From 8a8c633fec899154910986a2240427d0ab44be78 Mon Sep 17 00:00:00 2001 From: Aaron Dodson Date: Mon, 22 Apr 2024 10:35:29 -0700 Subject: [PATCH 001/521] fix: run stacks in response to click events (#1) * fix: run stacks in response to stack click events * refactor: listen for regular click events to run block stacks --- packages/scratch-vm/src/engine/blocks.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/scratch-vm/src/engine/blocks.js b/packages/scratch-vm/src/engine/blocks.js index cf1b2b7c4fd..f9d0138c808 100644 --- a/packages/scratch-vm/src/engine/blocks.js +++ b/packages/scratch-vm/src/engine/blocks.js @@ -308,12 +308,6 @@ class Blocks { const stage = this.runtime.getTargetForStage(); const editingTarget = this.runtime.getEditingTarget(); - // UI event: clicked scripts toggle in the runtime. - if (e.element === 'stackclick') { - this.runtime.toggleScript(e.blockId, {stackClick: true}); - return; - } - // Block create/update/destroy switch (e.type) { case 'create': { @@ -503,6 +497,12 @@ class Blocks { this.emitProjectChanged(); } break; + case 'click': + // UI event: clicked scripts toggle in the runtime. + if (e.targetType === 'block') { + this.runtime.toggleScript(this.getTopLevelScript(e.blockId), {stackClick: true}); + } + break; } } From 28ea54ac8720e39cda1c274af60b3807e1282cec Mon Sep 17 00:00:00 2001 From: Aaron Dodson Date: Tue, 30 Apr 2024 15:49:07 -0700 Subject: [PATCH 002/521] fix: use toolboxitemid instead of id as the identifier attribute for extensions toolbox categories (#2) --- packages/scratch-vm/src/engine/runtime.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/scratch-vm/src/engine/runtime.js b/packages/scratch-vm/src/engine/runtime.js index 452ff51c204..fd0fa688a4e 100644 --- a/packages/scratch-vm/src/engine/runtime.js +++ b/packages/scratch-vm/src/engine/runtime.js @@ -1429,7 +1429,7 @@ class Runtime extends EventEmitter { return { id: categoryInfo.id, - xml: `${ + xml: `${ paletteBlocks.map(block => block.xml).join('')}` }; }); From ac4280e1664a23e53bd188460bf657f17621d8ad Mon Sep 17 00:00:00 2001 From: Aaron Dodson Date: Wed, 12 Jun 2024 09:27:45 -0700 Subject: [PATCH 003/521] fix: handle modern workspace comment events (#3) * fix: handle modern workspace comment events * fix: correctly access coordinates on events --- packages/scratch-vm/src/engine/blocks.js | 33 ++++++++++++----------- packages/scratch-vm/src/engine/comment.js | 2 +- 2 files changed, 18 insertions(+), 17 deletions(-) diff --git a/packages/scratch-vm/src/engine/blocks.js b/packages/scratch-vm/src/engine/blocks.js index f9d0138c808..ebee6427cf5 100644 --- a/packages/scratch-vm/src/engine/blocks.js +++ b/packages/scratch-vm/src/engine/blocks.js @@ -419,8 +419,8 @@ class Blocks { case 'comment_create': if (this.runtime.getEditingTarget()) { const currTarget = this.runtime.getEditingTarget(); - currTarget.createComment(e.commentId, e.blockId, e.text, - e.xy.x, e.xy.y, e.width, e.height, e.minimized); + currTarget.createComment(e.commentId, null, '', + e.json.x, e.json.y, e.json.width, e.json.height, false); if (currTarget.comments[e.commentId].x === null && currTarget.comments[e.commentId].y === null) { @@ -430,8 +430,8 @@ class Blocks { // comments, then the auto positioning should have taken place. // Update the x and y position of these comments to match the // one from the event. - currTarget.comments[e.commentId].x = e.xy.x; - currTarget.comments[e.commentId].y = e.xy.y; + currTarget.comments[e.commentId].x = e.json.x; + currTarget.comments[e.commentId].y = e.json.y; } } this.emitProjectChanged(); @@ -444,18 +444,7 @@ class Blocks { return; } const comment = currTarget.comments[e.commentId]; - const change = e.newContents_; - if (Object.prototype.hasOwnProperty.call(change, 'minimized')) { - comment.minimized = change.minimized; - } - if (Object.prototype.hasOwnProperty.call(change, 'width') && - Object.prototype.hasOwnProperty.call(change, 'height')) { - comment.width = change.width; - comment.height = change.height; - } - if (Object.prototype.hasOwnProperty.call(change, 'text')) { - comment.text = change.text; - } + comment.text = e.newContents_; this.emitProjectChanged(); } break; @@ -474,6 +463,18 @@ class Blocks { this.emitProjectChanged(); } break; + case 'comment_collapse': + if (this.runtime.getEditingTarget()) { + const currTarget = this.runtime.getEditingTarget(); + if (currTarget && !Object.prototype.hasOwnProperty.call(currTarget.comments, e.commentId)) { + log.warn(`Cannot change comment with id ${e.commentId} because it does not exist.`); + return; + } + const comment = currTarget.comments[e.commentId]; + comment.minimized = e.newCollapsed; + this.emitProjectChanged(); + } + break; case 'comment_delete': if (this.runtime.getEditingTarget()) { const currTarget = this.runtime.getEditingTarget(); diff --git a/packages/scratch-vm/src/engine/comment.js b/packages/scratch-vm/src/engine/comment.js index ac644e770ea..bdf4e8f893a 100644 --- a/packages/scratch-vm/src/engine/comment.js +++ b/packages/scratch-vm/src/engine/comment.js @@ -31,7 +31,7 @@ class Comment { toXML () { return `${xmlEscape(this.text)}`; + this.blockId !== null}" collapsed="${this.minimized}">${xmlEscape(this.text)}`; } // TODO choose min and defaults for width and height From 29bdbd1fef6164884fd6fd64698802c8cc1c7b8d Mon Sep 17 00:00:00 2001 From: Aaron Dodson Date: Tue, 9 Jul 2024 09:31:31 -0700 Subject: [PATCH 004/521] fix: handle new custom block comment events (#4) --- packages/scratch-vm/src/engine/blocks.js | 25 ++++++++++++++++++++--- packages/scratch-vm/src/engine/comment.js | 2 +- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/packages/scratch-vm/src/engine/blocks.js b/packages/scratch-vm/src/engine/blocks.js index ebee6427cf5..2796d9ed0de 100644 --- a/packages/scratch-vm/src/engine/blocks.js +++ b/packages/scratch-vm/src/engine/blocks.js @@ -416,10 +416,11 @@ class Blocks { this.emitProjectChanged(); break; } + case 'block_comment_create': case 'comment_create': if (this.runtime.getEditingTarget()) { const currTarget = this.runtime.getEditingTarget(); - currTarget.createComment(e.commentId, null, '', + currTarget.createComment(e.commentId, e.blockId, '', e.json.x, e.json.y, e.json.width, e.json.height, false); if (currTarget.comments[e.commentId].x === null && @@ -436,6 +437,7 @@ class Blocks { } this.emitProjectChanged(); break; + case 'block_comment_change': case 'comment_change': if (this.runtime.getEditingTarget()) { const currTarget = this.runtime.getEditingTarget(); @@ -448,11 +450,12 @@ class Blocks { this.emitProjectChanged(); } break; + case 'block_comment_move': case 'comment_move': if (this.runtime.getEditingTarget()) { const currTarget = this.runtime.getEditingTarget(); if (currTarget && !Object.prototype.hasOwnProperty.call(currTarget.comments, e.commentId)) { - log.warn(`Cannot change comment with id ${e.commentId} because it does not exist.`); + log.warn(`Cannot move comment with id ${e.commentId} because it does not exist.`); return; } const comment = currTarget.comments[e.commentId]; @@ -463,11 +466,12 @@ class Blocks { this.emitProjectChanged(); } break; + case 'block_comment_collapse': case 'comment_collapse': if (this.runtime.getEditingTarget()) { const currTarget = this.runtime.getEditingTarget(); if (currTarget && !Object.prototype.hasOwnProperty.call(currTarget.comments, e.commentId)) { - log.warn(`Cannot change comment with id ${e.commentId} because it does not exist.`); + log.warn(`Cannot collapse comment with id ${e.commentId} because it does not exist.`); return; } const comment = currTarget.comments[e.commentId]; @@ -475,6 +479,21 @@ class Blocks { this.emitProjectChanged(); } break; + case 'block_comment_resize': + case 'comment_resize': + if (this.runtime.getEditingTarget()) { + const currTarget = this.runtime.getEditingTarget(); + if (currTarget && !Object.prototype.hasOwnProperty.call(currTarget.comments, e.commentId)) { + log.warn(`Cannot resize comment with id ${e.commentId} because it does not exist.`); + return; + } + const comment = currTarget.comments[e.commentId]; + comment.width = e.newSize.width; + comment.height = e.newSize.height; + this.emitProjectChanged(); + } + break; + case 'block_comment_delete': case 'comment_delete': if (this.runtime.getEditingTarget()) { const currTarget = this.runtime.getEditingTarget(); diff --git a/packages/scratch-vm/src/engine/comment.js b/packages/scratch-vm/src/engine/comment.js index bdf4e8f893a..a71c8dfcf80 100644 --- a/packages/scratch-vm/src/engine/comment.js +++ b/packages/scratch-vm/src/engine/comment.js @@ -31,7 +31,7 @@ class Comment { toXML () { return `${xmlEscape(this.text)}`; + !this.minimized}" collapsed="${this.minimized}">${xmlEscape(this.text)}`; } // TODO choose min and defaults for width and height From 8ba4f9e6324d7e6a4ce4c571a4633540580c98b6 Mon Sep 17 00:00:00 2001 From: Aaron Dodson Date: Tue, 3 Sep 2024 13:24:50 -0700 Subject: [PATCH 005/521] fix: add the hat extension to extension hat blocks (#5) * chore: format runtime.js * fix: add the hat extension to extension hat blocks --- packages/scratch-vm/src/engine/runtime.js | 1271 ++++++++++++--------- 1 file changed, 747 insertions(+), 524 deletions(-) diff --git a/packages/scratch-vm/src/engine/runtime.js b/packages/scratch-vm/src/engine/runtime.js index fd0fa688a4e..58d20485e68 100644 --- a/packages/scratch-vm/src/engine/runtime.js +++ b/packages/scratch-vm/src/engine/runtime.js @@ -1,50 +1,50 @@ -const EventEmitter = require('events'); -const {OrderedMap} = require('immutable'); -const uuid = require('uuid'); - -const ArgumentType = require('../extension-support/argument-type'); -const Blocks = require('./blocks'); -const BlocksRuntimeCache = require('./blocks-runtime-cache'); -const BlockType = require('../extension-support/block-type'); -const Profiler = require('./profiler'); -const Sequencer = require('./sequencer'); -const execute = require('./execute.js'); -const ScratchBlocksConstants = require('./scratch-blocks-constants'); -const TargetType = require('../extension-support/target-type'); -const Thread = require('./thread'); -const log = require('../util/log'); -const maybeFormatMessage = require('../util/maybe-format-message'); -const StageLayering = require('./stage-layering'); -const Variable = require('./variable'); -const xmlEscape = require('../util/xml-escape'); -const ScratchLinkWebSocket = require('../util/scratch-link-websocket'); -const fetchWithTimeout = require('../util/fetch-with-timeout'); +const EventEmitter = require("events"); +const { OrderedMap } = require("immutable"); +const uuid = require("uuid"); + +const ArgumentType = require("../extension-support/argument-type"); +const Blocks = require("./blocks"); +const BlocksRuntimeCache = require("./blocks-runtime-cache"); +const BlockType = require("../extension-support/block-type"); +const Profiler = require("./profiler"); +const Sequencer = require("./sequencer"); +const execute = require("./execute.js"); +const ScratchBlocksConstants = require("./scratch-blocks-constants"); +const TargetType = require("../extension-support/target-type"); +const Thread = require("./thread"); +const log = require("../util/log"); +const maybeFormatMessage = require("../util/maybe-format-message"); +const StageLayering = require("./stage-layering"); +const Variable = require("./variable"); +const xmlEscape = require("../util/xml-escape"); +const ScratchLinkWebSocket = require("../util/scratch-link-websocket"); +const fetchWithTimeout = require("../util/fetch-with-timeout"); // Virtual I/O devices. -const Clock = require('../io/clock'); -const Cloud = require('../io/cloud'); -const Keyboard = require('../io/keyboard'); -const Mouse = require('../io/mouse'); -const MouseWheel = require('../io/mouseWheel'); -const UserData = require('../io/userData'); -const Video = require('../io/video'); +const Clock = require("../io/clock"); +const Cloud = require("../io/cloud"); +const Keyboard = require("../io/keyboard"); +const Mouse = require("../io/mouse"); +const MouseWheel = require("../io/mouseWheel"); +const UserData = require("../io/userData"); +const Video = require("../io/video"); -const StringUtil = require('../util/string-util'); -const uid = require('../util/uid'); +const StringUtil = require("../util/string-util"); +const uid = require("../util/uid"); const defaultBlockPackages = { - scratch3_control: require('../blocks/scratch3_control'), - scratch3_event: require('../blocks/scratch3_event'), - scratch3_looks: require('../blocks/scratch3_looks'), - scratch3_motion: require('../blocks/scratch3_motion'), - scratch3_operators: require('../blocks/scratch3_operators'), - scratch3_sound: require('../blocks/scratch3_sound'), - scratch3_sensing: require('../blocks/scratch3_sensing'), - scratch3_data: require('../blocks/scratch3_data'), - scratch3_procedures: require('../blocks/scratch3_procedures') + scratch3_control: require("../blocks/scratch3_control"), + scratch3_event: require("../blocks/scratch3_event"), + scratch3_looks: require("../blocks/scratch3_looks"), + scratch3_motion: require("../blocks/scratch3_motion"), + scratch3_operators: require("../blocks/scratch3_operators"), + scratch3_sound: require("../blocks/scratch3_sound"), + scratch3_sensing: require("../blocks/scratch3_sensing"), + scratch3_data: require("../blocks/scratch3_data"), + scratch3_procedures: require("../blocks/scratch3_procedures"), }; -const defaultExtensionColors = ['#0FBD8C', '#0DA57A', '#0B8E69']; +const defaultExtensionColors = ["#0FBD8C", "#0DA57A", "#0B8E69"]; /** * Information used for converting Scratch argument types into scratch-blocks data. @@ -54,7 +54,7 @@ const ArgumentTypeMap = (() => { const map = {}; map[ArgumentType.ANGLE] = { shadow: { - type: 'math_angle', + type: "math_angle", // We specify fieldNames here so that we can pick // create and populate a field with the defaultValue // specified in the extension. @@ -62,46 +62,46 @@ const ArgumentTypeMap = (() => { // the will be left out of the XML and // the scratch-blocks defaults for that field will be // used instead (e.g. default of 0 for number fields) - fieldName: 'NUM' - } + fieldName: "NUM", + }, }; map[ArgumentType.COLOR] = { shadow: { - type: 'colour_picker', - fieldName: 'COLOUR' - } + type: "colour_picker", + fieldName: "COLOUR", + }, }; map[ArgumentType.NUMBER] = { shadow: { - type: 'math_number', - fieldName: 'NUM' - } + type: "math_number", + fieldName: "NUM", + }, }; map[ArgumentType.STRING] = { shadow: { - type: 'text', - fieldName: 'TEXT' - } + type: "text", + fieldName: "TEXT", + }, }; map[ArgumentType.BOOLEAN] = { - check: 'Boolean' + check: "Boolean", }; map[ArgumentType.MATRIX] = { shadow: { - type: 'matrix', - fieldName: 'MATRIX' - } + type: "matrix", + fieldName: "MATRIX", + }, }; map[ArgumentType.NOTE] = { shadow: { - type: 'note', - fieldName: 'NOTE' - } + type: "note", + fieldName: "NOTE", + }, }; map[ArgumentType.IMAGE] = { // Inline images are weird because they're not actually "arguments". // They are more analagous to the label on a block. - fieldType: 'field_image' + fieldType: "field_image", }; return map; })(); @@ -150,7 +150,7 @@ const cloudDataManager = () => { canAddCloudVariable, addCloudVariable, removeCloudVariable, - hasCloudVariables + hasCloudVariables, }; }; @@ -177,7 +177,7 @@ let rendererDrawProfilerId = -1; * @constructor */ class Runtime extends EventEmitter { - constructor () { + constructor() { super(); /** @@ -344,7 +344,7 @@ class Runtime extends EventEmitter { mouse: new Mouse(this), mouseWheel: new MouseWheel(this), userData: new UserData(), - video: new Video(this) + video: new Video(this), }; /** @@ -385,7 +385,8 @@ class Runtime extends EventEmitter { * being added. * @type {function} */ - this.addCloudVariable = this._initializeAddCloudVariable(newCloudDataManager); + this.addCloudVariable = + this._initializeAddCloudVariable(newCloudDataManager); /** * A function which updates the runtime's cloud variable limit @@ -393,7 +394,8 @@ class Runtime extends EventEmitter { * if the last of the cloud variables is being removed. * @type {function} */ - this.removeCloudVariable = this._initializeRemoveCloudVariable(newCloudDataManager); + this.removeCloudVariable = + this._initializeRemoveCloudVariable(newCloudDataManager); /** * A string representing the origin of the current project from outside of the @@ -411,7 +413,7 @@ class Runtime extends EventEmitter { * Width of the stage, in pixels. * @const {number} */ - static get STAGE_WIDTH () { + static get STAGE_WIDTH() { return 480; } @@ -419,7 +421,7 @@ class Runtime extends EventEmitter { * Height of the stage, in pixels. * @const {number} */ - static get STAGE_HEIGHT () { + static get STAGE_HEIGHT() { return 360; } @@ -427,32 +429,32 @@ class Runtime extends EventEmitter { * Event name for glowing a script. * @const {string} */ - static get SCRIPT_GLOW_ON () { - return 'SCRIPT_GLOW_ON'; + static get SCRIPT_GLOW_ON() { + return "SCRIPT_GLOW_ON"; } /** * Event name for unglowing a script. * @const {string} */ - static get SCRIPT_GLOW_OFF () { - return 'SCRIPT_GLOW_OFF'; + static get SCRIPT_GLOW_OFF() { + return "SCRIPT_GLOW_OFF"; } /** * Event name for glowing a block. * @const {string} */ - static get BLOCK_GLOW_ON () { - return 'BLOCK_GLOW_ON'; + static get BLOCK_GLOW_ON() { + return "BLOCK_GLOW_ON"; } /** * Event name for unglowing a block. * @const {string} */ - static get BLOCK_GLOW_OFF () { - return 'BLOCK_GLOW_OFF'; + static get BLOCK_GLOW_OFF() { + return "BLOCK_GLOW_OFF"; } /** @@ -460,24 +462,24 @@ class Runtime extends EventEmitter { * to this project. * @const {string} */ - static get HAS_CLOUD_DATA_UPDATE () { - return 'HAS_CLOUD_DATA_UPDATE'; + static get HAS_CLOUD_DATA_UPDATE() { + return "HAS_CLOUD_DATA_UPDATE"; } /** * Event name for turning on turbo mode. * @const {string} */ - static get TURBO_MODE_ON () { - return 'TURBO_MODE_ON'; + static get TURBO_MODE_ON() { + return "TURBO_MODE_ON"; } /** * Event name for turning off turbo mode. * @const {string} */ - static get TURBO_MODE_OFF () { - return 'TURBO_MODE_OFF'; + static get TURBO_MODE_OFF() { + return "TURBO_MODE_OFF"; } /** @@ -485,8 +487,8 @@ class Runtime extends EventEmitter { * running). * @const {string} */ - static get PROJECT_START () { - return 'PROJECT_START'; + static get PROJECT_START() { + return "PROJECT_START"; } /** @@ -494,8 +496,8 @@ class Runtime extends EventEmitter { * Used by the UI to indicate running status. * @const {string} */ - static get PROJECT_RUN_START () { - return 'PROJECT_RUN_START'; + static get PROJECT_RUN_START() { + return "PROJECT_RUN_START"; } /** @@ -503,8 +505,8 @@ class Runtime extends EventEmitter { * Used by the UI to indicate not-running status. * @const {string} */ - static get PROJECT_RUN_STOP () { - return 'PROJECT_RUN_STOP'; + static get PROJECT_RUN_STOP() { + return "PROJECT_RUN_STOP"; } /** @@ -512,8 +514,8 @@ class Runtime extends EventEmitter { * Used by blocks that need to reset state. * @const {string} */ - static get PROJECT_STOP_ALL () { - return 'PROJECT_STOP_ALL'; + static get PROJECT_STOP_ALL() { + return "PROJECT_STOP_ALL"; } /** @@ -521,88 +523,88 @@ class Runtime extends EventEmitter { * Used by blocks that need to stop individual targets. * @const {string} */ - static get STOP_FOR_TARGET () { - return 'STOP_FOR_TARGET'; + static get STOP_FOR_TARGET() { + return "STOP_FOR_TARGET"; } /** * Event name for visual value report. * @const {string} */ - static get VISUAL_REPORT () { - return 'VISUAL_REPORT'; + static get VISUAL_REPORT() { + return "VISUAL_REPORT"; } /** * Event name for project loaded report. * @const {string} */ - static get PROJECT_LOADED () { - return 'PROJECT_LOADED'; + static get PROJECT_LOADED() { + return "PROJECT_LOADED"; } /** * Event name for report that a change was made that can be saved * @const {string} */ - static get PROJECT_CHANGED () { - return 'PROJECT_CHANGED'; + static get PROJECT_CHANGED() { + return "PROJECT_CHANGED"; } /** * Event name for report that a change was made to an extension in the toolbox. * @const {string} */ - static get TOOLBOX_EXTENSIONS_NEED_UPDATE () { - return 'TOOLBOX_EXTENSIONS_NEED_UPDATE'; + static get TOOLBOX_EXTENSIONS_NEED_UPDATE() { + return "TOOLBOX_EXTENSIONS_NEED_UPDATE"; } /** * Event name for targets update report. * @const {string} */ - static get TARGETS_UPDATE () { - return 'TARGETS_UPDATE'; + static get TARGETS_UPDATE() { + return "TARGETS_UPDATE"; } /** * Event name for monitors update. * @const {string} */ - static get MONITORS_UPDATE () { - return 'MONITORS_UPDATE'; + static get MONITORS_UPDATE() { + return "MONITORS_UPDATE"; } /** * Event name for block drag update. * @const {string} */ - static get BLOCK_DRAG_UPDATE () { - return 'BLOCK_DRAG_UPDATE'; + static get BLOCK_DRAG_UPDATE() { + return "BLOCK_DRAG_UPDATE"; } /** * Event name for block drag end. * @const {string} */ - static get BLOCK_DRAG_END () { - return 'BLOCK_DRAG_END'; + static get BLOCK_DRAG_END() { + return "BLOCK_DRAG_END"; } /** * Event name for reporting that an extension was added. * @const {string} */ - static get EXTENSION_ADDED () { - return 'EXTENSION_ADDED'; + static get EXTENSION_ADDED() { + return "EXTENSION_ADDED"; } /** * Event name for reporting that an extension as asked for a custom field to be added * @const {string} */ - static get EXTENSION_FIELD_ADDED () { - return 'EXTENSION_FIELD_ADDED'; + static get EXTENSION_FIELD_ADDED() { + return "EXTENSION_FIELD_ADDED"; } /** @@ -611,8 +613,8 @@ class Runtime extends EventEmitter { * available peripherals. * @const {string} */ - static get PERIPHERAL_LIST_UPDATE () { - return 'PERIPHERAL_LIST_UPDATE'; + static get PERIPHERAL_LIST_UPDATE() { + return "PERIPHERAL_LIST_UPDATE"; } /** @@ -620,8 +622,8 @@ class Runtime extends EventEmitter { * via Companion Device Manager (CDM) * @const {string} */ - static get USER_PICKED_PERIPHERAL () { - return 'USER_PICKED_PERIPHERAL'; + static get USER_PICKED_PERIPHERAL() { + return "USER_PICKED_PERIPHERAL"; } /** @@ -629,8 +631,8 @@ class Runtime extends EventEmitter { * This causes the status button in the blocks menu to indicate 'connected'. * @const {string} */ - static get PERIPHERAL_CONNECTED () { - return 'PERIPHERAL_CONNECTED'; + static get PERIPHERAL_CONNECTED() { + return "PERIPHERAL_CONNECTED"; } /** @@ -638,8 +640,8 @@ class Runtime extends EventEmitter { * This causes the status button in the blocks menu to indicate 'disconnected'. * @const {string} */ - static get PERIPHERAL_DISCONNECTED () { - return 'PERIPHERAL_DISCONNECTED'; + static get PERIPHERAL_DISCONNECTED() { + return "PERIPHERAL_DISCONNECTED"; } /** @@ -647,8 +649,8 @@ class Runtime extends EventEmitter { * This causes the peripheral connection modal to switch to an error state. * @const {string} */ - static get PERIPHERAL_REQUEST_ERROR () { - return 'PERIPHERAL_REQUEST_ERROR'; + static get PERIPHERAL_REQUEST_ERROR() { + return "PERIPHERAL_REQUEST_ERROR"; } /** @@ -656,8 +658,8 @@ class Runtime extends EventEmitter { * This causes a 'peripheral connection lost' error alert to display. * @const {string} */ - static get PERIPHERAL_CONNECTION_LOST_ERROR () { - return 'PERIPHERAL_CONNECTION_LOST_ERROR'; + static get PERIPHERAL_CONNECTION_LOST_ERROR() { + return "PERIPHERAL_CONNECTION_LOST_ERROR"; } /** @@ -665,61 +667,61 @@ class Runtime extends EventEmitter { * This causes the peripheral connection modal to show a timeout state. * @const {string} */ - static get PERIPHERAL_SCAN_TIMEOUT () { - return 'PERIPHERAL_SCAN_TIMEOUT'; + static get PERIPHERAL_SCAN_TIMEOUT() { + return "PERIPHERAL_SCAN_TIMEOUT"; } /** * Event name to indicate that the microphone is being used to stream audio. * @const {string} */ - static get MIC_LISTENING () { - return 'MIC_LISTENING'; + static get MIC_LISTENING() { + return "MIC_LISTENING"; } /** * Event name for reporting that blocksInfo was updated. * @const {string} */ - static get BLOCKSINFO_UPDATE () { - return 'BLOCKSINFO_UPDATE'; + static get BLOCKSINFO_UPDATE() { + return "BLOCKSINFO_UPDATE"; } /** * Event name when the runtime tick loop has been started. * @const {string} */ - static get RUNTIME_STARTED () { - return 'RUNTIME_STARTED'; + static get RUNTIME_STARTED() { + return "RUNTIME_STARTED"; } /** * Event name when the runtime dispose has been called. * @const {string} */ - static get RUNTIME_DISPOSED () { - return 'RUNTIME_DISPOSED'; + static get RUNTIME_DISPOSED() { + return "RUNTIME_DISPOSED"; } /** * Event name for reporting that a block was updated and needs to be rerendered. * @const {string} */ - static get BLOCKS_NEED_UPDATE () { - return 'BLOCKS_NEED_UPDATE'; + static get BLOCKS_NEED_UPDATE() { + return "BLOCKS_NEED_UPDATE"; } /** * How rapidly we try to step threads by default, in ms. */ - static get THREAD_STEP_INTERVAL () { + static get THREAD_STEP_INTERVAL() { return 1000 / 60; } /** * In compatibility mode, how rapidly we try to step threads, in ms. */ - static get THREAD_STEP_INTERVAL_COMPATIBILITY () { + static get THREAD_STEP_INTERVAL_COMPATIBILITY() { return 1000 / 30; } @@ -727,7 +729,7 @@ class Runtime extends EventEmitter { * How many clones can be created at a time. * @const {number} */ - static get MAX_CLONES () { + static get MAX_CLONES() { return 300; } @@ -735,26 +737,26 @@ class Runtime extends EventEmitter { // ----------------------------------------------------------------------------- // Helper function for initializing the addCloudVariable function - _initializeAddCloudVariable (newCloudDataManager) { + _initializeAddCloudVariable(newCloudDataManager) { // The addCloudVariable function - return (() => { + return () => { const hadCloudVarsBefore = this.hasCloudData(); newCloudDataManager.addCloudVariable(); if (!hadCloudVarsBefore && this.hasCloudData()) { this.emit(Runtime.HAS_CLOUD_DATA_UPDATE, true); } - }); + }; } // Helper function for initializing the removeCloudVariable function - _initializeRemoveCloudVariable (newCloudDataManager) { - return (() => { + _initializeRemoveCloudVariable(newCloudDataManager) { + return () => { const hadCloudVarsBefore = this.hasCloudData(); newCloudDataManager.removeCloudVariable(); if (hadCloudVarsBefore && !this.hasCloudData()) { this.emit(Runtime.HAS_CLOUD_DATA_UPDATE, false); } - }); + }; } /** @@ -762,16 +764,28 @@ class Runtime extends EventEmitter { * @todo Prefix opcodes with package name. * @private */ - _registerBlockPackages () { + _registerBlockPackages() { for (const packageName in defaultBlockPackages) { - if (Object.prototype.hasOwnProperty.call(defaultBlockPackages, packageName)) { + if ( + Object.prototype.hasOwnProperty.call( + defaultBlockPackages, + packageName + ) + ) { // @todo pass a different runtime depending on package privilege? - const packageObject = new (defaultBlockPackages[packageName])(this); + const packageObject = new defaultBlockPackages[packageName]( + this + ); // Collect primitives from package. if (packageObject.getPrimitives) { const packagePrimitives = packageObject.getPrimitives(); for (const op in packagePrimitives) { - if (Object.prototype.hasOwnProperty.call(packagePrimitives, op)) { + if ( + Object.prototype.hasOwnProperty.call( + packagePrimitives, + op + ) + ) { this._primitives[op] = packagePrimitives[op].bind(packageObject); } @@ -781,20 +795,29 @@ class Runtime extends EventEmitter { if (packageObject.getHats) { const packageHats = packageObject.getHats(); for (const hatName in packageHats) { - if (Object.prototype.hasOwnProperty.call(packageHats, hatName)) { + if ( + Object.prototype.hasOwnProperty.call( + packageHats, + hatName + ) + ) { this._hats[hatName] = packageHats[hatName]; } } } // Collect monitored from package. if (packageObject.getMonitored) { - this.monitorBlockInfo = Object.assign({}, this.monitorBlockInfo, packageObject.getMonitored()); + this.monitorBlockInfo = Object.assign( + {}, + this.monitorBlockInfo, + packageObject.getMonitored() + ); } } } } - getMonitorState () { + getMonitorState() { return this._monitorState; } @@ -805,7 +828,7 @@ class Runtime extends EventEmitter { * @returns {string} - the constructed ID. * @private */ - _makeExtensionMenuId (menuName, extensionId) { + _makeExtensionMenuId(menuName, extensionId) { return `${extensionId}_menu_${xmlEscape(menuName)}`; } @@ -814,11 +837,13 @@ class Runtime extends EventEmitter { * @param {Target} [target] - the target to use as context. If a target is not provided, default to the current * editing target or the stage. */ - makeMessageContextForTarget (target) { + makeMessageContextForTarget(target) { const context = {}; target = target || this.getEditingTarget() || this.getTargetForStage(); if (target) { - context.targetType = (target.isStage ? TargetType.STAGE : TargetType.SPRITE); + context.targetType = target.isStage + ? TargetType.STAGE + : TargetType.SPRITE; } } @@ -827,13 +852,13 @@ class Runtime extends EventEmitter { * @param {ExtensionMetadata} extensionInfo - information about the extension (id, blocks, etc.) * @private */ - _registerExtensionPrimitives (extensionInfo) { + _registerExtensionPrimitives(extensionInfo) { const categoryInfo = { id: extensionInfo.id, name: maybeFormatMessage(extensionInfo.name), showStatusButton: extensionInfo.showStatusButton, blockIconURI: extensionInfo.blockIconURI, - menuIconURI: extensionInfo.menuIconURI + menuIconURI: extensionInfo.menuIconURI, }; if (extensionInfo.color1) { @@ -851,13 +876,19 @@ class Runtime extends EventEmitter { this._fillExtensionCategory(categoryInfo, extensionInfo); for (const fieldTypeName in categoryInfo.customFieldTypes) { - if (Object.prototype.hasOwnProperty.call(extensionInfo.customFieldTypes, fieldTypeName)) { - const fieldTypeInfo = categoryInfo.customFieldTypes[fieldTypeName]; + if ( + Object.prototype.hasOwnProperty.call( + extensionInfo.customFieldTypes, + fieldTypeName + ) + ) { + const fieldTypeInfo = + categoryInfo.customFieldTypes[fieldTypeName]; // Emit events for custom field types from extension this.emit(Runtime.EXTENSION_FIELD_ADDED, { name: `field_${fieldTypeInfo.extendedName}`, - implementation: fieldTypeInfo.fieldImplementation + implementation: fieldTypeInfo.fieldImplementation, }); } } @@ -870,8 +901,10 @@ class Runtime extends EventEmitter { * @param {ExtensionMetadata} extensionInfo - new info (results of running getInfo) for an extension * @private */ - _refreshExtensionPrimitives (extensionInfo) { - const categoryInfo = this._blockInfo.find(info => info.id === extensionInfo.id); + _refreshExtensionPrimitives(extensionInfo) { + const categoryInfo = this._blockInfo.find( + (info) => info.id === extensionInfo.id + ); if (categoryInfo) { categoryInfo.name = maybeFormatMessage(extensionInfo.name); this._fillExtensionCategory(categoryInfo, extensionInfo); @@ -887,22 +920,36 @@ class Runtime extends EventEmitter { * @param {ExtensionMetadata} extensionInfo - the extension metadata to read * @private */ - _fillExtensionCategory (categoryInfo, extensionInfo) { + _fillExtensionCategory(categoryInfo, extensionInfo) { categoryInfo.blocks = []; categoryInfo.customFieldTypes = {}; categoryInfo.menus = []; categoryInfo.menuInfo = {}; for (const menuName in extensionInfo.menus) { - if (Object.prototype.hasOwnProperty.call(extensionInfo.menus, menuName)) { + if ( + Object.prototype.hasOwnProperty.call( + extensionInfo.menus, + menuName + ) + ) { const menuInfo = extensionInfo.menus[menuName]; - const convertedMenu = this._buildMenuForScratchBlocks(menuName, menuInfo, categoryInfo); + const convertedMenu = this._buildMenuForScratchBlocks( + menuName, + menuInfo, + categoryInfo + ); categoryInfo.menus.push(convertedMenu); categoryInfo.menuInfo[menuName] = menuInfo; } } for (const fieldTypeName in extensionInfo.customFieldTypes) { - if (Object.prototype.hasOwnProperty.call(extensionInfo.customFieldTypes, fieldTypeName)) { + if ( + Object.prototype.hasOwnProperty.call( + extensionInfo.customFieldTypes, + fieldTypeName + ) + ) { const fieldType = extensionInfo.customFieldTypes[fieldTypeName]; const fieldTypeInfo = this._buildCustomFieldInfo( fieldTypeName, @@ -917,22 +964,32 @@ class Runtime extends EventEmitter { for (const blockInfo of extensionInfo.blocks) { try { - const convertedBlock = this._convertForScratchBlocks(blockInfo, categoryInfo); + const convertedBlock = this._convertForScratchBlocks( + blockInfo, + categoryInfo + ); categoryInfo.blocks.push(convertedBlock); if (convertedBlock.json) { const opcode = convertedBlock.json.type; if (blockInfo.blockType !== BlockType.EVENT) { this._primitives[opcode] = convertedBlock.info.func; } - if (blockInfo.blockType === BlockType.EVENT || blockInfo.blockType === BlockType.HAT) { + if ( + blockInfo.blockType === BlockType.EVENT || + blockInfo.blockType === BlockType.HAT + ) { this._hats[opcode] = { edgeActivated: blockInfo.isEdgeActivated, - restartExistingThreads: blockInfo.shouldRestartExistingThreads + restartExistingThreads: + blockInfo.shouldRestartExistingThreads, }; } } } catch (e) { - log.error('Error parsing block: ', {block: blockInfo, error: e}); + log.error("Error parsing block: ", { + block: blockInfo, + error: e, + }); } } } @@ -944,18 +1001,29 @@ class Runtime extends EventEmitter { * @returns {object} - an array of 2 element arrays or the original input function * @private */ - _convertMenuItems (menuItems) { - if (typeof menuItems !== 'function') { + _convertMenuItems(menuItems) { + if (typeof menuItems !== "function") { const extensionMessageContext = this.makeMessageContextForTarget(); - return menuItems.map(item => { - const formattedItem = maybeFormatMessage(item, extensionMessageContext); + return menuItems.map((item) => { + const formattedItem = maybeFormatMessage( + item, + extensionMessageContext + ); switch (typeof formattedItem) { - case 'string': - return [formattedItem, formattedItem]; - case 'object': - return [maybeFormatMessage(item.text, extensionMessageContext), item.value]; - default: - throw new Error(`Can't interpret menu item: ${JSON.stringify(item)}`); + case "string": + return [formattedItem, formattedItem]; + case "object": + return [ + maybeFormatMessage( + item.text, + extensionMessageContext + ), + item.value, + ]; + default: + throw new Error( + `Can't interpret menu item: ${JSON.stringify(item)}` + ); } }); } @@ -972,32 +1040,33 @@ class Runtime extends EventEmitter { * @returns {object} - a JSON-esque object ready for scratch-blocks' consumption * @private */ - _buildMenuForScratchBlocks (menuName, menuInfo, categoryInfo) { + _buildMenuForScratchBlocks(menuName, menuInfo, categoryInfo) { const menuId = this._makeExtensionMenuId(menuName, categoryInfo.id); const menuItems = this._convertMenuItems(menuInfo.items); return { json: { - message0: '%1', + message0: "%1", type: menuId, inputsInline: true, - output: 'String', + output: "String", colour: categoryInfo.color1, colourSecondary: categoryInfo.color2, colourTertiary: categoryInfo.color3, - outputShape: menuInfo.acceptReporters ? - ScratchBlocksConstants.OUTPUT_SHAPE_ROUND : ScratchBlocksConstants.OUTPUT_SHAPE_SQUARE, + outputShape: menuInfo.acceptReporters + ? ScratchBlocksConstants.OUTPUT_SHAPE_ROUND + : ScratchBlocksConstants.OUTPUT_SHAPE_SQUARE, args0: [ { - type: 'field_dropdown', + type: "field_dropdown", name: menuName, - options: menuItems - } - ] - } + options: menuItems, + }, + ], + }, }; } - _buildCustomFieldInfo (fieldName, fieldInfo, extensionId, categoryInfo) { + _buildCustomFieldInfo(fieldName, fieldInfo, extensionId, categoryInfo) { const extendedName = `${extensionId}_${fieldName}`; return { fieldName: fieldName, @@ -1005,8 +1074,8 @@ class Runtime extends EventEmitter { argumentTypeInfo: { shadow: { type: extendedName, - fieldName: `field_${extendedName}` - } + fieldName: `field_${extendedName}`, + }, }, scratchBlocksDefinition: this._buildCustomFieldTypeForScratchBlocks( extendedName, @@ -1014,7 +1083,7 @@ class Runtime extends EventEmitter { fieldInfo.outputShape, categoryInfo ), - fieldImplementation: fieldInfo.implementation + fieldImplementation: fieldInfo.implementation, }; } @@ -1027,11 +1096,16 @@ class Runtime extends EventEmitter { * @param {object} categoryInfo - The category the field belongs to (Used to set its colors) * @returns {object} - Object to be inserted into scratch-blocks */ - _buildCustomFieldTypeForScratchBlocks (fieldName, output, outputShape, categoryInfo) { + _buildCustomFieldTypeForScratchBlocks( + fieldName, + output, + outputShape, + categoryInfo + ) { return { json: { type: fieldName, - message0: '%1', + message0: "%1", inputsInline: true, output: output, colour: categoryInfo.color1, @@ -1041,10 +1115,10 @@ class Runtime extends EventEmitter { args0: [ { name: `field_${fieldName}`, - type: `field_${fieldName}` - } - ] - } + type: `field_${fieldName}`, + }, + ], + }, }; } @@ -1055,8 +1129,8 @@ class Runtime extends EventEmitter { * @returns {ConvertedBlockInfo} - the converted & original block information * @private */ - _convertForScratchBlocks (blockInfo, categoryInfo) { - if (blockInfo === '---') { + _convertForScratchBlocks(blockInfo, categoryInfo) { + if (blockInfo === "---") { return this._convertSeparatorForScratchBlocks(blockInfo); } @@ -1074,7 +1148,7 @@ class Runtime extends EventEmitter { * @returns {ConvertedBlockInfo} - the converted & original block information * @private */ - _convertBlockForScratchBlocks (blockInfo, categoryInfo) { + _convertBlockForScratchBlocks(blockInfo, categoryInfo) { const extendedOpcode = `${categoryInfo.id}_${blockInfo.opcode}`; const blockJSON = { @@ -1083,7 +1157,7 @@ class Runtime extends EventEmitter { category: categoryInfo.name, colour: categoryInfo.color1, colourSecondary: categoryInfo.color2, - colourTertiary: categoryInfo.color3 + colourTertiary: categoryInfo.color3, }; const context = { // TODO: store this somewhere so that we can map args appropriately after translation. @@ -1094,7 +1168,7 @@ class Runtime extends EventEmitter { blockJSON, categoryInfo, blockInfo, - inputList: [] + inputList: [], }; // If an icon for the extension exists, prepend it to each block, with a vertical separator. @@ -1103,72 +1177,97 @@ class Runtime extends EventEmitter { const iconURI = blockInfo.blockIconURI || categoryInfo.blockIconURI; if (iconURI) { - blockJSON.extensions = ['scratch_extension']; - blockJSON.message0 = '%1 %2'; + blockJSON.extensions = ["scratch_extension"]; + blockJSON.message0 = "%1 %2"; const iconJSON = { - type: 'field_image', + type: "field_image", src: iconURI, width: 40, - height: 40 + height: 40, }; const separatorJSON = { - type: 'field_vertical_separator' + type: "field_vertical_separator", }; - blockJSON.args0 = [ - iconJSON, - separatorJSON - ]; + blockJSON.args0 = [iconJSON, separatorJSON]; } switch (blockInfo.blockType) { - case BlockType.COMMAND: - blockJSON.outputShape = ScratchBlocksConstants.OUTPUT_SHAPE_SQUARE; - blockJSON.previousStatement = null; // null = available connection; undefined = hat - if (!blockInfo.isTerminal) { - blockJSON.nextStatement = null; // null = available connection; undefined = terminal - } - break; - case BlockType.REPORTER: - blockJSON.output = 'String'; // TODO: distinguish number & string here? - blockJSON.outputShape = ScratchBlocksConstants.OUTPUT_SHAPE_ROUND; - break; - case BlockType.BOOLEAN: - blockJSON.output = 'Boolean'; - blockJSON.outputShape = ScratchBlocksConstants.OUTPUT_SHAPE_HEXAGONAL; - break; - case BlockType.HAT: - case BlockType.EVENT: - if (!Object.prototype.hasOwnProperty.call(blockInfo, 'isEdgeActivated')) { - // if absent, this property defaults to true - blockInfo.isEdgeActivated = true; - } - blockJSON.outputShape = ScratchBlocksConstants.OUTPUT_SHAPE_SQUARE; - blockJSON.nextStatement = null; // null = available connection; undefined = terminal - break; - case BlockType.CONDITIONAL: - case BlockType.LOOP: - blockInfo.branchCount = blockInfo.branchCount || 1; - blockJSON.outputShape = ScratchBlocksConstants.OUTPUT_SHAPE_SQUARE; - blockJSON.previousStatement = null; // null = available connection; undefined = hat - if (!blockInfo.isTerminal) { + case BlockType.COMMAND: + blockJSON.outputShape = + ScratchBlocksConstants.OUTPUT_SHAPE_SQUARE; + blockJSON.previousStatement = null; // null = available connection; undefined = hat + if (!blockInfo.isTerminal) { + blockJSON.nextStatement = null; // null = available connection; undefined = terminal + } + break; + case BlockType.REPORTER: + blockJSON.output = "String"; // TODO: distinguish number & string here? + blockJSON.outputShape = + ScratchBlocksConstants.OUTPUT_SHAPE_ROUND; + break; + case BlockType.BOOLEAN: + blockJSON.output = "Boolean"; + blockJSON.outputShape = + ScratchBlocksConstants.OUTPUT_SHAPE_HEXAGONAL; + break; + case BlockType.HAT: + case BlockType.EVENT: + if ( + !Object.prototype.hasOwnProperty.call( + blockInfo, + "isEdgeActivated" + ) + ) { + // if absent, this property defaults to true + blockInfo.isEdgeActivated = true; + } + blockJSON.outputShape = + ScratchBlocksConstants.OUTPUT_SHAPE_SQUARE; blockJSON.nextStatement = null; // null = available connection; undefined = terminal - } - break; + if (!blockJSON.extensions) { + blockJSON.extensions = []; + } + blockJSON.extensions.push("shape_hat"); + break; + case BlockType.CONDITIONAL: + case BlockType.LOOP: + blockInfo.branchCount = blockInfo.branchCount || 1; + blockJSON.outputShape = + ScratchBlocksConstants.OUTPUT_SHAPE_SQUARE; + blockJSON.previousStatement = null; // null = available connection; undefined = hat + if (!blockInfo.isTerminal) { + blockJSON.nextStatement = null; // null = available connection; undefined = terminal + } + break; } - const blockText = Array.isArray(blockInfo.text) ? blockInfo.text : [blockInfo.text]; + const blockText = Array.isArray(blockInfo.text) + ? blockInfo.text + : [blockInfo.text]; let inTextNum = 0; // text for the next block "arm" is blockText[inTextNum] let inBranchNum = 0; // how many branches have we placed into the JSON so far? let outLineNum = 0; // used for scratch-blocks `message${outLineNum}` and `args${outLineNum}` - const convertPlaceholders = this._convertPlaceholders.bind(this, context); + const convertPlaceholders = this._convertPlaceholders.bind( + this, + context + ); const extensionMessageContext = this.makeMessageContextForTarget(); // alternate between a block "arm" with text on it and an open slot for a substack - while (inTextNum < blockText.length || inBranchNum < blockInfo.branchCount) { + while ( + inTextNum < blockText.length || + inBranchNum < blockInfo.branchCount + ) { if (inTextNum < blockText.length) { context.outLineNum = outLineNum; - const lineText = maybeFormatMessage(blockText[inTextNum], extensionMessageContext); - const convertedText = lineText.replace(/\[(.+?)]/g, convertPlaceholders); + const lineText = maybeFormatMessage( + blockText[inTextNum], + extensionMessageContext + ); + const convertedText = lineText.replace( + /\[(.+?)]/g, + convertPlaceholders + ); if (blockJSON[`message${outLineNum}`]) { blockJSON[`message${outLineNum}`] += convertedText; } else { @@ -1178,11 +1277,15 @@ class Runtime extends EventEmitter { ++outLineNum; } if (inBranchNum < blockInfo.branchCount) { - blockJSON[`message${outLineNum}`] = '%1'; - blockJSON[`args${outLineNum}`] = [{ - type: 'input_statement', - name: `SUBSTACK${inBranchNum > 0 ? inBranchNum + 1 : ''}` - }]; + blockJSON[`message${outLineNum}`] = "%1"; + blockJSON[`args${outLineNum}`] = [ + { + type: "input_statement", + name: `SUBSTACK${ + inBranchNum > 0 ? inBranchNum + 1 : "" + }`, + }, + ]; ++inBranchNum; ++outLineNum; } @@ -1194,27 +1297,31 @@ class Runtime extends EventEmitter { } } else if (blockInfo.blockType === BlockType.LOOP) { // Add icon to the bottom right of a loop block - blockJSON[`lastDummyAlign${outLineNum}`] = 'RIGHT'; - blockJSON[`message${outLineNum}`] = '%1'; - blockJSON[`args${outLineNum}`] = [{ - type: 'field_image', - src: './static/blocks-media/repeat.svg', // TODO: use a constant or make this configurable? - width: 24, - height: 24, - alt: '*', // TODO remove this since we don't use collapsed blocks in scratch - flip_rtl: true - }]; + blockJSON[`lastDummyAlign${outLineNum}`] = "RIGHT"; + blockJSON[`message${outLineNum}`] = "%1"; + blockJSON[`args${outLineNum}`] = [ + { + type: "field_image", + src: "./static/blocks-media/repeat.svg", // TODO: use a constant or make this configurable? + width: 24, + height: 24, + alt: "*", // TODO remove this since we don't use collapsed blocks in scratch + flip_rtl: true, + }, + ]; ++outLineNum; } - const mutation = blockInfo.isDynamic ? `` : ''; - const inputs = context.inputList.join(''); + const mutation = blockInfo.isDynamic + ? `` + : ""; + const inputs = context.inputList.join(""); const blockXML = `${mutation}${inputs}`; return { info: context.blockInfo, json: context.blockJSON, - xml: blockXML + xml: blockXML, }; } @@ -1225,10 +1332,10 @@ class Runtime extends EventEmitter { * @returns {ConvertedBlockInfo} - the converted & original block information * @private */ - _convertSeparatorForScratchBlocks (blockInfo) { + _convertSeparatorForScratchBlocks(blockInfo) { return { info: blockInfo, - xml: '' + xml: '', }; } @@ -1240,18 +1347,27 @@ class Runtime extends EventEmitter { * @returns {ConvertedBlockInfo} - the converted & original button information * @private */ - _convertButtonForScratchBlocks (buttonInfo) { + _convertButtonForScratchBlocks(buttonInfo) { // for now we only support these pre-defined callbacks handled in scratch-blocks - const supportedCallbackKeys = ['MAKE_A_LIST', 'MAKE_A_PROCEDURE', 'MAKE_A_VARIABLE']; + const supportedCallbackKeys = [ + "MAKE_A_LIST", + "MAKE_A_PROCEDURE", + "MAKE_A_VARIABLE", + ]; if (supportedCallbackKeys.indexOf(buttonInfo.func) < 0) { - log.error(`Custom button callbacks not supported yet: ${buttonInfo.func}`); + log.error( + `Custom button callbacks not supported yet: ${buttonInfo.func}` + ); } const extensionMessageContext = this.makeMessageContextForTarget(); - const buttonText = maybeFormatMessage(buttonInfo.text, extensionMessageContext); + const buttonText = maybeFormatMessage( + buttonInfo.text, + extensionMessageContext + ); return { info: buttonInfo, - xml: `` + xml: ``, }; } @@ -1261,20 +1377,22 @@ class Runtime extends EventEmitter { * @return {object} JSON blob for a scratch-blocks image field. * @private */ - _constructInlineImageJson (argInfo) { + _constructInlineImageJson(argInfo) { if (!argInfo.dataURI) { - log.warn('Missing data URI in extension block with argument type IMAGE'); + log.warn( + "Missing data URI in extension block with argument type IMAGE" + ); } return { - type: 'field_image', - src: argInfo.dataURI || '', + type: "field_image", + src: argInfo.dataURI || "", // TODO these probably shouldn't be hardcoded...? width: 24, height: 24, // Whether or not the inline image should be flipped horizontally // in RTL languages. Defaults to false, indicating that the // image will not be flipped. - flip_rtl: argInfo.flipRTL || false + flip_rtl: argInfo.flipRTL || false, }; } @@ -1287,17 +1405,22 @@ class Runtime extends EventEmitter { * @return {string} scratch-blocks placeholder for the argument: '%1'. * @private */ - _convertPlaceholders (context, match, placeholder) { + _convertPlaceholders(context, match, placeholder) { // Sanitize the placeholder to ensure valid XML - placeholder = placeholder.replace(/[<"&]/, '_'); + placeholder = placeholder.replace(/[<"&]/, "_"); // Determine whether the argument type is one of the known standard field types const argInfo = context.blockInfo.arguments[placeholder] || {}; let argTypeInfo = ArgumentTypeMap[argInfo.type] || {}; // Field type not a standard field type, see if extension has registered custom field type - if (!ArgumentTypeMap[argInfo.type] && context.categoryInfo.customFieldTypes[argInfo.type]) { - argTypeInfo = context.categoryInfo.customFieldTypes[argInfo.type].argumentTypeInfo; + if ( + !ArgumentTypeMap[argInfo.type] && + context.categoryInfo.customFieldTypes[argInfo.type] + ) { + argTypeInfo = + context.categoryInfo.customFieldTypes[argInfo.type] + .argumentTypeInfo; } // Start to construct the scratch-blocks style JSON defining how the block should be @@ -1306,20 +1429,26 @@ class Runtime extends EventEmitter { // Most field types are inputs (slots on the block that can have other blocks plugged into them) // check if this is not one of those cases. E.g. an inline image on a block. - if (argTypeInfo.fieldType === 'field_image') { + if (argTypeInfo.fieldType === "field_image") { argJSON = this._constructInlineImageJson(argInfo); } else { // Construct input value // Layout a block argument (e.g. an input slot on the block) argJSON = { - type: 'input_value', - name: placeholder + type: "input_value", + name: placeholder, }; const defaultValue = - typeof argInfo.defaultValue === 'undefined' ? '' : - xmlEscape(maybeFormatMessage(argInfo.defaultValue, this.makeMessageContextForTarget()).toString()); + typeof argInfo.defaultValue === "undefined" + ? "" + : xmlEscape( + maybeFormatMessage( + argInfo.defaultValue, + this.makeMessageContextForTarget() + ).toString() + ); if (argTypeInfo.check) { // Right now the only type of 'check' we have specifies that the @@ -1335,10 +1464,13 @@ class Runtime extends EventEmitter { const menuInfo = context.categoryInfo.menuInfo[argInfo.menu]; if (menuInfo.acceptReporters) { valueName = placeholder; - shadowType = this._makeExtensionMenuId(argInfo.menu, context.categoryInfo.id); + shadowType = this._makeExtensionMenuId( + argInfo.menu, + context.categoryInfo.id + ); fieldName = argInfo.menu; } else { - argJSON.type = 'field_dropdown'; + argJSON.type = "field_dropdown"; argJSON.options = this._convertMenuItems(menuInfo.items); valueName = null; shadowType = null; @@ -1346,8 +1478,11 @@ class Runtime extends EventEmitter { } } else { valueName = placeholder; - shadowType = (argTypeInfo.shadow && argTypeInfo.shadow.type) || null; - fieldName = (argTypeInfo.shadow && argTypeInfo.shadow.fieldName) || null; + shadowType = + (argTypeInfo.shadow && argTypeInfo.shadow.type) || null; + fieldName = + (argTypeInfo.shadow && argTypeInfo.shadow.fieldName) || + null; } // is the ScratchBlocks name for a block input. @@ -1364,20 +1499,23 @@ class Runtime extends EventEmitter { // A displays a dynamic value: a user-editable text field, a drop-down menu, etc. // Leave out the field if defaultValue or fieldName are not specified if (defaultValue && fieldName) { - context.inputList.push(`${defaultValue}`); + context.inputList.push( + `${defaultValue}` + ); } if (shadowType) { - context.inputList.push(''); + context.inputList.push(""); } if (valueName) { - context.inputList.push(''); + context.inputList.push(""); } } const argsName = `args${context.outLineNum}`; - const blockArgs = (context.blockJSON[argsName] = context.blockJSON[argsName] || []); + const blockArgs = (context.blockJSON[argsName] = + context.blockJSON[argsName] || []); if (argJSON) blockArgs.push(argJSON); const argNum = blockArgs.length; context.argsMap[placeholder] = argNum; @@ -1391,12 +1529,12 @@ class Runtime extends EventEmitter { * @property {string} id - the category / extension ID * @property {string} xml - the XML text for this category, starting with `` and ending with `` */ - getBlocksXML (target) { - return this._blockInfo.map(categoryInfo => { - const {name, color1, color2} = categoryInfo; + getBlocksXML(target) { + return this._blockInfo.map((categoryInfo) => { + const { name, color1, color2 } = categoryInfo; // Filter out blocks that aren't supposed to be shown on this target, as determined by the block info's // `hideFromPalette` and `filter` properties. - const paletteBlocks = categoryInfo.blocks.filter(block => { + const paletteBlocks = categoryInfo.blocks.filter((block) => { let blockFilterIncludesTarget = true; // If an editing target is not passed, include all blocks // If the block info doesn't include a `filter` property, always include it @@ -1413,24 +1551,26 @@ class Runtime extends EventEmitter { // Use a menu icon if there is one. Otherwise, use the block icon. If there's no icon, // the category menu will show its default colored circle. - let menuIconURI = ''; + let menuIconURI = ""; if (categoryInfo.menuIconURI) { menuIconURI = categoryInfo.menuIconURI; } else if (categoryInfo.blockIconURI) { menuIconURI = categoryInfo.blockIconURI; } - const menuIconXML = menuIconURI ? - `iconURI="${menuIconURI}"` : ''; + const menuIconXML = menuIconURI ? `iconURI="${menuIconURI}"` : ""; - let statusButtonXML = ''; + let statusButtonXML = ""; if (categoryInfo.showStatusButton) { statusButtonXML = 'showStatusButton="true"'; } return { id: categoryInfo.id, - xml: `${ - paletteBlocks.map(block => block.xml).join('')}` + xml: `${paletteBlocks + .map((block) => block.xml) + .join("")}`, }; }); } @@ -1438,39 +1578,47 @@ class Runtime extends EventEmitter { /** * @returns {Array.} - an array containing the scratch-blocks JSON information for each dynamic block. */ - getBlocksJSON () { + getBlocksJSON() { return this._blockInfo.reduce( - (result, categoryInfo) => result.concat(categoryInfo.blocks.map(blockInfo => blockInfo.json)), []); + (result, categoryInfo) => + result.concat( + categoryInfo.blocks.map((blockInfo) => blockInfo.json) + ), + [] + ); } /** * One-time initialization for Scratch Link support. */ - _initScratchLink () { + _initScratchLink() { // Check that we're actually in a real browser, not Node.js or JSDOM, and we have a valid-looking origin. // note that `if (self?....)` will throw if `self` is undefined, so check for that first! - if (typeof self !== 'undefined' && - typeof document !== 'undefined' && + if ( + typeof self !== "undefined" && + typeof document !== "undefined" && document.getElementById && self.origin && - self.origin !== 'null' && // note this is a string comparison, not a null check + self.origin !== "null" && // note this is a string comparison, not a null check self.navigator && self.navigator.userAgent && !( - self.navigator.userAgent.includes('Node.js') || - self.navigator.userAgent.includes('jsdom') + self.navigator.userAgent.includes("Node.js") || + self.navigator.userAgent.includes("jsdom") ) ) { // Create a script tag for the Scratch Link browser extension, unless one already exists - const scriptElement = document.getElementById('scratch-link-extension-script'); + const scriptElement = document.getElementById( + "scratch-link-extension-script" + ); if (!scriptElement) { - const script = document.createElement('script'); - script.id = 'scratch-link-extension-script'; + const script = document.createElement("script"); + script.id = "scratch-link-extension-script"; document.body.appendChild(script); // Tell the browser extension to inject its script. // If the extension isn't present or isn't active, this will do nothing. - self.postMessage('inject-scratch-link-script', self.origin); + self.postMessage("inject-scratch-link-script", self.origin); } } } @@ -1480,8 +1628,9 @@ class Runtime extends EventEmitter { * @param {string} type Either BLE or BT * @returns {ScratchLinkSocket} The scratch link socket. */ - getScratchLinkSocket (type) { - const factory = this._linkSocketFactory || this._defaultScratchLinkSocketFactory; + getScratchLinkSocket(type) { + const factory = + this._linkSocketFactory || this._defaultScratchLinkSocketFactory; return factory(type); } @@ -1490,7 +1639,7 @@ class Runtime extends EventEmitter { * either BT or BLE. * @param {Function} factory The new factory for creating ScratchLink sockets. */ - configureScratchLinkSocketFactory (factory) { + configureScratchLinkSocketFactory(factory) { this._linkSocketFactory = factory; } @@ -1499,12 +1648,17 @@ class Runtime extends EventEmitter { * @param {string} type Either BLE or BT * @returns {ScratchLinkSocket} The new scratch link socket (a WebSocket object) */ - _defaultScratchLinkSocketFactory (type) { + _defaultScratchLinkSocketFactory(type) { const Scratch = self.Scratch; - const ScratchLinkSafariSocket = Scratch && Scratch.ScratchLinkSafariSocket; + const ScratchLinkSafariSocket = + Scratch && Scratch.ScratchLinkSafariSocket; // detect this every time in case the user turns on the extension after loading the page - const useSafariSocket = ScratchLinkSafariSocket && ScratchLinkSafariSocket.isSafariHelperCompatible(); - return useSafariSocket ? new ScratchLinkSafariSocket(type) : new ScratchLinkWebSocket(type); + const useSafariSocket = + ScratchLinkSafariSocket && + ScratchLinkSafariSocket.isSafariHelperCompatible(); + return useSafariSocket + ? new ScratchLinkSafariSocket(type) + : new ScratchLinkWebSocket(type); } /** @@ -1513,7 +1667,7 @@ class Runtime extends EventEmitter { * @param {string} extensionId - the id of the extension. * @param {object} extension - the extension to register. */ - registerPeripheralExtension (extensionId, extension) { + registerPeripheralExtension(extensionId, extension) { this.peripheralExtensions[extensionId] = extension; } @@ -1521,7 +1675,7 @@ class Runtime extends EventEmitter { * Tell the specified extension to scan for a peripheral. * @param {string} extensionId - the id of the extension. */ - scanForPeripheral (extensionId) { + scanForPeripheral(extensionId) { if (this.peripheralExtensions[extensionId]) { this.peripheralExtensions[extensionId].scan(); } @@ -1532,7 +1686,7 @@ class Runtime extends EventEmitter { * @param {string} extensionId - the id of the extension. * @param {number} peripheralId - the id of the peripheral. */ - connectPeripheral (extensionId, peripheralId) { + connectPeripheral(extensionId, peripheralId) { if (this.peripheralExtensions[extensionId]) { this.peripheralExtensions[extensionId].connect(peripheralId); } @@ -1542,7 +1696,7 @@ class Runtime extends EventEmitter { * Disconnect from the extension's connected peripheral. * @param {string} extensionId - the id of the extension. */ - disconnectPeripheral (extensionId) { + disconnectPeripheral(extensionId) { if (this.peripheralExtensions[extensionId]) { this.peripheralExtensions[extensionId].disconnect(); } @@ -1553,7 +1707,7 @@ class Runtime extends EventEmitter { * @param {string} extensionId - the id of the extension. * @return {boolean} - whether the extension has a connected peripheral. */ - getPeripheralIsConnected (extensionId) { + getPeripheralIsConnected(extensionId) { let isConnected = false; if (this.peripheralExtensions[extensionId]) { isConnected = this.peripheralExtensions[extensionId].isConnected(); @@ -1565,7 +1719,7 @@ class Runtime extends EventEmitter { * Emit an event to indicate that the microphone is being used to stream audio. * @param {boolean} listening - true if the microphone is currently listening. */ - emitMicListening (listening) { + emitMicListening(listening) { this.emit(Runtime.MIC_LISTENING, listening); } @@ -1574,7 +1728,7 @@ class Runtime extends EventEmitter { * @param {!string} opcode The opcode to look up. * @return {Function} The function which implements the opcode. */ - getOpcodeFunction (opcode) { + getOpcodeFunction(opcode) { return this._primitives[opcode]; } @@ -1583,7 +1737,7 @@ class Runtime extends EventEmitter { * @param {!string} opcode The opcode to look up. * @return {boolean} True if the op is known to be a hat. */ - getIsHat (opcode) { + getIsHat(opcode) { return Object.prototype.hasOwnProperty.call(this._hats, opcode); } @@ -1592,17 +1746,18 @@ class Runtime extends EventEmitter { * @param {!string} opcode The opcode to look up. * @return {boolean} True if the op is known to be a edge-activated hat. */ - getIsEdgeActivatedHat (opcode) { - return Object.prototype.hasOwnProperty.call(this._hats, opcode) && - this._hats[opcode].edgeActivated; + getIsEdgeActivatedHat(opcode) { + return ( + Object.prototype.hasOwnProperty.call(this._hats, opcode) && + this._hats[opcode].edgeActivated + ); } - /** * Attach the audio engine * @param {!AudioEngine} audioEngine The audio engine to attach */ - attachAudioEngine (audioEngine) { + attachAudioEngine(audioEngine) { this.audioEngine = audioEngine; } @@ -1610,7 +1765,7 @@ class Runtime extends EventEmitter { * Attach the renderer * @param {!RenderWebGL} renderer The renderer to attach */ - attachRenderer (renderer) { + attachRenderer(renderer) { this.renderer = renderer; this.renderer.setLayerGroupOrdering(StageLayering.LAYER_GROUPS); } @@ -1620,7 +1775,7 @@ class Runtime extends EventEmitter { * bitmaps to scratch 3 bitmaps. (Scratch 3 bitmaps are all bitmap resolution 2) * @param {!function} bitmapAdapter The adapter to attach */ - attachV2BitmapAdapter (bitmapAdapter) { + attachV2BitmapAdapter(bitmapAdapter) { this.v2BitmapAdapter = bitmapAdapter; } @@ -1628,7 +1783,7 @@ class Runtime extends EventEmitter { * Attach the storage module * @param {!ScratchStorage} storage The storage module to attach */ - attachStorage (storage) { + attachStorage(storage) { this.storage = storage; fetchWithTimeout.setFetch(storage.scratchFetch.scratchFetch); this.resetRunId(); @@ -1646,14 +1801,14 @@ class Runtime extends EventEmitter { * @param {?boolean} opts.updateMonitor true if the script should update a monitor value * @return {!Thread} The newly created thread. */ - _pushThread (id, target, opts) { + _pushThread(id, target, opts) { const thread = new Thread(id); thread.target = target; thread.stackClick = Boolean(opts && opts.stackClick); thread.updateMonitor = Boolean(opts && opts.updateMonitor); - thread.blockContainer = thread.updateMonitor ? - this.monitorBlocks : - target.blocks; + thread.blockContainer = thread.updateMonitor + ? this.monitorBlocks + : target.blocks; thread.pushStack(id); this.threads.push(thread); @@ -1664,7 +1819,7 @@ class Runtime extends EventEmitter { * Stop a thread: stop running it immediately, and remove it from the thread list later. * @param {!Thread} thread Thread object to remove from actives */ - _stopThread (thread) { + _stopThread(thread) { // Mark the thread for later removal thread.isKilled = true; // Inform sequencer to stop executing that thread. @@ -1678,7 +1833,7 @@ class Runtime extends EventEmitter { * @param {!Thread} thread Thread object to restart. * @return {Thread} The restarted thread. */ - _restartThread (thread) { + _restartThread(thread) { const newThread = new Thread(thread.topBlock); newThread.target = thread.target; newThread.stackClick = thread.stackClick; @@ -1699,12 +1854,12 @@ class Runtime extends EventEmitter { * @param {?Thread} thread Thread object to check. * @return {boolean} True if the thread is active/running. */ - isActiveThread (thread) { + isActiveThread(thread) { return ( - ( - thread.stack.length > 0 && - thread.status !== Thread.STATUS_DONE) && - this.threads.indexOf(thread) > -1); + thread.stack.length > 0 && + thread.status !== Thread.STATUS_DONE && + this.threads.indexOf(thread) > -1 + ); } /** @@ -1712,7 +1867,7 @@ class Runtime extends EventEmitter { * @param {?Thread} thread Thread object to check. * @return {boolean} True if the thread is waiting */ - isWaitingThread (thread) { + isWaitingThread(thread) { return ( thread.status === Thread.STATUS_PROMISE_WAIT || thread.status === Thread.STATUS_YIELD_TICK || @@ -1728,19 +1883,30 @@ class Runtime extends EventEmitter { * @param {?boolean} opts.stackClick true if the user activated the stack by clicking, false if not. This * determines whether we show a visual report when turning on the script. */ - toggleScript (topBlockId, opts) { - opts = Object.assign({ - target: this._editingTarget, - stackClick: false - }, opts); + toggleScript(topBlockId, opts) { + opts = Object.assign( + { + target: this._editingTarget, + stackClick: false, + }, + opts + ); // Remove any existing thread. for (let i = 0; i < this.threads.length; i++) { // Toggling a script that's already running turns it off - if (this.threads[i].topBlock === topBlockId && this.threads[i].status !== Thread.STATUS_DONE) { + if ( + this.threads[i].topBlock === topBlockId && + this.threads[i].status !== Thread.STATUS_DONE + ) { const blockContainer = opts.target.blocks; - const opcode = blockContainer.getOpcode(blockContainer.getBlock(topBlockId)); + const opcode = blockContainer.getOpcode( + blockContainer.getBlock(topBlockId) + ); - if (this.getIsEdgeActivatedHat(opcode) && this.threads[i].stackClick !== opts.stackClick) { + if ( + this.getIsEdgeActivatedHat(opcode) && + this.threads[i].stackClick !== opts.stackClick + ) { // Allow edge activated hat thread stack click to coexist with // edge activated hat thread that runs every frame continue; @@ -1758,17 +1924,20 @@ class Runtime extends EventEmitter { * @param {!string} topBlockId ID of block that starts the script. * @param {?Target} optTarget target Target to run script on. If not supplied, uses editing target. */ - addMonitorScript (topBlockId, optTarget) { + addMonitorScript(topBlockId, optTarget) { if (!optTarget) optTarget = this._editingTarget; for (let i = 0; i < this.threads.length; i++) { // Don't re-add the script if it's already running - if (this.threads[i].topBlock === topBlockId && this.threads[i].status !== Thread.STATUS_DONE && - this.threads[i].updateMonitor) { + if ( + this.threads[i].topBlock === topBlockId && + this.threads[i].status !== Thread.STATUS_DONE && + this.threads[i].updateMonitor + ) { return; } } // Otherwise add it. - this._pushThread(topBlockId, optTarget, {updateMonitor: true}); + this._pushThread(topBlockId, optTarget, { updateMonitor: true }); } /** @@ -1779,7 +1948,7 @@ class Runtime extends EventEmitter { * @param {!Function} f Function to call for each script. * @param {Target=} optTarget Optionally, a target to restrict to. */ - allScriptsDo (f, optTarget) { + allScriptsDo(f, optTarget) { let targets = this.executableTargets; if (optTarget) { targets = [optTarget]; @@ -1794,14 +1963,17 @@ class Runtime extends EventEmitter { } } - allScriptsByOpcodeDo (opcode, f, optTarget) { + allScriptsByOpcodeDo(opcode, f, optTarget) { let targets = this.executableTargets; if (optTarget) { targets = [optTarget]; } for (let t = targets.length - 1; t >= 0; t--) { const target = targets[t]; - const scripts = BlocksRuntimeCache.getScripts(target.blocks, opcode); + const scripts = BlocksRuntimeCache.getScripts( + target.blocks, + opcode + ); for (let j = 0; j < scripts.length; j++) { f(scripts[j], target); } @@ -1815,9 +1987,13 @@ class Runtime extends EventEmitter { * @param {Target=} optTarget Optionally, a target to restrict to. * @return {Array.} List of threads started by this function. */ - startHats (requestedHatOpcode, - optMatchFields, optTarget) { - if (!Object.prototype.hasOwnProperty.call(this._hats, requestedHatOpcode)) { + startHats(requestedHatOpcode, optMatchFields, optTarget) { + if ( + !Object.prototype.hasOwnProperty.call( + this._hats, + requestedHatOpcode + ) + ) { // No known hat with this opcode. return; } @@ -1827,75 +2003,86 @@ class Runtime extends EventEmitter { const hatMeta = instance._hats[requestedHatOpcode]; for (const opts in optMatchFields) { - if (!Object.prototype.hasOwnProperty.call(optMatchFields, opts)) continue; + if (!Object.prototype.hasOwnProperty.call(optMatchFields, opts)) + continue; optMatchFields[opts] = optMatchFields[opts].toUpperCase(); } // Consider all scripts, looking for hats with opcode `requestedHatOpcode`. - this.allScriptsByOpcodeDo(requestedHatOpcode, (script, target) => { - const { - blockId: topBlockId, - fieldsOfInputs: hatFields - } = script; - - // Match any requested fields. - // For example: ensures that broadcasts match. - // This needs to happen before the block is evaluated - // (i.e., before the predicate can be run) because "broadcast and wait" - // needs to have a precise collection of started threads. - for (const matchField in optMatchFields) { - if (hatFields[matchField].value !== optMatchFields[matchField]) { - // Field mismatch. - return; - } - } - - if (hatMeta.restartExistingThreads) { - // If `restartExistingThreads` is true, we should stop - // any existing threads starting with the top block. - for (let i = 0; i < this.threads.length; i++) { - if (this.threads[i].target === target && - this.threads[i].topBlock === topBlockId && - // stack click threads and hat threads can coexist - !this.threads[i].stackClick) { - newThreads.push(this._restartThread(this.threads[i])); + this.allScriptsByOpcodeDo( + requestedHatOpcode, + (script, target) => { + const { blockId: topBlockId, fieldsOfInputs: hatFields } = + script; + + // Match any requested fields. + // For example: ensures that broadcasts match. + // This needs to happen before the block is evaluated + // (i.e., before the predicate can be run) because "broadcast and wait" + // needs to have a precise collection of started threads. + for (const matchField in optMatchFields) { + if ( + hatFields[matchField].value !== + optMatchFields[matchField] + ) { + // Field mismatch. return; } } - } else { - // If `restartExistingThreads` is false, we should - // give up if any threads with the top block are running. - for (let j = 0; j < this.threads.length; j++) { - if (this.threads[j].target === target && - this.threads[j].topBlock === topBlockId && - // stack click threads and hat threads can coexist - !this.threads[j].stackClick && - this.threads[j].status !== Thread.STATUS_DONE) { - // Some thread is already running. - return; + + if (hatMeta.restartExistingThreads) { + // If `restartExistingThreads` is true, we should stop + // any existing threads starting with the top block. + for (let i = 0; i < this.threads.length; i++) { + if ( + this.threads[i].target === target && + this.threads[i].topBlock === topBlockId && + // stack click threads and hat threads can coexist + !this.threads[i].stackClick + ) { + newThreads.push( + this._restartThread(this.threads[i]) + ); + return; + } + } + } else { + // If `restartExistingThreads` is false, we should + // give up if any threads with the top block are running. + for (let j = 0; j < this.threads.length; j++) { + if ( + this.threads[j].target === target && + this.threads[j].topBlock === topBlockId && + // stack click threads and hat threads can coexist + !this.threads[j].stackClick && + this.threads[j].status !== Thread.STATUS_DONE + ) { + // Some thread is already running. + return; + } } } - } - // Start the thread with this top block. - newThreads.push(this._pushThread(topBlockId, target)); - }, optTarget); + // Start the thread with this top block. + newThreads.push(this._pushThread(topBlockId, target)); + }, + optTarget + ); // For compatibility with Scratch 2, edge triggered hats need to be processed before // threads are stepped. See ScratchRuntime.as for original implementation - newThreads.forEach(thread => { + newThreads.forEach((thread) => { execute(this.sequencer, thread); thread.goToNextBlock(); }); return newThreads; } - /** * Dispose all targets. Return to clean state. */ - dispose () { + dispose() { this.stopAll(); // Deleting each target's variable's monitors. - this.targets.forEach(target => { + this.targets.forEach((target) => { if (target.isOriginal) target.deleteMonitors(); }); @@ -1920,8 +2107,10 @@ class Runtime extends EventEmitter { const newCloudDataManager = cloudDataManager(); this.hasCloudData = newCloudDataManager.hasCloudVariables; this.canAddCloudVariable = newCloudDataManager.canAddCloudVariable; - this.addCloudVariable = this._initializeAddCloudVariable(newCloudDataManager); - this.removeCloudVariable = this._initializeRemoveCloudVariable(newCloudDataManager); + this.addCloudVariable = + this._initializeAddCloudVariable(newCloudDataManager); + this.removeCloudVariable = + this._initializeRemoveCloudVariable(newCloudDataManager); } /** @@ -1930,7 +2119,7 @@ class Runtime extends EventEmitter { * into the correct execution order after calling this function. * @param {Target} target target to add */ - addTarget (target) { + addTarget(target) { this.targets.push(target); this.executableTargets.push(target); } @@ -1945,7 +2134,7 @@ class Runtime extends EventEmitter { * @param {number} delta number of positions to move target by * @returns {number} new position in execution order */ - moveExecutable (executableTarget, delta) { + moveExecutable(executableTarget, delta) { const oldIndex = this.executableTargets.indexOf(executableTarget); this.executableTargets.splice(oldIndex, 1); let newIndex = oldIndex + delta; @@ -1953,7 +2142,10 @@ class Runtime extends EventEmitter { newIndex = this.executableTargets.length; } if (newIndex <= 0) { - if (this.executableTargets.length > 0 && this.executableTargets[0].isStage) { + if ( + this.executableTargets.length > 0 && + this.executableTargets[0].isStage + ) { newIndex = 1; } else { newIndex = 0; @@ -1973,7 +2165,7 @@ class Runtime extends EventEmitter { * @param {number} newIndex position in execution order to place the target * @returns {number} new position in the execution order */ - setExecutablePosition (executableTarget, newIndex) { + setExecutablePosition(executableTarget, newIndex) { const oldIndex = this.executableTargets.indexOf(executableTarget); return this.moveExecutable(executableTarget, newIndex - oldIndex); } @@ -1982,7 +2174,7 @@ class Runtime extends EventEmitter { * Remove a target from the execution set. * @param {Target} executableTarget target to remove */ - removeExecutable (executableTarget) { + removeExecutable(executableTarget) { const oldIndex = this.executableTargets.indexOf(executableTarget); if (oldIndex > -1) { this.executableTargets.splice(oldIndex, 1); @@ -1993,8 +2185,8 @@ class Runtime extends EventEmitter { * Dispose of a target. * @param {!Target} disposingTarget Target to dispose of. */ - disposeTarget (disposingTarget) { - this.targets = this.targets.filter(target => { + disposeTarget(disposingTarget) { + this.targets = this.targets.filter((target) => { if (disposingTarget !== target) return true; // Allow target to do dispose actions. target.dispose(); @@ -2008,7 +2200,7 @@ class Runtime extends EventEmitter { * @param {!Target} target Target to stop threads for. * @param {Thread=} optThreadException Optional thread to skip. */ - stopForTarget (target, optThreadException) { + stopForTarget(target, optThreadException) { // Emit stop event to allow blocks to clean up any state. this.emit(Runtime.STOP_FOR_TARGET, target, optThreadException); @@ -2026,35 +2218,38 @@ class Runtime extends EventEmitter { /** * Reset the Run ID. Call this any time the project logically starts, stops, or changes identity. */ - resetRunId () { + resetRunId() { if (!this.storage) { // see also: attachStorage return; } const newRunId = uuid.v1(); - this.storage.scratchFetch.setMetadata(this.storage.scratchFetch.RequestMetadata.RunId, newRunId); + this.storage.scratchFetch.setMetadata( + this.storage.scratchFetch.RequestMetadata.RunId, + newRunId + ); } /** * Start all threads that start with the green flag. */ - greenFlag () { + greenFlag() { this.stopAll(); this.emit(Runtime.PROJECT_START); this.ioDevices.clock.resetProjectTimer(); - this.targets.forEach(target => target.clearEdgeActivatedValues()); + this.targets.forEach((target) => target.clearEdgeActivatedValues()); // Inform all targets of the green flag. for (let i = 0; i < this.targets.length; i++) { this.targets[i].onGreenFlag(); } - this.startHats('event_whenflagclicked'); + this.startHats("event_whenflagclicked"); } /** * Stop "everything." */ - stopAll () { + stopAll() { // Emit stop event to allow blocks to clean up any state. this.emit(Runtime.PROJECT_STOP_ALL); @@ -2062,8 +2257,13 @@ class Runtime extends EventEmitter { const newTargets = []; for (let i = 0; i < this.targets.length; i++) { this.targets[i].onStopAll(); - if (Object.prototype.hasOwnProperty.call(this.targets[i], 'isOriginal') && - !this.targets[i].isOriginal) { + if ( + Object.prototype.hasOwnProperty.call( + this.targets[i], + "isOriginal" + ) && + !this.targets[i].isOriginal + ) { this.targets[i].dispose(); } else { newTargets.push(this.targets[i]); @@ -2084,20 +2284,21 @@ class Runtime extends EventEmitter { * Repeatedly run `sequencer.stepThreads` and filter out * inactive threads after each iteration. */ - _step () { + _step() { if (this.profiler !== null) { if (stepProfilerId === -1) { - stepProfilerId = this.profiler.idByName('Runtime._step'); + stepProfilerId = this.profiler.idByName("Runtime._step"); } this.profiler.start(stepProfilerId); } // Clean up threads that were told to stop during or since the last step - this.threads = this.threads.filter(thread => !thread.isKilled); + this.threads = this.threads.filter((thread) => !thread.isKilled); // Find all edge-activated hats, and add them to threads to be evaluated. for (const hatType in this._hats) { - if (!Object.prototype.hasOwnProperty.call(this._hats, hatType)) continue; + if (!Object.prototype.hasOwnProperty.call(this._hats, hatType)) + continue; const hat = this._hats[hatType]; if (hat.edgeActivated) { this.startHats(hatType); @@ -2107,7 +2308,9 @@ class Runtime extends EventEmitter { this._pushMonitors(); if (this.profiler !== null) { if (stepThreadsProfilerId === -1) { - stepThreadsProfilerId = this.profiler.idByName('Sequencer.stepThreads'); + stepThreadsProfilerId = this.profiler.idByName( + "Sequencer.stepThreads" + ); } this.profiler.start(stepThreadsProfilerId); } @@ -2119,8 +2322,10 @@ class Runtime extends EventEmitter { // Add done threads so that even if a thread finishes within 1 frame, the green // flag will still indicate that a script ran. this._emitProjectRunStatus( - this.threads.length + doneThreads.length - - this._getMonitorThreadCount([...this.threads, ...doneThreads])); + this.threads.length + + doneThreads.length - + this._getMonitorThreadCount([...this.threads, ...doneThreads]) + ); // Store threads that completed this iteration for testing and other // internal purposes. this._lastStepDoneThreads = doneThreads; @@ -2128,7 +2333,8 @@ class Runtime extends EventEmitter { // @todo: Only render when this.redrawRequested or clones rendered. if (this.profiler !== null) { if (rendererDrawProfilerId === -1) { - rendererDrawProfilerId = this.profiler.idByName('RenderWebGL.draw'); + rendererDrawProfilerId = + this.profiler.idByName("RenderWebGL.draw"); } this.profiler.start(rendererDrawProfilerId); } @@ -2139,7 +2345,10 @@ class Runtime extends EventEmitter { } if (this._refreshTargets) { - this.emit(Runtime.TARGETS_UPDATE, false /* Don't emit project changed */); + this.emit( + Runtime.TARGETS_UPDATE, + false /* Don't emit project changed */ + ); this._refreshTargets = false; } @@ -2160,9 +2369,9 @@ class Runtime extends EventEmitter { * @param {!Array.} threads The set of threads to look through. * @return {number} The number of monitor threads in threads. */ - _getMonitorThreadCount (threads) { + _getMonitorThreadCount(threads) { let count = 0; - threads.forEach(thread => { + threads.forEach((thread) => { if (thread.updateMonitor) count++; }); return count; @@ -2171,7 +2380,7 @@ class Runtime extends EventEmitter { /** * Queue monitor blocks to sequencer to be run. */ - _pushMonitors () { + _pushMonitors() { this.monitorBlocks.runAllMonitored(this); } @@ -2179,7 +2388,7 @@ class Runtime extends EventEmitter { * Set the current editing target known by the runtime. * @param {!Target} editingTarget New editing target. */ - setEditingTarget (editingTarget) { + setEditingTarget(editingTarget) { const oldEditingTarget = this._editingTarget; this._editingTarget = editingTarget; // Script glows must be cleared. @@ -2195,7 +2404,7 @@ class Runtime extends EventEmitter { * Set whether we are in 30 TPS compatibility mode. * @param {boolean} compatibilityModeOn True iff in compatibility mode. */ - setCompatibilityMode (compatibilityModeOn) { + setCompatibilityMode(compatibilityModeOn) { this.compatibilityMode = compatibilityModeOn; if (this._steppingInterval) { clearInterval(this._steppingInterval); @@ -2209,7 +2418,7 @@ class Runtime extends EventEmitter { * Looks at `this.threads` and notices which have turned on/off new glows. * @param {Array.=} optExtraThreads Optional list of inactive threads. */ - _updateGlows (optExtraThreads) { + _updateGlows(optExtraThreads) { const searchThreads = []; searchThreads.push(...this.threads); if (optExtraThreads) { @@ -2226,12 +2435,12 @@ class Runtime extends EventEmitter { if (target === this._editingTarget) { const blockForThread = thread.blockGlowInFrame; if (thread.requestScriptGlowInFrame || thread.stackClick) { - let script = target.blocks.getTopLevelScript(blockForThread); + let script = + target.blocks.getTopLevelScript(blockForThread); if (!script) { // Attempt to find in flyout blocks. - script = this.flyoutBlocks.getTopLevelScript( - blockForThread - ); + script = + this.flyoutBlocks.getTopLevelScript(blockForThread); } if (script) { requestedGlowsThisFrame.push(script); @@ -2267,7 +2476,7 @@ class Runtime extends EventEmitter { * * @param {number} nonMonitorThreadCount The new nonMonitorThreadCount */ - _emitProjectRunStatus (nonMonitorThreadCount) { + _emitProjectRunStatus(nonMonitorThreadCount) { if (this._nonMonitorThreadCount === 0 && nonMonitorThreadCount > 0) { this.emit(Runtime.PROJECT_RUN_START); } @@ -2283,7 +2492,7 @@ class Runtime extends EventEmitter { * still be tracking glow data about it. * @param {!string} scriptBlockId Id of top-level block in script to quiet. */ - quietGlow (scriptBlockId) { + quietGlow(scriptBlockId) { const index = this._scriptGlowsPreviousFrame.indexOf(scriptBlockId); if (index > -1) { this._scriptGlowsPreviousFrame.splice(index, 1); @@ -2295,11 +2504,11 @@ class Runtime extends EventEmitter { * @param {?string} blockId ID for the block to update glow * @param {boolean} isGlowing True to turn on glow; false to turn off. */ - glowBlock (blockId, isGlowing) { + glowBlock(blockId, isGlowing) { if (isGlowing) { - this.emit(Runtime.BLOCK_GLOW_ON, {id: blockId}); + this.emit(Runtime.BLOCK_GLOW_ON, { id: blockId }); } else { - this.emit(Runtime.BLOCK_GLOW_OFF, {id: blockId}); + this.emit(Runtime.BLOCK_GLOW_OFF, { id: blockId }); } } @@ -2308,11 +2517,11 @@ class Runtime extends EventEmitter { * @param {?string} topBlockId ID for the top block to update glow * @param {boolean} isGlowing True to turn on glow; false to turn off. */ - glowScript (topBlockId, isGlowing) { + glowScript(topBlockId, isGlowing) { if (isGlowing) { - this.emit(Runtime.SCRIPT_GLOW_ON, {id: topBlockId}); + this.emit(Runtime.SCRIPT_GLOW_ON, { id: topBlockId }); } else { - this.emit(Runtime.SCRIPT_GLOW_OFF, {id: topBlockId}); + this.emit(Runtime.SCRIPT_GLOW_OFF, { id: topBlockId }); } } @@ -2320,7 +2529,7 @@ class Runtime extends EventEmitter { * Emit whether blocks are being dragged over gui * @param {boolean} areBlocksOverGui True if blocks are dragged out of blocks workspace, false otherwise */ - emitBlockDragUpdate (areBlocksOverGui) { + emitBlockDragUpdate(areBlocksOverGui) { this.emit(Runtime.BLOCK_DRAG_UPDATE, areBlocksOverGui); } @@ -2329,7 +2538,7 @@ class Runtime extends EventEmitter { * @param {Array.} blocks The set of blocks dragged to the GUI * @param {string} topBlockId The original id of the top block being dragged */ - emitBlockEndDrag (blocks, topBlockId) { + emitBlockEndDrag(blocks, topBlockId) { this.emit(Runtime.BLOCK_DRAG_END, blocks, topBlockId); } @@ -2338,8 +2547,8 @@ class Runtime extends EventEmitter { * @param {string} blockId ID for the block. * @param {string} value Value to show associated with the block. */ - visualReport (blockId, value) { - this.emit(Runtime.VISUAL_REPORT, {id: blockId, value: String(value)}); + visualReport(blockId, value) { + this.emit(Runtime.VISUAL_REPORT, { id: blockId, value: String(value) }); } /** @@ -2347,9 +2556,10 @@ class Runtime extends EventEmitter { * updates those properties that are defined in the given monitor record. * @param {!MonitorRecord} monitor Monitor to add. */ - requestAddMonitor (monitor) { - const id = monitor.get('id'); - if (!this.requestUpdateMonitor(monitor)) { // update monitor if it exists in the state + requestAddMonitor(monitor) { + const id = monitor.get("id"); + if (!this.requestUpdateMonitor(monitor)) { + // update monitor if it exists in the state // if the monitor did not exist in the state, add it this._monitorState = this._monitorState.set(id, monitor); } @@ -2362,17 +2572,20 @@ class Runtime extends EventEmitter { * the old monitor will keep its old value. * @return {boolean} true if monitor exists in the state and was updated, false if it did not exist. */ - requestUpdateMonitor (monitor) { - const id = monitor.get('id'); + requestUpdateMonitor(monitor) { + const id = monitor.get("id"); if (this._monitorState.has(id)) { this._monitorState = // Use mergeWith here to prevent undefined values from overwriting existing ones - this._monitorState.set(id, this._monitorState.get(id).mergeWith((prev, next) => { - if (typeof next === 'undefined' || next === null) { - return prev; - } - return next; - }, monitor)); + this._monitorState.set( + id, + this._monitorState.get(id).mergeWith((prev, next) => { + if (typeof next === "undefined" || next === null) { + return prev; + } + return next; + }, monitor) + ); return true; } return false; @@ -2383,7 +2596,7 @@ class Runtime extends EventEmitter { * not exist in the state. * @param {!string} monitorId ID of the monitor to remove. */ - requestRemoveMonitor (monitorId) { + requestRemoveMonitor(monitorId) { this._monitorState = this._monitorState.delete(monitorId); } @@ -2392,11 +2605,13 @@ class Runtime extends EventEmitter { * @param {!string} monitorId ID of the monitor to hide. * @return {boolean} true if monitor exists and was updated, false otherwise */ - requestHideMonitor (monitorId) { - return this.requestUpdateMonitor(new Map([ - ['id', monitorId], - ['visible', false] - ])); + requestHideMonitor(monitorId) { + return this.requestUpdateMonitor( + new Map([ + ["id", monitorId], + ["visible", false], + ]) + ); } /** @@ -2405,11 +2620,13 @@ class Runtime extends EventEmitter { * @param {!string} monitorId ID of the monitor to show. * @return {boolean} true if monitor exists and was updated, false otherwise */ - requestShowMonitor (monitorId) { - return this.requestUpdateMonitor(new Map([ - ['id', monitorId], - ['visible', true] - ])); + requestShowMonitor(monitorId) { + return this.requestUpdateMonitor( + new Map([ + ["id", monitorId], + ["visible", true], + ]) + ); } /** @@ -2417,8 +2634,10 @@ class Runtime extends EventEmitter { * the monitor already does not exist in the state. * @param {!string} targetId Remove all monitors with given target ID. */ - requestRemoveMonitorByTargetId (targetId) { - this._monitorState = this._monitorState.filterNot(value => value.targetId === targetId); + requestRemoveMonitorByTargetId(targetId) { + this._monitorState = this._monitorState.filterNot( + (value) => value.targetId === targetId + ); } /** @@ -2426,7 +2645,7 @@ class Runtime extends EventEmitter { * @param {string} targetId Id of target to find. * @return {?Target} The target, if found. */ - getTargetById (targetId) { + getTargetById(targetId) { for (let i = 0; i < this.targets.length; i++) { const target = this.targets[i]; if (target.id === targetId) { @@ -2440,7 +2659,7 @@ class Runtime extends EventEmitter { * @param {string} spriteName Name of sprite to look for. * @return {?Target} Target representing a sprite of the given name. */ - getSpriteTargetByName (spriteName) { + getSpriteTargetByName(spriteName) { for (let i = 0; i < this.targets.length; i++) { const target = this.targets[i]; if (target.isStage) { @@ -2457,7 +2676,7 @@ class Runtime extends EventEmitter { * @param {number} drawableID drawable id of target to find * @return {?Target} The target, if found */ - getTargetByDrawableId (drawableID) { + getTargetByDrawableId(drawableID) { for (let i = 0; i < this.targets.length; i++) { const target = this.targets[i]; if (target.drawableID === drawableID) return target; @@ -2468,7 +2687,7 @@ class Runtime extends EventEmitter { * Update the clone counter to track how many clones are created. * @param {number} changeAmount How many clones have been created/destroyed. */ - changeCloneCounter (changeAmount) { + changeCloneCounter(changeAmount) { this._cloneCounter += changeAmount; } @@ -2476,14 +2695,14 @@ class Runtime extends EventEmitter { * Return whether there are clones available. * @return {boolean} True until the number of clones hits Runtime.MAX_CLONES. */ - clonesAvailable () { + clonesAvailable() { return this._cloneCounter < Runtime.MAX_CLONES; } /** * Handle that the project has loaded in the Virtual Machine. */ - handleProjectLoaded () { + handleProjectLoaded() { this.emit(Runtime.PROJECT_LOADED); this.resetRunId(); } @@ -2491,7 +2710,7 @@ class Runtime extends EventEmitter { /** * Report that the project has changed in a way that would affect serialization */ - emitProjectChanged () { + emitProjectChanged() { this.emit(Runtime.PROJECT_CHANGED); } @@ -2501,8 +2720,8 @@ class Runtime extends EventEmitter { * @param {Target} [sourceTarget] - the target used as a source for the new clone, if any. * @fires Runtime#targetWasCreated */ - fireTargetWasCreated (newTarget, sourceTarget) { - this.emit('targetWasCreated', newTarget, sourceTarget); + fireTargetWasCreated(newTarget, sourceTarget) { + this.emit("targetWasCreated", newTarget, sourceTarget); } /** @@ -2510,15 +2729,15 @@ class Runtime extends EventEmitter { * @param {Target} target - the target being removed * @fires Runtime#targetWasRemoved */ - fireTargetWasRemoved (target) { - this.emit('targetWasRemoved', target); + fireTargetWasRemoved(target) { + this.emit("targetWasRemoved", target); } /** * Get a target representing the Scratch stage, if one exists. * @return {?Target} The target, if found. */ - getTargetForStage () { + getTargetForStage() { for (let i = 0; i < this.targets.length; i++) { const target = this.targets[i]; if (target.isStage) { @@ -2531,14 +2750,17 @@ class Runtime extends EventEmitter { * Get the editing target. * @return {?Target} The editing target. */ - getEditingTarget () { + getEditingTarget() { return this._editingTarget; } - getAllVarNamesOfType (varType) { + getAllVarNamesOfType(varType) { let varNames = []; for (const target of this.targets) { - const targetVarNames = target.getAllVariableNamesInScopeByType(varType, true); + const targetVarNames = target.getAllVariableNamesInScopeByType( + varType, + true + ); varNames = varNames.concat(targetVarNames); } return varNames; @@ -2552,20 +2774,20 @@ class Runtime extends EventEmitter { * @property {Function} [labelFn] - function to generate the label for this opcode * @property {string} [label] - the label for this opcode if `labelFn` is absent */ - getLabelForOpcode (extendedOpcode) { - const [category, opcode] = StringUtil.splitFirst(extendedOpcode, '_'); + getLabelForOpcode(extendedOpcode) { + const [category, opcode] = StringUtil.splitFirst(extendedOpcode, "_"); if (!(category && opcode)) return; - const categoryInfo = this._blockInfo.find(ci => ci.id === category); + const categoryInfo = this._blockInfo.find((ci) => ci.id === category); if (!categoryInfo) return; - const block = categoryInfo.blocks.find(b => b.info.opcode === opcode); + const block = categoryInfo.blocks.find((b) => b.info.opcode === opcode); if (!block) return; // TODO: we may want to format the label in a locale-specific way. return { - category: 'extension', // This assumes that all extensions have the same monitor color. - label: `${categoryInfo.name}: ${block.info.text}` + category: "extension", // This assumes that all extensions have the same monitor color. + label: `${categoryInfo.name}: ${block.info.text}`, }; } @@ -2578,8 +2800,9 @@ class Runtime extends EventEmitter { * @param {string} optVarType The type of the variable to create. Defaults to Variable.SCALAR_TYPE. * @return {Variable} The new variable that was created. */ - createNewGlobalVariable (variableName, optVarId, optVarType) { - const varType = (typeof optVarType === 'string') ? optVarType : Variable.SCALAR_TYPE; + createNewGlobalVariable(variableName, optVarId, optVarType) { + const varType = + typeof optVarType === "string" ? optVarType : Variable.SCALAR_TYPE; const allVariableNames = this.getAllVarNamesOfType(varType); const newName = StringUtil.unusedName(variableName, allVariableNames); const variable = new Variable(optVarId || uid(), newName, varType); @@ -2592,7 +2815,7 @@ class Runtime extends EventEmitter { * Tell the runtime to request a redraw. * Use after a clone/sprite has completed some visible operation on the stage. */ - requestRedraw () { + requestRedraw() { this.redrawRequested = true; } @@ -2601,7 +2824,7 @@ class Runtime extends EventEmitter { * the original sprite * @param {!Target} target Target requesting the targets update */ - requestTargetsUpdate (target) { + requestTargetsUpdate(target) { if (!target.isOriginal) return; this._refreshTargets = true; } @@ -2609,21 +2832,21 @@ class Runtime extends EventEmitter { /** * Emit an event that indicates that the blocks on the workspace need updating. */ - requestBlocksUpdate () { + requestBlocksUpdate() { this.emit(Runtime.BLOCKS_NEED_UPDATE); } /** * Emit an event that indicates that the toolbox extension blocks need updating. */ - requestToolboxExtensionsUpdate () { + requestToolboxExtensionsUpdate() { this.emit(Runtime.TOOLBOX_EXTENSIONS_NEED_UPDATE); } /** * Set up timers to repeatedly step in a browser. */ - start () { + start() { // Do not start if we are already running if (this._steppingInterval) return; @@ -2642,7 +2865,7 @@ class Runtime extends EventEmitter { * Quit the Runtime, clearing any handles which might keep the process alive. * Do not use the runtime after calling this method. This method is meant for test shutdown. */ - quit () { + quit() { clearInterval(this._steppingInterval); this._steppingInterval = null; } @@ -2652,7 +2875,7 @@ class Runtime extends EventEmitter { * @param {Profiler/FrameCallback} onFrame A callback handle passed a * profiling frame when the profiler reports its collected data. */ - enableProfiling (onFrame) { + enableProfiling(onFrame) { if (Profiler.available()) { this.profiler = new Profiler(onFrame); } @@ -2661,7 +2884,7 @@ class Runtime extends EventEmitter { /** * Turn off profiling. */ - disableProfiling () { + disableProfiling() { this.profiler = null; } @@ -2670,7 +2893,7 @@ class Runtime extends EventEmitter { * This value is helpful in certain instances for compatibility with Scratch 2, * which sometimes uses a `currentMSecs` timestamp value in Interpreter.as */ - updateCurrentMSecs () { + updateCurrentMSecs() { this.currentMSecs = Date.now(); } } From 42efd32514549dcb1ff3158edb182aebdd2271fb Mon Sep 17 00:00:00 2001 From: Aaron Dodson Date: Tue, 3 Sep 2024 13:33:20 -0700 Subject: [PATCH 006/521] fix: add the monitor block extension to extension monitor blocks (#6) --- packages/scratch-vm/src/engine/runtime.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/scratch-vm/src/engine/runtime.js b/packages/scratch-vm/src/engine/runtime.js index 58d20485e68..2d3aefd499d 100644 --- a/packages/scratch-vm/src/engine/runtime.js +++ b/packages/scratch-vm/src/engine/runtime.js @@ -1293,7 +1293,10 @@ class Runtime extends EventEmitter { if (blockInfo.blockType === BlockType.REPORTER) { if (!blockInfo.disableMonitor && context.inputList.length === 0) { - blockJSON.checkboxInFlyout = true; + if (!blockJSON.extensions) { + blockJSON.extensions = []; + } + blockJSON.extensions.push("monitor_block"); } } else if (blockInfo.blockType === BlockType.LOOP) { // Add icon to the bottom right of a loop block From 686996af76c712215fb6e23b960e2fc59d94d3c9 Mon Sep 17 00:00:00 2001 From: Aaron Dodson Date: Thu, 5 Sep 2024 15:53:02 -0700 Subject: [PATCH 007/521] refactor: use block styles instead of colors (#7) --- packages/scratch-vm/src/engine/runtime.js | 21 +++++---------------- 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/packages/scratch-vm/src/engine/runtime.js b/packages/scratch-vm/src/engine/runtime.js index 2d3aefd499d..59a1405b164 100644 --- a/packages/scratch-vm/src/engine/runtime.js +++ b/packages/scratch-vm/src/engine/runtime.js @@ -1049,9 +1049,7 @@ class Runtime extends EventEmitter { type: menuId, inputsInline: true, output: "String", - colour: categoryInfo.color1, - colourSecondary: categoryInfo.color2, - colourTertiary: categoryInfo.color3, + style: categoryInfo.id, outputShape: menuInfo.acceptReporters ? ScratchBlocksConstants.OUTPUT_SHAPE_ROUND : ScratchBlocksConstants.OUTPUT_SHAPE_SQUARE, @@ -1108,9 +1106,7 @@ class Runtime extends EventEmitter { message0: "%1", inputsInline: true, output: output, - colour: categoryInfo.color1, - colourSecondary: categoryInfo.color2, - colourTertiary: categoryInfo.color3, + style: categoryInfo.id, outputShape: outputShape, args0: [ { @@ -1155,9 +1151,8 @@ class Runtime extends EventEmitter { type: extendedOpcode, inputsInline: true, category: categoryInfo.name, - colour: categoryInfo.color1, - colourSecondary: categoryInfo.color2, - colourTertiary: categoryInfo.color3, + style: categoryInfo.id, + extensions: [], }; const context = { // TODO: store this somewhere so that we can map args appropriately after translation. @@ -1177,7 +1172,7 @@ class Runtime extends EventEmitter { const iconURI = blockInfo.blockIconURI || categoryInfo.blockIconURI; if (iconURI) { - blockJSON.extensions = ["scratch_extension"]; + blockJSON.extensions.push("scratch_extension"); blockJSON.message0 = "%1 %2"; const iconJSON = { type: "field_image", @@ -1224,9 +1219,6 @@ class Runtime extends EventEmitter { blockJSON.outputShape = ScratchBlocksConstants.OUTPUT_SHAPE_SQUARE; blockJSON.nextStatement = null; // null = available connection; undefined = terminal - if (!blockJSON.extensions) { - blockJSON.extensions = []; - } blockJSON.extensions.push("shape_hat"); break; case BlockType.CONDITIONAL: @@ -1293,9 +1285,6 @@ class Runtime extends EventEmitter { if (blockInfo.blockType === BlockType.REPORTER) { if (!blockInfo.disableMonitor && context.inputList.length === 0) { - if (!blockJSON.extensions) { - blockJSON.extensions = []; - } blockJSON.extensions.push("monitor_block"); } } else if (blockInfo.blockType === BlockType.LOOP) { From ced972e9a9d4c9bdb063bc47edb8144fa4ae8731 Mon Sep 17 00:00:00 2001 From: Aaron Dodson Date: Mon, 16 Sep 2024 09:49:20 -0700 Subject: [PATCH 008/521] fix: update VM state when blocks are removed from an input previously occupied by a shadow block (#8) * chore: format engine/blocks.js * fix: restore shadow blocks when removing a block from an input --- packages/scratch-vm/src/engine/blocks.js | 1096 +++++++++++++--------- 1 file changed, 651 insertions(+), 445 deletions(-) diff --git a/packages/scratch-vm/src/engine/blocks.js b/packages/scratch-vm/src/engine/blocks.js index 2796d9ed0de..fecd0cb92d8 100644 --- a/packages/scratch-vm/src/engine/blocks.js +++ b/packages/scratch-vm/src/engine/blocks.js @@ -1,14 +1,14 @@ -const adapter = require('./adapter'); -const mutationAdapter = require('./mutation-adapter'); -const xmlEscape = require('../util/xml-escape'); -const MonitorRecord = require('./monitor-record'); -const Clone = require('../util/clone'); -const {Map} = require('immutable'); -const BlocksExecuteCache = require('./blocks-execute-cache'); -const BlocksRuntimeCache = require('./blocks-runtime-cache'); -const log = require('../util/log'); -const Variable = require('./variable'); -const getMonitorIdForBlockWithArgs = require('../util/get-monitor-id'); +const adapter = require("./adapter"); +const mutationAdapter = require("./mutation-adapter"); +const xmlEscape = require("../util/xml-escape"); +const MonitorRecord = require("./monitor-record"); +const Clone = require("../util/clone"); +const { Map } = require("immutable"); +const BlocksExecuteCache = require("./blocks-execute-cache"); +const BlocksRuntimeCache = require("./blocks-runtime-cache"); +const log = require("../util/log"); +const Variable = require("./variable"); +const getMonitorIdForBlockWithArgs = require("../util/get-monitor-id"); /** * @fileoverview @@ -23,7 +23,7 @@ const getMonitorIdForBlockWithArgs = require('../util/get-monitor-id'); * should not request glows. This does not affect glows when clicking on a block to execute it. */ class Blocks { - constructor (runtime, optNoGlow) { + constructor(runtime, optNoGlow) { this.runtime = runtime; /** @@ -45,7 +45,10 @@ class Blocks { * @type {{inputs: {}, procedureParamNames: {}, procedureDefinitions: {}}} * @private */ - Object.defineProperty(this, '_cache', {writable: true, enumerable: false}); + Object.defineProperty(this, "_cache", { + writable: true, + enumerable: false, + }); this._cache = { /** * Cache block inputs by block id @@ -81,7 +84,7 @@ class Blocks { * A cache of hat opcodes to collection of theads to execute. * @type {object.} */ - scripts: {} + scripts: {}, }; /** @@ -101,8 +104,8 @@ class Blocks { * are prefixed with this string. * @const{string} */ - static get BRANCH_INPUT_PREFIX () { - return 'SUBSTACK'; + static get BRANCH_INPUT_PREFIX() { + return "SUBSTACK"; } /** @@ -110,7 +113,7 @@ class Blocks { * @param {!string} blockId ID of block we have stored. * @return {?object} Metadata about the block, if it exists. */ - getBlock (blockId) { + getBlock(blockId) { return this._blocks[blockId]; } @@ -118,18 +121,18 @@ class Blocks { * Get all known top-level blocks that start scripts. * @return {Array.} List of block IDs. */ - getScripts () { + getScripts() { return this._scripts; } /** - * Get the next block for a particular block - * @param {?string} id ID of block to get the next block for - * @return {?string} ID of next block in the sequence - */ - getNextBlock (id) { + * Get the next block for a particular block + * @param {?string} id ID of block to get the next block for + * @return {?string} ID of next block in the sequence + */ + getNextBlock(id) { const block = this._blocks[id]; - return (typeof block === 'undefined') ? null : block.next; + return typeof block === "undefined" ? null : block.next; } /** @@ -138,9 +141,9 @@ class Blocks { * @param {?number} branchNum Which branch to select (e.g. for if-else). * @return {?string} ID of block in the branch. */ - getBranch (id, branchNum) { + getBranch(id, branchNum) { const block = this._blocks[id]; - if (typeof block === 'undefined') return null; + if (typeof block === "undefined") return null; if (!branchNum) branchNum = 1; let inputName = Blocks.BRANCH_INPUT_PREFIX; @@ -150,7 +153,7 @@ class Blocks { // Empty C-block? const input = block.inputs[inputName]; - return (typeof input === 'undefined') ? null : input.block; + return typeof input === "undefined" ? null : input.block; } /** @@ -158,8 +161,8 @@ class Blocks { * @param {?object} block The block to query * @return {?string} the opcode corresponding to that block */ - getOpcode (block) { - return (typeof block === 'undefined') ? null : block.opcode; + getOpcode(block) { + return typeof block === "undefined" ? null : block.opcode; } /** @@ -167,8 +170,8 @@ class Blocks { * @param {?object} block The block to query. * @return {?object} All fields and their values. */ - getFields (block) { - return (typeof block === 'undefined') ? null : block.fields; + getFields(block) { + return typeof block === "undefined" ? null : block.fields; } /** @@ -176,18 +179,20 @@ class Blocks { * @param {?object} block the block to query. * @return {?Array.} All non-branch inputs and their associated blocks. */ - getInputs (block) { - if (typeof block === 'undefined') return null; + getInputs(block) { + if (typeof block === "undefined") return null; let inputs = this._cache.inputs[block.id]; - if (typeof inputs !== 'undefined') { + if (typeof inputs !== "undefined") { return inputs; } inputs = {}; for (const input in block.inputs) { // Ignore blocks prefixed with branch prefix. - if (input.substring(0, Blocks.BRANCH_INPUT_PREFIX.length) !== - Blocks.BRANCH_INPUT_PREFIX) { + if ( + input.substring(0, Blocks.BRANCH_INPUT_PREFIX.length) !== + Blocks.BRANCH_INPUT_PREFIX + ) { inputs[input] = block.inputs[input]; } } @@ -201,8 +206,8 @@ class Blocks { * @param {?object} block The block to query. * @return {?object} Mutation for the block. */ - getMutation (block) { - return (typeof block === 'undefined') ? null : block.mutation; + getMutation(block) { + return typeof block === "undefined" ? null : block.mutation; } /** @@ -210,9 +215,9 @@ class Blocks { * @param {?string} id ID of block to query. * @return {?string} ID of top-level script block. */ - getTopLevelScript (id) { + getTopLevelScript(id) { let block = this._blocks[id]; - if (typeof block === 'undefined') return null; + if (typeof block === "undefined") return null; while (block.parent !== null) { block = this._blocks[block.parent]; } @@ -224,16 +229,17 @@ class Blocks { * @param {?string} name Name of procedure to query. * @return {?string} ID of procedure definition. */ - getProcedureDefinition (name) { + getProcedureDefinition(name) { const blockID = this._cache.procedureDefinitions[name]; - if (typeof blockID !== 'undefined') { + if (typeof blockID !== "undefined") { return blockID; } for (const id in this._blocks) { - if (!Object.prototype.hasOwnProperty.call(this._blocks, id)) continue; + if (!Object.prototype.hasOwnProperty.call(this._blocks, id)) + continue; const block = this._blocks[id]; - if (block.opcode === 'procedures_definition') { + if (block.opcode === "procedures_definition") { const internal = this._getCustomBlockInternal(block); if (internal && internal.mutation.proccode === name) { this._cache.procedureDefinitions[name] = id; // The outer define block id @@ -251,7 +257,7 @@ class Blocks { * @param {?string} name Name of procedure to query. * @return {?Array.} List of param names for a procedure. */ - getProcedureParamNamesAndIds (name) { + getProcedureParamNamesAndIds(name) { return this.getProcedureParamNamesIdsAndDefaults(name).slice(0, 2); } @@ -260,17 +266,20 @@ class Blocks { * @param {?string} name Name of procedure to query. * @return {?Array.} List of param names for a procedure. */ - getProcedureParamNamesIdsAndDefaults (name) { + getProcedureParamNamesIdsAndDefaults(name) { const cachedNames = this._cache.procedureParamNames[name]; - if (typeof cachedNames !== 'undefined') { + if (typeof cachedNames !== "undefined") { return cachedNames; } for (const id in this._blocks) { - if (!Object.prototype.hasOwnProperty.call(this._blocks, id)) continue; + if (!Object.prototype.hasOwnProperty.call(this._blocks, id)) + continue; const block = this._blocks[id]; - if (block.opcode === 'procedures_prototype' && - block.mutation.proccode === name) { + if ( + block.opcode === "procedures_prototype" && + block.mutation.proccode === name + ) { const names = JSON.parse(block.mutation.argumentnames); const ids = JSON.parse(block.mutation.argumentids); const defaults = JSON.parse(block.mutation.argumentdefaults); @@ -284,7 +293,7 @@ class Blocks { return null; } - duplicate () { + duplicate() { const newBlocks = new Blocks(this.runtime, this.forceNoGlow); newBlocks._blocks = Clone.simple(this._blocks); newBlocks._scripts = Clone.simple(this._scripts); @@ -298,11 +307,14 @@ class Blocks { * runtime interface. * @param {object} e Blockly "block" or "variable" event */ - blocklyListen (e) { + blocklyListen(e) { // Validate event - if (typeof e !== 'object') return; - if (typeof e.blockId !== 'string' && typeof e.varId !== 'string' && - typeof e.commentId !== 'string') { + if (typeof e !== "object") return; + if ( + typeof e.blockId !== "string" && + typeof e.varId !== "string" && + typeof e.commentId !== "string" + ) { return; } const stage = this.runtime.getTargetForStage(); @@ -310,219 +322,315 @@ class Blocks { // Block create/update/destroy switch (e.type) { - case 'create': { - const newBlocks = adapter(e); - // A create event can create many blocks. Add them all. - for (let i = 0; i < newBlocks.length; i++) { - this.createBlock(newBlocks[i]); - } - break; - } - case 'change': - this.changeBlock({ - id: e.blockId, - element: e.element, - name: e.name, - value: e.newValue - }); - break; - case 'move': - this.moveBlock({ - id: e.blockId, - oldParent: e.oldParentId, - oldInput: e.oldInputName, - newParent: e.newParentId, - newInput: e.newInputName, - newCoordinate: e.newCoordinate - }); - break; - case 'dragOutside': - this.runtime.emitBlockDragUpdate(e.isOutside); - break; - case 'endDrag': - this.runtime.emitBlockDragUpdate(false /* areBlocksOverGui */); - - // Drag blocks onto another sprite - if (e.isOutside) { + case "create": { const newBlocks = adapter(e); - this.runtime.emitBlockEndDrag(newBlocks, e.blockId); - } - break; - case 'delete': - // Don't accept delete events for missing blocks, - // or shadow blocks being obscured. - if (!Object.prototype.hasOwnProperty.call(this._blocks, e.blockId) || - this._blocks[e.blockId].shadow) { - return; - } - // Inform any runtime to forget about glows on this script. - if (this._blocks[e.blockId].topLevel) { - this.runtime.quietGlow(e.blockId); + // A create event can create many blocks. Add them all. + for (let i = 0; i < newBlocks.length; i++) { + this.createBlock(newBlocks[i]); + } + break; } - this.deleteBlock(e.blockId); - break; - case 'var_create': - // Check if the variable being created is global or local - // If local, create a local var on the current editing target, as long - // as there are no conflicts, and the current target is actually a sprite - // If global or if the editing target is not present or we somehow got - // into a state where a local var was requested for the stage, - // create a stage (global) var after checking for name conflicts - // on all the sprites. - if (e.isLocal && editingTarget && !editingTarget.isStage && !e.isCloud) { - if (!editingTarget.lookupVariableById(e.varId)) { - editingTarget.createVariable(e.varId, e.varName, e.varType); - this.emitProjectChanged(); + case "change": + this.changeBlock({ + id: e.blockId, + element: e.element, + name: e.name, + value: e.newValue, + }); + break; + case "move": + this.moveBlock({ + id: e.blockId, + oldParent: e.oldParentId, + oldInput: e.oldInputName, + newParent: e.newParentId, + newInput: e.newInputName, + newCoordinate: e.newCoordinate, + }); + break; + case "dragOutside": + this.runtime.emitBlockDragUpdate(e.isOutside); + break; + case "endDrag": + this.runtime.emitBlockDragUpdate(false /* areBlocksOverGui */); + + // Drag blocks onto another sprite + if (e.isOutside) { + const newBlocks = adapter(e); + this.runtime.emitBlockEndDrag(newBlocks, e.blockId); } - } else { - if (stage.lookupVariableById(e.varId)) { - // Do not re-create a variable if it already exists + break; + case "delete": + // Don't accept delete events for missing blocks, + // or shadow blocks being obscured. + if ( + !Object.prototype.hasOwnProperty.call( + this._blocks, + e.blockId + ) || + this._blocks[e.blockId].shadow + ) { return; } - // Check for name conflicts in all of the targets - const allTargets = this.runtime.targets.filter(t => t.isOriginal); - for (const target of allTargets) { - if (target.lookupVariableByNameAndType(e.varName, e.varType, true)) { + // Inform any runtime to forget about glows on this script. + if (this._blocks[e.blockId].topLevel) { + this.runtime.quietGlow(e.blockId); + } + this.deleteBlock(e.blockId); + break; + case "var_create": + // Check if the variable being created is global or local + // If local, create a local var on the current editing target, as long + // as there are no conflicts, and the current target is actually a sprite + // If global or if the editing target is not present or we somehow got + // into a state where a local var was requested for the stage, + // create a stage (global) var after checking for name conflicts + // on all the sprites. + if ( + e.isLocal && + editingTarget && + !editingTarget.isStage && + !e.isCloud + ) { + if (!editingTarget.lookupVariableById(e.varId)) { + editingTarget.createVariable( + e.varId, + e.varName, + e.varType + ); + this.emitProjectChanged(); + } + } else { + if (stage.lookupVariableById(e.varId)) { + // Do not re-create a variable if it already exists return; } + // Check for name conflicts in all of the targets + const allTargets = this.runtime.targets.filter( + (t) => t.isOriginal + ); + for (const target of allTargets) { + if ( + target.lookupVariableByNameAndType( + e.varName, + e.varType, + true + ) + ) { + return; + } + } + stage.createVariable( + e.varId, + e.varName, + e.varType, + e.isCloud + ); + this.emitProjectChanged(); } - stage.createVariable(e.varId, e.varName, e.varType, e.isCloud); - this.emitProjectChanged(); - } - break; - case 'var_rename': - if (editingTarget && Object.prototype.hasOwnProperty.call(editingTarget.variables, e.varId)) { - // This is a local variable, rename on the current target - editingTarget.renameVariable(e.varId, e.newName); - // Update all the blocks on the current target that use - // this variable - editingTarget.blocks.updateBlocksAfterVarRename(e.varId, e.newName); - } else { - // This is a global variable - stage.renameVariable(e.varId, e.newName); - // Update all blocks on all targets that use the renamed variable - const targets = this.runtime.targets; - for (let i = 0; i < targets.length; i++) { - const currTarget = targets[i]; - currTarget.blocks.updateBlocksAfterVarRename(e.varId, e.newName); - } - } - this.emitProjectChanged(); - break; - case 'var_delete': { - const target = (editingTarget && Object.prototype.hasOwnProperty.call(editingTarget.variables, e.varId)) ? - editingTarget : stage; - target.deleteVariable(e.varId); - this.emitProjectChanged(); - break; - } - case 'block_comment_create': - case 'comment_create': - if (this.runtime.getEditingTarget()) { - const currTarget = this.runtime.getEditingTarget(); - currTarget.createComment(e.commentId, e.blockId, '', - e.json.x, e.json.y, e.json.width, e.json.height, false); - - if (currTarget.comments[e.commentId].x === null && - currTarget.comments[e.commentId].y === null) { - // Block comments imported from 2.0 projects are imported with their - // x and y coordinates set to null so that scratch-blocks can - // auto-position them. If we are receiving a create event for these - // comments, then the auto positioning should have taken place. - // Update the x and y position of these comments to match the - // one from the event. - currTarget.comments[e.commentId].x = e.json.x; - currTarget.comments[e.commentId].y = e.json.y; - } - } - this.emitProjectChanged(); - break; - case 'block_comment_change': - case 'comment_change': - if (this.runtime.getEditingTarget()) { - const currTarget = this.runtime.getEditingTarget(); - if (!Object.prototype.hasOwnProperty.call(currTarget.comments, e.commentId)) { - log.warn(`Cannot change comment with id ${e.commentId} because it does not exist.`); - return; + break; + case "var_rename": + if ( + editingTarget && + Object.prototype.hasOwnProperty.call( + editingTarget.variables, + e.varId + ) + ) { + // This is a local variable, rename on the current target + editingTarget.renameVariable(e.varId, e.newName); + // Update all the blocks on the current target that use + // this variable + editingTarget.blocks.updateBlocksAfterVarRename( + e.varId, + e.newName + ); + } else { + // This is a global variable + stage.renameVariable(e.varId, e.newName); + // Update all blocks on all targets that use the renamed variable + const targets = this.runtime.targets; + for (let i = 0; i < targets.length; i++) { + const currTarget = targets[i]; + currTarget.blocks.updateBlocksAfterVarRename( + e.varId, + e.newName + ); + } } - const comment = currTarget.comments[e.commentId]; - comment.text = e.newContents_; this.emitProjectChanged(); - } - break; - case 'block_comment_move': - case 'comment_move': - if (this.runtime.getEditingTarget()) { - const currTarget = this.runtime.getEditingTarget(); - if (currTarget && !Object.prototype.hasOwnProperty.call(currTarget.comments, e.commentId)) { - log.warn(`Cannot move comment with id ${e.commentId} because it does not exist.`); - return; - } - const comment = currTarget.comments[e.commentId]; - const newCoord = e.newCoordinate_; - comment.x = newCoord.x; - comment.y = newCoord.y; - + break; + case "var_delete": { + const target = + editingTarget && + Object.prototype.hasOwnProperty.call( + editingTarget.variables, + e.varId + ) + ? editingTarget + : stage; + target.deleteVariable(e.varId); this.emitProjectChanged(); + break; } - break; - case 'block_comment_collapse': - case 'comment_collapse': - if (this.runtime.getEditingTarget()) { - const currTarget = this.runtime.getEditingTarget(); - if (currTarget && !Object.prototype.hasOwnProperty.call(currTarget.comments, e.commentId)) { - log.warn(`Cannot collapse comment with id ${e.commentId} because it does not exist.`); - return; + case "block_comment_create": + case "comment_create": + if (this.runtime.getEditingTarget()) { + const currTarget = this.runtime.getEditingTarget(); + currTarget.createComment( + e.commentId, + e.blockId, + "", + e.json.x, + e.json.y, + e.json.width, + e.json.height, + false + ); + + if ( + currTarget.comments[e.commentId].x === null && + currTarget.comments[e.commentId].y === null + ) { + // Block comments imported from 2.0 projects are imported with their + // x and y coordinates set to null so that scratch-blocks can + // auto-position them. If we are receiving a create event for these + // comments, then the auto positioning should have taken place. + // Update the x and y position of these comments to match the + // one from the event. + currTarget.comments[e.commentId].x = e.json.x; + currTarget.comments[e.commentId].y = e.json.y; + } } - const comment = currTarget.comments[e.commentId]; - comment.minimized = e.newCollapsed; this.emitProjectChanged(); - } - break; - case 'block_comment_resize': - case 'comment_resize': - if (this.runtime.getEditingTarget()) { - const currTarget = this.runtime.getEditingTarget(); - if (currTarget && !Object.prototype.hasOwnProperty.call(currTarget.comments, e.commentId)) { - log.warn(`Cannot resize comment with id ${e.commentId} because it does not exist.`); - return; + break; + case "block_comment_change": + case "comment_change": + if (this.runtime.getEditingTarget()) { + const currTarget = this.runtime.getEditingTarget(); + if ( + !Object.prototype.hasOwnProperty.call( + currTarget.comments, + e.commentId + ) + ) { + log.warn( + `Cannot change comment with id ${e.commentId} because it does not exist.` + ); + return; + } + const comment = currTarget.comments[e.commentId]; + comment.text = e.newContents_; + this.emitProjectChanged(); } - const comment = currTarget.comments[e.commentId]; - comment.width = e.newSize.width; - comment.height = e.newSize.height; - this.emitProjectChanged(); - } - break; - case 'block_comment_delete': - case 'comment_delete': - if (this.runtime.getEditingTarget()) { - const currTarget = this.runtime.getEditingTarget(); - if (!Object.prototype.hasOwnProperty.call(currTarget.comments, e.commentId)) { - // If we're in this state, we have probably received - // a delete event from a workspace that we switched from - // (e.g. a delete event for a comment on sprite a's workspace - // when switching from sprite a to sprite b) - return; + break; + case "block_comment_move": + case "comment_move": + if (this.runtime.getEditingTarget()) { + const currTarget = this.runtime.getEditingTarget(); + if ( + currTarget && + !Object.prototype.hasOwnProperty.call( + currTarget.comments, + e.commentId + ) + ) { + log.warn( + `Cannot move comment with id ${e.commentId} because it does not exist.` + ); + return; + } + const comment = currTarget.comments[e.commentId]; + const newCoord = e.newCoordinate_; + comment.x = newCoord.x; + comment.y = newCoord.y; + + this.emitProjectChanged(); } - delete currTarget.comments[e.commentId]; - if (e.blockId) { - const block = currTarget.blocks.getBlock(e.blockId); - if (!block) { - log.warn(`Could not find block referenced by comment with id: ${e.commentId}`); + break; + case "block_comment_collapse": + case "comment_collapse": + if (this.runtime.getEditingTarget()) { + const currTarget = this.runtime.getEditingTarget(); + if ( + currTarget && + !Object.prototype.hasOwnProperty.call( + currTarget.comments, + e.commentId + ) + ) { + log.warn( + `Cannot collapse comment with id ${e.commentId} because it does not exist.` + ); return; } - delete block.comment; + const comment = currTarget.comments[e.commentId]; + comment.minimized = e.newCollapsed; + this.emitProjectChanged(); } + break; + case "block_comment_resize": + case "comment_resize": + if (this.runtime.getEditingTarget()) { + const currTarget = this.runtime.getEditingTarget(); + if ( + currTarget && + !Object.prototype.hasOwnProperty.call( + currTarget.comments, + e.commentId + ) + ) { + log.warn( + `Cannot resize comment with id ${e.commentId} because it does not exist.` + ); + return; + } + const comment = currTarget.comments[e.commentId]; + comment.width = e.newSize.width; + comment.height = e.newSize.height; + this.emitProjectChanged(); + } + break; + case "block_comment_delete": + case "comment_delete": + if (this.runtime.getEditingTarget()) { + const currTarget = this.runtime.getEditingTarget(); + if ( + !Object.prototype.hasOwnProperty.call( + currTarget.comments, + e.commentId + ) + ) { + // If we're in this state, we have probably received + // a delete event from a workspace that we switched from + // (e.g. a delete event for a comment on sprite a's workspace + // when switching from sprite a to sprite b) + return; + } + delete currTarget.comments[e.commentId]; + if (e.blockId) { + const block = currTarget.blocks.getBlock(e.blockId); + if (!block) { + log.warn( + `Could not find block referenced by comment with id: ${e.commentId}` + ); + return; + } + delete block.comment; + } - this.emitProjectChanged(); - } - break; - case 'click': - // UI event: clicked scripts toggle in the runtime. - if (e.targetType === 'block') { - this.runtime.toggleScript(this.getTopLevelScript(e.blockId), {stackClick: true}); - } - break; + this.emitProjectChanged(); + } + break; + case "click": + // UI event: clicked scripts toggle in the runtime. + if (e.targetType === "block") { + this.runtime.toggleScript( + this.getTopLevelScript(e.blockId), + { stackClick: true } + ); + } + break; } } @@ -531,7 +639,7 @@ class Blocks { /** * Reset all runtime caches. */ - resetCache () { + resetCache() { this._cache.inputs = {}; this._cache.procedureParamNames = {}; this._cache.procedureDefinitions = {}; @@ -544,7 +652,7 @@ class Blocks { * Emit a project changed event if this is a block container * that can affect the project state. */ - emitProjectChanged () { + emitProjectChanged() { if (!this.forceNoGlow) { this.runtime.emitProjectChanged(); } @@ -554,7 +662,7 @@ class Blocks { * Block management: create blocks and scripts from a `create` event * @param {!object} block Blockly create event to be processed */ - createBlock (block) { + createBlock(block) { // Does the block already exist? // Could happen, e.g., for an unobscured shadow. if (Object.prototype.hasOwnProperty.call(this._blocks, block.id)) { @@ -580,127 +688,166 @@ class Blocks { * Block management: change block field values * @param {!object} args Blockly change event to be processed */ - changeBlock (args) { + changeBlock(args) { // Validate - if (['field', 'mutation', 'checkbox'].indexOf(args.element) === -1) return; + if (["field", "mutation", "checkbox"].indexOf(args.element) === -1) + return; let block = this._blocks[args.id]; - if (typeof block === 'undefined') return; + if (typeof block === "undefined") return; switch (args.element) { - case 'field': - // TODO when the field of a monitored block changes, - // update the checkbox in the flyout based on whether - // a monitor for that current combination of selected parameters exists - // e.g. - // 1. check (current [v year]) - // 2. switch dropdown in flyout block to (current [v minute]) - // 3. the checkbox should become unchecked if we're not already - // monitoring current minute - - - // Update block value - if (!block.fields[args.name]) return; - if (args.name === 'VARIABLE' || args.name === 'LIST' || - args.name === 'BROADCAST_OPTION') { - // Get variable name using the id in args.value. - const variable = this.runtime.getEditingTarget().lookupVariableById(args.value); - if (variable) { - block.fields[args.name].value = variable.name; - block.fields[args.name].id = args.value; - } - } else { - // Changing the value in a dropdown - block.fields[args.name].value = args.value; - - // The selected item in the sensing of block menu needs to change based on the - // selected target. Set it to the first item in the menu list. - // TODO: (#1787) - if (block.opcode === 'sensing_of_object_menu') { - if (block.fields.OBJECT.value === '_stage_') { - this._blocks[block.parent].fields.PROPERTY.value = 'backdrop #'; - } else { - this._blocks[block.parent].fields.PROPERTY.value = 'x position'; + case "field": + // TODO when the field of a monitored block changes, + // update the checkbox in the flyout based on whether + // a monitor for that current combination of selected parameters exists + // e.g. + // 1. check (current [v year]) + // 2. switch dropdown in flyout block to (current [v minute]) + // 3. the checkbox should become unchecked if we're not already + // monitoring current minute + + // Update block value + if (!block.fields[args.name]) return; + if ( + args.name === "VARIABLE" || + args.name === "LIST" || + args.name === "BROADCAST_OPTION" + ) { + // Get variable name using the id in args.value. + const variable = this.runtime + .getEditingTarget() + .lookupVariableById(args.value); + if (variable) { + block.fields[args.name].value = variable.name; + block.fields[args.name].id = args.value; + } + } else { + // Changing the value in a dropdown + block.fields[args.name].value = args.value; + + // The selected item in the sensing of block menu needs to change based on the + // selected target. Set it to the first item in the menu list. + // TODO: (#1787) + if (block.opcode === "sensing_of_object_menu") { + if (block.fields.OBJECT.value === "_stage_") { + this._blocks[block.parent].fields.PROPERTY.value = + "backdrop #"; + } else { + this._blocks[block.parent].fields.PROPERTY.value = + "x position"; + } + this.runtime.requestBlocksUpdate(); } - this.runtime.requestBlocksUpdate(); - } - const flyoutBlock = block.shadow && block.parent ? this._blocks[block.parent] : block; - if (flyoutBlock.isMonitored) { - this.runtime.requestUpdateMonitor(Map({ - id: flyoutBlock.id, - params: this._getBlockParams(flyoutBlock) - })); - } - } - break; - case 'mutation': - block.mutation = mutationAdapter(args.value); - break; - case 'checkbox': { - // A checkbox usually has a one to one correspondence with the monitor - // block but in the case of monitored reporters that have arguments, - // map the old id to a new id, creating a new monitor block if necessary - if (block.fields && Object.keys(block.fields).length > 0 && - block.opcode !== 'data_variable' && block.opcode !== 'data_listcontents') { - - // This block has an argument which needs to get separated out into - // multiple monitor blocks with ids based on the selected argument - const newId = getMonitorIdForBlockWithArgs(block.id, block.fields); - // Note: we're not just constantly creating a longer and longer id everytime we check - // the checkbox because we're using the id of the block in the flyout as the base - - // check if a block with the new id already exists, otherwise create - let newBlock = this.runtime.monitorBlocks.getBlock(newId); - if (!newBlock) { - newBlock = JSON.parse(JSON.stringify(block)); - newBlock.id = newId; - this.runtime.monitorBlocks.createBlock(newBlock); + const flyoutBlock = + block.shadow && block.parent + ? this._blocks[block.parent] + : block; + if (flyoutBlock.isMonitored) { + this.runtime.requestUpdateMonitor( + Map({ + id: flyoutBlock.id, + params: this._getBlockParams(flyoutBlock), + }) + ); + } } + break; + case "mutation": + block.mutation = mutationAdapter(args.value); + break; + case "checkbox": { + // A checkbox usually has a one to one correspondence with the monitor + // block but in the case of monitored reporters that have arguments, + // map the old id to a new id, creating a new monitor block if necessary + if ( + block.fields && + Object.keys(block.fields).length > 0 && + block.opcode !== "data_variable" && + block.opcode !== "data_listcontents" + ) { + // This block has an argument which needs to get separated out into + // multiple monitor blocks with ids based on the selected argument + const newId = getMonitorIdForBlockWithArgs( + block.id, + block.fields + ); + // Note: we're not just constantly creating a longer and longer id everytime we check + // the checkbox because we're using the id of the block in the flyout as the base + + // check if a block with the new id already exists, otherwise create + let newBlock = this.runtime.monitorBlocks.getBlock(newId); + if (!newBlock) { + newBlock = JSON.parse(JSON.stringify(block)); + newBlock.id = newId; + this.runtime.monitorBlocks.createBlock(newBlock); + } - block = newBlock; // Carry on through the rest of this code with newBlock - } - - const wasMonitored = block.isMonitored; - block.isMonitored = args.value; + block = newBlock; // Carry on through the rest of this code with newBlock + } - // Variable blocks may be sprite specific depending on the owner of the variable - let isSpriteLocalVariable = false; - if (block.opcode === 'data_variable') { - isSpriteLocalVariable = !(this.runtime.getTargetForStage().variables[block.fields.VARIABLE.id]); - } else if (block.opcode === 'data_listcontents') { - isSpriteLocalVariable = !(this.runtime.getTargetForStage().variables[block.fields.LIST.id]); - } + const wasMonitored = block.isMonitored; + block.isMonitored = args.value; + + // Variable blocks may be sprite specific depending on the owner of the variable + let isSpriteLocalVariable = false; + if (block.opcode === "data_variable") { + isSpriteLocalVariable = + !this.runtime.getTargetForStage().variables[ + block.fields.VARIABLE.id + ]; + } else if (block.opcode === "data_listcontents") { + isSpriteLocalVariable = + !this.runtime.getTargetForStage().variables[ + block.fields.LIST.id + ]; + } - const isSpriteSpecific = isSpriteLocalVariable || - (Object.prototype.hasOwnProperty.call(this.runtime.monitorBlockInfo, block.opcode) && - this.runtime.monitorBlockInfo[block.opcode].isSpriteSpecific); - if (isSpriteSpecific) { - // If creating a new sprite specific monitor, the only possible target is - // the current editing one b/c you cannot dynamically create monitors. - // Also, do not change the targetId if it has already been assigned - block.targetId = block.targetId || this.runtime.getEditingTarget().id; - } else { - block.targetId = null; - } + const isSpriteSpecific = + isSpriteLocalVariable || + (Object.prototype.hasOwnProperty.call( + this.runtime.monitorBlockInfo, + block.opcode + ) && + this.runtime.monitorBlockInfo[block.opcode] + .isSpriteSpecific); + if (isSpriteSpecific) { + // If creating a new sprite specific monitor, the only possible target is + // the current editing one b/c you cannot dynamically create monitors. + // Also, do not change the targetId if it has already been assigned + block.targetId = + block.targetId || this.runtime.getEditingTarget().id; + } else { + block.targetId = null; + } - if (wasMonitored && !block.isMonitored) { - this.runtime.requestHideMonitor(block.id); - } else if (!wasMonitored && block.isMonitored) { - // Tries to show the monitor for specified block. If it doesn't exist, add the monitor. - if (!this.runtime.requestShowMonitor(block.id)) { - this.runtime.requestAddMonitor(MonitorRecord({ - id: block.id, - targetId: block.targetId, - spriteName: block.targetId ? this.runtime.getTargetById(block.targetId).getName() : null, - opcode: block.opcode, - params: this._getBlockParams(block), - // @todo(vm#565) for numerical values with decimals, some countries use comma - value: '', - mode: block.opcode === 'data_listcontents' ? 'list' : 'default' - })); + if (wasMonitored && !block.isMonitored) { + this.runtime.requestHideMonitor(block.id); + } else if (!wasMonitored && block.isMonitored) { + // Tries to show the monitor for specified block. If it doesn't exist, add the monitor. + if (!this.runtime.requestShowMonitor(block.id)) { + this.runtime.requestAddMonitor( + MonitorRecord({ + id: block.id, + targetId: block.targetId, + spriteName: block.targetId + ? this.runtime + .getTargetById(block.targetId) + .getName() + : null, + opcode: block.opcode, + params: this._getBlockParams(block), + // @todo(vm#565) for numerical values with decimals, some countries use comma + value: "", + mode: + block.opcode === "data_listcontents" + ? "list" + : "default", + }) + ); + } } + break; } - break; - } } this.emitProjectChanged(); @@ -712,7 +859,7 @@ class Blocks { * Block management: move blocks from parent to parent * @param {!object} e Blockly move event to be processed */ - moveBlock (e) { + moveBlock(e) { if (!Object.prototype.hasOwnProperty.call(this._blocks, e.id)) { return; } @@ -725,20 +872,26 @@ class Blocks { // Move coordinate changes. if (e.newCoordinate) { - - didChange = (block.x !== e.newCoordinate.x) || (block.y !== e.newCoordinate.y); + didChange = + block.x !== e.newCoordinate.x || block.y !== e.newCoordinate.y; block.x = e.newCoordinate.x; block.y = e.newCoordinate.y; } // Remove from any old parent. - if (typeof e.oldParent !== 'undefined') { + if (typeof e.oldParent !== "undefined") { const oldParent = this._blocks[e.oldParent]; - if (typeof e.oldInput !== 'undefined' && - oldParent.inputs[e.oldInput].block === e.id) { - // This block was connected to the old parent's input. - oldParent.inputs[e.oldInput].block = null; + if ( + typeof e.oldInput !== "undefined" && + oldParent.inputs[e.oldInput].block === e.id + ) { + // This block was connected to the old parent's input. We either + // want to restore the shadow block that previously occupied + // this input, or set it to null (which `.shadow` will be if + // there was no shadow previously) + oldParent.inputs[e.oldInput].block = + oldParent.inputs[e.oldInput].shadow; } else if (oldParent.next === e.id) { // This block was connected to the old parent's next connection. oldParent.next = null; @@ -748,21 +901,27 @@ class Blocks { } // Is this block a top-level block? - if (typeof e.newParent === 'undefined') { + if (typeof e.newParent === "undefined") { this._addScript(e.id); } else { // Remove script, if one exists. this._deleteScript(e.id); // Otherwise, try to connect it in its new place. - if (typeof e.newInput === 'undefined') { + if (typeof e.newInput === "undefined") { // Moved to the new parent's next connection. this._blocks[e.newParent].next = e.id; } else { // Moved to the new parent's input. // Don't obscure the shadow block. let oldShadow = null; - if (Object.prototype.hasOwnProperty.call(this._blocks[e.newParent].inputs, e.newInput)) { - oldShadow = this._blocks[e.newParent].inputs[e.newInput].shadow; + if ( + Object.prototype.hasOwnProperty.call( + this._blocks[e.newParent].inputs, + e.newInput + ) + ) { + oldShadow = + this._blocks[e.newParent].inputs[e.newInput].shadow; } // If the block being attached is itself a shadow, make sure to set @@ -773,7 +932,7 @@ class Blocks { this._blocks[e.newParent].inputs[e.newInput] = { name: e.newInput, block: e.id, - shadow: oldShadow + shadow: oldShadow, }; } this._blocks[e.id].parent = e.newParent; @@ -784,27 +943,28 @@ class Blocks { if (didChange) this.emitProjectChanged(); } - /** * Block management: run all blocks. * @param {!object} runtime Runtime to run all blocks in. */ - runAllMonitored (runtime) { + runAllMonitored(runtime) { if (this._cache._monitored === null) { this._cache._monitored = Object.keys(this._blocks) - .filter(blockId => this.getBlock(blockId).isMonitored) - .map(blockId => { + .filter((blockId) => this.getBlock(blockId).isMonitored) + .map((blockId) => { const targetId = this.getBlock(blockId).targetId; return { blockId, - target: targetId ? runtime.getTargetById(targetId) : null + target: targetId + ? runtime.getTargetById(targetId) + : null, }; }); } const monitored = this._cache._monitored; for (let i = 0; i < monitored.length; i++) { - const {blockId, target} = monitored[i]; + const { blockId, target } = monitored[i]; runtime.addMonitorScript(blockId, target); } } @@ -814,7 +974,7 @@ class Blocks { * with the given ID does not exist. * @param {!string} blockId Id of block to delete */ - deleteBlock (blockId) { + deleteBlock(blockId) { // @todo In runtime, stop threads running on this script. // Get block @@ -836,8 +996,10 @@ class Blocks { this.deleteBlock(block.inputs[input].block); } // Delete obscured shadow blocks. - if (block.inputs[input].shadow !== null && - block.inputs[input].shadow !== block.inputs[input].block) { + if ( + block.inputs[input].shadow !== null && + block.inputs[input].shadow !== block.inputs[input].block + ) { this.deleteBlock(block.inputs[input].shadow); } } @@ -855,9 +1017,9 @@ class Blocks { /** * Delete all blocks and their associated scripts. */ - deleteAllBlocks () { + deleteAllBlocks() { const blockIds = Object.keys(this._blocks); - blockIds.forEach(blockId => this.deleteBlock(blockId)); + blockIds.forEach((blockId) => this.deleteBlock(blockId)); } /** @@ -871,7 +1033,7 @@ class Blocks { * for that ID. A variable reference contains the field referencing that variable * and also the type of the variable being referenced. */ - getAllVariableAndListReferences (optBlocks, optIncludeBroadcast) { + getAllVariableAndListReferences(optBlocks, optIncludeBroadcast) { const blocks = optBlocks ? optBlocks : this._blocks; const allReferences = Object.create(null); for (const blockId in blocks) { @@ -883,7 +1045,10 @@ class Blocks { } else if (blocks[blockId].fields.LIST) { varOrListField = blocks[blockId].fields.LIST; varType = Variable.LIST_TYPE; - } else if (optIncludeBroadcast && blocks[blockId].fields.BROADCAST_OPTION) { + } else if ( + optIncludeBroadcast && + blocks[blockId].fields.BROADCAST_OPTION + ) { varOrListField = blocks[blockId].fields.BROADCAST_OPTION; varType = Variable.BROADCAST_MESSAGE_TYPE; } @@ -892,13 +1057,15 @@ class Blocks { if (allReferences[currVarId]) { allReferences[currVarId].push({ referencingField: varOrListField, - type: varType + type: varType, }); } else { - allReferences[currVarId] = [{ - referencingField: varOrListField, - type: varType - }]; + allReferences[currVarId] = [ + { + referencingField: varOrListField, + type: varType, + }, + ]; } } } @@ -910,7 +1077,7 @@ class Blocks { * @param {string} varId The id of the variable that was renamed * @param {string} newName The new name of the variable that was renamed */ - updateBlocksAfterVarRename (varId, newName) { + updateBlocksAfterVarRename(varId, newName) { const blocks = this._blocks; for (const blockId in blocks) { let varOrListField = null; @@ -932,13 +1099,19 @@ class Blocks { * Keep blocks up to date after they are shared between targets. * @param {boolean} isStage If the new target is a stage. */ - updateTargetSpecificBlocks (isStage) { + updateTargetSpecificBlocks(isStage) { const blocks = this._blocks; for (const blockId in blocks) { - if (isStage && blocks[blockId].opcode === 'event_whenthisspriteclicked') { - blocks[blockId].opcode = 'event_whenstageclicked'; - } else if (!isStage && blocks[blockId].opcode === 'event_whenstageclicked') { - blocks[blockId].opcode = 'event_whenthisspriteclicked'; + if ( + isStage && + blocks[blockId].opcode === "event_whenthisspriteclicked" + ) { + blocks[blockId].opcode = "event_whenstageclicked"; + } else if ( + !isStage && + blocks[blockId].opcode === "event_whenstageclicked" + ) { + blocks[blockId].opcode = "event_whenthisspriteclicked"; } } } @@ -953,15 +1126,15 @@ class Blocks { * that was renamed. This can be one of 'sprite','costume', 'sound', or * 'backdrop'. */ - updateAssetName (oldName, newName, assetType) { + updateAssetName(oldName, newName, assetType) { let getAssetField; - if (assetType === 'costume') { + if (assetType === "costume") { getAssetField = this._getCostumeField.bind(this); - } else if (assetType === 'sound') { + } else if (assetType === "sound") { getAssetField = this._getSoundField.bind(this); - } else if (assetType === 'backdrop') { + } else if (assetType === "backdrop") { getAssetField = this._getBackdropField.bind(this); - } else if (assetType === 'sprite') { + } else if (assetType === "sprite") { getAssetField = this._getSpriteField.bind(this); } else { return; @@ -982,15 +1155,17 @@ class Blocks { * @param {string} targetName The name of the target the variable belongs to. * @return {boolean} Returns true if any of the blocks were updated. */ - updateSensingOfReference (oldName, newName, targetName) { + updateSensingOfReference(oldName, newName, targetName) { const blocks = this._blocks; let blockUpdated = false; for (const blockId in blocks) { const block = blocks[blockId]; - if (block.opcode === 'sensing_of' && + if ( + block.opcode === "sensing_of" && block.fields.PROPERTY.value === oldName && // If block and shadow are different, it means a block is inserted to OBJECT, and should be ignored. - block.inputs.OBJECT.block === block.inputs.OBJECT.shadow) { + block.inputs.OBJECT.block === block.inputs.OBJECT.shadow + ) { const inputBlock = this.getBlock(block.inputs.OBJECT.block); if (inputBlock.fields.OBJECT.value === targetName) { block.fields.PROPERTY.value = newName; @@ -1009,9 +1184,12 @@ class Blocks { * Null if either a block with the given id doesn't exist or if a costume menu field * does not exist on the block with the given id. */ - _getCostumeField (blockId) { + _getCostumeField(blockId) { const block = this.getBlock(blockId); - if (block && Object.prototype.hasOwnProperty.call(block.fields, 'COSTUME')) { + if ( + block && + Object.prototype.hasOwnProperty.call(block.fields, "COSTUME") + ) { return block.fields.COSTUME; } return null; @@ -1024,9 +1202,12 @@ class Blocks { * Null, if either a block with the given id doesn't exist or if a sound menu field * does not exist on the block with the given id. */ - _getSoundField (blockId) { + _getSoundField(blockId) { const block = this.getBlock(blockId); - if (block && Object.prototype.hasOwnProperty.call(block.fields, 'SOUND_MENU')) { + if ( + block && + Object.prototype.hasOwnProperty.call(block.fields, "SOUND_MENU") + ) { return block.fields.SOUND_MENU; } return null; @@ -1039,9 +1220,12 @@ class Blocks { * Null, if either a block with the given id doesn't exist or if a backdrop menu field * does not exist on the block with the given id. */ - _getBackdropField (blockId) { + _getBackdropField(blockId) { const block = this.getBlock(blockId); - if (block && Object.prototype.hasOwnProperty.call(block.fields, 'BACKDROP')) { + if ( + block && + Object.prototype.hasOwnProperty.call(block.fields, "BACKDROP") + ) { return block.fields.BACKDROP; } return null; @@ -1054,13 +1238,20 @@ class Blocks { * Null, if either a block with the given id doesn't exist or if a sprite menu field * does not exist on the block with the given id. */ - _getSpriteField (blockId) { + _getSpriteField(blockId) { const block = this.getBlock(blockId); if (!block) { return null; } - const spriteMenuNames = ['TOWARDS', 'TO', 'OBJECT', 'VIDEOONMENU2', - 'DISTANCETOMENU', 'TOUCHINGOBJECTMENU', 'CLONE_OPTION']; + const spriteMenuNames = [ + "TOWARDS", + "TO", + "OBJECT", + "VIDEOONMENU2", + "DISTANCETOMENU", + "TOUCHINGOBJECTMENU", + "CLONE_OPTION", + ]; for (let i = 0; i < spriteMenuNames.length; i++) { const menuName = spriteMenuNames[i]; if (Object.prototype.hasOwnProperty.call(block.fields, menuName)) { @@ -1078,8 +1269,10 @@ class Blocks { * @param {object} comments Map of comments referenced by id * @return {string} String of XML representing this object's blocks. */ - toXML (comments) { - return this._scripts.map(script => this.blockToXML(script, comments)).join(); + toXML(comments) { + return this._scripts + .map((script) => this.blockToXML(script, comments)) + .join(); } /** @@ -1089,19 +1282,18 @@ class Blocks { * @param {object} comments Map of comments referenced by id * @return {string} String of XML representing this block and any children. */ - blockToXML (blockId, comments) { + blockToXML(blockId, comments) { const block = this._blocks[blockId]; // block should exist, but currently some blocks' next property point // to a blockId for non-existent blocks. Until we track down that behavior, // this early exit allows the project to load. if (!block) return; // Encode properties of this block. - const tagName = (block.shadow) ? 'shadow' : 'block'; - let xmlString = - `<${tagName} + const tagName = block.shadow ? "shadow" : "block"; + let xmlString = `<${tagName} id="${block.id}" type="${block.opcode}" - ${block.topLevel ? `x="${block.x}" y="${block.y}"` : ''} + ${block.topLevel ? `x="${block.x}" y="${block.y}"` : ""} >`; const commentId = block.comment; if (commentId) { @@ -1109,10 +1301,14 @@ class Blocks { if (Object.prototype.hasOwnProperty.call(comments, commentId)) { xmlString += comments[commentId].toXML(); } else { - log.warn(`Could not find comment with id: ${commentId} in provided comment descriptions.`); + log.warn( + `Could not find comment with id: ${commentId} in provided comment descriptions.` + ); } } else { - log.warn(`Cannot serialize comment with id: ${commentId}; no comment descriptions provided.`); + log.warn( + `Cannot serialize comment with id: ${commentId}; no comment descriptions provided.` + ); } } // Add any mutation. Must come before inputs. @@ -1121,7 +1317,8 @@ class Blocks { } // Add any inputs on this block. for (const input in block.inputs) { - if (!Object.prototype.hasOwnProperty.call(block.inputs, input)) continue; + if (!Object.prototype.hasOwnProperty.call(block.inputs, input)) + continue; const blockInput = block.inputs[input]; // Only encode a value tag if the value input is occupied. if (blockInput.block || blockInput.shadow) { @@ -1129,16 +1326,20 @@ class Blocks { if (blockInput.block) { xmlString += this.blockToXML(blockInput.block, comments); } - if (blockInput.shadow && blockInput.shadow !== blockInput.block) { + if ( + blockInput.shadow && + blockInput.shadow !== blockInput.block + ) { // Obscured shadow. xmlString += this.blockToXML(blockInput.shadow, comments); } - xmlString += ''; + xmlString += ""; } } // Add any fields on this block. for (const field in block.fields) { - if (!Object.prototype.hasOwnProperty.call(block.fields, field)) continue; + if (!Object.prototype.hasOwnProperty.call(block.fields, field)) + continue; const blockField = block.fields[field]; xmlString += `${value}`; } // Add blocks connected to the next connection. if (block.next) { - xmlString += `${this.blockToXML(block.next, comments)}`; + xmlString += `${this.blockToXML( + block.next, + comments + )}`; } xmlString += ``; return xmlString; @@ -1168,21 +1372,23 @@ class Blocks { * @param {!object} mutation Object representing a mutation. * @return {string} XML string representing a mutation. */ - mutationToXML (mutation) { + mutationToXML(mutation) { let mutationString = `<${mutation.tagName}`; for (const prop in mutation) { - if (prop === 'children' || prop === 'tagName') continue; - let mutationValue = (typeof mutation[prop] === 'string') ? - xmlEscape(mutation[prop]) : mutation[prop]; + if (prop === "children" || prop === "tagName") continue; + let mutationValue = + typeof mutation[prop] === "string" + ? xmlEscape(mutation[prop]) + : mutation[prop]; // Handle dynamic extension blocks - if (prop === 'blockInfo') { + if (prop === "blockInfo") { mutationValue = xmlEscape(JSON.stringify(mutation[prop])); } mutationString += ` ${prop}="${mutationValue}"`; } - mutationString += '>'; + mutationString += ">"; for (let i = 0; i < mutation.children.length; i++) { mutationString += this.mutationToXML(mutation.children[i]); } @@ -1196,7 +1402,7 @@ class Blocks { * @param {!object} block Block to be paramified. * @return {!object} object of param key/values. */ - _getBlockParams (block) { + _getBlockParams(block) { const params = {}; for (const key in block.fields) { params[key] = block.fields[key].value; @@ -1215,7 +1421,7 @@ class Blocks { * @param {!object} defineBlock Outer define block. * @return {!object} internal definition block which has the mutation. */ - _getCustomBlockInternal (defineBlock) { + _getCustomBlockInternal(defineBlock) { if (defineBlock.inputs && defineBlock.inputs.custom_block) { return this._blocks[defineBlock.inputs.custom_block.block]; } @@ -1225,7 +1431,7 @@ class Blocks { * Helper to add a stack to `this._scripts`. * @param {?string} topBlockId ID of block that starts the script. */ - _addScript (topBlockId) { + _addScript(topBlockId) { const i = this._scripts.indexOf(topBlockId); if (i > -1) return; // Already in scripts. this._scripts.push(topBlockId); @@ -1237,7 +1443,7 @@ class Blocks { * Helper to remove a script from `this._scripts`. * @param {?string} topBlockId ID of block that starts the script. */ - _deleteScript (topBlockId) { + _deleteScript(topBlockId) { const i = this._scripts.indexOf(topBlockId); if (i > -1) this._scripts.splice(i, 1); // Update `topLevel` property on the top block. @@ -1256,20 +1462,20 @@ class Blocks { */ BlocksExecuteCache.getCached = function (blocks, blockId, CacheType) { let cached = blocks._cache._executeCached[blockId]; - if (typeof cached !== 'undefined') { + if (typeof cached !== "undefined") { return cached; } const block = blocks.getBlock(blockId); - if (typeof block === 'undefined') return null; + if (typeof block === "undefined") return null; - if (typeof CacheType === 'undefined') { + if (typeof CacheType === "undefined") { cached = { id: blockId, opcode: blocks.getOpcode(block), fields: blocks.getFields(block), inputs: blocks.getInputs(block), - mutation: blocks.getMutation(block) + mutation: blocks.getMutation(block), }; } else { cached = new CacheType(blocks, { @@ -1277,7 +1483,7 @@ BlocksExecuteCache.getCached = function (blocks, blockId, CacheType) { opcode: blocks.getOpcode(block), fields: blocks.getFields(block), inputs: blocks.getInputs(block), - mutation: blocks.getMutation(block) + mutation: blocks.getMutation(block), }); } From ae67b9bfef7a95e856beb3396dbafd964adc791d Mon Sep 17 00:00:00 2001 From: Aaron Dodson Date: Tue, 8 Oct 2024 08:43:13 -0700 Subject: [PATCH 009/521] fix: fix bug that could result in the VM's representation of shadow blocks getting into a bad state (#9) --- packages/scratch-vm/src/engine/blocks.js | 25 ++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/packages/scratch-vm/src/engine/blocks.js b/packages/scratch-vm/src/engine/blocks.js index fecd0cb92d8..a0a833a46f2 100644 --- a/packages/scratch-vm/src/engine/blocks.js +++ b/packages/scratch-vm/src/engine/blocks.js @@ -886,23 +886,32 @@ class Blocks { typeof e.oldInput !== "undefined" && oldParent.inputs[e.oldInput].block === e.id ) { - // This block was connected to the old parent's input. We either - // want to restore the shadow block that previously occupied - // this input, or set it to null (which `.shadow` will be if - // there was no shadow previously) - oldParent.inputs[e.oldInput].block = - oldParent.inputs[e.oldInput].shadow; + // This block was connected to an input. We either want to + // restore the shadow block that previously occupied + // this input, or null out the input's block. + const shadow = oldParent.inputs[e.oldInput].shadow; + if (shadow && e.id !== shadow) { + oldParent.inputs[e.oldInput].block = shadow; + this._blocks[shadow].parent = oldParent.id; + } else { + oldParent.inputs[e.oldInput].block = null; + if (e.id !== shadow) { + this._blocks[e.id].parent = null; + } + } } else if (oldParent.next === e.id) { // This block was connected to the old parent's next connection. oldParent.next = null; + this._blocks[e.id].parent = null; } - this._blocks[e.id].parent = null; didChange = true; } // Is this block a top-level block? if (typeof e.newParent === "undefined") { - this._addScript(e.id); + if (!this._blocks[e.id].shadow) { + this._addScript(e.id); + } } else { // Remove script, if one exists. this._deleteScript(e.id); From a135fb51198b8987221de3bb64a2a8e5088a11fc Mon Sep 17 00:00:00 2001 From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com> Date: Fri, 11 Oct 2024 12:15:16 -0700 Subject: [PATCH 010/521] style: run "eslint --fix ." --- packages/scratch-vm/src/engine/blocks.js | 1035 +++++++++++---------- packages/scratch-vm/src/engine/runtime.js | 866 ++++++++--------- 2 files changed, 954 insertions(+), 947 deletions(-) diff --git a/packages/scratch-vm/src/engine/blocks.js b/packages/scratch-vm/src/engine/blocks.js index a0a833a46f2..6b646dc1b73 100644 --- a/packages/scratch-vm/src/engine/blocks.js +++ b/packages/scratch-vm/src/engine/blocks.js @@ -1,14 +1,14 @@ -const adapter = require("./adapter"); -const mutationAdapter = require("./mutation-adapter"); -const xmlEscape = require("../util/xml-escape"); -const MonitorRecord = require("./monitor-record"); -const Clone = require("../util/clone"); -const { Map } = require("immutable"); -const BlocksExecuteCache = require("./blocks-execute-cache"); -const BlocksRuntimeCache = require("./blocks-runtime-cache"); -const log = require("../util/log"); -const Variable = require("./variable"); -const getMonitorIdForBlockWithArgs = require("../util/get-monitor-id"); +const adapter = require('./adapter'); +const mutationAdapter = require('./mutation-adapter'); +const xmlEscape = require('../util/xml-escape'); +const MonitorRecord = require('./monitor-record'); +const Clone = require('../util/clone'); +const {Map} = require('immutable'); +const BlocksExecuteCache = require('./blocks-execute-cache'); +const BlocksRuntimeCache = require('./blocks-runtime-cache'); +const log = require('../util/log'); +const Variable = require('./variable'); +const getMonitorIdForBlockWithArgs = require('../util/get-monitor-id'); /** * @fileoverview @@ -23,7 +23,7 @@ const getMonitorIdForBlockWithArgs = require("../util/get-monitor-id"); * should not request glows. This does not affect glows when clicking on a block to execute it. */ class Blocks { - constructor(runtime, optNoGlow) { + constructor (runtime, optNoGlow) { this.runtime = runtime; /** @@ -45,9 +45,9 @@ class Blocks { * @type {{inputs: {}, procedureParamNames: {}, procedureDefinitions: {}}} * @private */ - Object.defineProperty(this, "_cache", { + Object.defineProperty(this, '_cache', { writable: true, - enumerable: false, + enumerable: false }); this._cache = { /** @@ -84,7 +84,7 @@ class Blocks { * A cache of hat opcodes to collection of theads to execute. * @type {object.} */ - scripts: {}, + scripts: {} }; /** @@ -104,8 +104,8 @@ class Blocks { * are prefixed with this string. * @const{string} */ - static get BRANCH_INPUT_PREFIX() { - return "SUBSTACK"; + static get BRANCH_INPUT_PREFIX () { + return 'SUBSTACK'; } /** @@ -113,7 +113,7 @@ class Blocks { * @param {!string} blockId ID of block we have stored. * @return {?object} Metadata about the block, if it exists. */ - getBlock(blockId) { + getBlock (blockId) { return this._blocks[blockId]; } @@ -121,7 +121,7 @@ class Blocks { * Get all known top-level blocks that start scripts. * @return {Array.} List of block IDs. */ - getScripts() { + getScripts () { return this._scripts; } @@ -130,9 +130,9 @@ class Blocks { * @param {?string} id ID of block to get the next block for * @return {?string} ID of next block in the sequence */ - getNextBlock(id) { + getNextBlock (id) { const block = this._blocks[id]; - return typeof block === "undefined" ? null : block.next; + return typeof block === 'undefined' ? null : block.next; } /** @@ -141,9 +141,9 @@ class Blocks { * @param {?number} branchNum Which branch to select (e.g. for if-else). * @return {?string} ID of block in the branch. */ - getBranch(id, branchNum) { + getBranch (id, branchNum) { const block = this._blocks[id]; - if (typeof block === "undefined") return null; + if (typeof block === 'undefined') return null; if (!branchNum) branchNum = 1; let inputName = Blocks.BRANCH_INPUT_PREFIX; @@ -153,7 +153,7 @@ class Blocks { // Empty C-block? const input = block.inputs[inputName]; - return typeof input === "undefined" ? null : input.block; + return typeof input === 'undefined' ? null : input.block; } /** @@ -161,8 +161,8 @@ class Blocks { * @param {?object} block The block to query * @return {?string} the opcode corresponding to that block */ - getOpcode(block) { - return typeof block === "undefined" ? null : block.opcode; + getOpcode (block) { + return typeof block === 'undefined' ? null : block.opcode; } /** @@ -170,8 +170,8 @@ class Blocks { * @param {?object} block The block to query. * @return {?object} All fields and their values. */ - getFields(block) { - return typeof block === "undefined" ? null : block.fields; + getFields (block) { + return typeof block === 'undefined' ? null : block.fields; } /** @@ -179,10 +179,10 @@ class Blocks { * @param {?object} block the block to query. * @return {?Array.} All non-branch inputs and their associated blocks. */ - getInputs(block) { - if (typeof block === "undefined") return null; + getInputs (block) { + if (typeof block === 'undefined') return null; let inputs = this._cache.inputs[block.id]; - if (typeof inputs !== "undefined") { + if (typeof inputs !== 'undefined') { return inputs; } @@ -206,8 +206,8 @@ class Blocks { * @param {?object} block The block to query. * @return {?object} Mutation for the block. */ - getMutation(block) { - return typeof block === "undefined" ? null : block.mutation; + getMutation (block) { + return typeof block === 'undefined' ? null : block.mutation; } /** @@ -215,9 +215,9 @@ class Blocks { * @param {?string} id ID of block to query. * @return {?string} ID of top-level script block. */ - getTopLevelScript(id) { + getTopLevelScript (id) { let block = this._blocks[id]; - if (typeof block === "undefined") return null; + if (typeof block === 'undefined') return null; while (block.parent !== null) { block = this._blocks[block.parent]; } @@ -229,17 +229,18 @@ class Blocks { * @param {?string} name Name of procedure to query. * @return {?string} ID of procedure definition. */ - getProcedureDefinition(name) { + getProcedureDefinition (name) { const blockID = this._cache.procedureDefinitions[name]; - if (typeof blockID !== "undefined") { + if (typeof blockID !== 'undefined') { return blockID; } for (const id in this._blocks) { - if (!Object.prototype.hasOwnProperty.call(this._blocks, id)) + if (!Object.prototype.hasOwnProperty.call(this._blocks, id)) { continue; + } const block = this._blocks[id]; - if (block.opcode === "procedures_definition") { + if (block.opcode === 'procedures_definition') { const internal = this._getCustomBlockInternal(block); if (internal && internal.mutation.proccode === name) { this._cache.procedureDefinitions[name] = id; // The outer define block id @@ -257,7 +258,7 @@ class Blocks { * @param {?string} name Name of procedure to query. * @return {?Array.} List of param names for a procedure. */ - getProcedureParamNamesAndIds(name) { + getProcedureParamNamesAndIds (name) { return this.getProcedureParamNamesIdsAndDefaults(name).slice(0, 2); } @@ -266,18 +267,19 @@ class Blocks { * @param {?string} name Name of procedure to query. * @return {?Array.} List of param names for a procedure. */ - getProcedureParamNamesIdsAndDefaults(name) { + getProcedureParamNamesIdsAndDefaults (name) { const cachedNames = this._cache.procedureParamNames[name]; - if (typeof cachedNames !== "undefined") { + if (typeof cachedNames !== 'undefined') { return cachedNames; } for (const id in this._blocks) { - if (!Object.prototype.hasOwnProperty.call(this._blocks, id)) + if (!Object.prototype.hasOwnProperty.call(this._blocks, id)) { continue; + } const block = this._blocks[id]; if ( - block.opcode === "procedures_prototype" && + block.opcode === 'procedures_prototype' && block.mutation.proccode === name ) { const names = JSON.parse(block.mutation.argumentnames); @@ -293,7 +295,7 @@ class Blocks { return null; } - duplicate() { + duplicate () { const newBlocks = new Blocks(this.runtime, this.forceNoGlow); newBlocks._blocks = Clone.simple(this._blocks); newBlocks._scripts = Clone.simple(this._scripts); @@ -307,13 +309,13 @@ class Blocks { * runtime interface. * @param {object} e Blockly "block" or "variable" event */ - blocklyListen(e) { + blocklyListen (e) { // Validate event - if (typeof e !== "object") return; + if (typeof e !== 'object') return; if ( - typeof e.blockId !== "string" && - typeof e.varId !== "string" && - typeof e.commentId !== "string" + typeof e.blockId !== 'string' && + typeof e.varId !== 'string' && + typeof e.commentId !== 'string' ) { return; } @@ -322,315 +324,315 @@ class Blocks { // Block create/update/destroy switch (e.type) { - case "create": { + case 'create': { + const newBlocks = adapter(e); + // A create event can create many blocks. Add them all. + for (let i = 0; i < newBlocks.length; i++) { + this.createBlock(newBlocks[i]); + } + break; + } + case 'change': + this.changeBlock({ + id: e.blockId, + element: e.element, + name: e.name, + value: e.newValue + }); + break; + case 'move': + this.moveBlock({ + id: e.blockId, + oldParent: e.oldParentId, + oldInput: e.oldInputName, + newParent: e.newParentId, + newInput: e.newInputName, + newCoordinate: e.newCoordinate + }); + break; + case 'dragOutside': + this.runtime.emitBlockDragUpdate(e.isOutside); + break; + case 'endDrag': + this.runtime.emitBlockDragUpdate(false /* areBlocksOverGui */); + + // Drag blocks onto another sprite + if (e.isOutside) { const newBlocks = adapter(e); - // A create event can create many blocks. Add them all. - for (let i = 0; i < newBlocks.length; i++) { - this.createBlock(newBlocks[i]); - } - break; + this.runtime.emitBlockEndDrag(newBlocks, e.blockId); } - case "change": - this.changeBlock({ - id: e.blockId, - element: e.element, - name: e.name, - value: e.newValue, - }); - break; - case "move": - this.moveBlock({ - id: e.blockId, - oldParent: e.oldParentId, - oldInput: e.oldInputName, - newParent: e.newParentId, - newInput: e.newInputName, - newCoordinate: e.newCoordinate, - }); - break; - case "dragOutside": - this.runtime.emitBlockDragUpdate(e.isOutside); - break; - case "endDrag": - this.runtime.emitBlockDragUpdate(false /* areBlocksOverGui */); - - // Drag blocks onto another sprite - if (e.isOutside) { - const newBlocks = adapter(e); - this.runtime.emitBlockEndDrag(newBlocks, e.blockId); - } - break; - case "delete": - // Don't accept delete events for missing blocks, - // or shadow blocks being obscured. - if ( - !Object.prototype.hasOwnProperty.call( - this._blocks, - e.blockId - ) || + break; + case 'delete': + // Don't accept delete events for missing blocks, + // or shadow blocks being obscured. + if ( + !Object.prototype.hasOwnProperty.call( + this._blocks, + e.blockId + ) || this._blocks[e.blockId].shadow - ) { - return; - } - // Inform any runtime to forget about glows on this script. - if (this._blocks[e.blockId].topLevel) { - this.runtime.quietGlow(e.blockId); - } - this.deleteBlock(e.blockId); - break; - case "var_create": - // Check if the variable being created is global or local - // If local, create a local var on the current editing target, as long - // as there are no conflicts, and the current target is actually a sprite - // If global or if the editing target is not present or we somehow got - // into a state where a local var was requested for the stage, - // create a stage (global) var after checking for name conflicts - // on all the sprites. - if ( - e.isLocal && + ) { + return; + } + // Inform any runtime to forget about glows on this script. + if (this._blocks[e.blockId].topLevel) { + this.runtime.quietGlow(e.blockId); + } + this.deleteBlock(e.blockId); + break; + case 'var_create': + // Check if the variable being created is global or local + // If local, create a local var on the current editing target, as long + // as there are no conflicts, and the current target is actually a sprite + // If global or if the editing target is not present or we somehow got + // into a state where a local var was requested for the stage, + // create a stage (global) var after checking for name conflicts + // on all the sprites. + if ( + e.isLocal && editingTarget && !editingTarget.isStage && !e.isCloud - ) { - if (!editingTarget.lookupVariableById(e.varId)) { - editingTarget.createVariable( - e.varId, - e.varName, - e.varType - ); - this.emitProjectChanged(); - } - } else { - if (stage.lookupVariableById(e.varId)) { - // Do not re-create a variable if it already exists - return; - } - // Check for name conflicts in all of the targets - const allTargets = this.runtime.targets.filter( - (t) => t.isOriginal - ); - for (const target of allTargets) { - if ( - target.lookupVariableByNameAndType( - e.varName, - e.varType, - true - ) - ) { - return; - } - } - stage.createVariable( + ) { + if (!editingTarget.lookupVariableById(e.varId)) { + editingTarget.createVariable( e.varId, e.varName, - e.varType, - e.isCloud + e.varType ); this.emitProjectChanged(); } - break; - case "var_rename": - if ( - editingTarget && + } else { + if (stage.lookupVariableById(e.varId)) { + // Do not re-create a variable if it already exists + return; + } + // Check for name conflicts in all of the targets + const allTargets = this.runtime.targets.filter( + t => t.isOriginal + ); + for (const target of allTargets) { + if ( + target.lookupVariableByNameAndType( + e.varName, + e.varType, + true + ) + ) { + return; + } + } + stage.createVariable( + e.varId, + e.varName, + e.varType, + e.isCloud + ); + this.emitProjectChanged(); + } + break; + case 'var_rename': + if ( + editingTarget && Object.prototype.hasOwnProperty.call( editingTarget.variables, e.varId ) - ) { - // This is a local variable, rename on the current target - editingTarget.renameVariable(e.varId, e.newName); - // Update all the blocks on the current target that use - // this variable - editingTarget.blocks.updateBlocksAfterVarRename( + ) { + // This is a local variable, rename on the current target + editingTarget.renameVariable(e.varId, e.newName); + // Update all the blocks on the current target that use + // this variable + editingTarget.blocks.updateBlocksAfterVarRename( + e.varId, + e.newName + ); + } else { + // This is a global variable + stage.renameVariable(e.varId, e.newName); + // Update all blocks on all targets that use the renamed variable + const targets = this.runtime.targets; + for (let i = 0; i < targets.length; i++) { + const currTarget = targets[i]; + currTarget.blocks.updateBlocksAfterVarRename( e.varId, e.newName ); - } else { - // This is a global variable - stage.renameVariable(e.varId, e.newName); - // Update all blocks on all targets that use the renamed variable - const targets = this.runtime.targets; - for (let i = 0; i < targets.length; i++) { - const currTarget = targets[i]; - currTarget.blocks.updateBlocksAfterVarRename( - e.varId, - e.newName - ); - } } - this.emitProjectChanged(); - break; - case "var_delete": { - const target = + } + this.emitProjectChanged(); + break; + case 'var_delete': { + const target = editingTarget && Object.prototype.hasOwnProperty.call( editingTarget.variables, e.varId - ) - ? editingTarget - : stage; - target.deleteVariable(e.varId); - this.emitProjectChanged(); - break; - } - case "block_comment_create": - case "comment_create": - if (this.runtime.getEditingTarget()) { - const currTarget = this.runtime.getEditingTarget(); - currTarget.createComment( - e.commentId, - e.blockId, - "", - e.json.x, - e.json.y, - e.json.width, - e.json.height, - false - ); + ) ? + editingTarget : + stage; + target.deleteVariable(e.varId); + this.emitProjectChanged(); + break; + } + case 'block_comment_create': + case 'comment_create': + if (this.runtime.getEditingTarget()) { + const currTarget = this.runtime.getEditingTarget(); + currTarget.createComment( + e.commentId, + e.blockId, + '', + e.json.x, + e.json.y, + e.json.width, + e.json.height, + false + ); - if ( - currTarget.comments[e.commentId].x === null && + if ( + currTarget.comments[e.commentId].x === null && currTarget.comments[e.commentId].y === null - ) { - // Block comments imported from 2.0 projects are imported with their - // x and y coordinates set to null so that scratch-blocks can - // auto-position them. If we are receiving a create event for these - // comments, then the auto positioning should have taken place. - // Update the x and y position of these comments to match the - // one from the event. - currTarget.comments[e.commentId].x = e.json.x; - currTarget.comments[e.commentId].y = e.json.y; - } + ) { + // Block comments imported from 2.0 projects are imported with their + // x and y coordinates set to null so that scratch-blocks can + // auto-position them. If we are receiving a create event for these + // comments, then the auto positioning should have taken place. + // Update the x and y position of these comments to match the + // one from the event. + currTarget.comments[e.commentId].x = e.json.x; + currTarget.comments[e.commentId].y = e.json.y; + } + } + this.emitProjectChanged(); + break; + case 'block_comment_change': + case 'comment_change': + if (this.runtime.getEditingTarget()) { + const currTarget = this.runtime.getEditingTarget(); + if ( + !Object.prototype.hasOwnProperty.call( + currTarget.comments, + e.commentId + ) + ) { + log.warn( + `Cannot change comment with id ${e.commentId} because it does not exist.` + ); + return; } + const comment = currTarget.comments[e.commentId]; + comment.text = e.newContents_; this.emitProjectChanged(); - break; - case "block_comment_change": - case "comment_change": - if (this.runtime.getEditingTarget()) { - const currTarget = this.runtime.getEditingTarget(); - if ( + } + break; + case 'block_comment_move': + case 'comment_move': + if (this.runtime.getEditingTarget()) { + const currTarget = this.runtime.getEditingTarget(); + if ( + currTarget && !Object.prototype.hasOwnProperty.call( currTarget.comments, e.commentId ) - ) { - log.warn( - `Cannot change comment with id ${e.commentId} because it does not exist.` - ); - return; - } - const comment = currTarget.comments[e.commentId]; - comment.text = e.newContents_; - this.emitProjectChanged(); + ) { + log.warn( + `Cannot move comment with id ${e.commentId} because it does not exist.` + ); + return; } - break; - case "block_comment_move": - case "comment_move": - if (this.runtime.getEditingTarget()) { - const currTarget = this.runtime.getEditingTarget(); - if ( - currTarget && - !Object.prototype.hasOwnProperty.call( - currTarget.comments, - e.commentId - ) - ) { - log.warn( - `Cannot move comment with id ${e.commentId} because it does not exist.` - ); - return; - } - const comment = currTarget.comments[e.commentId]; - const newCoord = e.newCoordinate_; - comment.x = newCoord.x; - comment.y = newCoord.y; + const comment = currTarget.comments[e.commentId]; + const newCoord = e.newCoordinate_; + comment.x = newCoord.x; + comment.y = newCoord.y; - this.emitProjectChanged(); - } - break; - case "block_comment_collapse": - case "comment_collapse": - if (this.runtime.getEditingTarget()) { - const currTarget = this.runtime.getEditingTarget(); - if ( - currTarget && + this.emitProjectChanged(); + } + break; + case 'block_comment_collapse': + case 'comment_collapse': + if (this.runtime.getEditingTarget()) { + const currTarget = this.runtime.getEditingTarget(); + if ( + currTarget && !Object.prototype.hasOwnProperty.call( currTarget.comments, e.commentId ) - ) { - log.warn( - `Cannot collapse comment with id ${e.commentId} because it does not exist.` - ); - return; - } - const comment = currTarget.comments[e.commentId]; - comment.minimized = e.newCollapsed; - this.emitProjectChanged(); + ) { + log.warn( + `Cannot collapse comment with id ${e.commentId} because it does not exist.` + ); + return; } - break; - case "block_comment_resize": - case "comment_resize": - if (this.runtime.getEditingTarget()) { - const currTarget = this.runtime.getEditingTarget(); - if ( - currTarget && + const comment = currTarget.comments[e.commentId]; + comment.minimized = e.newCollapsed; + this.emitProjectChanged(); + } + break; + case 'block_comment_resize': + case 'comment_resize': + if (this.runtime.getEditingTarget()) { + const currTarget = this.runtime.getEditingTarget(); + if ( + currTarget && !Object.prototype.hasOwnProperty.call( currTarget.comments, e.commentId ) - ) { + ) { + log.warn( + `Cannot resize comment with id ${e.commentId} because it does not exist.` + ); + return; + } + const comment = currTarget.comments[e.commentId]; + comment.width = e.newSize.width; + comment.height = e.newSize.height; + this.emitProjectChanged(); + } + break; + case 'block_comment_delete': + case 'comment_delete': + if (this.runtime.getEditingTarget()) { + const currTarget = this.runtime.getEditingTarget(); + if ( + !Object.prototype.hasOwnProperty.call( + currTarget.comments, + e.commentId + ) + ) { + // If we're in this state, we have probably received + // a delete event from a workspace that we switched from + // (e.g. a delete event for a comment on sprite a's workspace + // when switching from sprite a to sprite b) + return; + } + delete currTarget.comments[e.commentId]; + if (e.blockId) { + const block = currTarget.blocks.getBlock(e.blockId); + if (!block) { log.warn( - `Cannot resize comment with id ${e.commentId} because it does not exist.` + `Could not find block referenced by comment with id: ${e.commentId}` ); return; } - const comment = currTarget.comments[e.commentId]; - comment.width = e.newSize.width; - comment.height = e.newSize.height; - this.emitProjectChanged(); + delete block.comment; } - break; - case "block_comment_delete": - case "comment_delete": - if (this.runtime.getEditingTarget()) { - const currTarget = this.runtime.getEditingTarget(); - if ( - !Object.prototype.hasOwnProperty.call( - currTarget.comments, - e.commentId - ) - ) { - // If we're in this state, we have probably received - // a delete event from a workspace that we switched from - // (e.g. a delete event for a comment on sprite a's workspace - // when switching from sprite a to sprite b) - return; - } - delete currTarget.comments[e.commentId]; - if (e.blockId) { - const block = currTarget.blocks.getBlock(e.blockId); - if (!block) { - log.warn( - `Could not find block referenced by comment with id: ${e.commentId}` - ); - return; - } - delete block.comment; - } - this.emitProjectChanged(); - } - break; - case "click": - // UI event: clicked scripts toggle in the runtime. - if (e.targetType === "block") { - this.runtime.toggleScript( - this.getTopLevelScript(e.blockId), - { stackClick: true } - ); - } - break; + this.emitProjectChanged(); + } + break; + case 'click': + // UI event: clicked scripts toggle in the runtime. + if (e.targetType === 'block') { + this.runtime.toggleScript( + this.getTopLevelScript(e.blockId), + {stackClick: true} + ); + } + break; } } @@ -639,7 +641,7 @@ class Blocks { /** * Reset all runtime caches. */ - resetCache() { + resetCache () { this._cache.inputs = {}; this._cache.procedureParamNames = {}; this._cache.procedureDefinitions = {}; @@ -652,7 +654,7 @@ class Blocks { * Emit a project changed event if this is a block container * that can affect the project state. */ - emitProjectChanged() { + emitProjectChanged () { if (!this.forceNoGlow) { this.runtime.emitProjectChanged(); } @@ -662,7 +664,7 @@ class Blocks { * Block management: create blocks and scripts from a `create` event * @param {!object} block Blockly create event to be processed */ - createBlock(block) { + createBlock (block) { // Does the block already exist? // Could happen, e.g., for an unobscured shadow. if (Object.prototype.hasOwnProperty.call(this._blocks, block.id)) { @@ -688,121 +690,122 @@ class Blocks { * Block management: change block field values * @param {!object} args Blockly change event to be processed */ - changeBlock(args) { + changeBlock (args) { // Validate - if (["field", "mutation", "checkbox"].indexOf(args.element) === -1) + if (['field', 'mutation', 'checkbox'].indexOf(args.element) === -1) { return; + } let block = this._blocks[args.id]; - if (typeof block === "undefined") return; + if (typeof block === 'undefined') return; switch (args.element) { - case "field": - // TODO when the field of a monitored block changes, - // update the checkbox in the flyout based on whether - // a monitor for that current combination of selected parameters exists - // e.g. - // 1. check (current [v year]) - // 2. switch dropdown in flyout block to (current [v minute]) - // 3. the checkbox should become unchecked if we're not already - // monitoring current minute - - // Update block value - if (!block.fields[args.name]) return; - if ( - args.name === "VARIABLE" || - args.name === "LIST" || - args.name === "BROADCAST_OPTION" - ) { - // Get variable name using the id in args.value. - const variable = this.runtime - .getEditingTarget() - .lookupVariableById(args.value); - if (variable) { - block.fields[args.name].value = variable.name; - block.fields[args.name].id = args.value; - } - } else { - // Changing the value in a dropdown - block.fields[args.name].value = args.value; - - // The selected item in the sensing of block menu needs to change based on the - // selected target. Set it to the first item in the menu list. - // TODO: (#1787) - if (block.opcode === "sensing_of_object_menu") { - if (block.fields.OBJECT.value === "_stage_") { - this._blocks[block.parent].fields.PROPERTY.value = - "backdrop #"; - } else { - this._blocks[block.parent].fields.PROPERTY.value = - "x position"; - } - this.runtime.requestBlocksUpdate(); + case 'field': + // TODO when the field of a monitored block changes, + // update the checkbox in the flyout based on whether + // a monitor for that current combination of selected parameters exists + // e.g. + // 1. check (current [v year]) + // 2. switch dropdown in flyout block to (current [v minute]) + // 3. the checkbox should become unchecked if we're not already + // monitoring current minute + + // Update block value + if (!block.fields[args.name]) return; + if ( + args.name === 'VARIABLE' || + args.name === 'LIST' || + args.name === 'BROADCAST_OPTION' + ) { + // Get variable name using the id in args.value. + const variable = this.runtime + .getEditingTarget() + .lookupVariableById(args.value); + if (variable) { + block.fields[args.name].value = variable.name; + block.fields[args.name].id = args.value; + } + } else { + // Changing the value in a dropdown + block.fields[args.name].value = args.value; + + // The selected item in the sensing of block menu needs to change based on the + // selected target. Set it to the first item in the menu list. + // TODO: (#1787) + if (block.opcode === 'sensing_of_object_menu') { + if (block.fields.OBJECT.value === '_stage_') { + this._blocks[block.parent].fields.PROPERTY.value = + 'backdrop #'; + } else { + this._blocks[block.parent].fields.PROPERTY.value = + 'x position'; } + this.runtime.requestBlocksUpdate(); + } - const flyoutBlock = - block.shadow && block.parent - ? this._blocks[block.parent] - : block; - if (flyoutBlock.isMonitored) { - this.runtime.requestUpdateMonitor( - Map({ - id: flyoutBlock.id, - params: this._getBlockParams(flyoutBlock), - }) - ); - } + const flyoutBlock = + block.shadow && block.parent ? + this._blocks[block.parent] : + block; + if (flyoutBlock.isMonitored) { + this.runtime.requestUpdateMonitor( + Map({ + id: flyoutBlock.id, + params: this._getBlockParams(flyoutBlock) + }) + ); } - break; - case "mutation": - block.mutation = mutationAdapter(args.value); - break; - case "checkbox": { - // A checkbox usually has a one to one correspondence with the monitor - // block but in the case of monitored reporters that have arguments, - // map the old id to a new id, creating a new monitor block if necessary - if ( - block.fields && + } + break; + case 'mutation': + block.mutation = mutationAdapter(args.value); + break; + case 'checkbox': { + // A checkbox usually has a one to one correspondence with the monitor + // block but in the case of monitored reporters that have arguments, + // map the old id to a new id, creating a new monitor block if necessary + if ( + block.fields && Object.keys(block.fields).length > 0 && - block.opcode !== "data_variable" && - block.opcode !== "data_listcontents" - ) { - // This block has an argument which needs to get separated out into - // multiple monitor blocks with ids based on the selected argument - const newId = getMonitorIdForBlockWithArgs( - block.id, - block.fields - ); + block.opcode !== 'data_variable' && + block.opcode !== 'data_listcontents' + ) { + // This block has an argument which needs to get separated out into + // multiple monitor blocks with ids based on the selected argument + const newId = getMonitorIdForBlockWithArgs( + block.id, + block.fields + ); // Note: we're not just constantly creating a longer and longer id everytime we check // the checkbox because we're using the id of the block in the flyout as the base - // check if a block with the new id already exists, otherwise create - let newBlock = this.runtime.monitorBlocks.getBlock(newId); - if (!newBlock) { - newBlock = JSON.parse(JSON.stringify(block)); - newBlock.id = newId; - this.runtime.monitorBlocks.createBlock(newBlock); - } - - block = newBlock; // Carry on through the rest of this code with newBlock + // check if a block with the new id already exists, otherwise create + let newBlock = this.runtime.monitorBlocks.getBlock(newId); + if (!newBlock) { + newBlock = JSON.parse(JSON.stringify(block)); + newBlock.id = newId; + this.runtime.monitorBlocks.createBlock(newBlock); } - const wasMonitored = block.isMonitored; - block.isMonitored = args.value; + block = newBlock; // Carry on through the rest of this code with newBlock + } + + const wasMonitored = block.isMonitored; + block.isMonitored = args.value; - // Variable blocks may be sprite specific depending on the owner of the variable - let isSpriteLocalVariable = false; - if (block.opcode === "data_variable") { - isSpriteLocalVariable = + // Variable blocks may be sprite specific depending on the owner of the variable + let isSpriteLocalVariable = false; + if (block.opcode === 'data_variable') { + isSpriteLocalVariable = !this.runtime.getTargetForStage().variables[ block.fields.VARIABLE.id ]; - } else if (block.opcode === "data_listcontents") { - isSpriteLocalVariable = + } else if (block.opcode === 'data_listcontents') { + isSpriteLocalVariable = !this.runtime.getTargetForStage().variables[ block.fields.LIST.id ]; - } + } - const isSpriteSpecific = + const isSpriteSpecific = isSpriteLocalVariable || (Object.prototype.hasOwnProperty.call( this.runtime.monitorBlockInfo, @@ -810,44 +813,44 @@ class Blocks { ) && this.runtime.monitorBlockInfo[block.opcode] .isSpriteSpecific); - if (isSpriteSpecific) { - // If creating a new sprite specific monitor, the only possible target is - // the current editing one b/c you cannot dynamically create monitors. - // Also, do not change the targetId if it has already been assigned - block.targetId = + if (isSpriteSpecific) { + // If creating a new sprite specific monitor, the only possible target is + // the current editing one b/c you cannot dynamically create monitors. + // Also, do not change the targetId if it has already been assigned + block.targetId = block.targetId || this.runtime.getEditingTarget().id; - } else { - block.targetId = null; - } + } else { + block.targetId = null; + } - if (wasMonitored && !block.isMonitored) { - this.runtime.requestHideMonitor(block.id); - } else if (!wasMonitored && block.isMonitored) { - // Tries to show the monitor for specified block. If it doesn't exist, add the monitor. - if (!this.runtime.requestShowMonitor(block.id)) { - this.runtime.requestAddMonitor( - MonitorRecord({ - id: block.id, - targetId: block.targetId, - spriteName: block.targetId - ? this.runtime - .getTargetById(block.targetId) - .getName() - : null, - opcode: block.opcode, - params: this._getBlockParams(block), - // @todo(vm#565) for numerical values with decimals, some countries use comma - value: "", - mode: - block.opcode === "data_listcontents" - ? "list" - : "default", - }) - ); - } + if (wasMonitored && !block.isMonitored) { + this.runtime.requestHideMonitor(block.id); + } else if (!wasMonitored && block.isMonitored) { + // Tries to show the monitor for specified block. If it doesn't exist, add the monitor. + if (!this.runtime.requestShowMonitor(block.id)) { + this.runtime.requestAddMonitor( + MonitorRecord({ + id: block.id, + targetId: block.targetId, + spriteName: block.targetId ? + this.runtime + .getTargetById(block.targetId) + .getName() : + null, + opcode: block.opcode, + params: this._getBlockParams(block), + // @todo(vm#565) for numerical values with decimals, some countries use comma + value: '', + mode: + block.opcode === 'data_listcontents' ? + 'list' : + 'default' + }) + ); } - break; } + break; + } } this.emitProjectChanged(); @@ -859,7 +862,7 @@ class Blocks { * Block management: move blocks from parent to parent * @param {!object} e Blockly move event to be processed */ - moveBlock(e) { + moveBlock (e) { if (!Object.prototype.hasOwnProperty.call(this._blocks, e.id)) { return; } @@ -880,10 +883,10 @@ class Blocks { } // Remove from any old parent. - if (typeof e.oldParent !== "undefined") { + if (typeof e.oldParent !== 'undefined') { const oldParent = this._blocks[e.oldParent]; if ( - typeof e.oldInput !== "undefined" && + typeof e.oldInput !== 'undefined' && oldParent.inputs[e.oldInput].block === e.id ) { // This block was connected to an input. We either want to @@ -908,7 +911,7 @@ class Blocks { } // Is this block a top-level block? - if (typeof e.newParent === "undefined") { + if (typeof e.newParent === 'undefined') { if (!this._blocks[e.id].shadow) { this._addScript(e.id); } @@ -916,7 +919,7 @@ class Blocks { // Remove script, if one exists. this._deleteScript(e.id); // Otherwise, try to connect it in its new place. - if (typeof e.newInput === "undefined") { + if (typeof e.newInput === 'undefined') { // Moved to the new parent's next connection. this._blocks[e.newParent].next = e.id; } else { @@ -941,7 +944,7 @@ class Blocks { this._blocks[e.newParent].inputs[e.newInput] = { name: e.newInput, block: e.id, - shadow: oldShadow, + shadow: oldShadow }; } this._blocks[e.id].parent = e.newParent; @@ -956,24 +959,24 @@ class Blocks { * Block management: run all blocks. * @param {!object} runtime Runtime to run all blocks in. */ - runAllMonitored(runtime) { + runAllMonitored (runtime) { if (this._cache._monitored === null) { this._cache._monitored = Object.keys(this._blocks) - .filter((blockId) => this.getBlock(blockId).isMonitored) - .map((blockId) => { + .filter(blockId => this.getBlock(blockId).isMonitored) + .map(blockId => { const targetId = this.getBlock(blockId).targetId; return { blockId, - target: targetId - ? runtime.getTargetById(targetId) - : null, + target: targetId ? + runtime.getTargetById(targetId) : + null }; }); } const monitored = this._cache._monitored; for (let i = 0; i < monitored.length; i++) { - const { blockId, target } = monitored[i]; + const {blockId, target} = monitored[i]; runtime.addMonitorScript(blockId, target); } } @@ -983,7 +986,7 @@ class Blocks { * with the given ID does not exist. * @param {!string} blockId Id of block to delete */ - deleteBlock(blockId) { + deleteBlock (blockId) { // @todo In runtime, stop threads running on this script. // Get block @@ -1026,9 +1029,9 @@ class Blocks { /** * Delete all blocks and their associated scripts. */ - deleteAllBlocks() { + deleteAllBlocks () { const blockIds = Object.keys(this._blocks); - blockIds.forEach((blockId) => this.deleteBlock(blockId)); + blockIds.forEach(blockId => this.deleteBlock(blockId)); } /** @@ -1042,7 +1045,7 @@ class Blocks { * for that ID. A variable reference contains the field referencing that variable * and also the type of the variable being referenced. */ - getAllVariableAndListReferences(optBlocks, optIncludeBroadcast) { + getAllVariableAndListReferences (optBlocks, optIncludeBroadcast) { const blocks = optBlocks ? optBlocks : this._blocks; const allReferences = Object.create(null); for (const blockId in blocks) { @@ -1066,14 +1069,14 @@ class Blocks { if (allReferences[currVarId]) { allReferences[currVarId].push({ referencingField: varOrListField, - type: varType, + type: varType }); } else { allReferences[currVarId] = [ { referencingField: varOrListField, - type: varType, - }, + type: varType + } ]; } } @@ -1086,7 +1089,7 @@ class Blocks { * @param {string} varId The id of the variable that was renamed * @param {string} newName The new name of the variable that was renamed */ - updateBlocksAfterVarRename(varId, newName) { + updateBlocksAfterVarRename (varId, newName) { const blocks = this._blocks; for (const blockId in blocks) { let varOrListField = null; @@ -1108,19 +1111,19 @@ class Blocks { * Keep blocks up to date after they are shared between targets. * @param {boolean} isStage If the new target is a stage. */ - updateTargetSpecificBlocks(isStage) { + updateTargetSpecificBlocks (isStage) { const blocks = this._blocks; for (const blockId in blocks) { if ( isStage && - blocks[blockId].opcode === "event_whenthisspriteclicked" + blocks[blockId].opcode === 'event_whenthisspriteclicked' ) { - blocks[blockId].opcode = "event_whenstageclicked"; + blocks[blockId].opcode = 'event_whenstageclicked'; } else if ( !isStage && - blocks[blockId].opcode === "event_whenstageclicked" + blocks[blockId].opcode === 'event_whenstageclicked' ) { - blocks[blockId].opcode = "event_whenthisspriteclicked"; + blocks[blockId].opcode = 'event_whenthisspriteclicked'; } } } @@ -1135,15 +1138,15 @@ class Blocks { * that was renamed. This can be one of 'sprite','costume', 'sound', or * 'backdrop'. */ - updateAssetName(oldName, newName, assetType) { + updateAssetName (oldName, newName, assetType) { let getAssetField; - if (assetType === "costume") { + if (assetType === 'costume') { getAssetField = this._getCostumeField.bind(this); - } else if (assetType === "sound") { + } else if (assetType === 'sound') { getAssetField = this._getSoundField.bind(this); - } else if (assetType === "backdrop") { + } else if (assetType === 'backdrop') { getAssetField = this._getBackdropField.bind(this); - } else if (assetType === "sprite") { + } else if (assetType === 'sprite') { getAssetField = this._getSpriteField.bind(this); } else { return; @@ -1164,13 +1167,13 @@ class Blocks { * @param {string} targetName The name of the target the variable belongs to. * @return {boolean} Returns true if any of the blocks were updated. */ - updateSensingOfReference(oldName, newName, targetName) { + updateSensingOfReference (oldName, newName, targetName) { const blocks = this._blocks; let blockUpdated = false; for (const blockId in blocks) { const block = blocks[blockId]; if ( - block.opcode === "sensing_of" && + block.opcode === 'sensing_of' && block.fields.PROPERTY.value === oldName && // If block and shadow are different, it means a block is inserted to OBJECT, and should be ignored. block.inputs.OBJECT.block === block.inputs.OBJECT.shadow @@ -1193,11 +1196,11 @@ class Blocks { * Null if either a block with the given id doesn't exist or if a costume menu field * does not exist on the block with the given id. */ - _getCostumeField(blockId) { + _getCostumeField (blockId) { const block = this.getBlock(blockId); if ( block && - Object.prototype.hasOwnProperty.call(block.fields, "COSTUME") + Object.prototype.hasOwnProperty.call(block.fields, 'COSTUME') ) { return block.fields.COSTUME; } @@ -1211,11 +1214,11 @@ class Blocks { * Null, if either a block with the given id doesn't exist or if a sound menu field * does not exist on the block with the given id. */ - _getSoundField(blockId) { + _getSoundField (blockId) { const block = this.getBlock(blockId); if ( block && - Object.prototype.hasOwnProperty.call(block.fields, "SOUND_MENU") + Object.prototype.hasOwnProperty.call(block.fields, 'SOUND_MENU') ) { return block.fields.SOUND_MENU; } @@ -1229,11 +1232,11 @@ class Blocks { * Null, if either a block with the given id doesn't exist or if a backdrop menu field * does not exist on the block with the given id. */ - _getBackdropField(blockId) { + _getBackdropField (blockId) { const block = this.getBlock(blockId); if ( block && - Object.prototype.hasOwnProperty.call(block.fields, "BACKDROP") + Object.prototype.hasOwnProperty.call(block.fields, 'BACKDROP') ) { return block.fields.BACKDROP; } @@ -1247,19 +1250,19 @@ class Blocks { * Null, if either a block with the given id doesn't exist or if a sprite menu field * does not exist on the block with the given id. */ - _getSpriteField(blockId) { + _getSpriteField (blockId) { const block = this.getBlock(blockId); if (!block) { return null; } const spriteMenuNames = [ - "TOWARDS", - "TO", - "OBJECT", - "VIDEOONMENU2", - "DISTANCETOMENU", - "TOUCHINGOBJECTMENU", - "CLONE_OPTION", + 'TOWARDS', + 'TO', + 'OBJECT', + 'VIDEOONMENU2', + 'DISTANCETOMENU', + 'TOUCHINGOBJECTMENU', + 'CLONE_OPTION' ]; for (let i = 0; i < spriteMenuNames.length; i++) { const menuName = spriteMenuNames[i]; @@ -1278,9 +1281,9 @@ class Blocks { * @param {object} comments Map of comments referenced by id * @return {string} String of XML representing this object's blocks. */ - toXML(comments) { + toXML (comments) { return this._scripts - .map((script) => this.blockToXML(script, comments)) + .map(script => this.blockToXML(script, comments)) .join(); } @@ -1291,18 +1294,18 @@ class Blocks { * @param {object} comments Map of comments referenced by id * @return {string} String of XML representing this block and any children. */ - blockToXML(blockId, comments) { + blockToXML (blockId, comments) { const block = this._blocks[blockId]; // block should exist, but currently some blocks' next property point // to a blockId for non-existent blocks. Until we track down that behavior, // this early exit allows the project to load. if (!block) return; // Encode properties of this block. - const tagName = block.shadow ? "shadow" : "block"; + const tagName = block.shadow ? 'shadow' : 'block'; let xmlString = `<${tagName} id="${block.id}" type="${block.opcode}" - ${block.topLevel ? `x="${block.x}" y="${block.y}"` : ""} + ${block.topLevel ? `x="${block.x}" y="${block.y}"` : ''} >`; const commentId = block.comment; if (commentId) { @@ -1326,8 +1329,9 @@ class Blocks { } // Add any inputs on this block. for (const input in block.inputs) { - if (!Object.prototype.hasOwnProperty.call(block.inputs, input)) + if (!Object.prototype.hasOwnProperty.call(block.inputs, input)) { continue; + } const blockInput = block.inputs[input]; // Only encode a value tag if the value input is occupied. if (blockInput.block || blockInput.shadow) { @@ -1342,13 +1346,14 @@ class Blocks { // Obscured shadow. xmlString += this.blockToXML(blockInput.shadow, comments); } - xmlString += ""; + xmlString += ''; } } // Add any fields on this block. for (const field in block.fields) { - if (!Object.prototype.hasOwnProperty.call(block.fields, field)) + if (!Object.prototype.hasOwnProperty.call(block.fields, field)) { continue; + } const blockField = block.fields[field]; xmlString += `${value}`; @@ -1381,23 +1386,23 @@ class Blocks { * @param {!object} mutation Object representing a mutation. * @return {string} XML string representing a mutation. */ - mutationToXML(mutation) { + mutationToXML (mutation) { let mutationString = `<${mutation.tagName}`; for (const prop in mutation) { - if (prop === "children" || prop === "tagName") continue; + if (prop === 'children' || prop === 'tagName') continue; let mutationValue = - typeof mutation[prop] === "string" - ? xmlEscape(mutation[prop]) - : mutation[prop]; + typeof mutation[prop] === 'string' ? + xmlEscape(mutation[prop]) : + mutation[prop]; // Handle dynamic extension blocks - if (prop === "blockInfo") { + if (prop === 'blockInfo') { mutationValue = xmlEscape(JSON.stringify(mutation[prop])); } mutationString += ` ${prop}="${mutationValue}"`; } - mutationString += ">"; + mutationString += '>'; for (let i = 0; i < mutation.children.length; i++) { mutationString += this.mutationToXML(mutation.children[i]); } @@ -1411,7 +1416,7 @@ class Blocks { * @param {!object} block Block to be paramified. * @return {!object} object of param key/values. */ - _getBlockParams(block) { + _getBlockParams (block) { const params = {}; for (const key in block.fields) { params[key] = block.fields[key].value; @@ -1430,7 +1435,7 @@ class Blocks { * @param {!object} defineBlock Outer define block. * @return {!object} internal definition block which has the mutation. */ - _getCustomBlockInternal(defineBlock) { + _getCustomBlockInternal (defineBlock) { if (defineBlock.inputs && defineBlock.inputs.custom_block) { return this._blocks[defineBlock.inputs.custom_block.block]; } @@ -1440,7 +1445,7 @@ class Blocks { * Helper to add a stack to `this._scripts`. * @param {?string} topBlockId ID of block that starts the script. */ - _addScript(topBlockId) { + _addScript (topBlockId) { const i = this._scripts.indexOf(topBlockId); if (i > -1) return; // Already in scripts. this._scripts.push(topBlockId); @@ -1452,7 +1457,7 @@ class Blocks { * Helper to remove a script from `this._scripts`. * @param {?string} topBlockId ID of block that starts the script. */ - _deleteScript(topBlockId) { + _deleteScript (topBlockId) { const i = this._scripts.indexOf(topBlockId); if (i > -1) this._scripts.splice(i, 1); // Update `topLevel` property on the top block. @@ -1471,20 +1476,20 @@ class Blocks { */ BlocksExecuteCache.getCached = function (blocks, blockId, CacheType) { let cached = blocks._cache._executeCached[blockId]; - if (typeof cached !== "undefined") { + if (typeof cached !== 'undefined') { return cached; } const block = blocks.getBlock(blockId); - if (typeof block === "undefined") return null; + if (typeof block === 'undefined') return null; - if (typeof CacheType === "undefined") { + if (typeof CacheType === 'undefined') { cached = { id: blockId, opcode: blocks.getOpcode(block), fields: blocks.getFields(block), inputs: blocks.getInputs(block), - mutation: blocks.getMutation(block), + mutation: blocks.getMutation(block) }; } else { cached = new CacheType(blocks, { @@ -1492,7 +1497,7 @@ BlocksExecuteCache.getCached = function (blocks, blockId, CacheType) { opcode: blocks.getOpcode(block), fields: blocks.getFields(block), inputs: blocks.getInputs(block), - mutation: blocks.getMutation(block), + mutation: blocks.getMutation(block) }); } diff --git a/packages/scratch-vm/src/engine/runtime.js b/packages/scratch-vm/src/engine/runtime.js index 59a1405b164..06518d493b9 100644 --- a/packages/scratch-vm/src/engine/runtime.js +++ b/packages/scratch-vm/src/engine/runtime.js @@ -1,50 +1,50 @@ -const EventEmitter = require("events"); -const { OrderedMap } = require("immutable"); -const uuid = require("uuid"); - -const ArgumentType = require("../extension-support/argument-type"); -const Blocks = require("./blocks"); -const BlocksRuntimeCache = require("./blocks-runtime-cache"); -const BlockType = require("../extension-support/block-type"); -const Profiler = require("./profiler"); -const Sequencer = require("./sequencer"); -const execute = require("./execute.js"); -const ScratchBlocksConstants = require("./scratch-blocks-constants"); -const TargetType = require("../extension-support/target-type"); -const Thread = require("./thread"); -const log = require("../util/log"); -const maybeFormatMessage = require("../util/maybe-format-message"); -const StageLayering = require("./stage-layering"); -const Variable = require("./variable"); -const xmlEscape = require("../util/xml-escape"); -const ScratchLinkWebSocket = require("../util/scratch-link-websocket"); -const fetchWithTimeout = require("../util/fetch-with-timeout"); +const EventEmitter = require('events'); +const {OrderedMap} = require('immutable'); +const uuid = require('uuid'); + +const ArgumentType = require('../extension-support/argument-type'); +const Blocks = require('./blocks'); +const BlocksRuntimeCache = require('./blocks-runtime-cache'); +const BlockType = require('../extension-support/block-type'); +const Profiler = require('./profiler'); +const Sequencer = require('./sequencer'); +const execute = require('./execute.js'); +const ScratchBlocksConstants = require('./scratch-blocks-constants'); +const TargetType = require('../extension-support/target-type'); +const Thread = require('./thread'); +const log = require('../util/log'); +const maybeFormatMessage = require('../util/maybe-format-message'); +const StageLayering = require('./stage-layering'); +const Variable = require('./variable'); +const xmlEscape = require('../util/xml-escape'); +const ScratchLinkWebSocket = require('../util/scratch-link-websocket'); +const fetchWithTimeout = require('../util/fetch-with-timeout'); // Virtual I/O devices. -const Clock = require("../io/clock"); -const Cloud = require("../io/cloud"); -const Keyboard = require("../io/keyboard"); -const Mouse = require("../io/mouse"); -const MouseWheel = require("../io/mouseWheel"); -const UserData = require("../io/userData"); -const Video = require("../io/video"); +const Clock = require('../io/clock'); +const Cloud = require('../io/cloud'); +const Keyboard = require('../io/keyboard'); +const Mouse = require('../io/mouse'); +const MouseWheel = require('../io/mouseWheel'); +const UserData = require('../io/userData'); +const Video = require('../io/video'); -const StringUtil = require("../util/string-util"); -const uid = require("../util/uid"); +const StringUtil = require('../util/string-util'); +const uid = require('../util/uid'); const defaultBlockPackages = { - scratch3_control: require("../blocks/scratch3_control"), - scratch3_event: require("../blocks/scratch3_event"), - scratch3_looks: require("../blocks/scratch3_looks"), - scratch3_motion: require("../blocks/scratch3_motion"), - scratch3_operators: require("../blocks/scratch3_operators"), - scratch3_sound: require("../blocks/scratch3_sound"), - scratch3_sensing: require("../blocks/scratch3_sensing"), - scratch3_data: require("../blocks/scratch3_data"), - scratch3_procedures: require("../blocks/scratch3_procedures"), + scratch3_control: require('../blocks/scratch3_control'), + scratch3_event: require('../blocks/scratch3_event'), + scratch3_looks: require('../blocks/scratch3_looks'), + scratch3_motion: require('../blocks/scratch3_motion'), + scratch3_operators: require('../blocks/scratch3_operators'), + scratch3_sound: require('../blocks/scratch3_sound'), + scratch3_sensing: require('../blocks/scratch3_sensing'), + scratch3_data: require('../blocks/scratch3_data'), + scratch3_procedures: require('../blocks/scratch3_procedures') }; -const defaultExtensionColors = ["#0FBD8C", "#0DA57A", "#0B8E69"]; +const defaultExtensionColors = ['#0FBD8C', '#0DA57A', '#0B8E69']; /** * Information used for converting Scratch argument types into scratch-blocks data. @@ -54,7 +54,7 @@ const ArgumentTypeMap = (() => { const map = {}; map[ArgumentType.ANGLE] = { shadow: { - type: "math_angle", + type: 'math_angle', // We specify fieldNames here so that we can pick // create and populate a field with the defaultValue // specified in the extension. @@ -62,46 +62,46 @@ const ArgumentTypeMap = (() => { // the will be left out of the XML and // the scratch-blocks defaults for that field will be // used instead (e.g. default of 0 for number fields) - fieldName: "NUM", - }, + fieldName: 'NUM' + } }; map[ArgumentType.COLOR] = { shadow: { - type: "colour_picker", - fieldName: "COLOUR", - }, + type: 'colour_picker', + fieldName: 'COLOUR' + } }; map[ArgumentType.NUMBER] = { shadow: { - type: "math_number", - fieldName: "NUM", - }, + type: 'math_number', + fieldName: 'NUM' + } }; map[ArgumentType.STRING] = { shadow: { - type: "text", - fieldName: "TEXT", - }, + type: 'text', + fieldName: 'TEXT' + } }; map[ArgumentType.BOOLEAN] = { - check: "Boolean", + check: 'Boolean' }; map[ArgumentType.MATRIX] = { shadow: { - type: "matrix", - fieldName: "MATRIX", - }, + type: 'matrix', + fieldName: 'MATRIX' + } }; map[ArgumentType.NOTE] = { shadow: { - type: "note", - fieldName: "NOTE", - }, + type: 'note', + fieldName: 'NOTE' + } }; map[ArgumentType.IMAGE] = { // Inline images are weird because they're not actually "arguments". // They are more analagous to the label on a block. - fieldType: "field_image", + fieldType: 'field_image' }; return map; })(); @@ -150,7 +150,7 @@ const cloudDataManager = () => { canAddCloudVariable, addCloudVariable, removeCloudVariable, - hasCloudVariables, + hasCloudVariables }; }; @@ -177,7 +177,7 @@ let rendererDrawProfilerId = -1; * @constructor */ class Runtime extends EventEmitter { - constructor() { + constructor () { super(); /** @@ -344,7 +344,7 @@ class Runtime extends EventEmitter { mouse: new Mouse(this), mouseWheel: new MouseWheel(this), userData: new UserData(), - video: new Video(this), + video: new Video(this) }; /** @@ -413,7 +413,7 @@ class Runtime extends EventEmitter { * Width of the stage, in pixels. * @const {number} */ - static get STAGE_WIDTH() { + static get STAGE_WIDTH () { return 480; } @@ -421,7 +421,7 @@ class Runtime extends EventEmitter { * Height of the stage, in pixels. * @const {number} */ - static get STAGE_HEIGHT() { + static get STAGE_HEIGHT () { return 360; } @@ -429,32 +429,32 @@ class Runtime extends EventEmitter { * Event name for glowing a script. * @const {string} */ - static get SCRIPT_GLOW_ON() { - return "SCRIPT_GLOW_ON"; + static get SCRIPT_GLOW_ON () { + return 'SCRIPT_GLOW_ON'; } /** * Event name for unglowing a script. * @const {string} */ - static get SCRIPT_GLOW_OFF() { - return "SCRIPT_GLOW_OFF"; + static get SCRIPT_GLOW_OFF () { + return 'SCRIPT_GLOW_OFF'; } /** * Event name for glowing a block. * @const {string} */ - static get BLOCK_GLOW_ON() { - return "BLOCK_GLOW_ON"; + static get BLOCK_GLOW_ON () { + return 'BLOCK_GLOW_ON'; } /** * Event name for unglowing a block. * @const {string} */ - static get BLOCK_GLOW_OFF() { - return "BLOCK_GLOW_OFF"; + static get BLOCK_GLOW_OFF () { + return 'BLOCK_GLOW_OFF'; } /** @@ -462,24 +462,24 @@ class Runtime extends EventEmitter { * to this project. * @const {string} */ - static get HAS_CLOUD_DATA_UPDATE() { - return "HAS_CLOUD_DATA_UPDATE"; + static get HAS_CLOUD_DATA_UPDATE () { + return 'HAS_CLOUD_DATA_UPDATE'; } /** * Event name for turning on turbo mode. * @const {string} */ - static get TURBO_MODE_ON() { - return "TURBO_MODE_ON"; + static get TURBO_MODE_ON () { + return 'TURBO_MODE_ON'; } /** * Event name for turning off turbo mode. * @const {string} */ - static get TURBO_MODE_OFF() { - return "TURBO_MODE_OFF"; + static get TURBO_MODE_OFF () { + return 'TURBO_MODE_OFF'; } /** @@ -487,8 +487,8 @@ class Runtime extends EventEmitter { * running). * @const {string} */ - static get PROJECT_START() { - return "PROJECT_START"; + static get PROJECT_START () { + return 'PROJECT_START'; } /** @@ -496,8 +496,8 @@ class Runtime extends EventEmitter { * Used by the UI to indicate running status. * @const {string} */ - static get PROJECT_RUN_START() { - return "PROJECT_RUN_START"; + static get PROJECT_RUN_START () { + return 'PROJECT_RUN_START'; } /** @@ -505,8 +505,8 @@ class Runtime extends EventEmitter { * Used by the UI to indicate not-running status. * @const {string} */ - static get PROJECT_RUN_STOP() { - return "PROJECT_RUN_STOP"; + static get PROJECT_RUN_STOP () { + return 'PROJECT_RUN_STOP'; } /** @@ -514,8 +514,8 @@ class Runtime extends EventEmitter { * Used by blocks that need to reset state. * @const {string} */ - static get PROJECT_STOP_ALL() { - return "PROJECT_STOP_ALL"; + static get PROJECT_STOP_ALL () { + return 'PROJECT_STOP_ALL'; } /** @@ -523,88 +523,88 @@ class Runtime extends EventEmitter { * Used by blocks that need to stop individual targets. * @const {string} */ - static get STOP_FOR_TARGET() { - return "STOP_FOR_TARGET"; + static get STOP_FOR_TARGET () { + return 'STOP_FOR_TARGET'; } /** * Event name for visual value report. * @const {string} */ - static get VISUAL_REPORT() { - return "VISUAL_REPORT"; + static get VISUAL_REPORT () { + return 'VISUAL_REPORT'; } /** * Event name for project loaded report. * @const {string} */ - static get PROJECT_LOADED() { - return "PROJECT_LOADED"; + static get PROJECT_LOADED () { + return 'PROJECT_LOADED'; } /** * Event name for report that a change was made that can be saved * @const {string} */ - static get PROJECT_CHANGED() { - return "PROJECT_CHANGED"; + static get PROJECT_CHANGED () { + return 'PROJECT_CHANGED'; } /** * Event name for report that a change was made to an extension in the toolbox. * @const {string} */ - static get TOOLBOX_EXTENSIONS_NEED_UPDATE() { - return "TOOLBOX_EXTENSIONS_NEED_UPDATE"; + static get TOOLBOX_EXTENSIONS_NEED_UPDATE () { + return 'TOOLBOX_EXTENSIONS_NEED_UPDATE'; } /** * Event name for targets update report. * @const {string} */ - static get TARGETS_UPDATE() { - return "TARGETS_UPDATE"; + static get TARGETS_UPDATE () { + return 'TARGETS_UPDATE'; } /** * Event name for monitors update. * @const {string} */ - static get MONITORS_UPDATE() { - return "MONITORS_UPDATE"; + static get MONITORS_UPDATE () { + return 'MONITORS_UPDATE'; } /** * Event name for block drag update. * @const {string} */ - static get BLOCK_DRAG_UPDATE() { - return "BLOCK_DRAG_UPDATE"; + static get BLOCK_DRAG_UPDATE () { + return 'BLOCK_DRAG_UPDATE'; } /** * Event name for block drag end. * @const {string} */ - static get BLOCK_DRAG_END() { - return "BLOCK_DRAG_END"; + static get BLOCK_DRAG_END () { + return 'BLOCK_DRAG_END'; } /** * Event name for reporting that an extension was added. * @const {string} */ - static get EXTENSION_ADDED() { - return "EXTENSION_ADDED"; + static get EXTENSION_ADDED () { + return 'EXTENSION_ADDED'; } /** * Event name for reporting that an extension as asked for a custom field to be added * @const {string} */ - static get EXTENSION_FIELD_ADDED() { - return "EXTENSION_FIELD_ADDED"; + static get EXTENSION_FIELD_ADDED () { + return 'EXTENSION_FIELD_ADDED'; } /** @@ -613,8 +613,8 @@ class Runtime extends EventEmitter { * available peripherals. * @const {string} */ - static get PERIPHERAL_LIST_UPDATE() { - return "PERIPHERAL_LIST_UPDATE"; + static get PERIPHERAL_LIST_UPDATE () { + return 'PERIPHERAL_LIST_UPDATE'; } /** @@ -622,8 +622,8 @@ class Runtime extends EventEmitter { * via Companion Device Manager (CDM) * @const {string} */ - static get USER_PICKED_PERIPHERAL() { - return "USER_PICKED_PERIPHERAL"; + static get USER_PICKED_PERIPHERAL () { + return 'USER_PICKED_PERIPHERAL'; } /** @@ -631,8 +631,8 @@ class Runtime extends EventEmitter { * This causes the status button in the blocks menu to indicate 'connected'. * @const {string} */ - static get PERIPHERAL_CONNECTED() { - return "PERIPHERAL_CONNECTED"; + static get PERIPHERAL_CONNECTED () { + return 'PERIPHERAL_CONNECTED'; } /** @@ -640,8 +640,8 @@ class Runtime extends EventEmitter { * This causes the status button in the blocks menu to indicate 'disconnected'. * @const {string} */ - static get PERIPHERAL_DISCONNECTED() { - return "PERIPHERAL_DISCONNECTED"; + static get PERIPHERAL_DISCONNECTED () { + return 'PERIPHERAL_DISCONNECTED'; } /** @@ -649,8 +649,8 @@ class Runtime extends EventEmitter { * This causes the peripheral connection modal to switch to an error state. * @const {string} */ - static get PERIPHERAL_REQUEST_ERROR() { - return "PERIPHERAL_REQUEST_ERROR"; + static get PERIPHERAL_REQUEST_ERROR () { + return 'PERIPHERAL_REQUEST_ERROR'; } /** @@ -658,8 +658,8 @@ class Runtime extends EventEmitter { * This causes a 'peripheral connection lost' error alert to display. * @const {string} */ - static get PERIPHERAL_CONNECTION_LOST_ERROR() { - return "PERIPHERAL_CONNECTION_LOST_ERROR"; + static get PERIPHERAL_CONNECTION_LOST_ERROR () { + return 'PERIPHERAL_CONNECTION_LOST_ERROR'; } /** @@ -667,61 +667,61 @@ class Runtime extends EventEmitter { * This causes the peripheral connection modal to show a timeout state. * @const {string} */ - static get PERIPHERAL_SCAN_TIMEOUT() { - return "PERIPHERAL_SCAN_TIMEOUT"; + static get PERIPHERAL_SCAN_TIMEOUT () { + return 'PERIPHERAL_SCAN_TIMEOUT'; } /** * Event name to indicate that the microphone is being used to stream audio. * @const {string} */ - static get MIC_LISTENING() { - return "MIC_LISTENING"; + static get MIC_LISTENING () { + return 'MIC_LISTENING'; } /** * Event name for reporting that blocksInfo was updated. * @const {string} */ - static get BLOCKSINFO_UPDATE() { - return "BLOCKSINFO_UPDATE"; + static get BLOCKSINFO_UPDATE () { + return 'BLOCKSINFO_UPDATE'; } /** * Event name when the runtime tick loop has been started. * @const {string} */ - static get RUNTIME_STARTED() { - return "RUNTIME_STARTED"; + static get RUNTIME_STARTED () { + return 'RUNTIME_STARTED'; } /** * Event name when the runtime dispose has been called. * @const {string} */ - static get RUNTIME_DISPOSED() { - return "RUNTIME_DISPOSED"; + static get RUNTIME_DISPOSED () { + return 'RUNTIME_DISPOSED'; } /** * Event name for reporting that a block was updated and needs to be rerendered. * @const {string} */ - static get BLOCKS_NEED_UPDATE() { - return "BLOCKS_NEED_UPDATE"; + static get BLOCKS_NEED_UPDATE () { + return 'BLOCKS_NEED_UPDATE'; } /** * How rapidly we try to step threads by default, in ms. */ - static get THREAD_STEP_INTERVAL() { + static get THREAD_STEP_INTERVAL () { return 1000 / 60; } /** * In compatibility mode, how rapidly we try to step threads, in ms. */ - static get THREAD_STEP_INTERVAL_COMPATIBILITY() { + static get THREAD_STEP_INTERVAL_COMPATIBILITY () { return 1000 / 30; } @@ -729,7 +729,7 @@ class Runtime extends EventEmitter { * How many clones can be created at a time. * @const {number} */ - static get MAX_CLONES() { + static get MAX_CLONES () { return 300; } @@ -737,7 +737,7 @@ class Runtime extends EventEmitter { // ----------------------------------------------------------------------------- // Helper function for initializing the addCloudVariable function - _initializeAddCloudVariable(newCloudDataManager) { + _initializeAddCloudVariable (newCloudDataManager) { // The addCloudVariable function return () => { const hadCloudVarsBefore = this.hasCloudData(); @@ -749,7 +749,7 @@ class Runtime extends EventEmitter { } // Helper function for initializing the removeCloudVariable function - _initializeRemoveCloudVariable(newCloudDataManager) { + _initializeRemoveCloudVariable (newCloudDataManager) { return () => { const hadCloudVarsBefore = this.hasCloudData(); newCloudDataManager.removeCloudVariable(); @@ -764,7 +764,7 @@ class Runtime extends EventEmitter { * @todo Prefix opcodes with package name. * @private */ - _registerBlockPackages() { + _registerBlockPackages () { for (const packageName in defaultBlockPackages) { if ( Object.prototype.hasOwnProperty.call( @@ -817,7 +817,7 @@ class Runtime extends EventEmitter { } } - getMonitorState() { + getMonitorState () { return this._monitorState; } @@ -828,7 +828,7 @@ class Runtime extends EventEmitter { * @returns {string} - the constructed ID. * @private */ - _makeExtensionMenuId(menuName, extensionId) { + _makeExtensionMenuId (menuName, extensionId) { return `${extensionId}_menu_${xmlEscape(menuName)}`; } @@ -837,13 +837,13 @@ class Runtime extends EventEmitter { * @param {Target} [target] - the target to use as context. If a target is not provided, default to the current * editing target or the stage. */ - makeMessageContextForTarget(target) { + makeMessageContextForTarget (target) { const context = {}; target = target || this.getEditingTarget() || this.getTargetForStage(); if (target) { - context.targetType = target.isStage - ? TargetType.STAGE - : TargetType.SPRITE; + context.targetType = target.isStage ? + TargetType.STAGE : + TargetType.SPRITE; } } @@ -852,13 +852,13 @@ class Runtime extends EventEmitter { * @param {ExtensionMetadata} extensionInfo - information about the extension (id, blocks, etc.) * @private */ - _registerExtensionPrimitives(extensionInfo) { + _registerExtensionPrimitives (extensionInfo) { const categoryInfo = { id: extensionInfo.id, name: maybeFormatMessage(extensionInfo.name), showStatusButton: extensionInfo.showStatusButton, blockIconURI: extensionInfo.blockIconURI, - menuIconURI: extensionInfo.menuIconURI, + menuIconURI: extensionInfo.menuIconURI }; if (extensionInfo.color1) { @@ -888,7 +888,7 @@ class Runtime extends EventEmitter { // Emit events for custom field types from extension this.emit(Runtime.EXTENSION_FIELD_ADDED, { name: `field_${fieldTypeInfo.extendedName}`, - implementation: fieldTypeInfo.fieldImplementation, + implementation: fieldTypeInfo.fieldImplementation }); } } @@ -901,9 +901,9 @@ class Runtime extends EventEmitter { * @param {ExtensionMetadata} extensionInfo - new info (results of running getInfo) for an extension * @private */ - _refreshExtensionPrimitives(extensionInfo) { + _refreshExtensionPrimitives (extensionInfo) { const categoryInfo = this._blockInfo.find( - (info) => info.id === extensionInfo.id + info => info.id === extensionInfo.id ); if (categoryInfo) { categoryInfo.name = maybeFormatMessage(extensionInfo.name); @@ -920,7 +920,7 @@ class Runtime extends EventEmitter { * @param {ExtensionMetadata} extensionInfo - the extension metadata to read * @private */ - _fillExtensionCategory(categoryInfo, extensionInfo) { + _fillExtensionCategory (categoryInfo, extensionInfo) { categoryInfo.blocks = []; categoryInfo.customFieldTypes = {}; categoryInfo.menus = []; @@ -981,14 +981,14 @@ class Runtime extends EventEmitter { this._hats[opcode] = { edgeActivated: blockInfo.isEdgeActivated, restartExistingThreads: - blockInfo.shouldRestartExistingThreads, + blockInfo.shouldRestartExistingThreads }; } } } catch (e) { - log.error("Error parsing block: ", { + log.error('Error parsing block: ', { block: blockInfo, - error: e, + error: e }); } } @@ -1001,29 +1001,29 @@ class Runtime extends EventEmitter { * @returns {object} - an array of 2 element arrays or the original input function * @private */ - _convertMenuItems(menuItems) { - if (typeof menuItems !== "function") { + _convertMenuItems (menuItems) { + if (typeof menuItems !== 'function') { const extensionMessageContext = this.makeMessageContextForTarget(); - return menuItems.map((item) => { + return menuItems.map(item => { const formattedItem = maybeFormatMessage( item, extensionMessageContext ); switch (typeof formattedItem) { - case "string": - return [formattedItem, formattedItem]; - case "object": - return [ - maybeFormatMessage( - item.text, - extensionMessageContext - ), - item.value, - ]; - default: - throw new Error( - `Can't interpret menu item: ${JSON.stringify(item)}` - ); + case 'string': + return [formattedItem, formattedItem]; + case 'object': + return [ + maybeFormatMessage( + item.text, + extensionMessageContext + ), + item.value + ]; + default: + throw new Error( + `Can't interpret menu item: ${JSON.stringify(item)}` + ); } }); } @@ -1040,31 +1040,31 @@ class Runtime extends EventEmitter { * @returns {object} - a JSON-esque object ready for scratch-blocks' consumption * @private */ - _buildMenuForScratchBlocks(menuName, menuInfo, categoryInfo) { + _buildMenuForScratchBlocks (menuName, menuInfo, categoryInfo) { const menuId = this._makeExtensionMenuId(menuName, categoryInfo.id); const menuItems = this._convertMenuItems(menuInfo.items); return { json: { - message0: "%1", + message0: '%1', type: menuId, inputsInline: true, - output: "String", + output: 'String', style: categoryInfo.id, - outputShape: menuInfo.acceptReporters - ? ScratchBlocksConstants.OUTPUT_SHAPE_ROUND - : ScratchBlocksConstants.OUTPUT_SHAPE_SQUARE, + outputShape: menuInfo.acceptReporters ? + ScratchBlocksConstants.OUTPUT_SHAPE_ROUND : + ScratchBlocksConstants.OUTPUT_SHAPE_SQUARE, args0: [ { - type: "field_dropdown", + type: 'field_dropdown', name: menuName, - options: menuItems, - }, - ], - }, + options: menuItems + } + ] + } }; } - _buildCustomFieldInfo(fieldName, fieldInfo, extensionId, categoryInfo) { + _buildCustomFieldInfo (fieldName, fieldInfo, extensionId, categoryInfo) { const extendedName = `${extensionId}_${fieldName}`; return { fieldName: fieldName, @@ -1072,8 +1072,8 @@ class Runtime extends EventEmitter { argumentTypeInfo: { shadow: { type: extendedName, - fieldName: `field_${extendedName}`, - }, + fieldName: `field_${extendedName}` + } }, scratchBlocksDefinition: this._buildCustomFieldTypeForScratchBlocks( extendedName, @@ -1081,7 +1081,7 @@ class Runtime extends EventEmitter { fieldInfo.outputShape, categoryInfo ), - fieldImplementation: fieldInfo.implementation, + fieldImplementation: fieldInfo.implementation }; } @@ -1094,7 +1094,7 @@ class Runtime extends EventEmitter { * @param {object} categoryInfo - The category the field belongs to (Used to set its colors) * @returns {object} - Object to be inserted into scratch-blocks */ - _buildCustomFieldTypeForScratchBlocks( + _buildCustomFieldTypeForScratchBlocks ( fieldName, output, outputShape, @@ -1103,7 +1103,7 @@ class Runtime extends EventEmitter { return { json: { type: fieldName, - message0: "%1", + message0: '%1', inputsInline: true, output: output, style: categoryInfo.id, @@ -1111,10 +1111,10 @@ class Runtime extends EventEmitter { args0: [ { name: `field_${fieldName}`, - type: `field_${fieldName}`, - }, - ], - }, + type: `field_${fieldName}` + } + ] + } }; } @@ -1125,8 +1125,8 @@ class Runtime extends EventEmitter { * @returns {ConvertedBlockInfo} - the converted & original block information * @private */ - _convertForScratchBlocks(blockInfo, categoryInfo) { - if (blockInfo === "---") { + _convertForScratchBlocks (blockInfo, categoryInfo) { + if (blockInfo === '---') { return this._convertSeparatorForScratchBlocks(blockInfo); } @@ -1144,7 +1144,7 @@ class Runtime extends EventEmitter { * @returns {ConvertedBlockInfo} - the converted & original block information * @private */ - _convertBlockForScratchBlocks(blockInfo, categoryInfo) { + _convertBlockForScratchBlocks (blockInfo, categoryInfo) { const extendedOpcode = `${categoryInfo.id}_${blockInfo.opcode}`; const blockJSON = { @@ -1152,7 +1152,7 @@ class Runtime extends EventEmitter { inputsInline: true, category: categoryInfo.name, style: categoryInfo.id, - extensions: [], + extensions: [] }; const context = { // TODO: store this somewhere so that we can map args appropriately after translation. @@ -1163,7 +1163,7 @@ class Runtime extends EventEmitter { blockJSON, categoryInfo, blockInfo, - inputList: [], + inputList: [] }; // If an icon for the extension exists, prepend it to each block, with a vertical separator. @@ -1172,70 +1172,70 @@ class Runtime extends EventEmitter { const iconURI = blockInfo.blockIconURI || categoryInfo.blockIconURI; if (iconURI) { - blockJSON.extensions.push("scratch_extension"); - blockJSON.message0 = "%1 %2"; + blockJSON.extensions.push('scratch_extension'); + blockJSON.message0 = '%1 %2'; const iconJSON = { - type: "field_image", + type: 'field_image', src: iconURI, width: 40, - height: 40, + height: 40 }; const separatorJSON = { - type: "field_vertical_separator", + type: 'field_vertical_separator' }; blockJSON.args0 = [iconJSON, separatorJSON]; } switch (blockInfo.blockType) { - case BlockType.COMMAND: - blockJSON.outputShape = + case BlockType.COMMAND: + blockJSON.outputShape = ScratchBlocksConstants.OUTPUT_SHAPE_SQUARE; - blockJSON.previousStatement = null; // null = available connection; undefined = hat - if (!blockInfo.isTerminal) { - blockJSON.nextStatement = null; // null = available connection; undefined = terminal - } - break; - case BlockType.REPORTER: - blockJSON.output = "String"; // TODO: distinguish number & string here? - blockJSON.outputShape = + blockJSON.previousStatement = null; // null = available connection; undefined = hat + if (!blockInfo.isTerminal) { + blockJSON.nextStatement = null; // null = available connection; undefined = terminal + } + break; + case BlockType.REPORTER: + blockJSON.output = 'String'; // TODO: distinguish number & string here? + blockJSON.outputShape = ScratchBlocksConstants.OUTPUT_SHAPE_ROUND; - break; - case BlockType.BOOLEAN: - blockJSON.output = "Boolean"; - blockJSON.outputShape = + break; + case BlockType.BOOLEAN: + blockJSON.output = 'Boolean'; + blockJSON.outputShape = ScratchBlocksConstants.OUTPUT_SHAPE_HEXAGONAL; - break; - case BlockType.HAT: - case BlockType.EVENT: - if ( - !Object.prototype.hasOwnProperty.call( - blockInfo, - "isEdgeActivated" - ) - ) { - // if absent, this property defaults to true - blockInfo.isEdgeActivated = true; - } - blockJSON.outputShape = + break; + case BlockType.HAT: + case BlockType.EVENT: + if ( + !Object.prototype.hasOwnProperty.call( + blockInfo, + 'isEdgeActivated' + ) + ) { + // if absent, this property defaults to true + blockInfo.isEdgeActivated = true; + } + blockJSON.outputShape = ScratchBlocksConstants.OUTPUT_SHAPE_SQUARE; - blockJSON.nextStatement = null; // null = available connection; undefined = terminal - blockJSON.extensions.push("shape_hat"); - break; - case BlockType.CONDITIONAL: - case BlockType.LOOP: - blockInfo.branchCount = blockInfo.branchCount || 1; - blockJSON.outputShape = + blockJSON.nextStatement = null; // null = available connection; undefined = terminal + blockJSON.extensions.push('shape_hat'); + break; + case BlockType.CONDITIONAL: + case BlockType.LOOP: + blockInfo.branchCount = blockInfo.branchCount || 1; + blockJSON.outputShape = ScratchBlocksConstants.OUTPUT_SHAPE_SQUARE; - blockJSON.previousStatement = null; // null = available connection; undefined = hat - if (!blockInfo.isTerminal) { - blockJSON.nextStatement = null; // null = available connection; undefined = terminal - } - break; + blockJSON.previousStatement = null; // null = available connection; undefined = hat + if (!blockInfo.isTerminal) { + blockJSON.nextStatement = null; // null = available connection; undefined = terminal + } + break; } - const blockText = Array.isArray(blockInfo.text) - ? blockInfo.text - : [blockInfo.text]; + const blockText = Array.isArray(blockInfo.text) ? + blockInfo.text : + [blockInfo.text]; let inTextNum = 0; // text for the next block "arm" is blockText[inTextNum] let inBranchNum = 0; // how many branches have we placed into the JSON so far? let outLineNum = 0; // used for scratch-blocks `message${outLineNum}` and `args${outLineNum}` @@ -1269,14 +1269,14 @@ class Runtime extends EventEmitter { ++outLineNum; } if (inBranchNum < blockInfo.branchCount) { - blockJSON[`message${outLineNum}`] = "%1"; + blockJSON[`message${outLineNum}`] = '%1'; blockJSON[`args${outLineNum}`] = [ { - type: "input_statement", + type: 'input_statement', name: `SUBSTACK${ - inBranchNum > 0 ? inBranchNum + 1 : "" - }`, - }, + inBranchNum > 0 ? inBranchNum + 1 : '' + }` + } ]; ++inBranchNum; ++outLineNum; @@ -1285,35 +1285,35 @@ class Runtime extends EventEmitter { if (blockInfo.blockType === BlockType.REPORTER) { if (!blockInfo.disableMonitor && context.inputList.length === 0) { - blockJSON.extensions.push("monitor_block"); + blockJSON.extensions.push('monitor_block'); } } else if (blockInfo.blockType === BlockType.LOOP) { // Add icon to the bottom right of a loop block - blockJSON[`lastDummyAlign${outLineNum}`] = "RIGHT"; - blockJSON[`message${outLineNum}`] = "%1"; + blockJSON[`lastDummyAlign${outLineNum}`] = 'RIGHT'; + blockJSON[`message${outLineNum}`] = '%1'; blockJSON[`args${outLineNum}`] = [ { - type: "field_image", - src: "./static/blocks-media/repeat.svg", // TODO: use a constant or make this configurable? + type: 'field_image', + src: './static/blocks-media/repeat.svg', // TODO: use a constant or make this configurable? width: 24, height: 24, - alt: "*", // TODO remove this since we don't use collapsed blocks in scratch - flip_rtl: true, - }, + alt: '*', // TODO remove this since we don't use collapsed blocks in scratch + flip_rtl: true + } ]; ++outLineNum; } - const mutation = blockInfo.isDynamic - ? `` - : ""; - const inputs = context.inputList.join(""); + const mutation = blockInfo.isDynamic ? + `` : + ''; + const inputs = context.inputList.join(''); const blockXML = `${mutation}${inputs}`; return { info: context.blockInfo, json: context.blockJSON, - xml: blockXML, + xml: blockXML }; } @@ -1324,10 +1324,10 @@ class Runtime extends EventEmitter { * @returns {ConvertedBlockInfo} - the converted & original block information * @private */ - _convertSeparatorForScratchBlocks(blockInfo) { + _convertSeparatorForScratchBlocks (blockInfo) { return { info: blockInfo, - xml: '', + xml: '' }; } @@ -1339,12 +1339,12 @@ class Runtime extends EventEmitter { * @returns {ConvertedBlockInfo} - the converted & original button information * @private */ - _convertButtonForScratchBlocks(buttonInfo) { + _convertButtonForScratchBlocks (buttonInfo) { // for now we only support these pre-defined callbacks handled in scratch-blocks const supportedCallbackKeys = [ - "MAKE_A_LIST", - "MAKE_A_PROCEDURE", - "MAKE_A_VARIABLE", + 'MAKE_A_LIST', + 'MAKE_A_PROCEDURE', + 'MAKE_A_VARIABLE' ]; if (supportedCallbackKeys.indexOf(buttonInfo.func) < 0) { log.error( @@ -1359,7 +1359,7 @@ class Runtime extends EventEmitter { ); return { info: buttonInfo, - xml: ``, + xml: `` }; } @@ -1369,22 +1369,22 @@ class Runtime extends EventEmitter { * @return {object} JSON blob for a scratch-blocks image field. * @private */ - _constructInlineImageJson(argInfo) { + _constructInlineImageJson (argInfo) { if (!argInfo.dataURI) { log.warn( - "Missing data URI in extension block with argument type IMAGE" + 'Missing data URI in extension block with argument type IMAGE' ); } return { - type: "field_image", - src: argInfo.dataURI || "", + type: 'field_image', + src: argInfo.dataURI || '', // TODO these probably shouldn't be hardcoded...? width: 24, height: 24, // Whether or not the inline image should be flipped horizontally // in RTL languages. Defaults to false, indicating that the // image will not be flipped. - flip_rtl: argInfo.flipRTL || false, + flip_rtl: argInfo.flipRTL || false }; } @@ -1397,9 +1397,9 @@ class Runtime extends EventEmitter { * @return {string} scratch-blocks placeholder for the argument: '%1'. * @private */ - _convertPlaceholders(context, match, placeholder) { + _convertPlaceholders (context, match, placeholder) { // Sanitize the placeholder to ensure valid XML - placeholder = placeholder.replace(/[<"&]/, "_"); + placeholder = placeholder.replace(/[<"&]/, '_'); // Determine whether the argument type is one of the known standard field types const argInfo = context.blockInfo.arguments[placeholder] || {}; @@ -1421,26 +1421,26 @@ class Runtime extends EventEmitter { // Most field types are inputs (slots on the block that can have other blocks plugged into them) // check if this is not one of those cases. E.g. an inline image on a block. - if (argTypeInfo.fieldType === "field_image") { + if (argTypeInfo.fieldType === 'field_image') { argJSON = this._constructInlineImageJson(argInfo); } else { // Construct input value // Layout a block argument (e.g. an input slot on the block) argJSON = { - type: "input_value", - name: placeholder, + type: 'input_value', + name: placeholder }; const defaultValue = - typeof argInfo.defaultValue === "undefined" - ? "" - : xmlEscape( - maybeFormatMessage( - argInfo.defaultValue, - this.makeMessageContextForTarget() - ).toString() - ); + typeof argInfo.defaultValue === 'undefined' ? + '' : + xmlEscape( + maybeFormatMessage( + argInfo.defaultValue, + this.makeMessageContextForTarget() + ).toString() + ); if (argTypeInfo.check) { // Right now the only type of 'check' we have specifies that the @@ -1462,7 +1462,7 @@ class Runtime extends EventEmitter { ); fieldName = argInfo.menu; } else { - argJSON.type = "field_dropdown"; + argJSON.type = 'field_dropdown'; argJSON.options = this._convertMenuItems(menuInfo.items); valueName = null; shadowType = null; @@ -1497,11 +1497,11 @@ class Runtime extends EventEmitter { } if (shadowType) { - context.inputList.push(""); + context.inputList.push(''); } if (valueName) { - context.inputList.push(""); + context.inputList.push(''); } } @@ -1521,12 +1521,12 @@ class Runtime extends EventEmitter { * @property {string} id - the category / extension ID * @property {string} xml - the XML text for this category, starting with `` and ending with `` */ - getBlocksXML(target) { - return this._blockInfo.map((categoryInfo) => { - const { name, color1, color2 } = categoryInfo; + getBlocksXML (target) { + return this._blockInfo.map(categoryInfo => { + const {name, color1, color2} = categoryInfo; // Filter out blocks that aren't supposed to be shown on this target, as determined by the block info's // `hideFromPalette` and `filter` properties. - const paletteBlocks = categoryInfo.blocks.filter((block) => { + const paletteBlocks = categoryInfo.blocks.filter(block => { let blockFilterIncludesTarget = true; // If an editing target is not passed, include all blocks // If the block info doesn't include a `filter` property, always include it @@ -1543,15 +1543,15 @@ class Runtime extends EventEmitter { // Use a menu icon if there is one. Otherwise, use the block icon. If there's no icon, // the category menu will show its default colored circle. - let menuIconURI = ""; + let menuIconURI = ''; if (categoryInfo.menuIconURI) { menuIconURI = categoryInfo.menuIconURI; } else if (categoryInfo.blockIconURI) { menuIconURI = categoryInfo.blockIconURI; } - const menuIconXML = menuIconURI ? `iconURI="${menuIconURI}"` : ""; + const menuIconXML = menuIconURI ? `iconURI="${menuIconURI}"` : ''; - let statusButtonXML = ""; + let statusButtonXML = ''; if (categoryInfo.showStatusButton) { statusButtonXML = 'showStatusButton="true"'; } @@ -1561,8 +1561,8 @@ class Runtime extends EventEmitter { xml: `${paletteBlocks - .map((block) => block.xml) - .join("")}`, + .map(block => block.xml) + .join('')}` }; }); } @@ -1570,11 +1570,11 @@ class Runtime extends EventEmitter { /** * @returns {Array.} - an array containing the scratch-blocks JSON information for each dynamic block. */ - getBlocksJSON() { + getBlocksJSON () { return this._blockInfo.reduce( (result, categoryInfo) => result.concat( - categoryInfo.blocks.map((blockInfo) => blockInfo.json) + categoryInfo.blocks.map(blockInfo => blockInfo.json) ), [] ); @@ -1583,34 +1583,34 @@ class Runtime extends EventEmitter { /** * One-time initialization for Scratch Link support. */ - _initScratchLink() { + _initScratchLink () { // Check that we're actually in a real browser, not Node.js or JSDOM, and we have a valid-looking origin. // note that `if (self?....)` will throw if `self` is undefined, so check for that first! if ( - typeof self !== "undefined" && - typeof document !== "undefined" && + typeof self !== 'undefined' && + typeof document !== 'undefined' && document.getElementById && self.origin && - self.origin !== "null" && // note this is a string comparison, not a null check + self.origin !== 'null' && // note this is a string comparison, not a null check self.navigator && self.navigator.userAgent && !( - self.navigator.userAgent.includes("Node.js") || - self.navigator.userAgent.includes("jsdom") + self.navigator.userAgent.includes('Node.js') || + self.navigator.userAgent.includes('jsdom') ) ) { // Create a script tag for the Scratch Link browser extension, unless one already exists const scriptElement = document.getElementById( - "scratch-link-extension-script" + 'scratch-link-extension-script' ); if (!scriptElement) { - const script = document.createElement("script"); - script.id = "scratch-link-extension-script"; + const script = document.createElement('script'); + script.id = 'scratch-link-extension-script'; document.body.appendChild(script); // Tell the browser extension to inject its script. // If the extension isn't present or isn't active, this will do nothing. - self.postMessage("inject-scratch-link-script", self.origin); + self.postMessage('inject-scratch-link-script', self.origin); } } } @@ -1620,7 +1620,7 @@ class Runtime extends EventEmitter { * @param {string} type Either BLE or BT * @returns {ScratchLinkSocket} The scratch link socket. */ - getScratchLinkSocket(type) { + getScratchLinkSocket (type) { const factory = this._linkSocketFactory || this._defaultScratchLinkSocketFactory; return factory(type); @@ -1631,7 +1631,7 @@ class Runtime extends EventEmitter { * either BT or BLE. * @param {Function} factory The new factory for creating ScratchLink sockets. */ - configureScratchLinkSocketFactory(factory) { + configureScratchLinkSocketFactory (factory) { this._linkSocketFactory = factory; } @@ -1640,7 +1640,7 @@ class Runtime extends EventEmitter { * @param {string} type Either BLE or BT * @returns {ScratchLinkSocket} The new scratch link socket (a WebSocket object) */ - _defaultScratchLinkSocketFactory(type) { + _defaultScratchLinkSocketFactory (type) { const Scratch = self.Scratch; const ScratchLinkSafariSocket = Scratch && Scratch.ScratchLinkSafariSocket; @@ -1648,9 +1648,9 @@ class Runtime extends EventEmitter { const useSafariSocket = ScratchLinkSafariSocket && ScratchLinkSafariSocket.isSafariHelperCompatible(); - return useSafariSocket - ? new ScratchLinkSafariSocket(type) - : new ScratchLinkWebSocket(type); + return useSafariSocket ? + new ScratchLinkSafariSocket(type) : + new ScratchLinkWebSocket(type); } /** @@ -1659,7 +1659,7 @@ class Runtime extends EventEmitter { * @param {string} extensionId - the id of the extension. * @param {object} extension - the extension to register. */ - registerPeripheralExtension(extensionId, extension) { + registerPeripheralExtension (extensionId, extension) { this.peripheralExtensions[extensionId] = extension; } @@ -1667,7 +1667,7 @@ class Runtime extends EventEmitter { * Tell the specified extension to scan for a peripheral. * @param {string} extensionId - the id of the extension. */ - scanForPeripheral(extensionId) { + scanForPeripheral (extensionId) { if (this.peripheralExtensions[extensionId]) { this.peripheralExtensions[extensionId].scan(); } @@ -1678,7 +1678,7 @@ class Runtime extends EventEmitter { * @param {string} extensionId - the id of the extension. * @param {number} peripheralId - the id of the peripheral. */ - connectPeripheral(extensionId, peripheralId) { + connectPeripheral (extensionId, peripheralId) { if (this.peripheralExtensions[extensionId]) { this.peripheralExtensions[extensionId].connect(peripheralId); } @@ -1688,7 +1688,7 @@ class Runtime extends EventEmitter { * Disconnect from the extension's connected peripheral. * @param {string} extensionId - the id of the extension. */ - disconnectPeripheral(extensionId) { + disconnectPeripheral (extensionId) { if (this.peripheralExtensions[extensionId]) { this.peripheralExtensions[extensionId].disconnect(); } @@ -1699,7 +1699,7 @@ class Runtime extends EventEmitter { * @param {string} extensionId - the id of the extension. * @return {boolean} - whether the extension has a connected peripheral. */ - getPeripheralIsConnected(extensionId) { + getPeripheralIsConnected (extensionId) { let isConnected = false; if (this.peripheralExtensions[extensionId]) { isConnected = this.peripheralExtensions[extensionId].isConnected(); @@ -1711,7 +1711,7 @@ class Runtime extends EventEmitter { * Emit an event to indicate that the microphone is being used to stream audio. * @param {boolean} listening - true if the microphone is currently listening. */ - emitMicListening(listening) { + emitMicListening (listening) { this.emit(Runtime.MIC_LISTENING, listening); } @@ -1720,7 +1720,7 @@ class Runtime extends EventEmitter { * @param {!string} opcode The opcode to look up. * @return {Function} The function which implements the opcode. */ - getOpcodeFunction(opcode) { + getOpcodeFunction (opcode) { return this._primitives[opcode]; } @@ -1729,7 +1729,7 @@ class Runtime extends EventEmitter { * @param {!string} opcode The opcode to look up. * @return {boolean} True if the op is known to be a hat. */ - getIsHat(opcode) { + getIsHat (opcode) { return Object.prototype.hasOwnProperty.call(this._hats, opcode); } @@ -1738,7 +1738,7 @@ class Runtime extends EventEmitter { * @param {!string} opcode The opcode to look up. * @return {boolean} True if the op is known to be a edge-activated hat. */ - getIsEdgeActivatedHat(opcode) { + getIsEdgeActivatedHat (opcode) { return ( Object.prototype.hasOwnProperty.call(this._hats, opcode) && this._hats[opcode].edgeActivated @@ -1749,7 +1749,7 @@ class Runtime extends EventEmitter { * Attach the audio engine * @param {!AudioEngine} audioEngine The audio engine to attach */ - attachAudioEngine(audioEngine) { + attachAudioEngine (audioEngine) { this.audioEngine = audioEngine; } @@ -1757,7 +1757,7 @@ class Runtime extends EventEmitter { * Attach the renderer * @param {!RenderWebGL} renderer The renderer to attach */ - attachRenderer(renderer) { + attachRenderer (renderer) { this.renderer = renderer; this.renderer.setLayerGroupOrdering(StageLayering.LAYER_GROUPS); } @@ -1767,7 +1767,7 @@ class Runtime extends EventEmitter { * bitmaps to scratch 3 bitmaps. (Scratch 3 bitmaps are all bitmap resolution 2) * @param {!function} bitmapAdapter The adapter to attach */ - attachV2BitmapAdapter(bitmapAdapter) { + attachV2BitmapAdapter (bitmapAdapter) { this.v2BitmapAdapter = bitmapAdapter; } @@ -1775,7 +1775,7 @@ class Runtime extends EventEmitter { * Attach the storage module * @param {!ScratchStorage} storage The storage module to attach */ - attachStorage(storage) { + attachStorage (storage) { this.storage = storage; fetchWithTimeout.setFetch(storage.scratchFetch.scratchFetch); this.resetRunId(); @@ -1793,14 +1793,14 @@ class Runtime extends EventEmitter { * @param {?boolean} opts.updateMonitor true if the script should update a monitor value * @return {!Thread} The newly created thread. */ - _pushThread(id, target, opts) { + _pushThread (id, target, opts) { const thread = new Thread(id); thread.target = target; thread.stackClick = Boolean(opts && opts.stackClick); thread.updateMonitor = Boolean(opts && opts.updateMonitor); - thread.blockContainer = thread.updateMonitor - ? this.monitorBlocks - : target.blocks; + thread.blockContainer = thread.updateMonitor ? + this.monitorBlocks : + target.blocks; thread.pushStack(id); this.threads.push(thread); @@ -1811,7 +1811,7 @@ class Runtime extends EventEmitter { * Stop a thread: stop running it immediately, and remove it from the thread list later. * @param {!Thread} thread Thread object to remove from actives */ - _stopThread(thread) { + _stopThread (thread) { // Mark the thread for later removal thread.isKilled = true; // Inform sequencer to stop executing that thread. @@ -1825,7 +1825,7 @@ class Runtime extends EventEmitter { * @param {!Thread} thread Thread object to restart. * @return {Thread} The restarted thread. */ - _restartThread(thread) { + _restartThread (thread) { const newThread = new Thread(thread.topBlock); newThread.target = thread.target; newThread.stackClick = thread.stackClick; @@ -1846,7 +1846,7 @@ class Runtime extends EventEmitter { * @param {?Thread} thread Thread object to check. * @return {boolean} True if the thread is active/running. */ - isActiveThread(thread) { + isActiveThread (thread) { return ( thread.stack.length > 0 && thread.status !== Thread.STATUS_DONE && @@ -1859,7 +1859,7 @@ class Runtime extends EventEmitter { * @param {?Thread} thread Thread object to check. * @return {boolean} True if the thread is waiting */ - isWaitingThread(thread) { + isWaitingThread (thread) { return ( thread.status === Thread.STATUS_PROMISE_WAIT || thread.status === Thread.STATUS_YIELD_TICK || @@ -1875,11 +1875,11 @@ class Runtime extends EventEmitter { * @param {?boolean} opts.stackClick true if the user activated the stack by clicking, false if not. This * determines whether we show a visual report when turning on the script. */ - toggleScript(topBlockId, opts) { + toggleScript (topBlockId, opts) { opts = Object.assign( { target: this._editingTarget, - stackClick: false, + stackClick: false }, opts ); @@ -1916,7 +1916,7 @@ class Runtime extends EventEmitter { * @param {!string} topBlockId ID of block that starts the script. * @param {?Target} optTarget target Target to run script on. If not supplied, uses editing target. */ - addMonitorScript(topBlockId, optTarget) { + addMonitorScript (topBlockId, optTarget) { if (!optTarget) optTarget = this._editingTarget; for (let i = 0; i < this.threads.length; i++) { // Don't re-add the script if it's already running @@ -1929,7 +1929,7 @@ class Runtime extends EventEmitter { } } // Otherwise add it. - this._pushThread(topBlockId, optTarget, { updateMonitor: true }); + this._pushThread(topBlockId, optTarget, {updateMonitor: true}); } /** @@ -1940,7 +1940,7 @@ class Runtime extends EventEmitter { * @param {!Function} f Function to call for each script. * @param {Target=} optTarget Optionally, a target to restrict to. */ - allScriptsDo(f, optTarget) { + allScriptsDo (f, optTarget) { let targets = this.executableTargets; if (optTarget) { targets = [optTarget]; @@ -1955,7 +1955,7 @@ class Runtime extends EventEmitter { } } - allScriptsByOpcodeDo(opcode, f, optTarget) { + allScriptsByOpcodeDo (opcode, f, optTarget) { let targets = this.executableTargets; if (optTarget) { targets = [optTarget]; @@ -1979,7 +1979,7 @@ class Runtime extends EventEmitter { * @param {Target=} optTarget Optionally, a target to restrict to. * @return {Array.} List of threads started by this function. */ - startHats(requestedHatOpcode, optMatchFields, optTarget) { + startHats (requestedHatOpcode, optMatchFields, optTarget) { if ( !Object.prototype.hasOwnProperty.call( this._hats, @@ -1995,8 +1995,9 @@ class Runtime extends EventEmitter { const hatMeta = instance._hats[requestedHatOpcode]; for (const opts in optMatchFields) { - if (!Object.prototype.hasOwnProperty.call(optMatchFields, opts)) + if (!Object.prototype.hasOwnProperty.call(optMatchFields, opts)) { continue; + } optMatchFields[opts] = optMatchFields[opts].toUpperCase(); } @@ -2004,7 +2005,7 @@ class Runtime extends EventEmitter { this.allScriptsByOpcodeDo( requestedHatOpcode, (script, target) => { - const { blockId: topBlockId, fieldsOfInputs: hatFields } = + const {blockId: topBlockId, fieldsOfInputs: hatFields} = script; // Match any requested fields. @@ -2061,7 +2062,7 @@ class Runtime extends EventEmitter { ); // For compatibility with Scratch 2, edge triggered hats need to be processed before // threads are stepped. See ScratchRuntime.as for original implementation - newThreads.forEach((thread) => { + newThreads.forEach(thread => { execute(this.sequencer, thread); thread.goToNextBlock(); }); @@ -2071,10 +2072,10 @@ class Runtime extends EventEmitter { /** * Dispose all targets. Return to clean state. */ - dispose() { + dispose () { this.stopAll(); // Deleting each target's variable's monitors. - this.targets.forEach((target) => { + this.targets.forEach(target => { if (target.isOriginal) target.deleteMonitors(); }); @@ -2111,7 +2112,7 @@ class Runtime extends EventEmitter { * into the correct execution order after calling this function. * @param {Target} target target to add */ - addTarget(target) { + addTarget (target) { this.targets.push(target); this.executableTargets.push(target); } @@ -2126,7 +2127,7 @@ class Runtime extends EventEmitter { * @param {number} delta number of positions to move target by * @returns {number} new position in execution order */ - moveExecutable(executableTarget, delta) { + moveExecutable (executableTarget, delta) { const oldIndex = this.executableTargets.indexOf(executableTarget); this.executableTargets.splice(oldIndex, 1); let newIndex = oldIndex + delta; @@ -2157,7 +2158,7 @@ class Runtime extends EventEmitter { * @param {number} newIndex position in execution order to place the target * @returns {number} new position in the execution order */ - setExecutablePosition(executableTarget, newIndex) { + setExecutablePosition (executableTarget, newIndex) { const oldIndex = this.executableTargets.indexOf(executableTarget); return this.moveExecutable(executableTarget, newIndex - oldIndex); } @@ -2166,7 +2167,7 @@ class Runtime extends EventEmitter { * Remove a target from the execution set. * @param {Target} executableTarget target to remove */ - removeExecutable(executableTarget) { + removeExecutable (executableTarget) { const oldIndex = this.executableTargets.indexOf(executableTarget); if (oldIndex > -1) { this.executableTargets.splice(oldIndex, 1); @@ -2177,8 +2178,8 @@ class Runtime extends EventEmitter { * Dispose of a target. * @param {!Target} disposingTarget Target to dispose of. */ - disposeTarget(disposingTarget) { - this.targets = this.targets.filter((target) => { + disposeTarget (disposingTarget) { + this.targets = this.targets.filter(target => { if (disposingTarget !== target) return true; // Allow target to do dispose actions. target.dispose(); @@ -2192,7 +2193,7 @@ class Runtime extends EventEmitter { * @param {!Target} target Target to stop threads for. * @param {Thread=} optThreadException Optional thread to skip. */ - stopForTarget(target, optThreadException) { + stopForTarget (target, optThreadException) { // Emit stop event to allow blocks to clean up any state. this.emit(Runtime.STOP_FOR_TARGET, target, optThreadException); @@ -2210,7 +2211,7 @@ class Runtime extends EventEmitter { /** * Reset the Run ID. Call this any time the project logically starts, stops, or changes identity. */ - resetRunId() { + resetRunId () { if (!this.storage) { // see also: attachStorage return; @@ -2226,22 +2227,22 @@ class Runtime extends EventEmitter { /** * Start all threads that start with the green flag. */ - greenFlag() { + greenFlag () { this.stopAll(); this.emit(Runtime.PROJECT_START); this.ioDevices.clock.resetProjectTimer(); - this.targets.forEach((target) => target.clearEdgeActivatedValues()); + this.targets.forEach(target => target.clearEdgeActivatedValues()); // Inform all targets of the green flag. for (let i = 0; i < this.targets.length; i++) { this.targets[i].onGreenFlag(); } - this.startHats("event_whenflagclicked"); + this.startHats('event_whenflagclicked'); } /** * Stop "everything." */ - stopAll() { + stopAll () { // Emit stop event to allow blocks to clean up any state. this.emit(Runtime.PROJECT_STOP_ALL); @@ -2252,7 +2253,7 @@ class Runtime extends EventEmitter { if ( Object.prototype.hasOwnProperty.call( this.targets[i], - "isOriginal" + 'isOriginal' ) && !this.targets[i].isOriginal ) { @@ -2276,21 +2277,22 @@ class Runtime extends EventEmitter { * Repeatedly run `sequencer.stepThreads` and filter out * inactive threads after each iteration. */ - _step() { + _step () { if (this.profiler !== null) { if (stepProfilerId === -1) { - stepProfilerId = this.profiler.idByName("Runtime._step"); + stepProfilerId = this.profiler.idByName('Runtime._step'); } this.profiler.start(stepProfilerId); } // Clean up threads that were told to stop during or since the last step - this.threads = this.threads.filter((thread) => !thread.isKilled); + this.threads = this.threads.filter(thread => !thread.isKilled); // Find all edge-activated hats, and add them to threads to be evaluated. for (const hatType in this._hats) { - if (!Object.prototype.hasOwnProperty.call(this._hats, hatType)) + if (!Object.prototype.hasOwnProperty.call(this._hats, hatType)) { continue; + } const hat = this._hats[hatType]; if (hat.edgeActivated) { this.startHats(hatType); @@ -2301,7 +2303,7 @@ class Runtime extends EventEmitter { if (this.profiler !== null) { if (stepThreadsProfilerId === -1) { stepThreadsProfilerId = this.profiler.idByName( - "Sequencer.stepThreads" + 'Sequencer.stepThreads' ); } this.profiler.start(stepThreadsProfilerId); @@ -2326,7 +2328,7 @@ class Runtime extends EventEmitter { if (this.profiler !== null) { if (rendererDrawProfilerId === -1) { rendererDrawProfilerId = - this.profiler.idByName("RenderWebGL.draw"); + this.profiler.idByName('RenderWebGL.draw'); } this.profiler.start(rendererDrawProfilerId); } @@ -2361,9 +2363,9 @@ class Runtime extends EventEmitter { * @param {!Array.} threads The set of threads to look through. * @return {number} The number of monitor threads in threads. */ - _getMonitorThreadCount(threads) { + _getMonitorThreadCount (threads) { let count = 0; - threads.forEach((thread) => { + threads.forEach(thread => { if (thread.updateMonitor) count++; }); return count; @@ -2372,7 +2374,7 @@ class Runtime extends EventEmitter { /** * Queue monitor blocks to sequencer to be run. */ - _pushMonitors() { + _pushMonitors () { this.monitorBlocks.runAllMonitored(this); } @@ -2380,7 +2382,7 @@ class Runtime extends EventEmitter { * Set the current editing target known by the runtime. * @param {!Target} editingTarget New editing target. */ - setEditingTarget(editingTarget) { + setEditingTarget (editingTarget) { const oldEditingTarget = this._editingTarget; this._editingTarget = editingTarget; // Script glows must be cleared. @@ -2396,7 +2398,7 @@ class Runtime extends EventEmitter { * Set whether we are in 30 TPS compatibility mode. * @param {boolean} compatibilityModeOn True iff in compatibility mode. */ - setCompatibilityMode(compatibilityModeOn) { + setCompatibilityMode (compatibilityModeOn) { this.compatibilityMode = compatibilityModeOn; if (this._steppingInterval) { clearInterval(this._steppingInterval); @@ -2410,7 +2412,7 @@ class Runtime extends EventEmitter { * Looks at `this.threads` and notices which have turned on/off new glows. * @param {Array.=} optExtraThreads Optional list of inactive threads. */ - _updateGlows(optExtraThreads) { + _updateGlows (optExtraThreads) { const searchThreads = []; searchThreads.push(...this.threads); if (optExtraThreads) { @@ -2468,7 +2470,7 @@ class Runtime extends EventEmitter { * * @param {number} nonMonitorThreadCount The new nonMonitorThreadCount */ - _emitProjectRunStatus(nonMonitorThreadCount) { + _emitProjectRunStatus (nonMonitorThreadCount) { if (this._nonMonitorThreadCount === 0 && nonMonitorThreadCount > 0) { this.emit(Runtime.PROJECT_RUN_START); } @@ -2484,7 +2486,7 @@ class Runtime extends EventEmitter { * still be tracking glow data about it. * @param {!string} scriptBlockId Id of top-level block in script to quiet. */ - quietGlow(scriptBlockId) { + quietGlow (scriptBlockId) { const index = this._scriptGlowsPreviousFrame.indexOf(scriptBlockId); if (index > -1) { this._scriptGlowsPreviousFrame.splice(index, 1); @@ -2496,11 +2498,11 @@ class Runtime extends EventEmitter { * @param {?string} blockId ID for the block to update glow * @param {boolean} isGlowing True to turn on glow; false to turn off. */ - glowBlock(blockId, isGlowing) { + glowBlock (blockId, isGlowing) { if (isGlowing) { - this.emit(Runtime.BLOCK_GLOW_ON, { id: blockId }); + this.emit(Runtime.BLOCK_GLOW_ON, {id: blockId}); } else { - this.emit(Runtime.BLOCK_GLOW_OFF, { id: blockId }); + this.emit(Runtime.BLOCK_GLOW_OFF, {id: blockId}); } } @@ -2509,11 +2511,11 @@ class Runtime extends EventEmitter { * @param {?string} topBlockId ID for the top block to update glow * @param {boolean} isGlowing True to turn on glow; false to turn off. */ - glowScript(topBlockId, isGlowing) { + glowScript (topBlockId, isGlowing) { if (isGlowing) { - this.emit(Runtime.SCRIPT_GLOW_ON, { id: topBlockId }); + this.emit(Runtime.SCRIPT_GLOW_ON, {id: topBlockId}); } else { - this.emit(Runtime.SCRIPT_GLOW_OFF, { id: topBlockId }); + this.emit(Runtime.SCRIPT_GLOW_OFF, {id: topBlockId}); } } @@ -2521,7 +2523,7 @@ class Runtime extends EventEmitter { * Emit whether blocks are being dragged over gui * @param {boolean} areBlocksOverGui True if blocks are dragged out of blocks workspace, false otherwise */ - emitBlockDragUpdate(areBlocksOverGui) { + emitBlockDragUpdate (areBlocksOverGui) { this.emit(Runtime.BLOCK_DRAG_UPDATE, areBlocksOverGui); } @@ -2530,7 +2532,7 @@ class Runtime extends EventEmitter { * @param {Array.} blocks The set of blocks dragged to the GUI * @param {string} topBlockId The original id of the top block being dragged */ - emitBlockEndDrag(blocks, topBlockId) { + emitBlockEndDrag (blocks, topBlockId) { this.emit(Runtime.BLOCK_DRAG_END, blocks, topBlockId); } @@ -2539,8 +2541,8 @@ class Runtime extends EventEmitter { * @param {string} blockId ID for the block. * @param {string} value Value to show associated with the block. */ - visualReport(blockId, value) { - this.emit(Runtime.VISUAL_REPORT, { id: blockId, value: String(value) }); + visualReport (blockId, value) { + this.emit(Runtime.VISUAL_REPORT, {id: blockId, value: String(value)}); } /** @@ -2548,8 +2550,8 @@ class Runtime extends EventEmitter { * updates those properties that are defined in the given monitor record. * @param {!MonitorRecord} monitor Monitor to add. */ - requestAddMonitor(monitor) { - const id = monitor.get("id"); + requestAddMonitor (monitor) { + const id = monitor.get('id'); if (!this.requestUpdateMonitor(monitor)) { // update monitor if it exists in the state // if the monitor did not exist in the state, add it @@ -2564,15 +2566,15 @@ class Runtime extends EventEmitter { * the old monitor will keep its old value. * @return {boolean} true if monitor exists in the state and was updated, false if it did not exist. */ - requestUpdateMonitor(monitor) { - const id = monitor.get("id"); + requestUpdateMonitor (monitor) { + const id = monitor.get('id'); if (this._monitorState.has(id)) { this._monitorState = // Use mergeWith here to prevent undefined values from overwriting existing ones this._monitorState.set( id, this._monitorState.get(id).mergeWith((prev, next) => { - if (typeof next === "undefined" || next === null) { + if (typeof next === 'undefined' || next === null) { return prev; } return next; @@ -2588,7 +2590,7 @@ class Runtime extends EventEmitter { * not exist in the state. * @param {!string} monitorId ID of the monitor to remove. */ - requestRemoveMonitor(monitorId) { + requestRemoveMonitor (monitorId) { this._monitorState = this._monitorState.delete(monitorId); } @@ -2597,11 +2599,11 @@ class Runtime extends EventEmitter { * @param {!string} monitorId ID of the monitor to hide. * @return {boolean} true if monitor exists and was updated, false otherwise */ - requestHideMonitor(monitorId) { + requestHideMonitor (monitorId) { return this.requestUpdateMonitor( new Map([ - ["id", monitorId], - ["visible", false], + ['id', monitorId], + ['visible', false] ]) ); } @@ -2612,11 +2614,11 @@ class Runtime extends EventEmitter { * @param {!string} monitorId ID of the monitor to show. * @return {boolean} true if monitor exists and was updated, false otherwise */ - requestShowMonitor(monitorId) { + requestShowMonitor (monitorId) { return this.requestUpdateMonitor( new Map([ - ["id", monitorId], - ["visible", true], + ['id', monitorId], + ['visible', true] ]) ); } @@ -2626,9 +2628,9 @@ class Runtime extends EventEmitter { * the monitor already does not exist in the state. * @param {!string} targetId Remove all monitors with given target ID. */ - requestRemoveMonitorByTargetId(targetId) { + requestRemoveMonitorByTargetId (targetId) { this._monitorState = this._monitorState.filterNot( - (value) => value.targetId === targetId + value => value.targetId === targetId ); } @@ -2637,7 +2639,7 @@ class Runtime extends EventEmitter { * @param {string} targetId Id of target to find. * @return {?Target} The target, if found. */ - getTargetById(targetId) { + getTargetById (targetId) { for (let i = 0; i < this.targets.length; i++) { const target = this.targets[i]; if (target.id === targetId) { @@ -2651,7 +2653,7 @@ class Runtime extends EventEmitter { * @param {string} spriteName Name of sprite to look for. * @return {?Target} Target representing a sprite of the given name. */ - getSpriteTargetByName(spriteName) { + getSpriteTargetByName (spriteName) { for (let i = 0; i < this.targets.length; i++) { const target = this.targets[i]; if (target.isStage) { @@ -2668,7 +2670,7 @@ class Runtime extends EventEmitter { * @param {number} drawableID drawable id of target to find * @return {?Target} The target, if found */ - getTargetByDrawableId(drawableID) { + getTargetByDrawableId (drawableID) { for (let i = 0; i < this.targets.length; i++) { const target = this.targets[i]; if (target.drawableID === drawableID) return target; @@ -2679,7 +2681,7 @@ class Runtime extends EventEmitter { * Update the clone counter to track how many clones are created. * @param {number} changeAmount How many clones have been created/destroyed. */ - changeCloneCounter(changeAmount) { + changeCloneCounter (changeAmount) { this._cloneCounter += changeAmount; } @@ -2687,14 +2689,14 @@ class Runtime extends EventEmitter { * Return whether there are clones available. * @return {boolean} True until the number of clones hits Runtime.MAX_CLONES. */ - clonesAvailable() { + clonesAvailable () { return this._cloneCounter < Runtime.MAX_CLONES; } /** * Handle that the project has loaded in the Virtual Machine. */ - handleProjectLoaded() { + handleProjectLoaded () { this.emit(Runtime.PROJECT_LOADED); this.resetRunId(); } @@ -2702,7 +2704,7 @@ class Runtime extends EventEmitter { /** * Report that the project has changed in a way that would affect serialization */ - emitProjectChanged() { + emitProjectChanged () { this.emit(Runtime.PROJECT_CHANGED); } @@ -2712,8 +2714,8 @@ class Runtime extends EventEmitter { * @param {Target} [sourceTarget] - the target used as a source for the new clone, if any. * @fires Runtime#targetWasCreated */ - fireTargetWasCreated(newTarget, sourceTarget) { - this.emit("targetWasCreated", newTarget, sourceTarget); + fireTargetWasCreated (newTarget, sourceTarget) { + this.emit('targetWasCreated', newTarget, sourceTarget); } /** @@ -2721,15 +2723,15 @@ class Runtime extends EventEmitter { * @param {Target} target - the target being removed * @fires Runtime#targetWasRemoved */ - fireTargetWasRemoved(target) { - this.emit("targetWasRemoved", target); + fireTargetWasRemoved (target) { + this.emit('targetWasRemoved', target); } /** * Get a target representing the Scratch stage, if one exists. * @return {?Target} The target, if found. */ - getTargetForStage() { + getTargetForStage () { for (let i = 0; i < this.targets.length; i++) { const target = this.targets[i]; if (target.isStage) { @@ -2742,11 +2744,11 @@ class Runtime extends EventEmitter { * Get the editing target. * @return {?Target} The editing target. */ - getEditingTarget() { + getEditingTarget () { return this._editingTarget; } - getAllVarNamesOfType(varType) { + getAllVarNamesOfType (varType) { let varNames = []; for (const target of this.targets) { const targetVarNames = target.getAllVariableNamesInScopeByType( @@ -2766,20 +2768,20 @@ class Runtime extends EventEmitter { * @property {Function} [labelFn] - function to generate the label for this opcode * @property {string} [label] - the label for this opcode if `labelFn` is absent */ - getLabelForOpcode(extendedOpcode) { - const [category, opcode] = StringUtil.splitFirst(extendedOpcode, "_"); + getLabelForOpcode (extendedOpcode) { + const [category, opcode] = StringUtil.splitFirst(extendedOpcode, '_'); if (!(category && opcode)) return; - const categoryInfo = this._blockInfo.find((ci) => ci.id === category); + const categoryInfo = this._blockInfo.find(ci => ci.id === category); if (!categoryInfo) return; - const block = categoryInfo.blocks.find((b) => b.info.opcode === opcode); + const block = categoryInfo.blocks.find(b => b.info.opcode === opcode); if (!block) return; // TODO: we may want to format the label in a locale-specific way. return { - category: "extension", // This assumes that all extensions have the same monitor color. - label: `${categoryInfo.name}: ${block.info.text}`, + category: 'extension', // This assumes that all extensions have the same monitor color. + label: `${categoryInfo.name}: ${block.info.text}` }; } @@ -2792,9 +2794,9 @@ class Runtime extends EventEmitter { * @param {string} optVarType The type of the variable to create. Defaults to Variable.SCALAR_TYPE. * @return {Variable} The new variable that was created. */ - createNewGlobalVariable(variableName, optVarId, optVarType) { + createNewGlobalVariable (variableName, optVarId, optVarType) { const varType = - typeof optVarType === "string" ? optVarType : Variable.SCALAR_TYPE; + typeof optVarType === 'string' ? optVarType : Variable.SCALAR_TYPE; const allVariableNames = this.getAllVarNamesOfType(varType); const newName = StringUtil.unusedName(variableName, allVariableNames); const variable = new Variable(optVarId || uid(), newName, varType); @@ -2807,7 +2809,7 @@ class Runtime extends EventEmitter { * Tell the runtime to request a redraw. * Use after a clone/sprite has completed some visible operation on the stage. */ - requestRedraw() { + requestRedraw () { this.redrawRequested = true; } @@ -2816,7 +2818,7 @@ class Runtime extends EventEmitter { * the original sprite * @param {!Target} target Target requesting the targets update */ - requestTargetsUpdate(target) { + requestTargetsUpdate (target) { if (!target.isOriginal) return; this._refreshTargets = true; } @@ -2824,21 +2826,21 @@ class Runtime extends EventEmitter { /** * Emit an event that indicates that the blocks on the workspace need updating. */ - requestBlocksUpdate() { + requestBlocksUpdate () { this.emit(Runtime.BLOCKS_NEED_UPDATE); } /** * Emit an event that indicates that the toolbox extension blocks need updating. */ - requestToolboxExtensionsUpdate() { + requestToolboxExtensionsUpdate () { this.emit(Runtime.TOOLBOX_EXTENSIONS_NEED_UPDATE); } /** * Set up timers to repeatedly step in a browser. */ - start() { + start () { // Do not start if we are already running if (this._steppingInterval) return; @@ -2857,7 +2859,7 @@ class Runtime extends EventEmitter { * Quit the Runtime, clearing any handles which might keep the process alive. * Do not use the runtime after calling this method. This method is meant for test shutdown. */ - quit() { + quit () { clearInterval(this._steppingInterval); this._steppingInterval = null; } @@ -2867,7 +2869,7 @@ class Runtime extends EventEmitter { * @param {Profiler/FrameCallback} onFrame A callback handle passed a * profiling frame when the profiler reports its collected data. */ - enableProfiling(onFrame) { + enableProfiling (onFrame) { if (Profiler.available()) { this.profiler = new Profiler(onFrame); } @@ -2876,7 +2878,7 @@ class Runtime extends EventEmitter { /** * Turn off profiling. */ - disableProfiling() { + disableProfiling () { this.profiler = null; } @@ -2885,7 +2887,7 @@ class Runtime extends EventEmitter { * This value is helpful in certain instances for compatibility with Scratch 2, * which sometimes uses a `currentMSecs` timestamp value in Interpreter.as */ - updateCurrentMSecs() { + updateCurrentMSecs () { this.currentMSecs = Date.now(); } } From 9136cd0b530e2255f221b31df398a13bb2b50af2 Mon Sep 17 00:00:00 2001 From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com> Date: Wed, 19 Feb 2025 16:29:25 -0800 Subject: [PATCH 011/521] style: copy style changes from gonfunko/modern-blockly --- packages/scratch-vm/src/engine/blocks.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/scratch-vm/src/engine/blocks.js b/packages/scratch-vm/src/engine/blocks.js index 6b646dc1b73..881b345d6d7 100644 --- a/packages/scratch-vm/src/engine/blocks.js +++ b/packages/scratch-vm/src/engine/blocks.js @@ -770,12 +770,12 @@ class Blocks { ) { // This block has an argument which needs to get separated out into // multiple monitor blocks with ids based on the selected argument + // Note: we're not just constantly creating a longer and longer id everytime we check + // the checkbox because we're using the id of the block in the flyout as the base const newId = getMonitorIdForBlockWithArgs( block.id, block.fields ); - // Note: we're not just constantly creating a longer and longer id everytime we check - // the checkbox because we're using the id of the block in the flyout as the base // check if a block with the new id already exists, otherwise create let newBlock = this.runtime.monitorBlocks.getBlock(newId); From e8e96034bf05fea59f8ef7dcaea6287694e3a7c5 Mon Sep 17 00:00:00 2001 From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com> Date: Fri, 18 Oct 2024 15:22:05 -0700 Subject: [PATCH 012/521] ci: enable alpha and beta releases --- packages/scratch-vm/release.config.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/packages/scratch-vm/release.config.js b/packages/scratch-vm/release.config.js index 87af40a04ca..1276a673d09 100644 --- a/packages/scratch-vm/release.config.js +++ b/packages/scratch-vm/release.config.js @@ -5,6 +5,14 @@ module.exports = { name: 'develop' // default channel }, + { + name: 'alpha', + prerelease: true + }, + { + name: 'beta', + prerelease: true + }, { name: 'hotfix/*', channel: 'hotfix' From 8263b70edf13a615e02f1c1aae795c99bd23a088 Mon Sep 17 00:00:00 2001 From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com> Date: Fri, 18 Oct 2024 15:33:18 -0700 Subject: [PATCH 013/521] fix: use scratch-blocks@^2.0.0-beta --- package-lock.json | 333 +++++++++++++++++++++++++- packages/scratch-vm/package.json | 2 +- packages/scratch-vm/webpack.config.js | 2 +- 3 files changed, 334 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index d30d96494a4..744f464452b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2037,6 +2037,30 @@ "node": ">=6.9.0" } }, + "node_modules/@blockly/continuous-toolbox": { + "version": "6.0.12", + "resolved": "https://registry.npmjs.org/@blockly/continuous-toolbox/-/continuous-toolbox-6.0.12.tgz", + "integrity": "sha512-I2jsxN/f+wytrzUQkSrxOKLWHPgsjiIz/w0Tpdo9PcDB5mwoBnG8l0ldh5Yj55CRMZbY/q9tANPWR8V8acgMIw==", + "dev": true, + "engines": { + "node": ">=8.17.0" + }, + "peerDependencies": { + "blockly": "^11.0.0" + } + }, + "node_modules/@blockly/field-colour": { + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/@blockly/field-colour/-/field-colour-5.0.12.tgz", + "integrity": "sha512-vNw6L/B0cpf+j0S6pShX31bOI16KJu+eACpsfHGOBZbb7+LT3bYKcGHe6+VRe+KtIE3jGlY7vYfnaJdOCrYlfQ==", + "dev": true, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "blockly": "^11.0.0" + } + }, "node_modules/@colors/colors": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", @@ -8760,6 +8784,283 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, + "node_modules/blockly": { + "version": "11.2.1", + "resolved": "https://registry.npmjs.org/blockly/-/blockly-11.2.1.tgz", + "integrity": "sha512-20sCwSwX2Z6UxR/er0B5y6wRFukuIdvOjc7jMuIwyCO/yT35+UbAqYueMga3JFA9NoWPwQc+3s6/XnLkyceAww==", + "dev": true, + "dependencies": { + "jsdom": "25.0.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/blockly/node_modules/cssstyle": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.2.1.tgz", + "integrity": "sha512-9+vem03dMXG7gDmZ62uqmRiMRNtinIZ9ZyuF6BdxzfOD+FdN5hretzynkn0ReS2DO2GSw76RWHs0UmJPI2zUjw==", + "dev": true, + "dependencies": { + "@asamuzakjp/css-color": "^2.8.2", + "rrweb-cssom": "^0.8.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/blockly/node_modules/cssstyle/node_modules/rrweb-cssom": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", + "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==", + "dev": true + }, + "node_modules/blockly/node_modules/data-urls": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", + "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", + "dev": true, + "dependencies": { + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/blockly/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/blockly/node_modules/form-data": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", + "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/blockly/node_modules/html-encoding-sniffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", + "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", + "dev": true, + "dependencies": { + "whatwg-encoding": "^3.1.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/blockly/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, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/blockly/node_modules/jsdom": { + "version": "25.0.1", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-25.0.1.tgz", + "integrity": "sha512-8i7LzZj7BF8uplX+ZyOlIz86V6TAsSs+np6m1kpW9u0JWi4z/1t+FzcK1aek+ybTnAC4KhBL4uXCNT0wcUIeCw==", + "dev": true, + "dependencies": { + "cssstyle": "^4.1.0", + "data-urls": "^5.0.0", + "decimal.js": "^10.4.3", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^4.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.5", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.12", + "parse5": "^7.1.2", + "rrweb-cssom": "^0.7.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^5.0.0", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^3.1.1", + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0", + "ws": "^8.18.0", + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "canvas": "^2.11.2" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/blockly/node_modules/parse5": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", + "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", + "dev": true, + "dependencies": { + "entities": "^4.5.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/blockly/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, + "engines": { + "node": ">=6" + } + }, + "node_modules/blockly/node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "node_modules/blockly/node_modules/tough-cookie": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.1.tgz", + "integrity": "sha512-Ek7HndSVkp10hmHP9V4qZO1u+pn1RU5sI0Fw+jCU3lyvuMZcgqsNgc6CmJJZyByK4Vm/qotGRJlfgAX8q+4JiA==", + "dev": true, + "dependencies": { + "tldts": "^6.1.32" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/blockly/node_modules/tr46": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz", + "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==", + "dev": true, + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/blockly/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==", + "dev": true, + "dependencies": { + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/blockly/node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/blockly/node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "dev": true, + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/blockly/node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "dev": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/blockly/node_modules/whatwg-url": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.1.1.tgz", + "integrity": "sha512-mDGf9diDad/giZ/Sm9Xi2YcyzaFpbdLpJPr+E9fSkyQ7KpQD4SdFcugkRQYzhmfI4KeV4Qpnn2sKPdo+kmsgRQ==", + "dev": true, + "dependencies": { + "tr46": "^5.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/blockly/node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/blockly/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, + "engines": { + "node": ">=18" + } + }, "node_modules/bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", @@ -35590,6 +35891,24 @@ "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==" }, + "node_modules/tldts": { + "version": "6.1.77", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.77.tgz", + "integrity": "sha512-lBpoWgy+kYmuXWQ83+R7LlJCnsd9YW8DGpZSHhrMl4b8Ly/1vzOie3OdtmUJDkKxcgRGOehDu5btKkty+JEe+g==", + "dev": true, + "dependencies": { + "tldts-core": "^6.1.77" + }, + "bin": { + "tldts": "bin/cli.js" + } + }, + "node_modules/tldts-core": { + "version": "6.1.77", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.77.tgz", + "integrity": "sha512-bCaqm24FPk8OgBkM0u/SrEWJgHnhBWYqeBo6yUmcZJDCHt/IfyWBb+14CXdGi4RInMv4v7eUAin15W0DoA+Ytg==", + "dev": true + }, "node_modules/tmp": { "version": "0.0.30", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz", @@ -40370,7 +40689,7 @@ "jsdoc": "3.6.11", "json": "^9.0.4", "pngjs": "3.4.0", - "scratch-blocks": "1.1.206", + "scratch-blocks": "^2.0.0-beta", "scratch-l10n": "5.0.134", "scratch-render-fonts": "1.0.165", "scratch-semantic-release-config": "3.0.0", @@ -41322,6 +41641,18 @@ "node": ">= 4" } }, + "packages/scratch-vm/node_modules/scratch-blocks": { + "version": "2.0.0-beta.2", + "resolved": "https://registry.npmjs.org/scratch-blocks/-/scratch-blocks-2.0.0-beta.2.tgz", + "integrity": "sha512-j/2F1/tIGoPMeQHVIDXzEh21fdQTwhLDSCv9Qo8J0wIq+v2EYipHMbV3QvQloheBaXdTpLsn9SJnUjOmiICFUA==", + "deprecated": "Moved Blockly unforking test to 'spork' channel", + "dev": true, + "dependencies": { + "@blockly/continuous-toolbox": "^6.0.9", + "@blockly/field-colour": "^5.0.9", + "blockly": "^11.0.0" + } + }, "packages/scratch-vm/node_modules/selfsigned": { "version": "1.10.14", "dev": true, diff --git a/packages/scratch-vm/package.json b/packages/scratch-vm/package.json index 64eb736c0a1..627d6e0fa0a 100644 --- a/packages/scratch-vm/package.json +++ b/packages/scratch-vm/package.json @@ -91,7 +91,7 @@ "jsdoc": "3.6.11", "json": "^9.0.4", "pngjs": "3.4.0", - "scratch-blocks": "1.1.206", + "scratch-blocks": "^2.0.0-beta", "scratch-l10n": "5.0.134", "scratch-render-fonts": "1.0.165", "scratch-semantic-release-config": "3.0.0", diff --git a/packages/scratch-vm/webpack.config.js b/packages/scratch-vm/webpack.config.js index 82e7b787b11..81d841845ef 100644 --- a/packages/scratch-vm/webpack.config.js +++ b/packages/scratch-vm/webpack.config.js @@ -81,7 +81,7 @@ const playgroundBuilder = webBuilder.clone() } }) .addModuleRule({ - test: require.resolve('scratch-blocks/dist/vertical.js'), + test: require.resolve('scratch-blocks/dist/main.js'), loader: 'expose-loader', options: { exposes: 'Blockly' From 36652adaba293649313171eceee02dfc1bd50876 Mon Sep 17 00:00:00 2001 From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com> Date: Sun, 20 Oct 2024 18:52:33 -0700 Subject: [PATCH 014/521] ci: make temporary "spork" release channel --- packages/scratch-vm/release.config.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/scratch-vm/release.config.js b/packages/scratch-vm/release.config.js index 1276a673d09..1becc7a098f 100644 --- a/packages/scratch-vm/release.config.js +++ b/packages/scratch-vm/release.config.js @@ -13,6 +13,10 @@ module.exports = { name: 'beta', prerelease: true }, + { + name: 'spork', + prerelease: true + }, { name: 'hotfix/*', channel: 'hotfix' From 603b8526a55558a69b8b8f9d6d131753238e3519 Mon Sep 17 00:00:00 2001 From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com> Date: Sun, 20 Oct 2024 18:58:57 -0700 Subject: [PATCH 015/521] chore(deps): update deps for spork test --- package-lock.json | 9 ++++----- packages/scratch-vm/package.json | 2 +- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 744f464452b..b67914d451a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -40689,7 +40689,7 @@ "jsdoc": "3.6.11", "json": "^9.0.4", "pngjs": "3.4.0", - "scratch-blocks": "^2.0.0-beta", + "scratch-blocks": "2.0.0-spork.1", "scratch-l10n": "5.0.134", "scratch-render-fonts": "1.0.165", "scratch-semantic-release-config": "3.0.0", @@ -41642,10 +41642,9 @@ } }, "packages/scratch-vm/node_modules/scratch-blocks": { - "version": "2.0.0-beta.2", - "resolved": "https://registry.npmjs.org/scratch-blocks/-/scratch-blocks-2.0.0-beta.2.tgz", - "integrity": "sha512-j/2F1/tIGoPMeQHVIDXzEh21fdQTwhLDSCv9Qo8J0wIq+v2EYipHMbV3QvQloheBaXdTpLsn9SJnUjOmiICFUA==", - "deprecated": "Moved Blockly unforking test to 'spork' channel", + "version": "2.0.0-spork.1", + "resolved": "https://registry.npmjs.org/scratch-blocks/-/scratch-blocks-2.0.0-spork.1.tgz", + "integrity": "sha512-kA9T2rg1UZk6JVKwxZoPCz8uOZBhZ0eLi7nnFnZ4VZzzfItjCQQpdgPzbeBycEuEzlp3TIE2zP1G3jpthpkW0g==", "dev": true, "dependencies": { "@blockly/continuous-toolbox": "^6.0.9", diff --git a/packages/scratch-vm/package.json b/packages/scratch-vm/package.json index 627d6e0fa0a..1e6f9c5b720 100644 --- a/packages/scratch-vm/package.json +++ b/packages/scratch-vm/package.json @@ -91,7 +91,7 @@ "jsdoc": "3.6.11", "json": "^9.0.4", "pngjs": "3.4.0", - "scratch-blocks": "^2.0.0-beta", + "scratch-blocks": "2.0.0-spork.1", "scratch-l10n": "5.0.134", "scratch-render-fonts": "1.0.165", "scratch-semantic-release-config": "3.0.0", From f6339954aecf43ce94bf876b4f66c5840809800e Mon Sep 17 00:00:00 2001 From: Aaron Dodson Date: Thu, 14 Nov 2024 11:05:45 -0800 Subject: [PATCH 016/521] fix: Fix test failures. (#10) --- packages/scratch-vm/test/fixtures/events.json | 2 +- .../test/integration/stack-click.js | 3 +- .../test/unit/extension_conversion.js | 10 ++-- .../test/unit/project_changed_state_blocks.js | 48 +++++++++---------- 4 files changed, 30 insertions(+), 33 deletions(-) diff --git a/packages/scratch-vm/test/fixtures/events.json b/packages/scratch-vm/test/fixtures/events.json index a6b42cf8186..c1534e67be9 100644 --- a/packages/scratch-vm/test/fixtures/events.json +++ b/packages/scratch-vm/test/fixtures/events.json @@ -89,7 +89,7 @@ "name": "comment", "type": "comment_create", "commentId": "a comment", - "xy": {"x": 10, "y": 20} + "json": { "x": 10, "y": 20 } }, "mockVariableBlock": { "name": "block", diff --git a/packages/scratch-vm/test/integration/stack-click.js b/packages/scratch-vm/test/integration/stack-click.js index a6911064ff1..b36dcc5582d 100644 --- a/packages/scratch-vm/test/integration/stack-click.js +++ b/packages/scratch-vm/test/integration/stack-click.js @@ -44,7 +44,8 @@ test('stack click activates the stack', t => { if (allBlocks[blockId].opcode === 'event_whengreaterthan') { blockContainer.blocklyListen({ blockId: blockId, - element: 'stackclick' + targetType: 'block', + type: 'click' }); } } diff --git a/packages/scratch-vm/test/unit/extension_conversion.js b/packages/scratch-vm/test/unit/extension_conversion.js index 876b01a62ce..d2ec0fb3b5e 100644 --- a/packages/scratch-vm/test/unit/extension_conversion.js +++ b/packages/scratch-vm/test/unit/extension_conversion.js @@ -125,9 +125,7 @@ const extensionInfoWithCustomFieldTypes = { const testCategoryInfo = function (t, block) { t.equal(block.json.category, 'fake test extension'); - t.equal(block.json.colour, '#111111'); - t.equal(block.json.colourSecondary, '#222222'); - t.equal(block.json.colourTertiary, '#333333'); + t.equal(block.json.style, 'test'); t.equal(block.json.inputsInline, true); }; @@ -139,12 +137,11 @@ const testButton = function (t, button) { const testReporter = function (t, reporter) { t.equal(reporter.json.type, 'test_reporter'); testCategoryInfo(t, reporter); - t.equal(reporter.json.checkboxInFlyout, true); t.equal(reporter.json.outputShape, ScratchBlocksConstants.OUTPUT_SHAPE_ROUND); t.equal(reporter.json.output, 'String'); t.notOk(Object.prototype.hasOwnProperty.call(reporter.json, 'previousStatement')); t.notOk(Object.prototype.hasOwnProperty.call(reporter.json, 'nextStatement')); - t.same(reporter.json.extensions, ['scratch_extension']); + t.same(reporter.json.extensions, ['scratch_extension', 'monitor_block']); t.equal(reporter.json.message0, '%1 %2simple text'); // "%1 %2" from the block icon t.notOk(Object.prototype.hasOwnProperty.call(reporter.json, 'message1')); t.same(reporter.json.args0, [ @@ -167,12 +164,11 @@ const testReporter = function (t, reporter) { const testInlineImage = function (t, inlineImage) { t.equal(inlineImage.json.type, 'test_inlineImage'); testCategoryInfo(t, inlineImage); - t.equal(inlineImage.json.checkboxInFlyout, true); t.equal(inlineImage.json.outputShape, ScratchBlocksConstants.OUTPUT_SHAPE_ROUND); t.equal(inlineImage.json.output, 'String'); t.notOk(Object.prototype.hasOwnProperty.call(inlineImage.json, 'previousStatement')); t.notOk(Object.prototype.hasOwnProperty.call(inlineImage.json, 'nextStatement')); - t.notOk(inlineImage.json.extensions && inlineImage.json.extensions.length); // OK if it's absent or empty + t.same(inlineImage.json.extensions, ['monitor_block']); t.equal(inlineImage.json.message0, 'text and %1'); // block text followed by inline image t.notOk(Object.prototype.hasOwnProperty.call(inlineImage.json, 'message1')); t.same(inlineImage.json.args0, [ diff --git a/packages/scratch-vm/test/unit/project_changed_state_blocks.js b/packages/scratch-vm/test/unit/project_changed_state_blocks.js index 9685cdd2983..18b0dc0677f 100644 --- a/packages/scratch-vm/test/unit/project_changed_state_blocks.js +++ b/packages/scratch-vm/test/unit/project_changed_state_blocks.js @@ -255,11 +255,11 @@ test('Creating a block comment should emit a project changed event', t => { type: 'comment_create', blockId: 'a new block', commentId: 'a new comment', - height: 250, - width: 400, - xy: { + json: { x: -40, - y: 27 + y: 27, + height: 250, + width: 400 }, minimized: false, text: 'comment' @@ -274,11 +274,11 @@ test('Creating a workspace comment should emit a project changed event', t => { type: 'comment_create', blockId: null, commentId: 'a new comment', - height: 250, - width: 400, - xy: { + json: { x: -40, - y: 27 + y: 27, + height: 250, + width: 400 }, minimized: false, text: 'comment' @@ -293,11 +293,11 @@ test('Changing a comment should emit a project changed event', t => { type: 'comment_create', blockId: null, commentId: 'a new comment', - height: 250, - width: 400, - xy: { + json: { x: -40, - y: 27 + y: 27, + height: 250, + width: 400 }, minimized: false, text: 'comment' @@ -343,11 +343,11 @@ test('Deleting a block comment should emit a project changed event', t => { type: 'comment_create', blockId: 'a new block', commentId: 'a new comment', - height: 250, - width: 400, - xy: { + json: { x: -40, - y: 27 + y: 27, + height: 250, + width: 400 }, minimized: false, text: 'comment' @@ -378,11 +378,11 @@ test('Deleting a workspace comment should emit a project changed event', t => { type: 'comment_create', blockId: null, commentId: 'a new comment', - height: 250, - width: 400, - xy: { + json: { x: -40, - y: 27 + y: 27, + height: 250, + width: 400 }, minimized: false, text: 'comment' @@ -432,11 +432,11 @@ test('Moving a comment should emit a project changed event', t => { type: 'comment_create', blockId: null, commentId: 'a new comment', - height: 250, - width: 400, - xy: { + json: { x: -40, - y: 27 + y: 27, + height: 250, + width: 400 }, minimized: false, text: 'comment' From c07586b713d7cd7da32ca6bf0cdac07052a52f5f Mon Sep 17 00:00:00 2001 From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com> Date: Wed, 11 Dec 2024 07:39:15 -0800 Subject: [PATCH 017/521] chore(deps): update deps for spork test --- package-lock.json | 310 ++++++++++++++++++++++++++++++- packages/scratch-vm/package.json | 2 +- 2 files changed, 305 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index b67914d451a..f15fceb9b88 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8789,6 +8789,7 @@ "resolved": "https://registry.npmjs.org/blockly/-/blockly-11.2.1.tgz", "integrity": "sha512-20sCwSwX2Z6UxR/er0B5y6wRFukuIdvOjc7jMuIwyCO/yT35+UbAqYueMga3JFA9NoWPwQc+3s6/XnLkyceAww==", "dev": true, + "peer": true, "dependencies": { "jsdom": "25.0.1" }, @@ -8801,6 +8802,7 @@ "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.2.1.tgz", "integrity": "sha512-9+vem03dMXG7gDmZ62uqmRiMRNtinIZ9ZyuF6BdxzfOD+FdN5hretzynkn0ReS2DO2GSw76RWHs0UmJPI2zUjw==", "dev": true, + "peer": true, "dependencies": { "@asamuzakjp/css-color": "^2.8.2", "rrweb-cssom": "^0.8.0" @@ -8813,13 +8815,15 @@ "version": "0.8.0", "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==", - "dev": true + "dev": true, + "peer": true }, "node_modules/blockly/node_modules/data-urls": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", "dev": true, + "peer": true, "dependencies": { "whatwg-mimetype": "^4.0.0", "whatwg-url": "^14.0.0" @@ -8833,6 +8837,7 @@ "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "dev": true, + "peer": true, "engines": { "node": ">=0.12" }, @@ -8845,6 +8850,7 @@ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", "dev": true, + "peer": true, "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -8860,6 +8866,7 @@ "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", "dev": true, + "peer": true, "dependencies": { "whatwg-encoding": "^3.1.1" }, @@ -8872,6 +8879,7 @@ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, + "peer": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -8884,6 +8892,7 @@ "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-25.0.1.tgz", "integrity": "sha512-8i7LzZj7BF8uplX+ZyOlIz86V6TAsSs+np6m1kpW9u0JWi4z/1t+FzcK1aek+ybTnAC4KhBL4uXCNT0wcUIeCw==", "dev": true, + "peer": true, "dependencies": { "cssstyle": "^4.1.0", "data-urls": "^5.0.0", @@ -8924,6 +8933,7 @@ "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", "dev": true, + "peer": true, "dependencies": { "entities": "^4.5.0" }, @@ -8936,6 +8946,7 @@ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, + "peer": true, "engines": { "node": ">=6" } @@ -8945,6 +8956,7 @@ "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", "dev": true, + "peer": true, "dependencies": { "xmlchars": "^2.2.0" }, @@ -8957,6 +8969,7 @@ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.1.tgz", "integrity": "sha512-Ek7HndSVkp10hmHP9V4qZO1u+pn1RU5sI0Fw+jCU3lyvuMZcgqsNgc6CmJJZyByK4Vm/qotGRJlfgAX8q+4JiA==", "dev": true, + "peer": true, "dependencies": { "tldts": "^6.1.32" }, @@ -8969,6 +8982,7 @@ "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz", "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==", "dev": true, + "peer": true, "dependencies": { "punycode": "^2.3.1" }, @@ -8981,6 +8995,7 @@ "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", "dev": true, + "peer": true, "dependencies": { "xml-name-validator": "^5.0.0" }, @@ -8993,6 +9008,7 @@ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", "dev": true, + "peer": true, "engines": { "node": ">=12" } @@ -9002,6 +9018,7 @@ "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", "dev": true, + "peer": true, "dependencies": { "iconv-lite": "0.6.3" }, @@ -9014,6 +9031,7 @@ "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", "dev": true, + "peer": true, "engines": { "node": ">=18" } @@ -9023,6 +9041,7 @@ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.1.1.tgz", "integrity": "sha512-mDGf9diDad/giZ/Sm9Xi2YcyzaFpbdLpJPr+E9fSkyQ7KpQD4SdFcugkRQYzhmfI4KeV4Qpnn2sKPdo+kmsgRQ==", "dev": true, + "peer": true, "dependencies": { "tr46": "^5.0.0", "webidl-conversions": "^7.0.0" @@ -9036,6 +9055,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "dev": true, + "peer": true, "engines": { "node": ">=10.0.0" }, @@ -9057,6 +9077,7 @@ "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", "dev": true, + "peer": true, "engines": { "node": ">=18" } @@ -40689,7 +40710,7 @@ "jsdoc": "3.6.11", "json": "^9.0.4", "pngjs": "3.4.0", - "scratch-blocks": "2.0.0-spork.1", + "scratch-blocks": "2.0.0-spork.3", "scratch-l10n": "5.0.134", "scratch-render-fonts": "1.0.165", "scratch-semantic-release-config": "3.0.0", @@ -40837,6 +40858,18 @@ "node": ">=0.10.0" } }, + "packages/scratch-vm/node_modules/blockly": { + "version": "12.0.0-beta.1", + "resolved": "https://registry.npmjs.org/blockly/-/blockly-12.0.0-beta.1.tgz", + "integrity": "sha512-lECwZ4K+YuLXMM0yxWTz1lwkmDl424sst7h/dhtSefuCki8afjI/F87byYK/ZIZsMKBEz2+8wEJ1Wlx5cYWIAg==", + "dev": true, + "dependencies": { + "jsdom": "25.0.1" + }, + "engines": { + "node": ">=18" + } + }, "packages/scratch-vm/node_modules/braces": { "version": "2.3.2", "dev": true, @@ -40991,6 +41024,38 @@ "node": ">= 4" } }, + "packages/scratch-vm/node_modules/cssstyle": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.2.1.tgz", + "integrity": "sha512-9+vem03dMXG7gDmZ62uqmRiMRNtinIZ9ZyuF6BdxzfOD+FdN5hretzynkn0ReS2DO2GSw76RWHs0UmJPI2zUjw==", + "dev": true, + "dependencies": { + "@asamuzakjp/css-color": "^2.8.2", + "rrweb-cssom": "^0.8.0" + }, + "engines": { + "node": ">=18" + } + }, + "packages/scratch-vm/node_modules/cssstyle/node_modules/rrweb-cssom": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", + "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==", + "dev": true + }, + "packages/scratch-vm/node_modules/data-urls": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", + "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", + "dev": true, + "dependencies": { + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0" + }, + "engines": { + "node": ">=18" + } + }, "packages/scratch-vm/node_modules/define-property": { "version": "2.0.2", "dev": true, @@ -41074,6 +41139,18 @@ "dev": true, "license": "MIT" }, + "packages/scratch-vm/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "packages/scratch-vm/node_modules/expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", @@ -41195,6 +41272,21 @@ "node": ">=4" } }, + "packages/scratch-vm/node_modules/form-data": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", + "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "packages/scratch-vm/node_modules/glob-parent": { "version": "3.1.0", "dev": true, @@ -41239,6 +41331,18 @@ "node": ">=4" } }, + "packages/scratch-vm/node_modules/html-encoding-sniffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", + "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", + "dev": true, + "dependencies": { + "whatwg-encoding": "^3.1.1" + }, + "engines": { + "node": ">=18" + } + }, "packages/scratch-vm/node_modules/html-entities": { "version": "1.4.0", "dev": true, @@ -41258,6 +41362,18 @@ "node": ">=4.0.0" } }, + "packages/scratch-vm/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, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "packages/scratch-vm/node_modules/ignore": { "version": "3.3.10", "dev": true, @@ -41353,6 +41469,67 @@ "dev": true, "license": "MIT" }, + "packages/scratch-vm/node_modules/jsdom": { + "version": "25.0.1", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-25.0.1.tgz", + "integrity": "sha512-8i7LzZj7BF8uplX+ZyOlIz86V6TAsSs+np6m1kpW9u0JWi4z/1t+FzcK1aek+ybTnAC4KhBL4uXCNT0wcUIeCw==", + "dev": true, + "dependencies": { + "cssstyle": "^4.1.0", + "data-urls": "^5.0.0", + "decimal.js": "^10.4.3", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^4.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.5", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.12", + "parse5": "^7.1.2", + "rrweb-cssom": "^0.7.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^5.0.0", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^3.1.1", + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0", + "ws": "^8.18.0", + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "canvas": "^2.11.2" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "packages/scratch-vm/node_modules/jsdom/node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "packages/scratch-vm/node_modules/json-schema-traverse": { "version": "0.4.1", "dev": true, @@ -41521,6 +41698,18 @@ "node": ">=4" } }, + "packages/scratch-vm/node_modules/parse5": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", + "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", + "dev": true, + "dependencies": { + "entities": "^4.5.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, "packages/scratch-vm/node_modules/path-exists": { "version": "3.0.0", "dev": true, @@ -41551,6 +41740,15 @@ "node": ">=4" } }, + "packages/scratch-vm/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, + "engines": { + "node": ">=6" + } + }, "packages/scratch-vm/node_modules/readable-stream": { "version": "2.3.8", "dev": true, @@ -41628,6 +41826,18 @@ "dev": true, "license": "MIT" }, + "packages/scratch-vm/node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, "packages/scratch-vm/node_modules/schema-utils": { "version": "1.0.0", "dev": true, @@ -41642,14 +41852,14 @@ } }, "packages/scratch-vm/node_modules/scratch-blocks": { - "version": "2.0.0-spork.1", - "resolved": "https://registry.npmjs.org/scratch-blocks/-/scratch-blocks-2.0.0-spork.1.tgz", - "integrity": "sha512-kA9T2rg1UZk6JVKwxZoPCz8uOZBhZ0eLi7nnFnZ4VZzzfItjCQQpdgPzbeBycEuEzlp3TIE2zP1G3jpthpkW0g==", + "version": "2.0.0-spork.3", + "resolved": "https://registry.npmjs.org/scratch-blocks/-/scratch-blocks-2.0.0-spork.3.tgz", + "integrity": "sha512-luy2QtACBjhHT2rH2Zcvwevjb9zBnMWGwLnp9ydEXzbcFTptmYxFTmC8iFRPm6szxGiCw1pH48Qr3BwTGRKp8Q==", "dev": true, "dependencies": { "@blockly/continuous-toolbox": "^6.0.9", "@blockly/field-colour": "^5.0.9", - "blockly": "^11.0.0" + "blockly": "^12.0.0-beta.0" } }, "packages/scratch-vm/node_modules/selfsigned": { @@ -41763,6 +41973,51 @@ "node": ">=0.10.0" } }, + "packages/scratch-vm/node_modules/tough-cookie": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.1.tgz", + "integrity": "sha512-Ek7HndSVkp10hmHP9V4qZO1u+pn1RU5sI0Fw+jCU3lyvuMZcgqsNgc6CmJJZyByK4Vm/qotGRJlfgAX8q+4JiA==", + "dev": true, + "dependencies": { + "tldts": "^6.1.32" + }, + "engines": { + "node": ">=16" + } + }, + "packages/scratch-vm/node_modules/tr46": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz", + "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==", + "dev": true, + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=18" + } + }, + "packages/scratch-vm/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==", + "dev": true, + "dependencies": { + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "packages/scratch-vm/node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "engines": { + "node": ">=12" + } + }, "packages/scratch-vm/node_modules/webpack-cli": { "version": "4.10.0", "dev": true, @@ -41963,6 +42218,40 @@ "node": ">=6" } }, + "packages/scratch-vm/node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "dev": true, + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "packages/scratch-vm/node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "dev": true, + "engines": { + "node": ">=18" + } + }, + "packages/scratch-vm/node_modules/whatwg-url": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.1.1.tgz", + "integrity": "sha512-mDGf9diDad/giZ/Sm9Xi2YcyzaFpbdLpJPr+E9fSkyQ7KpQD4SdFcugkRQYzhmfI4KeV4Qpnn2sKPdo+kmsgRQ==", + "dev": true, + "dependencies": { + "tr46": "^5.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=18" + } + }, "packages/scratch-vm/node_modules/wrap-ansi": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", @@ -42001,6 +42290,15 @@ "node": ">=6" } }, + "packages/scratch-vm/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, + "engines": { + "node": ">=18" + } + }, "packages/scratch-vm/node_modules/y18n": { "version": "4.0.3", "dev": true, diff --git a/packages/scratch-vm/package.json b/packages/scratch-vm/package.json index 1e6f9c5b720..85d7d2f6644 100644 --- a/packages/scratch-vm/package.json +++ b/packages/scratch-vm/package.json @@ -91,7 +91,7 @@ "jsdoc": "3.6.11", "json": "^9.0.4", "pngjs": "3.4.0", - "scratch-blocks": "2.0.0-spork.1", + "scratch-blocks": "2.0.0-spork.3", "scratch-l10n": "5.0.134", "scratch-render-fonts": "1.0.165", "scratch-semantic-release-config": "3.0.0", From baf68a236c85bdadf5d1a61dfbcf22edc06d4b8c Mon Sep 17 00:00:00 2001 From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com> Date: Fri, 20 Dec 2024 11:47:58 -0800 Subject: [PATCH 018/521] build: fix webpack-dev-server configuration The playgrounds themselves are still broken, but it's a step... --- packages/scratch-vm/webpack.config.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/scratch-vm/webpack.config.js b/packages/scratch-vm/webpack.config.js index 81d841845ef..d0735419056 100644 --- a/packages/scratch-vm/webpack.config.js +++ b/packages/scratch-vm/webpack.config.js @@ -128,7 +128,7 @@ const playgroundBuilder = webBuilder.clone() ])); module.exports = [ + playgroundBuilder.get(), // webpack-dev-server only looks at the first configuration nodeBuilder.get(), - webBuilder.get(), - playgroundBuilder.get() + webBuilder.get() ]; From f0f1c14b2e7091eb210c661d35dca4004a679776 Mon Sep 17 00:00:00 2001 From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com> Date: Tue, 11 Feb 2025 09:27:06 -0800 Subject: [PATCH 019/521] chore(deps): update deps for spork test --- package-lock.json | 282 ++++++++++++++++++++----------- packages/scratch-vm/package.json | 2 +- 2 files changed, 181 insertions(+), 103 deletions(-) diff --git a/package-lock.json b/package-lock.json index f15fceb9b88..6ec88501afb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2037,28 +2037,16 @@ "node": ">=6.9.0" } }, - "node_modules/@blockly/continuous-toolbox": { - "version": "6.0.12", - "resolved": "https://registry.npmjs.org/@blockly/continuous-toolbox/-/continuous-toolbox-6.0.12.tgz", - "integrity": "sha512-I2jsxN/f+wytrzUQkSrxOKLWHPgsjiIz/w0Tpdo9PcDB5mwoBnG8l0ldh5Yj55CRMZbY/q9tANPWR8V8acgMIw==", - "dev": true, - "engines": { - "node": ">=8.17.0" - }, - "peerDependencies": { - "blockly": "^11.0.0" - } - }, "node_modules/@blockly/field-colour": { - "version": "5.0.12", - "resolved": "https://registry.npmjs.org/@blockly/field-colour/-/field-colour-5.0.12.tgz", - "integrity": "sha512-vNw6L/B0cpf+j0S6pShX31bOI16KJu+eACpsfHGOBZbb7+LT3bYKcGHe6+VRe+KtIE3jGlY7vYfnaJdOCrYlfQ==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@blockly/field-colour/-/field-colour-4.0.4.tgz", + "integrity": "sha512-FUXnlReiyejaaT+tkweW386dFbj9mSHjUCVtHgTP6cP5Wbvh6vJHQmnFxlPUNLsHPDGtri8j+yRKxGH97UkJvA==", "dev": true, "engines": { "node": ">=8.0.0" }, "peerDependencies": { - "blockly": "^11.0.0" + "blockly": "^10.4.3" } }, "node_modules/@colors/colors": { @@ -6094,6 +6082,16 @@ "node": ">=4" } }, + "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==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 10" + } + }, "node_modules/@transifex/api": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/@transifex/api/-/api-4.3.0.tgz", @@ -8785,51 +8783,68 @@ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/blockly": { - "version": "11.2.1", - "resolved": "https://registry.npmjs.org/blockly/-/blockly-11.2.1.tgz", - "integrity": "sha512-20sCwSwX2Z6UxR/er0B5y6wRFukuIdvOjc7jMuIwyCO/yT35+UbAqYueMga3JFA9NoWPwQc+3s6/XnLkyceAww==", + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/blockly/-/blockly-10.4.3.tgz", + "integrity": "sha512-+opfBmQnSiv7vTiY/TkDEBOslxUyfj8luS3S+qs1NnQKjInC+Waf2l9cNsMh9J8BMkmiCIT+Ed/3mmjIaL9wug==", "dev": true, "peer": true, "dependencies": { - "jsdom": "25.0.1" + "jsdom": "22.1.0" + } + }, + "node_modules/blockly/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, + "peer": true, + "dependencies": { + "debug": "4" }, "engines": { - "node": ">=18" + "node": ">= 6.0.0" } }, "node_modules/blockly/node_modules/cssstyle": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.2.1.tgz", - "integrity": "sha512-9+vem03dMXG7gDmZ62uqmRiMRNtinIZ9ZyuF6BdxzfOD+FdN5hretzynkn0ReS2DO2GSw76RWHs0UmJPI2zUjw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-3.0.0.tgz", + "integrity": "sha512-N4u2ABATi3Qplzf0hWbVCdjenim8F3ojEXpBDF5hBpjzW182MjNGLqfmQ0SkSPeQ+V86ZXgeH8aXj6kayd4jgg==", "dev": true, "peer": true, "dependencies": { - "@asamuzakjp/css-color": "^2.8.2", - "rrweb-cssom": "^0.8.0" + "rrweb-cssom": "^0.6.0" }, "engines": { - "node": ">=18" + "node": ">=14" } }, - "node_modules/blockly/node_modules/cssstyle/node_modules/rrweb-cssom": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", - "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==", + "node_modules/blockly/node_modules/data-urls": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-4.0.0.tgz", + "integrity": "sha512-/mMTei/JXPqvFqQtfyTowxmJVwr2PVAeCcDxyFf6LhoOu/09TX2OX3kb2wzi4DMXcfj4OItwDOnhl5oziPnT6g==", "dev": true, - "peer": true + "peer": true, + "dependencies": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^12.0.0" + }, + "engines": { + "node": ">=14" + } }, - "node_modules/blockly/node_modules/data-urls": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", - "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", + "node_modules/blockly/node_modules/domexception": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", + "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", + "deprecated": "Use your platform's native DOMException instead", "dev": true, "peer": true, "dependencies": { - "whatwg-mimetype": "^4.0.0", - "whatwg-url": "^14.0.0" + "webidl-conversions": "^7.0.0" }, "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/blockly/node_modules/entities": { @@ -8862,16 +8877,45 @@ } }, "node_modules/blockly/node_modules/html-encoding-sniffer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", - "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", "dev": true, "peer": true, "dependencies": { - "whatwg-encoding": "^3.1.1" + "whatwg-encoding": "^2.0.0" }, "engines": { - "node": ">=18" + "node": ">=12" + } + }, + "node_modules/blockly/node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "peer": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/blockly/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, + "peer": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" } }, "node_modules/blockly/node_modules/iconv-lite": { @@ -8888,39 +8932,41 @@ } }, "node_modules/blockly/node_modules/jsdom": { - "version": "25.0.1", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-25.0.1.tgz", - "integrity": "sha512-8i7LzZj7BF8uplX+ZyOlIz86V6TAsSs+np6m1kpW9u0JWi4z/1t+FzcK1aek+ybTnAC4KhBL4uXCNT0wcUIeCw==", + "version": "22.1.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-22.1.0.tgz", + "integrity": "sha512-/9AVW7xNbsBv6GfWho4TTNjEo9fe6Zhf9O7s0Fhhr3u+awPwAJMKwAMXnkk5vBxflqLW9hTHX/0cs+P3gW+cQw==", "dev": true, "peer": true, "dependencies": { - "cssstyle": "^4.1.0", - "data-urls": "^5.0.0", + "abab": "^2.0.6", + "cssstyle": "^3.0.0", + "data-urls": "^4.0.0", "decimal.js": "^10.4.3", + "domexception": "^4.0.0", "form-data": "^4.0.0", - "html-encoding-sniffer": "^4.0.0", - "http-proxy-agent": "^7.0.2", - "https-proxy-agent": "^7.0.5", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.12", + "nwsapi": "^2.2.4", "parse5": "^7.1.2", - "rrweb-cssom": "^0.7.1", + "rrweb-cssom": "^0.6.0", "saxes": "^6.0.0", "symbol-tree": "^3.2.4", - "tough-cookie": "^5.0.0", - "w3c-xmlserializer": "^5.0.0", + "tough-cookie": "^4.1.2", + "w3c-xmlserializer": "^4.0.0", "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^3.1.1", - "whatwg-mimetype": "^4.0.0", - "whatwg-url": "^14.0.0", - "ws": "^8.18.0", - "xml-name-validator": "^5.0.0" + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^12.0.1", + "ws": "^8.13.0", + "xml-name-validator": "^4.0.0" }, "engines": { - "node": ">=18" + "node": ">=16" }, "peerDependencies": { - "canvas": "^2.11.2" + "canvas": "^2.5.0" }, "peerDependenciesMeta": { "canvas": { @@ -8951,6 +8997,13 @@ "node": ">=6" } }, + "node_modules/blockly/node_modules/rrweb-cssom": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz", + "integrity": "sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==", + "dev": true, + "peer": true + }, "node_modules/blockly/node_modules/saxes": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", @@ -8965,42 +9018,55 @@ } }, "node_modules/blockly/node_modules/tough-cookie": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.1.tgz", - "integrity": "sha512-Ek7HndSVkp10hmHP9V4qZO1u+pn1RU5sI0Fw+jCU3lyvuMZcgqsNgc6CmJJZyByK4Vm/qotGRJlfgAX8q+4JiA==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", "dev": true, "peer": true, "dependencies": { - "tldts": "^6.1.32" + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" }, "engines": { - "node": ">=16" + "node": ">=6" } }, "node_modules/blockly/node_modules/tr46": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz", - "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz", + "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==", "dev": true, "peer": true, "dependencies": { - "punycode": "^2.3.1" + "punycode": "^2.3.0" }, "engines": { - "node": ">=18" + "node": ">=14" + } + }, + "node_modules/blockly/node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 4.0.0" } }, "node_modules/blockly/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==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", + "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", "dev": true, "peer": true, "dependencies": { - "xml-name-validator": "^5.0.0" + "xml-name-validator": "^4.0.0" }, "engines": { - "node": ">=18" + "node": ">=14" } }, "node_modules/blockly/node_modules/webidl-conversions": { @@ -9014,40 +9080,40 @@ } }, "node_modules/blockly/node_modules/whatwg-encoding": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", - "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "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==", "dev": true, "peer": true, "dependencies": { "iconv-lite": "0.6.3" }, "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/blockly/node_modules/whatwg-mimetype": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", - "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", "dev": true, "peer": true, "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/blockly/node_modules/whatwg-url": { - "version": "14.1.1", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.1.1.tgz", - "integrity": "sha512-mDGf9diDad/giZ/Sm9Xi2YcyzaFpbdLpJPr+E9fSkyQ7KpQD4SdFcugkRQYzhmfI4KeV4Qpnn2sKPdo+kmsgRQ==", + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-12.0.1.tgz", + "integrity": "sha512-Ed/LrqB8EPlGxjS+TrsXcpUond1mhccS3pchLhzSgPCnTimUCKj3IZE75pAs5m6heB2U2TMerKFUXheyHY+VDQ==", "dev": true, "peer": true, "dependencies": { - "tr46": "^5.0.0", + "tr46": "^4.1.1", "webidl-conversions": "^7.0.0" }, "engines": { - "node": ">=18" + "node": ">=14" } }, "node_modules/blockly/node_modules/ws": { @@ -9073,13 +9139,13 @@ } }, "node_modules/blockly/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==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", "dev": true, "peer": true, "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/bluebird": { @@ -40710,7 +40776,7 @@ "jsdoc": "3.6.11", "json": "^9.0.4", "pngjs": "3.4.0", - "scratch-blocks": "2.0.0-spork.3", + "scratch-blocks": "2.0.0-spork.4", "scratch-l10n": "5.0.134", "scratch-render-fonts": "1.0.165", "scratch-semantic-release-config": "3.0.0", @@ -40724,6 +40790,18 @@ "webpack-dev-server": "3.11.3" } }, + "packages/scratch-vm/node_modules/@blockly/continuous-toolbox": { + "version": "7.0.0-beta.1", + "resolved": "https://registry.npmjs.org/@blockly/continuous-toolbox/-/continuous-toolbox-7.0.0-beta.1.tgz", + "integrity": "sha512-IKu0whdtRTmdXSB11efSJ5fCNzQtAp98fv+7KnZk/V7Q/xAhVAutWWQE+FJvr9lKJlkeYqm9m+cxDhOBtlVP1w==", + "dev": true, + "engines": { + "node": ">=8.17.0" + }, + "peerDependencies": { + "blockly": "^12.0.0-beta.0" + } + }, "packages/scratch-vm/node_modules/@webpack-cli/configtest": { "version": "1.2.0", "dev": true, @@ -41852,14 +41930,14 @@ } }, "packages/scratch-vm/node_modules/scratch-blocks": { - "version": "2.0.0-spork.3", - "resolved": "https://registry.npmjs.org/scratch-blocks/-/scratch-blocks-2.0.0-spork.3.tgz", - "integrity": "sha512-luy2QtACBjhHT2rH2Zcvwevjb9zBnMWGwLnp9ydEXzbcFTptmYxFTmC8iFRPm6szxGiCw1pH48Qr3BwTGRKp8Q==", + "version": "2.0.0-spork.4", + "resolved": "https://registry.npmjs.org/scratch-blocks/-/scratch-blocks-2.0.0-spork.4.tgz", + "integrity": "sha512-gG/w7a5bAKZAPoYLFbyNgtS7ZIGKpc6MrwmxtZG5oSA2WdJcwZMyYLeV9kMCnCh4P0pKBy+NaQEfQC4fDeXK9A==", "dev": true, "dependencies": { - "@blockly/continuous-toolbox": "^6.0.9", - "@blockly/field-colour": "^5.0.9", - "blockly": "^12.0.0-beta.0" + "@blockly/continuous-toolbox": "^7.0.0-beta.1", + "@blockly/field-colour": "^4.0.2", + "blockly": "^12.0.0-beta.1" } }, "packages/scratch-vm/node_modules/selfsigned": { diff --git a/packages/scratch-vm/package.json b/packages/scratch-vm/package.json index 85d7d2f6644..0222610edf6 100644 --- a/packages/scratch-vm/package.json +++ b/packages/scratch-vm/package.json @@ -91,7 +91,7 @@ "jsdoc": "3.6.11", "json": "^9.0.4", "pngjs": "3.4.0", - "scratch-blocks": "2.0.0-spork.3", + "scratch-blocks": "2.0.0-spork.4", "scratch-l10n": "5.0.134", "scratch-render-fonts": "1.0.165", "scratch-semantic-release-config": "3.0.0", From aedce8a9080009fde1c423541cc234a8f793367e Mon Sep 17 00:00:00 2001 From: adroitwhiz Date: Tue, 9 Mar 2021 18:40:11 -0500 Subject: [PATCH 020/521] Replace text-encoding polyfill --- package-lock.json | 5 ++--- packages/scratch-gui/package.json | 2 +- packages/scratch-gui/src/lib/default-project/index.ts | 2 +- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6ec88501afb..7e083672a81 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14550,8 +14550,7 @@ "node_modules/fastestsmallesttextencoderdecoder": { "version": "1.0.22", "resolved": "https://registry.npmjs.org/fastestsmallesttextencoderdecoder/-/fastestsmallesttextencoderdecoder-1.0.22.tgz", - "integrity": "sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw==", - "license": "CC0-1.0" + "integrity": "sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw==" }, "node_modules/fastq": { "version": "1.17.1", @@ -38225,6 +38224,7 @@ "css-loader": "5.2.7", "dapjs": "2.3.0", "es6-object-assign": "1.1.0", + "fastestsmallesttextencoderdecoder": "^1.0.22", "get-float-time-domain-data": "0.1.0", "get-user-media-promise": "1.1.4", "immutable": "3.8.2", @@ -38265,7 +38265,6 @@ "scratch-storage": "4.0.24", "startaudiocontext": "1.2.1", "style-loader": "4.0.0", - "text-encoding": "0.7.0", "to-style": "1.3.3", "wav-encoder": "1.3.0", "xhr": "2.6.0" diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index 0ef4808eda5..1fb967bab4b 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -60,6 +60,7 @@ "css-loader": "5.2.7", "dapjs": "2.3.0", "es6-object-assign": "1.1.0", + "fastestsmallesttextencoderdecoder": "^1.0.22", "get-float-time-domain-data": "0.1.0", "get-user-media-promise": "1.1.4", "immutable": "3.8.2", @@ -100,7 +101,6 @@ "scratch-storage": "4.0.24", "startaudiocontext": "1.2.1", "style-loader": "4.0.0", - "text-encoding": "0.7.0", "to-style": "1.3.3", "wav-encoder": "1.3.0", "xhr": "2.6.0" diff --git a/packages/scratch-gui/src/lib/default-project/index.ts b/packages/scratch-gui/src/lib/default-project/index.ts index 4808aca037e..a1b6c6697d7 100644 --- a/packages/scratch-gui/src/lib/default-project/index.ts +++ b/packages/scratch-gui/src/lib/default-project/index.ts @@ -14,7 +14,7 @@ declare function require(path: 'text-encoding'): { TextEncoder: typeof TextEncod const defaultProject = (translator?: TranslatorFunction) => { let _TextEncoder: typeof TextEncoder; if (typeof TextEncoder === 'undefined') { - _TextEncoder = require('text-encoding').TextEncoder; + _TextEncoder = require('fastestsmallesttextencoderdecoder').TextEncoder; } else { _TextEncoder = TextEncoder; } From d67cb26c366a96357e34ff09d8f4b58bc8d1f4c0 Mon Sep 17 00:00:00 2001 From: Aaron Dodson Date: Fri, 19 Apr 2024 08:07:58 -0700 Subject: [PATCH 021/521] fix: temporarily disable functionality in scratch-gui for compatibility with patched scratch-blocks (#1) --- .../scratch-gui/src/containers/blocks.jsx | 55 +++++++++++-------- packages/scratch-gui/src/lib/blocks.js | 40 +++++++++----- .../scratch-gui/src/lib/make-toolbox-xml.js | 20 +++---- 3 files changed, 68 insertions(+), 47 deletions(-) diff --git a/packages/scratch-gui/src/containers/blocks.jsx b/packages/scratch-gui/src/containers/blocks.jsx index 84b1e3f3cec..cdbec8f8ca5 100644 --- a/packages/scratch-gui/src/containers/blocks.jsx +++ b/packages/scratch-gui/src/containers/blocks.jsx @@ -95,14 +95,24 @@ class Blocks extends React.Component { this.ScratchBlocks.statusButtonCallback = this.handleConnectionModalStart; this.ScratchBlocks.recordSoundCallback = this.handleOpenSoundRecorder; - this.ScratchBlocks.FieldColourSlider.activateEyedropper_ = this.props.onActivateColorPicker; + // this.ScratchBlocks.FieldColourSlider.activateEyedropper_ = this.props.onActivateColorPicker; this.ScratchBlocks.Procedures.externalProcedureDefCallback = this.props.onActivateCustomProcedures; this.ScratchBlocks.ScratchMsgs.setLocale(this.props.locale); + const theme = this.ScratchBlocks.Theme.defineTheme('Scratch', { + 'base': this.ScratchBlocks.Themes.Zelos, + 'startHats': true + }); const workspaceConfig = defaultsDeep({}, Blocks.defaultOptions, this.props.options, - {rtl: this.props.isRtl, toolbox: this.props.toolboxXML, colours: getColorsForTheme(this.props.theme)} + { + rtl: this.props.isRtl, + toolbox: this.props.toolboxXML, + colours: getColorsForTheme(this.props.theme), + renderer: 'zelos', + theme: theme, + } ); this.workspace = this.ScratchBlocks.inject(this.blocks, workspaceConfig); @@ -129,10 +139,11 @@ class Blocks extends React.Component { // we actually never want the workspace to enable "refresh toolbox" - this basically re-renders the // entire toolbox every time we reset the workspace. We call updateToolbox as a part of // componentDidUpdate so the toolbox will still correctly be updated - this.setToolboxRefreshEnabled = this.workspace.setToolboxRefreshEnabled.bind(this.workspace); - this.workspace.setToolboxRefreshEnabled = () => { - this.setToolboxRefreshEnabled(false); - }; + this.setToolboxRefreshEnabled = () => {}; + // this.workspace.setToolboxRefreshEnabled.bind(this.workspace); + // this.workspace.setToolboxRefreshEnabled = () => { + // this.setToolboxRefreshEnabled(false); + // }; // @todo change this when blockly supports UI events addFunctionListener(this.workspace, 'translate', this.onWorkspaceMetricsChange); @@ -213,11 +224,11 @@ class Blocks extends React.Component { this.ScratchBlocks.ScratchMsgs.setLocale(this.props.locale); this.props.vm.setLocale(this.props.locale, this.props.messages) .then(() => { - this.workspace.getFlyout().setRecyclingEnabled(false); + // this.workspace.getFlyout().setRecyclingEnabled(false); this.props.vm.refreshWorkspace(); this.requestToolboxUpdate(); this.withToolboxUpdates(() => { - this.workspace.getFlyout().setRecyclingEnabled(true); + // this.workspace.getFlyout().setRecyclingEnabled(true); }); }); } @@ -225,8 +236,8 @@ class Blocks extends React.Component { updateToolbox () { this.toolboxUpdateTimeout = false; - const categoryId = this.workspace.toolbox_.getSelectedCategoryId(); - const offset = this.workspace.toolbox_.getCategoryScrollOffset(); + // const categoryId = this.workspace.toolbox_.getSelectedItem().getId(); + // const offset = this.workspace.toolbox_.getCategoryScrollOffset(); this.workspace.updateToolbox(this.props.toolboxXML); this._renderedToolboxXML = this.props.toolboxXML; @@ -235,13 +246,13 @@ class Blocks extends React.Component { // Using the setter function will rerender the entire toolbox which we just rendered. this.workspace.toolboxRefreshEnabled_ = true; - const currentCategoryPos = this.workspace.toolbox_.getCategoryPositionById(categoryId); - const currentCategoryLen = this.workspace.toolbox_.getCategoryLengthById(categoryId); - if (offset < currentCategoryLen) { - this.workspace.toolbox_.setFlyoutScrollPos(currentCategoryPos + offset); - } else { - this.workspace.toolbox_.setFlyoutScrollPos(currentCategoryPos); - } + // const currentCategoryPos = this.workspace.toolbox_.getCategoryPositionById(categoryId); + // const currentCategoryLen = this.workspace.toolbox_.getCategoryLengthById(categoryId); + // if (offset < currentCategoryLen) { + // this.workspace.toolbox_.setFlyoutScrollPos(currentCategoryPos + offset); + // } else { + // this.workspace.toolbox_.setFlyoutScrollPos(currentCategoryPos); + // } const queue = this.toolboxUpdateQueue; this.toolboxUpdateQueue = []; @@ -329,16 +340,16 @@ class Blocks extends React.Component { } } onScriptGlowOn (data) { - this.workspace.glowStack(data.id, true); + // this.workspace.glowStack(data.id, true); } onScriptGlowOff (data) { - this.workspace.glowStack(data.id, false); + // this.workspace.glowStack(data.id, false); } onBlockGlowOn (data) { - this.workspace.glowBlock(data.id, true); + // this.workspace.glowBlock(data.id, true); } onBlockGlowOff (data) { - this.workspace.glowBlock(data.id, false); + // this.workspace.glowBlock(data.id, false); } onVisualReport (data) { this.workspace.reportValue(data.id, data.value); @@ -382,7 +393,7 @@ class Blocks extends React.Component { // Remove and reattach the workspace listener (but allow flyout events) this.workspace.removeChangeListener(this.props.vm.blockListener); - const dom = this.ScratchBlocks.Xml.textToDom(data.xml); + const dom = this.ScratchBlocks.utils.xml.textToDom(data.xml); try { this.ScratchBlocks.Xml.clearWorkspaceAndLoadFromXml(dom, this.workspace); } catch (error) { diff --git a/packages/scratch-gui/src/lib/blocks.js b/packages/scratch-gui/src/lib/blocks.js index f89f5fe0b02..97d5ec30dea 100644 --- a/packages/scratch-gui/src/lib/blocks.js +++ b/packages/scratch-gui/src/lib/blocks.js @@ -5,7 +5,7 @@ * @return {ScratchBlocks} ScratchBlocks connected with the vm */ export default function (vm, useCatBlocks) { - const ScratchBlocks = useCatBlocks ? require('cat-blocks') : require('scratch-blocks'); + const {ScratchBlocks} = useCatBlocks ? require('cat-blocks') : require('scratch-blocks'); const jsonForMenuBlock = function (name, menuOptionsFn, colors, start) { return { message0: '%1', @@ -82,7 +82,7 @@ export default function (vm, useCatBlocks) { } menu.push([ ScratchBlocks.ScratchMsgs.translate('SOUND_RECORD', 'record...'), - ScratchBlocks.recordSoundCallback + 'SOUND_RECORD' ]); return menu; }; @@ -158,6 +158,16 @@ export default function (vm, useCatBlocks) { ScratchBlocks.Blocks.sound_sounds_menu.init = function () { const json = jsonForMenuBlock('SOUND_MENU', soundsMenu, soundColors, []); this.jsonInit(json); + this.inputList[0].removeField('SOUND_MENU'); + this.inputList[0].appendField(new ScratchBlocks.FieldDropdown(() => { + return soundsMenu(); + }, (newValue) => { + if (newValue === 'SOUND_RECORD') { + ScratchBlocks.recordSoundCallback(); + return null; + } + return newValue; + }), 'SOUND_MENU'); }; ScratchBlocks.Blocks.looks_costume.init = function () { @@ -323,16 +333,16 @@ export default function (vm, useCatBlocks) { return monitoredBlock ? monitoredBlock.isMonitored : false; }; - ScratchBlocks.FlyoutExtensionCategoryHeader.getExtensionState = function (extensionId) { - if (vm.getPeripheralIsConnected(extensionId)) { - return ScratchBlocks.StatusButtonState.READY; - } - return ScratchBlocks.StatusButtonState.NOT_READY; - }; - - ScratchBlocks.FieldNote.playNote_ = function (noteNum, extensionId) { - vm.runtime.emit('PLAY_NOTE', noteNum, extensionId); - }; + // ScratchBlocks.FlyoutExtensionCategoryHeader.getExtensionState = function (extensionId) { + // if (vm.getPeripheralIsConnected(extensionId)) { + // return ScratchBlocks.StatusButtonState.READY; + // } + // return ScratchBlocks.StatusButtonState.NOT_READY; + // }; + // + // ScratchBlocks.FieldNote.playNote_ = function (noteNum, extensionId) { + // vm.runtime.emit('PLAY_NOTE', noteNum, extensionId); + // }; // Use a collator's compare instead of localeCompare which internally // creates a collator. Using this is a lot faster in browsers that create a @@ -341,9 +351,9 @@ export default function (vm, useCatBlocks) { sensitivity: 'base', numeric: true }); - ScratchBlocks.scratchBlocksUtils.compareStrings = function (str1, str2) { - return collator.compare(str1, str2); - }; + // ScratchBlocks.scratchBlocksUtils.compareStrings = function (str1, str2) { + // return collator.compare(str1, str2); + // }; // Blocks wants to know if 3D CSS transforms are supported. The cross // section of browsers Scratch supports and browsers that support 3D CSS diff --git a/packages/scratch-gui/src/lib/make-toolbox-xml.js b/packages/scratch-gui/src/lib/make-toolbox-xml.js index 8d356e442d9..156f4cd2811 100644 --- a/packages/scratch-gui/src/lib/make-toolbox-xml.js +++ b/packages/scratch-gui/src/lib/make-toolbox-xml.js @@ -1,4 +1,4 @@ -import ScratchBlocks from 'scratch-blocks'; +import {ScratchBlocks} from 'scratch-blocks'; import {defaultColors} from './themes'; const categorySeparator = ''; @@ -13,7 +13,7 @@ const motion = function (isInitialSetup, isStage, targetId, colors) { ); // Note: the category's secondaryColour matches up with the blocks' tertiary color, both used for border color. return ` - + ${isStage ? ` ` : ` @@ -158,7 +158,7 @@ const looks = function (isInitialSetup, isStage, targetId, costumeName, backdrop const hmm = ScratchBlocks.ScratchMsgs.translate('LOOKS_HMM', 'Hmm...'); // Note: the category's secondaryColour matches up with the blocks' tertiary color, both used for border color. return ` - + ${isStage ? '' : ` @@ -294,7 +294,7 @@ const looks = function (isInitialSetup, isStage, targetId, costumeName, backdrop const sound = function (isInitialSetup, isStage, targetId, soundName, colors) { // Note: the category's secondaryColour matches up with the blocks' tertiary color, both used for border color. return ` - + @@ -350,7 +350,7 @@ const sound = function (isInitialSetup, isStage, targetId, soundName, colors) { const events = function (isInitialSetup, isStage, targetId, colors) { // Note: the category's secondaryColour matches up with the blocks' tertiary color, both used for border color. return ` - + @@ -391,7 +391,7 @@ const control = function (isInitialSetup, isStage, targetId, colors) { // Note: the category's secondaryColour matches up with the blocks' tertiary color, both used for border color. return ` @@ -444,7 +444,7 @@ const sensing = function (isInitialSetup, isStage, targetId, colors) { // Note: the category's secondaryColour matches up with the blocks' tertiary color, both used for border color. return ` @@ -526,7 +526,7 @@ const operators = function (isInitialSetup, isStage, targetId, colors) { // Note: the category's secondaryColour matches up with the blocks' tertiary color, both used for border color. return ` @@ -715,7 +715,7 @@ const variables = function (isInitialSetup, isStage, targetId, colors) { // Note: the category's secondaryColour matches up with the blocks' tertiary color, both used for border color. return ` Date: Tue, 23 Apr 2024 09:45:13 -0700 Subject: [PATCH 022/521] fix: show the correct toolbox based on sprites or the stage being selected (#4) --- packages/scratch-gui/src/containers/blocks.jsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/scratch-gui/src/containers/blocks.jsx b/packages/scratch-gui/src/containers/blocks.jsx index cdbec8f8ca5..ad632b68845 100644 --- a/packages/scratch-gui/src/containers/blocks.jsx +++ b/packages/scratch-gui/src/containers/blocks.jsx @@ -148,6 +148,7 @@ class Blocks extends React.Component { // @todo change this when blockly supports UI events addFunctionListener(this.workspace, 'translate', this.onWorkspaceMetricsChange); addFunctionListener(this.workspace, 'zoom', this.onWorkspaceMetricsChange); + this.workspace.getToolbox().selectItemByPosition(0); this.attachVM(); // Only update blocks/vm locale when visible to avoid sizing issues @@ -224,11 +225,11 @@ class Blocks extends React.Component { this.ScratchBlocks.ScratchMsgs.setLocale(this.props.locale); this.props.vm.setLocale(this.props.locale, this.props.messages) .then(() => { - // this.workspace.getFlyout().setRecyclingEnabled(false); + this.workspace.getFlyout().setRecyclingEnabled(false); this.props.vm.refreshWorkspace(); this.requestToolboxUpdate(); this.withToolboxUpdates(() => { - // this.workspace.getFlyout().setRecyclingEnabled(true); + this.workspace.getFlyout().setRecyclingEnabled(true); }); }); } @@ -239,6 +240,7 @@ class Blocks extends React.Component { // const categoryId = this.workspace.toolbox_.getSelectedItem().getId(); // const offset = this.workspace.toolbox_.getCategoryScrollOffset(); this.workspace.updateToolbox(this.props.toolboxXML); + this.workspace.refreshToolboxSelection(); this._renderedToolboxXML = this.props.toolboxXML; // In order to catch any changes that mutate the toolbox during "normal runtime" From 818227b7512e46a38d500192e609b692d0be2f9f Mon Sep 17 00:00:00 2001 From: Aaron Dodson Date: Tue, 23 Apr 2024 10:48:35 -0700 Subject: [PATCH 023/521] fix: modify inject options to reflect Scratch behaviors (#5) --- packages/scratch-gui/src/containers/blocks.jsx | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/scratch-gui/src/containers/blocks.jsx b/packages/scratch-gui/src/containers/blocks.jsx index ad632b68845..398bb3e3ee1 100644 --- a/packages/scratch-gui/src/containers/blocks.jsx +++ b/packages/scratch-gui/src/containers/blocks.jsx @@ -664,9 +664,12 @@ Blocks.propTypes = { Blocks.defaultOptions = { zoom: { controls: true, - wheel: true, + wheel: false, startScale: BLOCKS_DEFAULT_SCALE }, + move: { + wheel: true, + }, grid: { spacing: 40, length: 2, @@ -674,7 +677,8 @@ Blocks.defaultOptions = { }, comments: true, collapse: false, - sounds: false + sounds: false, + trashcan: false, }; Blocks.defaultProps = { From 7c758282ff875b048f15a4925015605961dc3233 Mon Sep 17 00:00:00 2001 From: Aaron Dodson Date: Wed, 24 Apr 2024 12:28:10 -0700 Subject: [PATCH 024/521] fix: add support for Scratch-style procedures (#6) * fix: add support for Scratch-style procedures * refactor: remove underscore procedure creation callback --- packages/scratch-gui/src/containers/blocks.jsx | 14 ++++++++------ .../src/containers/custom-procedures.jsx | 12 +++++++----- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/packages/scratch-gui/src/containers/blocks.jsx b/packages/scratch-gui/src/containers/blocks.jsx index 398bb3e3ee1..9b082eaca4c 100644 --- a/packages/scratch-gui/src/containers/blocks.jsx +++ b/packages/scratch-gui/src/containers/blocks.jsx @@ -79,7 +79,7 @@ class Blocks extends React.Component { 'setBlocks', 'setLocale' ]); - this.ScratchBlocks.prompt = this.handlePromptStart; + this.ScratchBlocks.dialog.setPrompt(this.handlePromptStart); this.ScratchBlocks.statusButtonCallback = this.handleConnectionModalStart; this.ScratchBlocks.recordSoundCallback = this.handleOpenSoundRecorder; @@ -91,12 +91,12 @@ class Blocks extends React.Component { } componentDidMount () { this.ScratchBlocks = VMScratchBlocks(this.props.vm, this.props.useCatBlocks); - this.ScratchBlocks.prompt = this.handlePromptStart; + this.ScratchBlocks.dialog.setPrompt(this.handlePromptStart); this.ScratchBlocks.statusButtonCallback = this.handleConnectionModalStart; this.ScratchBlocks.recordSoundCallback = this.handleOpenSoundRecorder; // this.ScratchBlocks.FieldColourSlider.activateEyedropper_ = this.props.onActivateColorPicker; - this.ScratchBlocks.Procedures.externalProcedureDefCallback = this.props.onActivateCustomProcedures; + this.ScratchBlocks.ScratchProcedures.externalProcedureDefCallback = this.props.onActivateCustomProcedures; this.ScratchBlocks.ScratchMsgs.setLocale(this.props.locale); const theme = this.ScratchBlocks.Theme.defineTheme('Scratch', { @@ -115,6 +115,8 @@ class Blocks extends React.Component { } ); this.workspace = this.ScratchBlocks.inject(this.blocks, workspaceConfig); + this.workspace.registerToolboxCategoryCallback('PROCEDURE', + this.ScratchBlocks.ScratchProcedures.getProceduresCategory); // Register buttons under new callback keys for creating variables, // lists, and procedures from extensions. @@ -124,7 +126,7 @@ class Blocks extends React.Component { const varListButtonCallback = type => (() => this.ScratchBlocks.Variables.createVariable(this.workspace, null, type)); const procButtonCallback = () => { - this.ScratchBlocks.Procedures.createProcedureDefCallback_(this.workspace); + this.ScratchBlocks.ScratchProcedures.createProcedureDefCallback(this.workspace); }; toolboxWorkspace.registerButtonCallback('MAKE_A_VARIABLE', varListButtonCallback('')); @@ -545,8 +547,8 @@ class Blocks extends React.Component { handleCustomProceduresClose (data) { this.props.onRequestCloseCustomProcedures(data); const ws = this.workspace; - ws.refreshToolboxSelection_(); - ws.toolbox_.scrollToCategoryById('myBlocks'); + this.updateToolbox(); + ws.getToolbox().selectCategoryByName('myBlocks'); } handleDrop (dragInfo) { fetch(dragInfo.payload.bodyUrl) diff --git a/packages/scratch-gui/src/containers/custom-procedures.jsx b/packages/scratch-gui/src/containers/custom-procedures.jsx index e691b0466f7..de7ac0a0423 100644 --- a/packages/scratch-gui/src/containers/custom-procedures.jsx +++ b/packages/scratch-gui/src/containers/custom-procedures.jsx @@ -3,7 +3,7 @@ import defaultsDeep from 'lodash.defaultsdeep'; import PropTypes from 'prop-types'; import React from 'react'; import CustomProceduresComponent from '../components/custom-procedures/custom-procedures.jsx'; -import ScratchBlocks from 'scratch-blocks'; +import {ScratchBlocks} from 'scratch-blocks'; import {connect} from 'react-redux'; class CustomProcedures extends React.Component { @@ -37,11 +37,13 @@ class CustomProcedures extends React.Component { {rtl: this.props.isRtl} ); - // @todo This is a hack to make there be no toolbox. - const oldDefaultToolbox = ScratchBlocks.Blocks.defaultToolbox; - ScratchBlocks.Blocks.defaultToolbox = null; + const theme = ScratchBlocks.Theme.defineTheme('Scratch', { + 'base': ScratchBlocks.Themes.Zelos, + 'startHats': true + }); + workspaceConfig.theme = theme; + workspaceConfig.renderer = 'zelos'; this.workspace = ScratchBlocks.inject(this.blocks, workspaceConfig); - ScratchBlocks.Blocks.defaultToolbox = oldDefaultToolbox; // Create the procedure declaration block for editing the mutation. this.mutationRoot = this.workspace.newBlock('procedures_declaration'); From fde8293fe73b9f4916ebf98552907d81848d4a22 Mon Sep 17 00:00:00 2001 From: Aaron Dodson Date: Wed, 24 Apr 2024 15:40:57 -0700 Subject: [PATCH 025/521] fix: reenable the Scratch colour eyedropper --- packages/scratch-gui/src/containers/blocks.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/scratch-gui/src/containers/blocks.jsx b/packages/scratch-gui/src/containers/blocks.jsx index 9b082eaca4c..73ac0414656 100644 --- a/packages/scratch-gui/src/containers/blocks.jsx +++ b/packages/scratch-gui/src/containers/blocks.jsx @@ -95,7 +95,7 @@ class Blocks extends React.Component { this.ScratchBlocks.statusButtonCallback = this.handleConnectionModalStart; this.ScratchBlocks.recordSoundCallback = this.handleOpenSoundRecorder; - // this.ScratchBlocks.FieldColourSlider.activateEyedropper_ = this.props.onActivateColorPicker; + this.ScratchBlocks.FieldColourSlider.activateEyedropper_ = this.props.onActivateColorPicker; this.ScratchBlocks.ScratchProcedures.externalProcedureDefCallback = this.props.onActivateCustomProcedures; this.ScratchBlocks.ScratchMsgs.setLocale(this.props.locale); From 3baa9bb1535e7068fe20ac47948cbbaa1c0faec5 Mon Sep 17 00:00:00 2001 From: Aaron Dodson Date: Fri, 26 Apr 2024 11:22:41 -0700 Subject: [PATCH 026/521] fix: patch the getCheckboxState method in the new flyout (#7) --- packages/scratch-gui/src/lib/blocks.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/scratch-gui/src/lib/blocks.js b/packages/scratch-gui/src/lib/blocks.js index 97d5ec30dea..3230729c8ad 100644 --- a/packages/scratch-gui/src/lib/blocks.js +++ b/packages/scratch-gui/src/lib/blocks.js @@ -328,7 +328,7 @@ export default function (vm, useCatBlocks) { this.jsonInit(json); }; - ScratchBlocks.VerticalFlyout.getCheckboxState = function (blockId) { + ScratchBlocks.CheckableContinuousFlyout.prototype.getCheckboxState = function (blockId) { const monitoredBlock = vm.runtime.monitorBlocks._blocks[blockId]; return monitoredBlock ? monitoredBlock.isMonitored : false; }; From fbffc14ceadb80261ad7873c9d0d148bd9332e01 Mon Sep 17 00:00:00 2001 From: Aaron Dodson Date: Tue, 30 Apr 2024 15:07:15 -0700 Subject: [PATCH 027/521] fix: select extension categories when added (#8) --- packages/scratch-gui/src/containers/blocks.jsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/scratch-gui/src/containers/blocks.jsx b/packages/scratch-gui/src/containers/blocks.jsx index 73ac0414656..8654acdb869 100644 --- a/packages/scratch-gui/src/containers/blocks.jsx +++ b/packages/scratch-gui/src/containers/blocks.jsx @@ -500,7 +500,8 @@ class Blocks extends React.Component { } this.withToolboxUpdates(() => { - this.workspace.toolbox_.setSelectedCategoryById(categoryId); + const toolbox = this.workspace.getToolbox(); + toolbox.setSelectedItem(toolbox.getToolboxItemById(categoryId)); }); } setBlocks (blocks) { From 5de68f1a60fa3909e7f81a2fba1c60718be15581 Mon Sep 17 00:00:00 2001 From: Aaron Dodson Date: Tue, 30 Apr 2024 15:48:05 -0700 Subject: [PATCH 028/521] fix: Use toolboxitemid instead of id as the identifier attribute for toolbox categories (#9) --- .../scratch-gui/src/lib/make-toolbox-xml.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/scratch-gui/src/lib/make-toolbox-xml.js b/packages/scratch-gui/src/lib/make-toolbox-xml.js index 156f4cd2811..532f9e14c0a 100644 --- a/packages/scratch-gui/src/lib/make-toolbox-xml.js +++ b/packages/scratch-gui/src/lib/make-toolbox-xml.js @@ -13,7 +13,7 @@ const motion = function (isInitialSetup, isStage, targetId, colors) { ); // Note: the category's secondaryColour matches up with the blocks' tertiary color, both used for border color. return ` - + ${isStage ? ` ` : ` @@ -158,7 +158,7 @@ const looks = function (isInitialSetup, isStage, targetId, costumeName, backdrop const hmm = ScratchBlocks.ScratchMsgs.translate('LOOKS_HMM', 'Hmm...'); // Note: the category's secondaryColour matches up with the blocks' tertiary color, both used for border color. return ` - + ${isStage ? '' : ` @@ -294,7 +294,7 @@ const looks = function (isInitialSetup, isStage, targetId, costumeName, backdrop const sound = function (isInitialSetup, isStage, targetId, soundName, colors) { // Note: the category's secondaryColour matches up with the blocks' tertiary color, both used for border color. return ` - + @@ -350,7 +350,7 @@ const sound = function (isInitialSetup, isStage, targetId, soundName, colors) { const events = function (isInitialSetup, isStage, targetId, colors) { // Note: the category's secondaryColour matches up with the blocks' tertiary color, both used for border color. return ` - + @@ -392,7 +392,7 @@ const control = function (isInitialSetup, isStage, targetId, colors) { return ` @@ -445,7 +445,7 @@ const sensing = function (isInitialSetup, isStage, targetId, colors) { return ` ${isStage ? '' : ` @@ -527,7 +527,7 @@ const operators = function (isInitialSetup, isStage, targetId, colors) { return ` @@ -716,7 +716,7 @@ const variables = function (isInitialSetup, isStage, targetId, colors) { return ` @@ -729,7 +729,7 @@ const myBlocks = function (isInitialSetup, isStage, targetId, colors) { return ` From c0b3d0e9102b26fbd192e6cb5f55cc452cb06e6d Mon Sep 17 00:00:00 2001 From: Aaron Dodson Date: Wed, 1 May 2024 09:21:02 -0700 Subject: [PATCH 029/521] fix: preserve toolbox scroll position when switching between sprites/the stage (#10) --- .../scratch-gui/src/containers/blocks.jsx | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/packages/scratch-gui/src/containers/blocks.jsx b/packages/scratch-gui/src/containers/blocks.jsx index 8654acdb869..08c697f0cd4 100644 --- a/packages/scratch-gui/src/containers/blocks.jsx +++ b/packages/scratch-gui/src/containers/blocks.jsx @@ -239,8 +239,13 @@ class Blocks extends React.Component { updateToolbox () { this.toolboxUpdateTimeout = false; - // const categoryId = this.workspace.toolbox_.getSelectedItem().getId(); - // const offset = this.workspace.toolbox_.getCategoryScrollOffset(); + const scale = this.workspace.getFlyout().getWorkspace().scale; + const selectedCategoryName = this.workspace.getToolbox().getSelectedItem().getName(); + const selectedCategoryScrollPosition = this.workspace.getFlyout().getCategoryScrollPosition( + selectedCategoryName).y * scale; + const offsetWithinCategory = (this.workspace.getFlyout().getWorkspace().getMetrics().viewTop + - selectedCategoryScrollPosition); + this.workspace.updateToolbox(this.props.toolboxXML); this.workspace.refreshToolboxSelection(); this._renderedToolboxXML = this.props.toolboxXML; @@ -250,13 +255,10 @@ class Blocks extends React.Component { // Using the setter function will rerender the entire toolbox which we just rendered. this.workspace.toolboxRefreshEnabled_ = true; - // const currentCategoryPos = this.workspace.toolbox_.getCategoryPositionById(categoryId); - // const currentCategoryLen = this.workspace.toolbox_.getCategoryLengthById(categoryId); - // if (offset < currentCategoryLen) { - // this.workspace.toolbox_.setFlyoutScrollPos(currentCategoryPos + offset); - // } else { - // this.workspace.toolbox_.setFlyoutScrollPos(currentCategoryPos); - // } + const newCategoryScrollPosition = this.workspace.getFlyout().getCategoryScrollPosition( + selectedCategoryName).y * scale; + this.workspace.getFlyout().getWorkspace().scrollbar.setY( + newCategoryScrollPosition + offsetWithinCategory); const queue = this.toolboxUpdateQueue; this.toolboxUpdateQueue = []; From b7e7854aaa1e261cee8e4dd6c6c27886ed487cab Mon Sep 17 00:00:00 2001 From: Aaron Dodson Date: Fri, 3 May 2024 08:58:11 -0700 Subject: [PATCH 030/521] fix: call reportValue on the ScratchBlocks module instead of the workspace (#11) --- packages/scratch-gui/src/containers/blocks.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/scratch-gui/src/containers/blocks.jsx b/packages/scratch-gui/src/containers/blocks.jsx index 08c697f0cd4..e8de435c281 100644 --- a/packages/scratch-gui/src/containers/blocks.jsx +++ b/packages/scratch-gui/src/containers/blocks.jsx @@ -358,7 +358,7 @@ class Blocks extends React.Component { // this.workspace.glowBlock(data.id, false); } onVisualReport (data) { - this.workspace.reportValue(data.id, data.value); + this.ScratchBlocks.reportValue(data.id, data.value); } getToolboxXML () { // Use try/catch because this requires digging pretty deep into the VM From 0cd556ff3b66814610cfa3249d1d5fea7cdbff2b Mon Sep 17 00:00:00 2001 From: Aaron Dodson Date: Mon, 6 May 2024 13:42:13 -0700 Subject: [PATCH 031/521] fix: call the new glow methods on ScratchBlocks (#12) * fix: call the new glow methods on ScratchBlocks * refactor: remove the glowBlock calls --- packages/scratch-gui/src/containers/blocks.jsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/scratch-gui/src/containers/blocks.jsx b/packages/scratch-gui/src/containers/blocks.jsx index e8de435c281..a0373417a89 100644 --- a/packages/scratch-gui/src/containers/blocks.jsx +++ b/packages/scratch-gui/src/containers/blocks.jsx @@ -346,16 +346,16 @@ class Blocks extends React.Component { } } onScriptGlowOn (data) { - // this.workspace.glowStack(data.id, true); + this.ScratchBlocks.glowStack(data.id, true); } onScriptGlowOff (data) { - // this.workspace.glowStack(data.id, false); + this.ScratchBlocks.glowStack(data.id, false); } onBlockGlowOn (data) { - // this.workspace.glowBlock(data.id, true); + // No-op, support may be added in the future } onBlockGlowOff (data) { - // this.workspace.glowBlock(data.id, false); + // No-op, support may be added in the future } onVisualReport (data) { this.ScratchBlocks.reportValue(data.id, data.value); From 9ecec906762ecc2cbe3800d8b4357e5b264dc16e Mon Sep 17 00:00:00 2001 From: Aaron Dodson Date: Tue, 7 May 2024 11:57:53 -0700 Subject: [PATCH 032/521] fix: adjust key event filtering to fix the when key pressed block (#13) --- packages/scratch-gui/src/lib/vm-listener-hoc.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/scratch-gui/src/lib/vm-listener-hoc.jsx b/packages/scratch-gui/src/lib/vm-listener-hoc.jsx index 87b9dab7c67..6d9c3c5dc1a 100644 --- a/packages/scratch-gui/src/lib/vm-listener-hoc.jsx +++ b/packages/scratch-gui/src/lib/vm-listener-hoc.jsx @@ -85,7 +85,7 @@ const vmListenerHOC = function (WrappedComponent) { } handleKeyDown (e) { // Don't capture keys intended for Blockly inputs. - if (e.target !== document && e.target !== document.body) return; + if (e.target instanceof HTMLInputElement) return; const key = (!e.key || e.key === 'Dead') ? e.keyCode : e.key; this.props.vm.postIOData('keyboard', { From 2d6e6768f9f7b03b85e557a8056c485d30fceb1a Mon Sep 17 00:00:00 2001 From: Aaron Dodson Date: Thu, 16 May 2024 15:54:10 -0700 Subject: [PATCH 033/521] refactor: simplify toolbox refreshing behavior (#14) --- packages/scratch-gui/src/containers/blocks.jsx | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/packages/scratch-gui/src/containers/blocks.jsx b/packages/scratch-gui/src/containers/blocks.jsx index a0373417a89..e803f3fdb43 100644 --- a/packages/scratch-gui/src/containers/blocks.jsx +++ b/packages/scratch-gui/src/containers/blocks.jsx @@ -138,15 +138,6 @@ class Blocks extends React.Component { // the xml can change while e.g. on the costumes tab. this._renderedToolboxXML = this.props.toolboxXML; - // we actually never want the workspace to enable "refresh toolbox" - this basically re-renders the - // entire toolbox every time we reset the workspace. We call updateToolbox as a part of - // componentDidUpdate so the toolbox will still correctly be updated - this.setToolboxRefreshEnabled = () => {}; - // this.workspace.setToolboxRefreshEnabled.bind(this.workspace); - // this.workspace.setToolboxRefreshEnabled = () => { - // this.setToolboxRefreshEnabled(false); - // }; - // @todo change this when blockly supports UI events addFunctionListener(this.workspace, 'translate', this.onWorkspaceMetricsChange); addFunctionListener(this.workspace, 'zoom', this.onWorkspaceMetricsChange); @@ -247,14 +238,9 @@ class Blocks extends React.Component { - selectedCategoryScrollPosition); this.workspace.updateToolbox(this.props.toolboxXML); - this.workspace.refreshToolboxSelection(); + this.workspace.getToolbox().forceRerender(); this._renderedToolboxXML = this.props.toolboxXML; - // In order to catch any changes that mutate the toolbox during "normal runtime" - // (variable changes/etc), re-enable toolbox refresh. - // Using the setter function will rerender the entire toolbox which we just rendered. - this.workspace.toolboxRefreshEnabled_ = true; - const newCategoryScrollPosition = this.workspace.getFlyout().getCategoryScrollPosition( selectedCategoryName).y * scale; this.workspace.getFlyout().getWorkspace().scrollbar.setY( From 1c691944637fb336d1384eead7ded7f187a0d8ae Mon Sep 17 00:00:00 2001 From: Aaron Dodson Date: Mon, 8 Jul 2024 14:52:42 -0700 Subject: [PATCH 034/521] fix: allow typing into comments (#15) --- packages/scratch-gui/src/lib/vm-listener-hoc.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/scratch-gui/src/lib/vm-listener-hoc.jsx b/packages/scratch-gui/src/lib/vm-listener-hoc.jsx index 6d9c3c5dc1a..eceac440922 100644 --- a/packages/scratch-gui/src/lib/vm-listener-hoc.jsx +++ b/packages/scratch-gui/src/lib/vm-listener-hoc.jsx @@ -85,7 +85,7 @@ const vmListenerHOC = function (WrappedComponent) { } handleKeyDown (e) { // Don't capture keys intended for Blockly inputs. - if (e.target instanceof HTMLInputElement) return; + if (e.target instanceof HTMLInputElement || e.target instanceof HTMLTextAreaElement) return; const key = (!e.key || e.key === 'Dead') ? e.keyCode : e.key; this.props.vm.postIOData('keyboard', { From 2d07d0bb545e517a59773bd588aa20cc7a68092e Mon Sep 17 00:00:00 2001 From: Aaron Dodson Date: Fri, 2 Aug 2024 13:30:06 -0700 Subject: [PATCH 035/521] feat: plumb Scratch variable support into the UI (#16) * chore: format blocks.jsx * feat: plumb Scratch variable support into the UI --- .../scratch-gui/src/containers/blocks.jsx | 630 +++++++++++------- 1 file changed, 396 insertions(+), 234 deletions(-) diff --git a/packages/scratch-gui/src/containers/blocks.jsx b/packages/scratch-gui/src/containers/blocks.jsx index e803f3fdb43..96dcba775cb 100644 --- a/packages/scratch-gui/src/containers/blocks.jsx +++ b/packages/scratch-gui/src/containers/blocks.jsx @@ -1,39 +1,49 @@ -import bindAll from 'lodash.bindall'; -import debounce from 'lodash.debounce'; -import defaultsDeep from 'lodash.defaultsdeep'; -import makeToolboxXML from '../lib/make-toolbox-xml'; -import PropTypes from 'prop-types'; -import React from 'react'; -import VMScratchBlocks from '../lib/blocks'; -import VM from '@scratch/scratch-vm'; - -import log from '../lib/log.js'; -import Prompt from './prompt.jsx'; -import BlocksComponent from '../components/blocks/blocks.jsx'; -import ExtensionLibrary from './extension-library.jsx'; -import extensionData from '../lib/libraries/extensions/index.jsx'; -import CustomProcedures from './custom-procedures.jsx'; -import errorBoundaryHOC from '../lib/error-boundary-hoc.jsx'; -import {BLOCKS_DEFAULT_SCALE, STAGE_DISPLAY_SIZES} from '../lib/layout-constants'; -import DropAreaHOC from '../lib/drop-area-hoc.jsx'; -import DragConstants from '../lib/drag-constants'; -import defineDynamicBlock from '../lib/define-dynamic-block'; -import {DEFAULT_THEME, getColorsForTheme, themeMap} from '../lib/themes'; -import {injectExtensionBlockTheme, injectExtensionCategoryTheme} from '../lib/themes/blockHelpers'; - -import {connect} from 'react-redux'; -import {updateToolbox} from '../reducers/toolbox'; -import {activateColorPicker} from '../reducers/color-picker'; -import {closeExtensionLibrary, openSoundRecorder, openConnectionModal} from '../reducers/modals'; -import {activateCustomProcedures, deactivateCustomProcedures} from '../reducers/custom-procedures'; -import {setConnectionModalExtensionId} from '../reducers/connection-modal'; -import {updateMetrics} from '../reducers/workspace-metrics'; -import {isTimeTravel2020} from '../reducers/time-travel'; +import bindAll from "lodash.bindall"; +import debounce from "lodash.debounce"; +import defaultsDeep from "lodash.defaultsdeep"; +import makeToolboxXML from "../lib/make-toolbox-xml"; +import PropTypes from "prop-types"; +import React from "react"; +import VMScratchBlocks from "../lib/blocks"; +import VM from "@scratch/scratch-vm"; + +import log from "../lib/log.js"; +import Prompt from "./prompt.jsx"; +import BlocksComponent from "../components/blocks/blocks.jsx"; +import ExtensionLibrary from "./extension-library.jsx"; +import extensionData from "../lib/libraries/extensions/index.jsx"; +import CustomProcedures from "./custom-procedures.jsx"; +import errorBoundaryHOC from "../lib/error-boundary-hoc.jsx"; +import { + BLOCKS_DEFAULT_SCALE, + STAGE_DISPLAY_SIZES, +} from "../lib/layout-constants"; +import DropAreaHOC from "../lib/drop-area-hoc.jsx"; +import DragConstants from "../lib/drag-constants"; +import defineDynamicBlock from "../lib/define-dynamic-block"; +import { DEFAULT_THEME, getColorsForTheme, themeMap } from "../lib/themes"; +import { + injectExtensionBlockTheme, + injectExtensionCategoryTheme, +} from "../lib/themes/blockHelpers"; +import { connect } from "react-redux"; +import { updateToolbox } from "../reducers/toolbox"; +import { activateColorPicker } from "../reducers/color-picker"; +import { + closeExtensionLibrary, + openSoundRecorder, + openConnectionModal, +} from "../reducers/modals"; import { - activateTab, - SOUNDS_TAB_INDEX -} from '../reducers/editor-tab'; + activateCustomProcedures, + deactivateCustomProcedures, +} from "../reducers/custom-procedures"; +import { setConnectionModalExtensionId } from "../reducers/connection-modal"; +import { updateMetrics } from "../reducers/workspace-metrics"; +import { isTimeTravel2020 } from "../reducers/time-travel"; + +import { activateTab, SOUNDS_TAB_INDEX } from "../reducers/editor-tab"; const addFunctionListener = (object, property, callback) => { const oldFn = object[property]; @@ -44,94 +54,135 @@ const addFunctionListener = (object, property, callback) => { }; }; -const DroppableBlocks = DropAreaHOC([ - DragConstants.BACKPACK_CODE -])(BlocksComponent); +const DroppableBlocks = DropAreaHOC([DragConstants.BACKPACK_CODE])( + BlocksComponent +); class Blocks extends React.Component { - constructor (props) { + constructor(props) { super(props); this.ScratchBlocks = VMScratchBlocks(props.vm, false); bindAll(this, [ - 'attachVM', - 'detachVM', - 'getToolboxXML', - 'handleCategorySelected', - 'handleConnectionModalStart', - 'handleDrop', - 'handleStatusButtonUpdate', - 'handleOpenSoundRecorder', - 'handlePromptStart', - 'handlePromptCallback', - 'handlePromptClose', - 'handleCustomProceduresClose', - 'onScriptGlowOn', - 'onScriptGlowOff', - 'onBlockGlowOn', - 'onBlockGlowOff', - 'handleMonitorsUpdate', - 'handleExtensionAdded', - 'handleBlocksInfoUpdate', - 'onTargetsUpdate', - 'onVisualReport', - 'onWorkspaceUpdate', - 'onWorkspaceMetricsChange', - 'setBlocks', - 'setLocale' + "attachVM", + "detachVM", + "getToolboxXML", + "handleCategorySelected", + "handleConnectionModalStart", + "handleDrop", + "handleStatusButtonUpdate", + "handleOpenSoundRecorder", + "handlePromptStart", + "handlePromptCallback", + "handlePromptClose", + "handleCustomProceduresClose", + "onScriptGlowOn", + "onScriptGlowOff", + "onBlockGlowOn", + "onBlockGlowOff", + "handleMonitorsUpdate", + "handleExtensionAdded", + "handleBlocksInfoUpdate", + "onTargetsUpdate", + "onVisualReport", + "onWorkspaceUpdate", + "onWorkspaceMetricsChange", + "setBlocks", + "setLocale", ]); this.ScratchBlocks.dialog.setPrompt(this.handlePromptStart); - this.ScratchBlocks.statusButtonCallback = this.handleConnectionModalStart; + this.ScratchBlocks.statusButtonCallback = + this.handleConnectionModalStart; this.ScratchBlocks.recordSoundCallback = this.handleOpenSoundRecorder; this.state = { - prompt: null + prompt: null, }; this.onTargetsUpdate = debounce(this.onTargetsUpdate, 100); this.toolboxUpdateQueue = []; } - componentDidMount () { - this.ScratchBlocks = VMScratchBlocks(this.props.vm, this.props.useCatBlocks); + componentDidMount() { + this.ScratchBlocks = VMScratchBlocks( + this.props.vm, + this.props.useCatBlocks + ); this.ScratchBlocks.dialog.setPrompt(this.handlePromptStart); - this.ScratchBlocks.statusButtonCallback = this.handleConnectionModalStart; + this.ScratchBlocks.statusButtonCallback = + this.handleConnectionModalStart; this.ScratchBlocks.recordSoundCallback = this.handleOpenSoundRecorder; - this.ScratchBlocks.FieldColourSlider.activateEyedropper_ = this.props.onActivateColorPicker; - this.ScratchBlocks.ScratchProcedures.externalProcedureDefCallback = this.props.onActivateCustomProcedures; + this.ScratchBlocks.FieldColourSlider.activateEyedropper_ = + this.props.onActivateColorPicker; + this.ScratchBlocks.ScratchProcedures.externalProcedureDefCallback = + this.props.onActivateCustomProcedures; this.ScratchBlocks.ScratchMsgs.setLocale(this.props.locale); - const theme = this.ScratchBlocks.Theme.defineTheme('Scratch', { - 'base': this.ScratchBlocks.Themes.Zelos, - 'startHats': true + const theme = this.ScratchBlocks.Theme.defineTheme("Scratch", { + base: this.ScratchBlocks.Themes.Zelos, + startHats: true, }); - const workspaceConfig = defaultsDeep({}, + const workspaceConfig = defaultsDeep( + {}, Blocks.defaultOptions, this.props.options, { rtl: this.props.isRtl, toolbox: this.props.toolboxXML, colours: getColorsForTheme(this.props.theme), - renderer: 'zelos', + renderer: "zelos", theme: theme, } ); - this.workspace = this.ScratchBlocks.inject(this.blocks, workspaceConfig); - this.workspace.registerToolboxCategoryCallback('PROCEDURE', - this.ScratchBlocks.ScratchProcedures.getProceduresCategory); + this.workspace = this.ScratchBlocks.inject( + this.blocks, + workspaceConfig + ); + this.workspace.registerToolboxCategoryCallback( + "VARIABLE", + this.ScratchBlocks.ScratchVariables.getVariablesCategory + ); + this.workspace.registerToolboxCategoryCallback( + "PROCEDURE", + this.ScratchBlocks.ScratchProcedures.getProceduresCategory + ); + this.workspace.addChangeListener((event) => { + if ( + event.type === this.ScratchBlocks.Events.VAR_CREATE || + event.type === this.ScratchBlocks.Events.VAR_RENAME || + event.type === this.ScratchBlocks.Events.VAR_DELETE + ) { + this.requestToolboxUpdate(); + } + }); // Register buttons under new callback keys for creating variables, // lists, and procedures from extensions. const toolboxWorkspace = this.workspace.getFlyout().getWorkspace(); - const varListButtonCallback = type => - (() => this.ScratchBlocks.Variables.createVariable(this.workspace, null, type)); + const varListButtonCallback = (type) => () => + this.ScratchBlocks.ScratchVariables.createVariable( + this.workspace, + null, + type + ); const procButtonCallback = () => { - this.ScratchBlocks.ScratchProcedures.createProcedureDefCallback(this.workspace); + this.ScratchBlocks.ScratchProcedures.createProcedureDefCallback( + this.workspace + ); }; - toolboxWorkspace.registerButtonCallback('MAKE_A_VARIABLE', varListButtonCallback('')); - toolboxWorkspace.registerButtonCallback('MAKE_A_LIST', varListButtonCallback('list')); - toolboxWorkspace.registerButtonCallback('MAKE_A_PROCEDURE', procButtonCallback); + toolboxWorkspace.registerButtonCallback( + "MAKE_A_VARIABLE", + varListButtonCallback("") + ); + toolboxWorkspace.registerButtonCallback( + "MAKE_A_LIST", + varListButtonCallback("list") + ); + toolboxWorkspace.registerButtonCallback( + "MAKE_A_PROCEDURE", + procButtonCallback + ); // Store the xml of the toolbox that is actually rendered. // This is used in componentDidUpdate instead of prevProps, because @@ -139,8 +190,16 @@ class Blocks extends React.Component { this._renderedToolboxXML = this.props.toolboxXML; // @todo change this when blockly supports UI events - addFunctionListener(this.workspace, 'translate', this.onWorkspaceMetricsChange); - addFunctionListener(this.workspace, 'zoom', this.onWorkspaceMetricsChange); + addFunctionListener( + this.workspace, + "translate", + this.onWorkspaceMetricsChange + ); + addFunctionListener( + this.workspace, + "zoom", + this.onWorkspaceMetricsChange + ); this.workspace.getToolbox().selectItemByPosition(0); this.attachVM(); @@ -150,19 +209,21 @@ class Blocks extends React.Component { this.setLocale(); } } - shouldComponentUpdate (nextProps, nextState) { + shouldComponentUpdate(nextProps, nextState) { return ( this.state.prompt !== nextState.prompt || this.props.isVisible !== nextProps.isVisible || this._renderedToolboxXML !== nextProps.toolboxXML || - this.props.extensionLibraryVisible !== nextProps.extensionLibraryVisible || - this.props.customProceduresVisible !== nextProps.customProceduresVisible || + this.props.extensionLibraryVisible !== + nextProps.extensionLibraryVisible || + this.props.customProceduresVisible !== + nextProps.customProceduresVisible || this.props.locale !== nextProps.locale || this.props.anyModalVisible !== nextProps.anyModalVisible || this.props.stageSize !== nextProps.stageSize ); } - componentDidUpdate (prevProps) { + componentDidUpdate(prevProps) { // If any modals are open, call hideChaff to close z-indexed field editors if (this.props.anyModalVisible && !prevProps.anyModalVisible) { this.ScratchBlocks.hideChaff(); @@ -171,22 +232,29 @@ class Blocks extends React.Component { // Only rerender the toolbox when the blocks are visible and the xml is // different from the previously rendered toolbox xml. // Do not check against prevProps.toolboxXML because that may not have been rendered. - if (this.props.isVisible && this.props.toolboxXML !== this._renderedToolboxXML) { + if ( + this.props.isVisible && + this.props.toolboxXML !== this._renderedToolboxXML + ) { this.requestToolboxUpdate(); } if (this.props.isVisible === prevProps.isVisible) { if (this.props.stageSize !== prevProps.stageSize) { // force workspace to redraw for the new stage size - window.dispatchEvent(new Event('resize')); + window.dispatchEvent(new Event("resize")); } return; } // @todo hack to resize blockly manually in case resize happened while hidden // @todo hack to reload the workspace due to gui bug #413 - if (this.props.isVisible) { // Scripts tab + if (this.props.isVisible) { + // Scripts tab this.workspace.setVisible(true); - if (prevProps.locale !== this.props.locale || this.props.locale !== this.props.vm.getLocale()) { + if ( + prevProps.locale !== this.props.locale || + this.props.locale !== this.props.vm.getLocale() + ) { // call setLocale if the locale has changed, or changed while the blocks were hidden. // vm.getLocale() will be out of sync if locale was changed while not visible this.setLocale(); @@ -195,12 +263,12 @@ class Blocks extends React.Component { this.requestToolboxUpdate(); } - window.dispatchEvent(new Event('resize')); + window.dispatchEvent(new Event("resize")); } else { this.workspace.setVisible(false); } } - componentWillUnmount () { + componentWillUnmount() { this.detachVM(); this.workspace.dispose(); clearTimeout(this.toolboxUpdateTimeout); @@ -208,15 +276,16 @@ class Blocks extends React.Component { // Clear the flyout blocks so that they can be recreated on mount. this.props.vm.clearFlyoutBlocks(); } - requestToolboxUpdate () { + requestToolboxUpdate() { clearTimeout(this.toolboxUpdateTimeout); this.toolboxUpdateTimeout = setTimeout(() => { this.updateToolbox(); }, 0); } - setLocale () { + setLocale() { this.ScratchBlocks.ScratchMsgs.setLocale(this.props.locale); - this.props.vm.setLocale(this.props.locale, this.props.messages) + this.props.vm + .setLocale(this.props.locale, this.props.messages) .then(() => { this.workspace.getFlyout().setRecyclingEnabled(false); this.props.vm.refreshWorkspace(); @@ -227,31 +296,41 @@ class Blocks extends React.Component { }); } - updateToolbox () { + updateToolbox() { this.toolboxUpdateTimeout = false; const scale = this.workspace.getFlyout().getWorkspace().scale; - const selectedCategoryName = this.workspace.getToolbox().getSelectedItem().getName(); - const selectedCategoryScrollPosition = this.workspace.getFlyout().getCategoryScrollPosition( - selectedCategoryName).y * scale; - const offsetWithinCategory = (this.workspace.getFlyout().getWorkspace().getMetrics().viewTop - - selectedCategoryScrollPosition); + const selectedCategoryName = this.workspace + .getToolbox() + .getSelectedItem() + .getName(); + const selectedCategoryScrollPosition = + this.workspace + .getFlyout() + .getCategoryScrollPosition(selectedCategoryName).y * scale; + const offsetWithinCategory = + this.workspace.getFlyout().getWorkspace().getMetrics().viewTop - + selectedCategoryScrollPosition; this.workspace.updateToolbox(this.props.toolboxXML); this.workspace.getToolbox().forceRerender(); this._renderedToolboxXML = this.props.toolboxXML; - const newCategoryScrollPosition = this.workspace.getFlyout().getCategoryScrollPosition( - selectedCategoryName).y * scale; - this.workspace.getFlyout().getWorkspace().scrollbar.setY( - newCategoryScrollPosition + offsetWithinCategory); + const newCategoryScrollPosition = + this.workspace + .getFlyout() + .getCategoryScrollPosition(selectedCategoryName).y * scale; + this.workspace + .getFlyout() + .getWorkspace() + .scrollbar.setY(newCategoryScrollPosition + offsetWithinCategory); const queue = this.toolboxUpdateQueue; this.toolboxUpdateQueue = []; - queue.forEach(fn => fn()); + queue.forEach((fn) => fn()); } - withToolboxUpdates (fn) { + withToolboxUpdates(fn) { // if there is a queued toolbox update, we need to wait if (this.toolboxUpdateTimeout) { this.toolboxUpdateQueue.push(fn); @@ -260,42 +339,68 @@ class Blocks extends React.Component { } } - attachVM () { + attachVM() { this.workspace.addChangeListener(this.props.vm.blockListener); - this.flyoutWorkspace = this.workspace - .getFlyout() - .getWorkspace(); - this.flyoutWorkspace.addChangeListener(this.props.vm.flyoutBlockListener); - this.flyoutWorkspace.addChangeListener(this.props.vm.monitorBlockListener); - this.props.vm.addListener('SCRIPT_GLOW_ON', this.onScriptGlowOn); - this.props.vm.addListener('SCRIPT_GLOW_OFF', this.onScriptGlowOff); - this.props.vm.addListener('BLOCK_GLOW_ON', this.onBlockGlowOn); - this.props.vm.addListener('BLOCK_GLOW_OFF', this.onBlockGlowOff); - this.props.vm.addListener('VISUAL_REPORT', this.onVisualReport); - this.props.vm.addListener('workspaceUpdate', this.onWorkspaceUpdate); - this.props.vm.addListener('targetsUpdate', this.onTargetsUpdate); - this.props.vm.addListener('MONITORS_UPDATE', this.handleMonitorsUpdate); - this.props.vm.addListener('EXTENSION_ADDED', this.handleExtensionAdded); - this.props.vm.addListener('BLOCKSINFO_UPDATE', this.handleBlocksInfoUpdate); - this.props.vm.addListener('PERIPHERAL_CONNECTED', this.handleStatusButtonUpdate); - this.props.vm.addListener('PERIPHERAL_DISCONNECTED', this.handleStatusButtonUpdate); - } - detachVM () { - this.props.vm.removeListener('SCRIPT_GLOW_ON', this.onScriptGlowOn); - this.props.vm.removeListener('SCRIPT_GLOW_OFF', this.onScriptGlowOff); - this.props.vm.removeListener('BLOCK_GLOW_ON', this.onBlockGlowOn); - this.props.vm.removeListener('BLOCK_GLOW_OFF', this.onBlockGlowOff); - this.props.vm.removeListener('VISUAL_REPORT', this.onVisualReport); - this.props.vm.removeListener('workspaceUpdate', this.onWorkspaceUpdate); - this.props.vm.removeListener('targetsUpdate', this.onTargetsUpdate); - this.props.vm.removeListener('MONITORS_UPDATE', this.handleMonitorsUpdate); - this.props.vm.removeListener('EXTENSION_ADDED', this.handleExtensionAdded); - this.props.vm.removeListener('BLOCKSINFO_UPDATE', this.handleBlocksInfoUpdate); - this.props.vm.removeListener('PERIPHERAL_CONNECTED', this.handleStatusButtonUpdate); - this.props.vm.removeListener('PERIPHERAL_DISCONNECTED', this.handleStatusButtonUpdate); - } - - updateToolboxBlockValue (id, value) { + this.flyoutWorkspace = this.workspace.getFlyout().getWorkspace(); + this.flyoutWorkspace.addChangeListener( + this.props.vm.flyoutBlockListener + ); + this.flyoutWorkspace.addChangeListener( + this.props.vm.monitorBlockListener + ); + this.props.vm.addListener("SCRIPT_GLOW_ON", this.onScriptGlowOn); + this.props.vm.addListener("SCRIPT_GLOW_OFF", this.onScriptGlowOff); + this.props.vm.addListener("BLOCK_GLOW_ON", this.onBlockGlowOn); + this.props.vm.addListener("BLOCK_GLOW_OFF", this.onBlockGlowOff); + this.props.vm.addListener("VISUAL_REPORT", this.onVisualReport); + this.props.vm.addListener("workspaceUpdate", this.onWorkspaceUpdate); + this.props.vm.addListener("targetsUpdate", this.onTargetsUpdate); + this.props.vm.addListener("MONITORS_UPDATE", this.handleMonitorsUpdate); + this.props.vm.addListener("EXTENSION_ADDED", this.handleExtensionAdded); + this.props.vm.addListener( + "BLOCKSINFO_UPDATE", + this.handleBlocksInfoUpdate + ); + this.props.vm.addListener( + "PERIPHERAL_CONNECTED", + this.handleStatusButtonUpdate + ); + this.props.vm.addListener( + "PERIPHERAL_DISCONNECTED", + this.handleStatusButtonUpdate + ); + } + detachVM() { + this.props.vm.removeListener("SCRIPT_GLOW_ON", this.onScriptGlowOn); + this.props.vm.removeListener("SCRIPT_GLOW_OFF", this.onScriptGlowOff); + this.props.vm.removeListener("BLOCK_GLOW_ON", this.onBlockGlowOn); + this.props.vm.removeListener("BLOCK_GLOW_OFF", this.onBlockGlowOff); + this.props.vm.removeListener("VISUAL_REPORT", this.onVisualReport); + this.props.vm.removeListener("workspaceUpdate", this.onWorkspaceUpdate); + this.props.vm.removeListener("targetsUpdate", this.onTargetsUpdate); + this.props.vm.removeListener( + "MONITORS_UPDATE", + this.handleMonitorsUpdate + ); + this.props.vm.removeListener( + "EXTENSION_ADDED", + this.handleExtensionAdded + ); + this.props.vm.removeListener( + "BLOCKSINFO_UPDATE", + this.handleBlocksInfoUpdate + ); + this.props.vm.removeListener( + "PERIPHERAL_CONNECTED", + this.handleStatusButtonUpdate + ); + this.props.vm.removeListener( + "PERIPHERAL_DISCONNECTED", + this.handleStatusButtonUpdate + ); + } + + updateToolboxBlockValue(id, value) { this.withToolboxUpdates(() => { const block = this.workspace .getFlyout() @@ -307,15 +412,21 @@ class Blocks extends React.Component { }); } - onTargetsUpdate () { + onTargetsUpdate() { if (this.props.vm.editingTarget && this.workspace.getFlyout()) { - ['glide', 'move', 'set'].forEach(prefix => { - this.updateToolboxBlockValue(`${prefix}x`, Math.round(this.props.vm.editingTarget.x).toString()); - this.updateToolboxBlockValue(`${prefix}y`, Math.round(this.props.vm.editingTarget.y).toString()); + ["glide", "move", "set"].forEach((prefix) => { + this.updateToolboxBlockValue( + `${prefix}x`, + Math.round(this.props.vm.editingTarget.x).toString() + ); + this.updateToolboxBlockValue( + `${prefix}y`, + Math.round(this.props.vm.editingTarget.y).toString() + ); }); } } - onWorkspaceMetricsChange () { + onWorkspaceMetricsChange() { const target = this.props.vm.editingTarget; if (target && target.id) { // Dispatch updateMetrics later, since onWorkspaceMetricsChange may be (very indirectly) @@ -326,32 +437,32 @@ class Blocks extends React.Component { targetID: target.id, scrollX: this.workspace.scrollX, scrollY: this.workspace.scrollY, - scale: this.workspace.scale + scale: this.workspace.scale, }); }, 0); } } - onScriptGlowOn (data) { + onScriptGlowOn(data) { this.ScratchBlocks.glowStack(data.id, true); } - onScriptGlowOff (data) { + onScriptGlowOff(data) { this.ScratchBlocks.glowStack(data.id, false); } - onBlockGlowOn (data) { + onBlockGlowOn(data) { // No-op, support may be added in the future } - onBlockGlowOff (data) { + onBlockGlowOff(data) { // No-op, support may be added in the future } - onVisualReport (data) { + onVisualReport(data) { this.ScratchBlocks.reportValue(data.id, data.value); } - getToolboxXML () { + getToolboxXML() { // Use try/catch because this requires digging pretty deep into the VM // Code inside intentionally ignores several error situations (no stage, etc.) // Because they would get caught by this try/catch try { - let {editingTarget: target, runtime} = this.props.vm; + let { editingTarget: target, runtime } = this.props.vm; const stage = runtime.getTargetForStage(); if (!target) target = stage; // If no editingTarget, use the stage @@ -362,24 +473,33 @@ class Blocks extends React.Component { this.props.vm.runtime.getBlocksXML(target), this.props.theme ); - return makeToolboxXML(false, target.isStage, target.id, dynamicBlocksXML, + return makeToolboxXML( + false, + target.isStage, + target.id, + dynamicBlocksXML, targetCostumes[targetCostumes.length - 1].name, stageCostumes[stageCostumes.length - 1].name, - targetSounds.length > 0 ? targetSounds[targetSounds.length - 1].name : '', + targetSounds.length > 0 + ? targetSounds[targetSounds.length - 1].name + : "", getColorsForTheme(this.props.theme) ); } catch { return null; } } - onWorkspaceUpdate (data) { + onWorkspaceUpdate(data) { // When we change sprites, update the toolbox to have the new sprite's blocks const toolboxXML = this.getToolboxXML(); if (toolboxXML) { this.props.updateToolboxState(toolboxXML); } - if (this.props.vm.editingTarget && !this.props.workspaceMetrics.targets[this.props.vm.editingTarget.id]) { + if ( + this.props.vm.editingTarget && + !this.props.workspaceMetrics.targets[this.props.vm.editingTarget.id] + ) { this.onWorkspaceMetricsChange(); } @@ -387,7 +507,10 @@ class Blocks extends React.Component { this.workspace.removeChangeListener(this.props.vm.blockListener); const dom = this.ScratchBlocks.utils.xml.textToDom(data.xml); try { - this.ScratchBlocks.Xml.clearWorkspaceAndLoadFromXml(dom, this.workspace); + this.ScratchBlocks.Xml.clearWorkspaceAndLoadFromXml( + dom, + this.workspace + ); } catch (error) { // The workspace is likely incomplete. What did update should be // functional. @@ -405,8 +528,14 @@ class Blocks extends React.Component { } this.workspace.addChangeListener(this.props.vm.blockListener); - if (this.props.vm.editingTarget && this.props.workspaceMetrics.targets[this.props.vm.editingTarget.id]) { - const {scrollX, scrollY, scale} = this.props.workspaceMetrics.targets[this.props.vm.editingTarget.id]; + if ( + this.props.vm.editingTarget && + this.props.workspaceMetrics.targets[this.props.vm.editingTarget.id] + ) { + const { scrollX, scrollY, scale } = + this.props.workspaceMetrics.targets[ + this.props.vm.editingTarget.id + ]; this.workspace.scrollX = scrollX; this.workspace.scrollY = scrollY; this.workspace.scale = scale; @@ -418,14 +547,14 @@ class Blocks extends React.Component { // workspace to be 'undone' here. this.workspace.clearUndo(); } - handleMonitorsUpdate (monitors) { + handleMonitorsUpdate(monitors) { // Update the checkboxes of the relevant monitors. // TODO: What about monitors that have fields? See todo in scratch-vm blocks.js changeBlock: // https://github.com/LLK/scratch-vm/blob/2373f9483edaf705f11d62662f7bb2a57fbb5e28/src/engine/blocks.js#L569-L576 const flyout = this.workspace.getFlyout(); for (const monitor of monitors.values()) { - const blockId = monitor.get('id'); - const isVisible = monitor.get('visible'); + const blockId = monitor.get("id"); + const isVisible = monitor.get("visible"); flyout.setCheckboxState(blockId, isVisible); // We also need to update the isMonitored flag for this block on the VM, since it's used to determine // whether the checkbox is activated or not when the checkbox is re-displayed (e.g. local variables/blocks @@ -436,28 +565,37 @@ class Blocks extends React.Component { } } } - handleExtensionAdded (categoryInfo) { - const defineBlocks = blockInfoArray => { + handleExtensionAdded(categoryInfo) { + const defineBlocks = (blockInfoArray) => { if (blockInfoArray && blockInfoArray.length > 0) { const staticBlocksJson = []; const dynamicBlocksInfo = []; - blockInfoArray.forEach(blockInfo => { + blockInfoArray.forEach((blockInfo) => { if (blockInfo.info && blockInfo.info.isDynamic) { dynamicBlocksInfo.push(blockInfo); } else if (blockInfo.json) { - staticBlocksJson.push(injectExtensionBlockTheme(blockInfo.json, this.props.theme)); + staticBlocksJson.push( + injectExtensionBlockTheme( + blockInfo.json, + this.props.theme + ) + ); } // otherwise it's a non-block entry such as '---' }); this.ScratchBlocks.defineBlocksWithJsonArray(staticBlocksJson); - dynamicBlocksInfo.forEach(blockInfo => { + dynamicBlocksInfo.forEach((blockInfo) => { // This is creating the block factory / constructor -- NOT a specific instance of the block. // The factory should only know static info about the block: the category info and the opcode. // Anything else will be picked up from the XML attached to the block instance. const extendedOpcode = `${categoryInfo.id}_${blockInfo.info.opcode}`; - const blockDefinition = - defineDynamicBlock(this.ScratchBlocks, categoryInfo, blockInfo, extendedOpcode); + const blockDefinition = defineDynamicBlock( + this.ScratchBlocks, + categoryInfo, + blockInfo, + extendedOpcode + ); this.ScratchBlocks.Blocks[extendedOpcode] = blockDefinition; }); } @@ -466,8 +604,12 @@ class Blocks extends React.Component { // scratch-blocks implements a menu or custom field as a special kind of block ("shadow" block) // these actually define blocks and MUST run regardless of the UI state defineBlocks( - Object.getOwnPropertyNames(categoryInfo.customFieldTypes) - .map(fieldTypeName => categoryInfo.customFieldTypes[fieldTypeName].scratchBlocksDefinition)); + Object.getOwnPropertyNames(categoryInfo.customFieldTypes).map( + (fieldTypeName) => + categoryInfo.customFieldTypes[fieldTypeName] + .scratchBlocksDefinition + ) + ); defineBlocks(categoryInfo.menus); defineBlocks(categoryInfo.blocks); @@ -477,12 +619,14 @@ class Blocks extends React.Component { this.props.updateToolboxState(toolboxXML); } } - handleBlocksInfoUpdate (categoryInfo) { + handleBlocksInfoUpdate(categoryInfo) { // @todo Later we should replace this to avoid all the warnings from redefining blocks. this.handleExtensionAdded(categoryInfo); } - handleCategorySelected (categoryId) { - const extension = extensionData.find(ext => ext.extensionId === categoryId); + handleCategorySelected(categoryId) { + const extension = extensionData.find( + (ext) => ext.extensionId === categoryId + ); if (extension && extension.launchPeripheralConnectionFlow) { this.handleConnectionModalStart(categoryId); } @@ -492,29 +636,35 @@ class Blocks extends React.Component { toolbox.setSelectedItem(toolbox.getToolboxItemById(categoryId)); }); } - setBlocks (blocks) { + setBlocks(blocks) { this.blocks = blocks; } - handlePromptStart (message, defaultValue, callback, optTitle, optVarType) { - const p = {prompt: {callback, message, defaultValue}}; - p.prompt.title = optTitle ? optTitle : - this.ScratchBlocks.Msg.VARIABLE_MODAL_TITLE; - p.prompt.varType = typeof optVarType === 'string' ? - optVarType : this.ScratchBlocks.SCALAR_VARIABLE_TYPE; + handlePromptStart(message, defaultValue, callback, optTitle, optVarType) { + const p = { prompt: { callback, message, defaultValue } }; + p.prompt.title = optTitle + ? optTitle + : this.ScratchBlocks.Msg.VARIABLE_MODAL_TITLE; + p.prompt.varType = + typeof optVarType === "string" + ? optVarType + : this.ScratchBlocks.SCALAR_VARIABLE_TYPE; p.prompt.showVariableOptions = // This flag means that we should show variable/list options about scope optVarType !== this.ScratchBlocks.BROADCAST_MESSAGE_VARIABLE_TYPE && - p.prompt.title !== this.ScratchBlocks.Msg.RENAME_VARIABLE_MODAL_TITLE && + p.prompt.title !== + this.ScratchBlocks.Msg.RENAME_VARIABLE_MODAL_TITLE && p.prompt.title !== this.ScratchBlocks.Msg.RENAME_LIST_MODAL_TITLE; - p.prompt.showCloudOption = (optVarType === this.ScratchBlocks.SCALAR_VARIABLE_TYPE) && this.props.canUseCloud; + p.prompt.showCloudOption = + optVarType === this.ScratchBlocks.SCALAR_VARIABLE_TYPE && + this.props.canUseCloud; this.setState(p); } - handleConnectionModalStart (extensionId) { + handleConnectionModalStart(extensionId) { this.props.onOpenConnectionModal(extensionId); } - handleStatusButtonUpdate () { + handleStatusButtonUpdate() { this.ScratchBlocks.refreshStatusButtons(this.workspace); } - handleOpenSoundRecorder () { + handleOpenSoundRecorder() { this.props.onOpenSoundRecorder(); } @@ -523,32 +673,40 @@ class Blocks extends React.Component { * and additional potentially conflicting variable names from the VM * to the variable validation prompt callback used in scratch-blocks. */ - handlePromptCallback (input, variableOptions) { + handlePromptCallback(input, variableOptions) { this.state.prompt.callback( input, - this.props.vm.runtime.getAllVarNamesOfType(this.state.prompt.varType), - variableOptions); + this.props.vm.runtime.getAllVarNamesOfType( + this.state.prompt.varType + ), + variableOptions + ); this.handlePromptClose(); } - handlePromptClose () { - this.setState({prompt: null}); + handlePromptClose() { + this.setState({ prompt: null }); } - handleCustomProceduresClose (data) { + handleCustomProceduresClose(data) { this.props.onRequestCloseCustomProcedures(data); const ws = this.workspace; this.updateToolbox(); - ws.getToolbox().selectCategoryByName('myBlocks'); + ws.getToolbox().selectCategoryByName("myBlocks"); } - handleDrop (dragInfo) { + handleDrop(dragInfo) { fetch(dragInfo.payload.bodyUrl) - .then(response => response.json()) - .then(blocks => this.props.vm.shareBlocksToTarget(blocks, this.props.vm.editingTarget.id)) + .then((response) => response.json()) + .then((blocks) => + this.props.vm.shareBlocksToTarget( + blocks, + this.props.vm.editingTarget.id + ) + ) .then(() => { this.props.vm.refreshWorkspace(); this.updateToolbox(); // To show new variables/custom blocks }); } - render () { + render() { /* eslint-disable no-unused-vars */ const { anyModalVisible, @@ -585,10 +743,15 @@ class Blocks extends React.Component { @@ -635,10 +798,10 @@ Blocks.propTypes = { zoom: PropTypes.shape({ controls: PropTypes.bool, wheel: PropTypes.bool, - startScale: PropTypes.number + startScale: PropTypes.number, }), comments: PropTypes.bool, - collapse: PropTypes.bool + collapse: PropTypes.bool, }), stageSize: PropTypes.oneOf(Object.keys(STAGE_DISPLAY_SIZES)).isRequired, theme: PropTypes.oneOf(Object.keys(themeMap)), @@ -648,23 +811,23 @@ Blocks.propTypes = { useCatBlocks: PropTypes.bool, vm: PropTypes.instanceOf(VM).isRequired, workspaceMetrics: PropTypes.shape({ - targets: PropTypes.objectOf(PropTypes.object) - }) + targets: PropTypes.objectOf(PropTypes.object), + }), }; Blocks.defaultOptions = { zoom: { controls: true, wheel: false, - startScale: BLOCKS_DEFAULT_SCALE + startScale: BLOCKS_DEFAULT_SCALE, }, move: { - wheel: true, + wheel: true, }, grid: { spacing: 40, length: 2, - colour: '#ddd' + colour: "#ddd", }, comments: true, collapse: false, @@ -675,14 +838,14 @@ Blocks.defaultOptions = { Blocks.defaultProps = { isVisible: true, options: Blocks.defaultOptions, - theme: DEFAULT_THEME + theme: DEFAULT_THEME, }; -const mapStateToProps = state => ({ - anyModalVisible: ( - Object.keys(state.scratchGui.modals).some(key => state.scratchGui.modals[key]) || - state.scratchGui.mode.isFullScreen - ), +const mapStateToProps = (state) => ({ + anyModalVisible: + Object.keys(state.scratchGui.modals).some( + (key) => state.scratchGui.modals[key] + ) || state.scratchGui.mode.isFullScreen, extensionLibraryVisible: state.scratchGui.modals.extensionLibrary, isRtl: state.locales.isRtl, locale: state.locales.locale, @@ -690,13 +853,15 @@ const mapStateToProps = state => ({ toolboxXML: state.scratchGui.toolbox.toolboxXML, customProceduresVisible: state.scratchGui.customProcedures.active, workspaceMetrics: state.scratchGui.workspaceMetrics, - useCatBlocks: isTimeTravel2020(state) + useCatBlocks: isTimeTravel2020(state), }); -const mapDispatchToProps = dispatch => ({ - onActivateColorPicker: callback => dispatch(activateColorPicker(callback)), - onActivateCustomProcedures: (data, callback) => dispatch(activateCustomProcedures(data, callback)), - onOpenConnectionModal: id => { +const mapDispatchToProps = (dispatch) => ({ + onActivateColorPicker: (callback) => + dispatch(activateColorPicker(callback)), + onActivateCustomProcedures: (data, callback) => + dispatch(activateCustomProcedures(data, callback)), + onOpenConnectionModal: (id) => { dispatch(setConnectionModalExtensionId(id)); dispatch(openConnectionModal()); }, @@ -707,20 +872,17 @@ const mapDispatchToProps = dispatch => ({ onRequestCloseExtensionLibrary: () => { dispatch(closeExtensionLibrary()); }, - onRequestCloseCustomProcedures: data => { + onRequestCloseCustomProcedures: (data) => { dispatch(deactivateCustomProcedures(data)); }, - updateToolboxState: toolboxXML => { + updateToolboxState: (toolboxXML) => { dispatch(updateToolbox(toolboxXML)); }, - updateMetrics: metrics => { + updateMetrics: (metrics) => { dispatch(updateMetrics(metrics)); - } + }, }); -export default errorBoundaryHOC('Blocks')( - connect( - mapStateToProps, - mapDispatchToProps - )(Blocks) +export default errorBoundaryHOC("Blocks")( + connect(mapStateToProps, mapDispatchToProps)(Blocks) ); From b30a1c3464cff8d5fd6e0e5bde6a1757ed2d60b3 Mon Sep 17 00:00:00 2001 From: Aaron Dodson Date: Mon, 5 Aug 2024 13:32:41 -0700 Subject: [PATCH 036/521] fix: specify the function to be used for prompting about variables (#17) --- packages/scratch-gui/src/containers/blocks.jsx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/scratch-gui/src/containers/blocks.jsx b/packages/scratch-gui/src/containers/blocks.jsx index 96dcba775cb..7e39c149929 100644 --- a/packages/scratch-gui/src/containers/blocks.jsx +++ b/packages/scratch-gui/src/containers/blocks.jsx @@ -90,6 +90,9 @@ class Blocks extends React.Component { "setLocale", ]); this.ScratchBlocks.dialog.setPrompt(this.handlePromptStart); + this.ScratchBlocks.ScratchVariables.setPromptHandler( + this.handlePromptStart + ); this.ScratchBlocks.statusButtonCallback = this.handleConnectionModalStart; this.ScratchBlocks.recordSoundCallback = this.handleOpenSoundRecorder; From f7fc9dc09d8db8fcb8ce9e58b24c16fad4de58aa Mon Sep 17 00:00:00 2001 From: Aaron Dodson Date: Tue, 6 Aug 2024 09:40:36 -0700 Subject: [PATCH 037/521] fix: update the toolbox in response to procedure deletion/creation (#18) --- packages/scratch-gui/src/containers/blocks.jsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/scratch-gui/src/containers/blocks.jsx b/packages/scratch-gui/src/containers/blocks.jsx index 7e39c149929..c6e7f8977eb 100644 --- a/packages/scratch-gui/src/containers/blocks.jsx +++ b/packages/scratch-gui/src/containers/blocks.jsx @@ -151,7 +151,11 @@ class Blocks extends React.Component { if ( event.type === this.ScratchBlocks.Events.VAR_CREATE || event.type === this.ScratchBlocks.Events.VAR_RENAME || - event.type === this.ScratchBlocks.Events.VAR_DELETE + event.type === this.ScratchBlocks.Events.VAR_DELETE || + (event.type === this.ScratchBlocks.Events.BLOCK_DELETE && + event.oldJson.type === "procedures_definition") || + (event.type === this.ScratchBlocks.Events.BLOCK_CREATE && + event.json.type === "procedures_definition") ) { this.requestToolboxUpdate(); } From 8bcd420c7b81c995ccc2fffbafc2f575643762d1 Mon Sep 17 00:00:00 2001 From: Aaron Dodson Date: Mon, 12 Aug 2024 15:51:00 -0700 Subject: [PATCH 038/521] chore: don't specify the renderer/theme (#20) --- packages/scratch-gui/src/containers/blocks.jsx | 6 ------ 1 file changed, 6 deletions(-) diff --git a/packages/scratch-gui/src/containers/blocks.jsx b/packages/scratch-gui/src/containers/blocks.jsx index c6e7f8977eb..87fa082ed25 100644 --- a/packages/scratch-gui/src/containers/blocks.jsx +++ b/packages/scratch-gui/src/containers/blocks.jsx @@ -119,10 +119,6 @@ class Blocks extends React.Component { this.props.onActivateCustomProcedures; this.ScratchBlocks.ScratchMsgs.setLocale(this.props.locale); - const theme = this.ScratchBlocks.Theme.defineTheme("Scratch", { - base: this.ScratchBlocks.Themes.Zelos, - startHats: true, - }); const workspaceConfig = defaultsDeep( {}, Blocks.defaultOptions, @@ -131,8 +127,6 @@ class Blocks extends React.Component { rtl: this.props.isRtl, toolbox: this.props.toolboxXML, colours: getColorsForTheme(this.props.theme), - renderer: "zelos", - theme: theme, } ); this.workspace = this.ScratchBlocks.inject( From 4638b40a6c483634b07aed9b74859c1d5b5320ef Mon Sep 17 00:00:00 2001 From: Aaron Dodson Date: Mon, 12 Aug 2024 15:53:44 -0700 Subject: [PATCH 039/521] fix: only refresh the toolbox when procedures are created via undo (#19) * fix: only refresh the toolbox when procedures are created via undo * chore: add comment clarifying procedure block creation handling --- packages/scratch-gui/src/containers/blocks.jsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/scratch-gui/src/containers/blocks.jsx b/packages/scratch-gui/src/containers/blocks.jsx index 87fa082ed25..b20a48a1ad7 100644 --- a/packages/scratch-gui/src/containers/blocks.jsx +++ b/packages/scratch-gui/src/containers/blocks.jsx @@ -148,8 +148,12 @@ class Blocks extends React.Component { event.type === this.ScratchBlocks.Events.VAR_DELETE || (event.type === this.ScratchBlocks.Events.BLOCK_DELETE && event.oldJson.type === "procedures_definition") || + // Only refresh the toolbox when procedure block creations are + // triggered by undoing a deletion (implied by recordUndo being + // false on the event). (event.type === this.ScratchBlocks.Events.BLOCK_CREATE && - event.json.type === "procedures_definition") + event.json.type === "procedures_definition" && + !event.recordUndo) ) { this.requestToolboxUpdate(); } From 64b7d3d4e127aa1dac01db02fd3e605dfe99fcd4 Mon Sep 17 00:00:00 2001 From: Beka Westberg Date: Wed, 21 Aug 2024 16:02:42 +0000 Subject: [PATCH 040/521] fix: add pinch to zoom support (#21) --- packages/scratch-gui/src/containers/blocks.jsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/scratch-gui/src/containers/blocks.jsx b/packages/scratch-gui/src/containers/blocks.jsx index b20a48a1ad7..c2550e90dde 100644 --- a/packages/scratch-gui/src/containers/blocks.jsx +++ b/packages/scratch-gui/src/containers/blocks.jsx @@ -823,7 +823,8 @@ Blocks.propTypes = { Blocks.defaultOptions = { zoom: { controls: true, - wheel: false, + wheel: true, + pinch: true, startScale: BLOCKS_DEFAULT_SCALE, }, move: { From 217a3c01b0a1f05d67c86e2fbeeae6e2d6355e68 Mon Sep 17 00:00:00 2001 From: Aaron Dodson Date: Tue, 3 Sep 2024 11:42:47 -0700 Subject: [PATCH 041/521] fix: make dropdown menu shadow block colors consistent (#22) * chore: format blocks.js * fix: define shadow block colors consistently with scratch-blocks * refactor: clean up sound menu recording handler --- packages/scratch-gui/src/lib/blocks.js | 337 +++++++++++++++---------- 1 file changed, 203 insertions(+), 134 deletions(-) diff --git a/packages/scratch-gui/src/lib/blocks.js b/packages/scratch-gui/src/lib/blocks.js index 3230729c8ad..149d67897f9 100644 --- a/packages/scratch-gui/src/lib/blocks.js +++ b/packages/scratch-gui/src/lib/blocks.js @@ -5,126 +5,154 @@ * @return {ScratchBlocks} ScratchBlocks connected with the vm */ export default function (vm, useCatBlocks) { - const {ScratchBlocks} = useCatBlocks ? require('cat-blocks') : require('scratch-blocks'); - const jsonForMenuBlock = function (name, menuOptionsFn, colors, start) { + const { ScratchBlocks } = useCatBlocks + ? require("cat-blocks") + : require("scratch-blocks"); + const jsonForMenuBlock = function (name, menuOptionsFn, category, start) { return { - message0: '%1', + message0: "%1", args0: [ { - type: 'field_dropdown', + type: "field_dropdown", name: name, options: function () { return start.concat(menuOptionsFn()); - } - } + }, + }, ], inputsInline: true, - output: 'String', - colour: colors.secondary, - colourSecondary: colors.secondary, - colourTertiary: colors.tertiary, - colourQuaternary: colors.quaternary, - outputShape: ScratchBlocks.OUTPUT_SHAPE_ROUND + output: "String", + outputShape: ScratchBlocks.OUTPUT_SHAPE_ROUND, + extensions: [`colours_${category}`], }; }; - const jsonForHatBlockMenu = function (hatName, name, menuOptionsFn, colors, start) { + const jsonForHatBlockMenu = function ( + hatName, + name, + menuOptionsFn, + category, + start + ) { return { message0: hatName, args0: [ { - type: 'field_dropdown', + type: "field_dropdown", name: name, options: function () { return start.concat(menuOptionsFn()); - } - } + }, + }, ], - colour: colors.primary, - colourSecondary: colors.secondary, - colourTertiary: colors.tertiary, - colourQuaternary: colors.quaternary, - extensions: ['shape_hat'] + extensions: [`colours_${category}`, "shape_hat"], }; }; - const jsonForSensingMenus = function (menuOptionsFn) { return { message0: ScratchBlocks.Msg.SENSING_OF, args0: [ { - type: 'field_dropdown', - name: 'PROPERTY', + type: "field_dropdown", + name: "PROPERTY", options: function () { return menuOptionsFn(); - } - + }, }, { - type: 'input_value', - name: 'OBJECT' - } + type: "input_value", + name: "OBJECT", + }, ], output: true, - colour: ScratchBlocks.Colours.sensing.primary, - colourSecondary: ScratchBlocks.Colours.sensing.secondary, - colourTertiary: ScratchBlocks.Colours.sensing.tertiary, - colourQuaternary: ScratchBlocks.Colours.sensing.quaternary, - outputShape: ScratchBlocks.OUTPUT_SHAPE_ROUND + outputShape: ScratchBlocks.OUTPUT_SHAPE_ROUND, + extensions: ["colours_sensing"], }; }; const soundsMenu = function () { - let menu = [['', '']]; + let menu = [["", ""]]; if (vm.editingTarget && vm.editingTarget.sprite.sounds.length > 0) { - menu = vm.editingTarget.sprite.sounds.map(sound => [sound.name, sound.name]); + menu = vm.editingTarget.sprite.sounds.map((sound) => [ + sound.name, + sound.name, + ]); } menu.push([ - ScratchBlocks.ScratchMsgs.translate('SOUND_RECORD', 'record...'), - 'SOUND_RECORD' + ScratchBlocks.ScratchMsgs.translate("SOUND_RECORD", "record..."), + "SOUND_RECORD", ]); return menu; }; const costumesMenu = function () { if (vm.editingTarget && vm.editingTarget.getCostumes().length > 0) { - return vm.editingTarget.getCostumes().map(costume => [costume.name, costume.name]); + return vm.editingTarget + .getCostumes() + .map((costume) => [costume.name, costume.name]); } - return [['', '']]; + return [["", ""]]; }; const backdropsMenu = function () { - const next = ScratchBlocks.ScratchMsgs.translate('LOOKS_NEXTBACKDROP', 'next backdrop'); - const previous = ScratchBlocks.ScratchMsgs.translate('LOOKS_PREVIOUSBACKDROP', 'previous backdrop'); - const random = ScratchBlocks.ScratchMsgs.translate('LOOKS_RANDOMBACKDROP', 'random backdrop'); - if (vm.runtime.targets[0] && vm.runtime.targets[0].getCostumes().length > 0) { - return vm.runtime.targets[0].getCostumes().map(costume => [costume.name, costume.name]) - .concat([[next, 'next backdrop'], - [previous, 'previous backdrop'], - [random, 'random backdrop']]); + const next = ScratchBlocks.ScratchMsgs.translate( + "LOOKS_NEXTBACKDROP", + "next backdrop" + ); + const previous = ScratchBlocks.ScratchMsgs.translate( + "LOOKS_PREVIOUSBACKDROP", + "previous backdrop" + ); + const random = ScratchBlocks.ScratchMsgs.translate( + "LOOKS_RANDOMBACKDROP", + "random backdrop" + ); + if ( + vm.runtime.targets[0] && + vm.runtime.targets[0].getCostumes().length > 0 + ) { + return vm.runtime.targets[0] + .getCostumes() + .map((costume) => [costume.name, costume.name]) + .concat([ + [next, "next backdrop"], + [previous, "previous backdrop"], + [random, "random backdrop"], + ]); } - return [['', '']]; + return [["", ""]]; }; const backdropNamesMenu = function () { const stage = vm.runtime.getTargetForStage(); if (stage && stage.getCostumes().length > 0) { - return stage.getCostumes().map(costume => [costume.name, costume.name]); + return stage + .getCostumes() + .map((costume) => [costume.name, costume.name]); } - return [['', '']]; + return [["", ""]]; }; const spriteMenu = function () { const sprites = []; for (const targetId in vm.runtime.targets) { - if (!Object.prototype.hasOwnProperty.call(vm.runtime.targets, targetId)) continue; + if ( + !Object.prototype.hasOwnProperty.call( + vm.runtime.targets, + targetId + ) + ) + continue; if (vm.runtime.targets[targetId].isOriginal) { if (!vm.runtime.targets[targetId].isStage) { if (vm.runtime.targets[targetId] === vm.editingTarget) { continue; } - sprites.push([vm.runtime.targets[targetId].sprite.name, vm.runtime.targets[targetId].sprite.name]); + sprites.push([ + vm.runtime.targets[targetId].sprite.name, + vm.runtime.targets[targetId].sprite.name, + ]); } } } @@ -135,90 +163,100 @@ export default function (vm, useCatBlocks) { if (vm.editingTarget && vm.editingTarget.isStage) { const menu = spriteMenu(); if (menu.length === 0) { - return [['', '']]; // Empty menu matches Scratch 2 behavior + return [["", ""]]; // Empty menu matches Scratch 2 behavior } return menu; } - const myself = ScratchBlocks.ScratchMsgs.translate('CONTROL_CREATECLONEOF_MYSELF', 'myself'); - return [[myself, '_myself_']].concat(spriteMenu()); + const myself = ScratchBlocks.ScratchMsgs.translate( + "CONTROL_CREATECLONEOF_MYSELF", + "myself" + ); + return [[myself, "_myself_"]].concat(spriteMenu()); }; - const soundColors = ScratchBlocks.Colours.sounds; - - const looksColors = ScratchBlocks.Colours.looks; - - const motionColors = ScratchBlocks.Colours.motion; - - const sensingColors = ScratchBlocks.Colours.sensing; - - const controlColors = ScratchBlocks.Colours.control; - - const eventColors = ScratchBlocks.Colours.event; - ScratchBlocks.Blocks.sound_sounds_menu.init = function () { - const json = jsonForMenuBlock('SOUND_MENU', soundsMenu, soundColors, []); + const json = jsonForMenuBlock("SOUND_MENU", soundsMenu, "sounds", []); this.jsonInit(json); - this.inputList[0].removeField('SOUND_MENU'); - this.inputList[0].appendField(new ScratchBlocks.FieldDropdown(() => { - return soundsMenu(); - }, (newValue) => { - if (newValue === 'SOUND_RECORD') { - ScratchBlocks.recordSoundCallback(); - return null; + this.getField("SOUND_MENU").setValidator((newValue) => { + if (newValue === "SOUND_RECORD") { + ScratchBlocks.recordSoundCallback(); + return null; } return newValue; - }), 'SOUND_MENU'); + }); }; ScratchBlocks.Blocks.looks_costume.init = function () { - const json = jsonForMenuBlock('COSTUME', costumesMenu, looksColors, []); + const json = jsonForMenuBlock("COSTUME", costumesMenu, "looks", []); this.jsonInit(json); }; ScratchBlocks.Blocks.looks_backdrops.init = function () { - const json = jsonForMenuBlock('BACKDROP', backdropsMenu, looksColors, []); + const json = jsonForMenuBlock("BACKDROP", backdropsMenu, "looks", []); this.jsonInit(json); }; ScratchBlocks.Blocks.event_whenbackdropswitchesto.init = function () { const json = jsonForHatBlockMenu( ScratchBlocks.Msg.EVENT_WHENBACKDROPSWITCHESTO, - 'BACKDROP', backdropNamesMenu, eventColors, []); + "BACKDROP", + backdropNamesMenu, + "event", + [] + ); this.jsonInit(json); }; ScratchBlocks.Blocks.motion_pointtowards_menu.init = function () { - const mouse = ScratchBlocks.ScratchMsgs.translate('MOTION_POINTTOWARDS_POINTER', 'mouse-pointer'); - const json = jsonForMenuBlock('TOWARDS', spriteMenu, motionColors, [ - [mouse, '_mouse_'] + const mouse = ScratchBlocks.ScratchMsgs.translate( + "MOTION_POINTTOWARDS_POINTER", + "mouse-pointer" + ); + const json = jsonForMenuBlock("TOWARDS", spriteMenu, "motion", [ + [mouse, "_mouse_"], ]); this.jsonInit(json); }; ScratchBlocks.Blocks.motion_goto_menu.init = function () { - const random = ScratchBlocks.ScratchMsgs.translate('MOTION_GOTO_RANDOM', 'random position'); - const mouse = ScratchBlocks.ScratchMsgs.translate('MOTION_GOTO_POINTER', 'mouse-pointer'); - const json = jsonForMenuBlock('TO', spriteMenu, motionColors, [ - [random, '_random_'], - [mouse, '_mouse_'] + const random = ScratchBlocks.ScratchMsgs.translate( + "MOTION_GOTO_RANDOM", + "random position" + ); + const mouse = ScratchBlocks.ScratchMsgs.translate( + "MOTION_GOTO_POINTER", + "mouse-pointer" + ); + const json = jsonForMenuBlock("TO", spriteMenu, "motion", [ + [random, "_random_"], + [mouse, "_mouse_"], ]); this.jsonInit(json); }; ScratchBlocks.Blocks.motion_glideto_menu.init = function () { - const random = ScratchBlocks.ScratchMsgs.translate('MOTION_GLIDETO_RANDOM', 'random position'); - const mouse = ScratchBlocks.ScratchMsgs.translate('MOTION_GLIDETO_POINTER', 'mouse-pointer'); - const json = jsonForMenuBlock('TO', spriteMenu, motionColors, [ - [random, '_random_'], - [mouse, '_mouse_'] + const random = ScratchBlocks.ScratchMsgs.translate( + "MOTION_GLIDETO_RANDOM", + "random position" + ); + const mouse = ScratchBlocks.ScratchMsgs.translate( + "MOTION_GLIDETO_POINTER", + "mouse-pointer" + ); + const json = jsonForMenuBlock("TO", spriteMenu, "motion", [ + [random, "_random_"], + [mouse, "_mouse_"], ]); this.jsonInit(json); }; ScratchBlocks.Blocks.sensing_of_object_menu.init = function () { - const stage = ScratchBlocks.ScratchMsgs.translate('SENSING_OF_STAGE', 'Stage'); - const json = jsonForMenuBlock('OBJECT', spriteMenu, sensingColors, [ - [stage, '_stage_'] + const stage = ScratchBlocks.ScratchMsgs.translate( + "SENSING_OF_STAGE", + "Stage" + ); + const json = jsonForMenuBlock("OBJECT", spriteMenu, "sensing", [ + [stage, "_stage_"], ]); this.jsonInit(json); }; @@ -230,7 +268,7 @@ export default function (vm, useCatBlocks) { // Get the sensing_of block from vm. let defaultSensingOfBlock; const blocks = vm.runtime.flyoutBlocks._blocks; - Object.keys(blocks).forEach(id => { + Object.keys(blocks).forEach((id) => { const block = blocks[id]; if (id === blockType || (block && block.opcode === blockType)) { defaultSensingOfBlock = block; @@ -241,18 +279,18 @@ export default function (vm, useCatBlocks) { // Called every time it opens since it depends on the values in the other block input. const menuFn = function () { const stageOptions = [ - [ScratchBlocks.Msg.SENSING_OF_BACKDROPNUMBER, 'backdrop #'], - [ScratchBlocks.Msg.SENSING_OF_BACKDROPNAME, 'backdrop name'], - [ScratchBlocks.Msg.SENSING_OF_VOLUME, 'volume'] + [ScratchBlocks.Msg.SENSING_OF_BACKDROPNUMBER, "backdrop #"], + [ScratchBlocks.Msg.SENSING_OF_BACKDROPNAME, "backdrop name"], + [ScratchBlocks.Msg.SENSING_OF_VOLUME, "volume"], ]; const spriteOptions = [ - [ScratchBlocks.Msg.SENSING_OF_XPOSITION, 'x position'], - [ScratchBlocks.Msg.SENSING_OF_YPOSITION, 'y position'], - [ScratchBlocks.Msg.SENSING_OF_DIRECTION, 'direction'], - [ScratchBlocks.Msg.SENSING_OF_COSTUMENUMBER, 'costume #'], - [ScratchBlocks.Msg.SENSING_OF_COSTUMENAME, 'costume name'], - [ScratchBlocks.Msg.SENSING_OF_SIZE, 'size'], - [ScratchBlocks.Msg.SENSING_OF_VOLUME, 'volume'] + [ScratchBlocks.Msg.SENSING_OF_XPOSITION, "x position"], + [ScratchBlocks.Msg.SENSING_OF_YPOSITION, "y position"], + [ScratchBlocks.Msg.SENSING_OF_DIRECTION, "direction"], + [ScratchBlocks.Msg.SENSING_OF_COSTUMENUMBER, "costume #"], + [ScratchBlocks.Msg.SENSING_OF_COSTUMENAME, "costume name"], + [ScratchBlocks.Msg.SENSING_OF_SIZE, "size"], + [ScratchBlocks.Msg.SENSING_OF_VOLUME, "volume"], ]; if (vm.editingTarget) { let lookupBlocks = vm.editingTarget.blocks; @@ -260,31 +298,44 @@ export default function (vm, useCatBlocks) { // The block doesn't exist, but should be in the flyout. Look there. if (!sensingOfBlock) { - sensingOfBlock = vm.runtime.flyoutBlocks.getBlock(blockId) || defaultSensingOfBlock; + sensingOfBlock = + vm.runtime.flyoutBlocks.getBlock(blockId) || + defaultSensingOfBlock; // If we still don't have a block, just return an empty list . This happens during // scratch blocks construction. if (!sensingOfBlock) { - return [['', '']]; + return [["", ""]]; } // The block was in the flyout so look up future block info there. lookupBlocks = vm.runtime.flyoutBlocks; } const sort = function (options) { - options.sort(ScratchBlocks.scratchBlocksUtils.compareStrings); + options.sort( + ScratchBlocks.scratchBlocksUtils.compareStrings + ); }; // Get all the stage variables (no lists) so we can add them to menu when the stage is selected. - const stageVariableOptions = vm.runtime.getTargetForStage().getAllVariableNamesInScopeByType(''); + const stageVariableOptions = vm.runtime + .getTargetForStage() + .getAllVariableNamesInScopeByType(""); sort(stageVariableOptions); - const stageVariableMenuItems = stageVariableOptions.map(variable => [variable, variable]); - if (sensingOfBlock.inputs.OBJECT.shadow !== sensingOfBlock.inputs.OBJECT.block) { + const stageVariableMenuItems = stageVariableOptions.map( + (variable) => [variable, variable] + ); + if ( + sensingOfBlock.inputs.OBJECT.shadow !== + sensingOfBlock.inputs.OBJECT.block + ) { // There's a block dropped on top of the menu. It'd be nice to evaluate it and // return the correct list, but that is tricky. Scratch2 just returns stage options // so just do that here too. return stageOptions.concat(stageVariableMenuItems); } - const menuBlock = lookupBlocks.getBlock(sensingOfBlock.inputs.OBJECT.shadow); + const menuBlock = lookupBlocks.getBlock( + sensingOfBlock.inputs.OBJECT.shadow + ); const selectedItem = menuBlock.fields.OBJECT.value; - if (selectedItem === '_stage_') { + if (selectedItem === "_stage_") { return stageOptions.concat(stageVariableMenuItems); } // Get all the local variables (no lists) and add them to the menu. @@ -292,13 +343,16 @@ export default function (vm, useCatBlocks) { let spriteVariableOptions = []; // The target should exist, but there are ways for it not to (e.g. #4203). if (target) { - spriteVariableOptions = target.getAllVariableNamesInScopeByType('', true); + spriteVariableOptions = + target.getAllVariableNamesInScopeByType("", true); sort(spriteVariableOptions); } - const spriteVariableMenuItems = spriteVariableOptions.map(variable => [variable, variable]); + const spriteVariableMenuItems = spriteVariableOptions.map( + (variable) => [variable, variable] + ); return spriteOptions.concat(spriteVariableMenuItems); } - return [['', '']]; + return [["", ""]]; }; const json = jsonForSensingMenus(menuFn); @@ -306,32 +360,47 @@ export default function (vm, useCatBlocks) { }; ScratchBlocks.Blocks.sensing_distancetomenu.init = function () { - const mouse = ScratchBlocks.ScratchMsgs.translate('SENSING_DISTANCETO_POINTER', 'mouse-pointer'); - const json = jsonForMenuBlock('DISTANCETOMENU', spriteMenu, sensingColors, [ - [mouse, '_mouse_'] + const mouse = ScratchBlocks.ScratchMsgs.translate( + "SENSING_DISTANCETO_POINTER", + "mouse-pointer" + ); + const json = jsonForMenuBlock("DISTANCETOMENU", spriteMenu, "sensing", [ + [mouse, "_mouse_"], ]); this.jsonInit(json); }; ScratchBlocks.Blocks.sensing_touchingobjectmenu.init = function () { - const mouse = ScratchBlocks.ScratchMsgs.translate('SENSING_TOUCHINGOBJECT_POINTER', 'mouse-pointer'); - const edge = ScratchBlocks.ScratchMsgs.translate('SENSING_TOUCHINGOBJECT_EDGE', 'edge'); - const json = jsonForMenuBlock('TOUCHINGOBJECTMENU', spriteMenu, sensingColors, [ - [mouse, '_mouse_'], - [edge, '_edge_'] - ]); + const mouse = ScratchBlocks.ScratchMsgs.translate( + "SENSING_TOUCHINGOBJECT_POINTER", + "mouse-pointer" + ); + const edge = ScratchBlocks.ScratchMsgs.translate( + "SENSING_TOUCHINGOBJECT_EDGE", + "edge" + ); + const json = jsonForMenuBlock( + "TOUCHINGOBJECTMENU", + spriteMenu, + "sensing", + [ + [mouse, "_mouse_"], + [edge, "_edge_"], + ] + ); this.jsonInit(json); }; ScratchBlocks.Blocks.control_create_clone_of_menu.init = function () { - const json = jsonForMenuBlock('CLONE_OPTION', cloneMenu, controlColors, []); + const json = jsonForMenuBlock("CLONE_OPTION", cloneMenu, "control", []); this.jsonInit(json); }; - ScratchBlocks.CheckableContinuousFlyout.prototype.getCheckboxState = function (blockId) { - const monitoredBlock = vm.runtime.monitorBlocks._blocks[blockId]; - return monitoredBlock ? monitoredBlock.isMonitored : false; - }; + ScratchBlocks.CheckableContinuousFlyout.prototype.getCheckboxState = + function (blockId) { + const monitoredBlock = vm.runtime.monitorBlocks._blocks[blockId]; + return monitoredBlock ? monitoredBlock.isMonitored : false; + }; // ScratchBlocks.FlyoutExtensionCategoryHeader.getExtensionState = function (extensionId) { // if (vm.getPeripheralIsConnected(extensionId)) { @@ -348,8 +417,8 @@ export default function (vm, useCatBlocks) { // creates a collator. Using this is a lot faster in browsers that create a // collator for every localeCompare call. const collator = new Intl.Collator([], { - sensitivity: 'base', - numeric: true + sensitivity: "base", + numeric: true, }); // ScratchBlocks.scratchBlocksUtils.compareStrings = function (str1, str2) { // return collator.compare(str1, str2); From 77c4e2ff7aa17d0eb89f8df8f40d095d251067f7 Mon Sep 17 00:00:00 2001 From: Aaron Dodson Date: Wed, 11 Sep 2024 15:11:46 -0700 Subject: [PATCH 042/521] refactor: use block styles instead of directly specifying block colors (#23) * chore: format monitor.jsx * chore: format define-dynamic-block.js * chore: format make-toolbox-xml.js * chore: format blockHelpers.js * chore: format theme definitions * chore: format custom-procedures.jsx * fix: use styles instead of colors for coloring dynamic blocks * refactor: define themes in the format expected by Blockly for BlockStyles * refactor: convert and inject Scratch themes into Blockly * chore: add comments clarifying the color/colour dichotomy --- .../src/components/monitor/monitor.jsx | 128 ++++--- .../scratch-gui/src/containers/blocks.jsx | 46 ++- .../src/containers/custom-procedures.jsx | 120 ++++--- .../src/lib/define-dynamic-block.js | 107 +++--- .../scratch-gui/src/lib/make-toolbox-xml.js | 325 +++++++++++++----- .../src/lib/themes/blockHelpers.js | 83 +++-- .../src/lib/themes/default/index.js | 142 ++++---- .../src/lib/themes/high-contrast/index.js | 134 ++++---- 8 files changed, 650 insertions(+), 435 deletions(-) diff --git a/packages/scratch-gui/src/components/monitor/monitor.jsx b/packages/scratch-gui/src/components/monitor/monitor.jsx index d9ceb926957..e398445708f 100644 --- a/packages/scratch-gui/src/components/monitor/monitor.jsx +++ b/packages/scratch-gui/src/components/monitor/monitor.jsx @@ -1,49 +1,56 @@ -import React from 'react'; -import ReactDOM from 'react-dom'; -import PropTypes from 'prop-types'; -import Draggable from 'react-draggable'; -import {FormattedMessage} from 'react-intl'; -import {ContextMenuTrigger} from 'react-contextmenu'; -import {BorderedMenuItem, ContextMenu, MenuItem} from '../context-menu/context-menu.jsx'; -import Box from '../box/box.jsx'; -import DefaultMonitor from './default-monitor.jsx'; -import LargeMonitor from './large-monitor.jsx'; -import SliderMonitor from '../../containers/slider-monitor.jsx'; -import ListMonitor from '../../containers/list-monitor.jsx'; -import {getColorsForTheme} from '../../lib/themes/index.js'; +import React from "react"; +import ReactDOM from "react-dom"; +import PropTypes from "prop-types"; +import Draggable from "react-draggable"; +import { FormattedMessage } from "react-intl"; +import { ContextMenuTrigger } from "react-contextmenu"; +import { + BorderedMenuItem, + ContextMenu, + MenuItem, +} from "../context-menu/context-menu.jsx"; +import Box from "../box/box.jsx"; +import DefaultMonitor from "./default-monitor.jsx"; +import LargeMonitor from "./large-monitor.jsx"; +import SliderMonitor from "../../containers/slider-monitor.jsx"; +import ListMonitor from "../../containers/list-monitor.jsx"; +import { getColorsForTheme } from "../../lib/themes/index.js"; -import styles from './monitor.css'; +import styles from "./monitor.css"; -// Map category name to color name used in scratch-blocks Blockly.Colours +// Map category name to color name used in scratch-blocks Blockly.Colours. Note +// that Blockly uses the UK spelling of "colour", so fields that interact +// directly with Blockly follow that convention, while Scratch code uses the US +// spelling of "color". const categoryColorMap = { - data: 'data', - sensing: 'sensing', - sound: 'sounds', - looks: 'looks', - motion: 'motion', - list: 'data_lists', - extension: 'pen' + data: "data", + sensing: "sensing", + sound: "sounds", + looks: "looks", + motion: "motion", + list: "data_lists", + extension: "pen", }; const modes = { default: DefaultMonitor, large: LargeMonitor, slider: SliderMonitor, - list: ListMonitor + list: ListMonitor, }; const getCategoryColor = (theme, category) => { const colors = getColorsForTheme(theme); return { - background: colors[categoryColorMap[category]].primary, - text: colors.text + background: colors[categoryColorMap[category]].colourPrimary, + text: colors.text, }; }; -const MonitorComponent = props => ( +const MonitorComponent = (props) => ( ( {React.createElement(modes[props.mode], { - categoryColor: getCategoryColor(props.theme, props.category), - ...props + categoryColor: getCategoryColor( + props.theme, + props.category + ), + ...props, })} - {ReactDOM.createPortal(( + {ReactDOM.createPortal( // Use a portal to render the context menu outside the flow to avoid // positioning conflicts between the monitors `transform: scale` and // the context menus `position: fixed`. For more details, see // http://meyerweb.com/eric/thoughts/2011/09/12/un-fixing-fixed-elements-with-css-transforms/ - {props.onSetModeToDefault && + {props.onSetModeToDefault && ( - } - {props.onSetModeToLarge && + + )} + {props.onSetModeToLarge && ( - } - {props.onSetModeToSlider && + + )} + {props.onSetModeToSlider && ( - } - {props.onSliderPromptOpen && props.mode === 'slider' && + + )} + {props.onSliderPromptOpen && props.mode === "slider" && ( - } - {props.onImport && + + )} + {props.onImport && ( - } - {props.onExport && + + )} + {props.onExport && ( - } - {props.onHide && + + )} + {props.onHide && ( - } - - ), document.body)} + + )} + , + document.body + )} - ); const monitorModes = Object.keys(modes); @@ -149,15 +170,12 @@ MonitorComponent.propTypes = { onSetModeToLarge: PropTypes.func, onSetModeToSlider: PropTypes.func, onSliderPromptOpen: PropTypes.func, - theme: PropTypes.string.isRequired + theme: PropTypes.string.isRequired, }; MonitorComponent.defaultProps = { - category: 'extension', - mode: 'default' + category: "extension", + mode: "default", }; -export { - MonitorComponent as default, - monitorModes -}; +export { MonitorComponent as default, monitorModes }; diff --git a/packages/scratch-gui/src/containers/blocks.jsx b/packages/scratch-gui/src/containers/blocks.jsx index c2550e90dde..ecdc577443a 100644 --- a/packages/scratch-gui/src/containers/blocks.jsx +++ b/packages/scratch-gui/src/containers/blocks.jsx @@ -23,8 +23,9 @@ import DragConstants from "../lib/drag-constants"; import defineDynamicBlock from "../lib/define-dynamic-block"; import { DEFAULT_THEME, getColorsForTheme, themeMap } from "../lib/themes"; import { - injectExtensionBlockTheme, + injectExtensionBlockIcons, injectExtensionCategoryTheme, + getExtensionColors, } from "../lib/themes/blockHelpers"; import { connect } from "react-redux"; @@ -126,7 +127,10 @@ class Blocks extends React.Component { { rtl: this.props.isRtl, toolbox: this.props.toolboxXML, - colours: getColorsForTheme(this.props.theme), + theme: new this.ScratchBlocks.Theme( + this.props.theme, + getColorsForTheme(this.props.theme) + ), } ); this.workspace = this.ScratchBlocks.inject( @@ -580,7 +584,7 @@ class Blocks extends React.Component { dynamicBlocksInfo.push(blockInfo); } else if (blockInfo.json) { staticBlocksJson.push( - injectExtensionBlockTheme( + injectExtensionBlockIcons( blockInfo.json, this.props.theme ) @@ -617,7 +621,39 @@ class Blocks extends React.Component { ); defineBlocks(categoryInfo.menus); defineBlocks(categoryInfo.blocks); - + // Note that Blockly uses the UK spelling of "colour", so fields that + // interact directly with Blockly follow that convention, while Scratch + // code uses the US spelling of "color". + let colourPrimary = categoryInfo.color1; + let colourSecondary = categoryInfo.color2; + let colourTertiary = categoryInfo.color3; + let colourQuaternary = categoryInfo.color3; + if (this.props.theme !== DEFAULT_THEME) { + const colors = getExtensionColors(this.props.theme); + colourPrimary = colors.colourPrimary; + colourSecondary = colors.colourSecondary; + colourTertiary = colors.colourTertiary; + colourQuaternary = colors.colourQuaternary; + } + this.ScratchBlocks.getMainWorkspace() + .getTheme() + .setBlockStyle(categoryInfo.id, { + colourPrimary, + colourSecondary, + colourTertiary, + colourQuaternary, + }); + this.ScratchBlocks.getMainWorkspace() + .getTheme() + .setBlockStyle(`${categoryInfo.id}_selected`, { + colourPrimary: colourQuaternary, + colourSecondary: colourQuaternary, + colourTertiary: colourQuaternary, + colourQuaternary: colourQuaternary, + }); + this.ScratchBlocks.getMainWorkspace().setTheme( + this.ScratchBlocks.getMainWorkspace().getTheme() + ); // Update the toolbox with new blocks if possible const toolboxXML = this.getToolboxXML(); if (toolboxXML) { @@ -734,6 +770,7 @@ class Blocks extends React.Component { updateMetrics: updateMetricsProp, useCatBlocks, workspaceMetrics, + theme, ...props } = this.props; /* eslint-enable no-unused-vars */ @@ -776,6 +813,7 @@ class Blocks extends React.Component { media: options.media, }} onRequestClose={this.handleCustomProceduresClose} + theme={theme} /> ) : null} diff --git a/packages/scratch-gui/src/containers/custom-procedures.jsx b/packages/scratch-gui/src/containers/custom-procedures.jsx index de7ac0a0423..20dd9146e3a 100644 --- a/packages/scratch-gui/src/containers/custom-procedures.jsx +++ b/packages/scratch-gui/src/containers/custom-procedures.jsx @@ -1,52 +1,53 @@ -import bindAll from 'lodash.bindall'; -import defaultsDeep from 'lodash.defaultsdeep'; -import PropTypes from 'prop-types'; -import React from 'react'; -import CustomProceduresComponent from '../components/custom-procedures/custom-procedures.jsx'; -import {ScratchBlocks} from 'scratch-blocks'; -import {connect} from 'react-redux'; +import bindAll from "lodash.bindall"; +import defaultsDeep from "lodash.defaultsdeep"; +import PropTypes from "prop-types"; +import React from "react"; +import CustomProceduresComponent from "../components/custom-procedures/custom-procedures.jsx"; +import { getColorsForTheme, themeMap } from "../lib/themes"; +import { ScratchBlocks } from "scratch-blocks"; +import { connect } from "react-redux"; class CustomProcedures extends React.Component { - constructor (props) { + constructor(props) { super(props); bindAll(this, [ - 'handleAddLabel', - 'handleAddBoolean', - 'handleAddTextNumber', - 'handleToggleWarp', - 'handleCancel', - 'handleOk', - 'setBlocks' + "handleAddLabel", + "handleAddBoolean", + "handleAddTextNumber", + "handleToggleWarp", + "handleCancel", + "handleOk", + "setBlocks", ]); this.state = { rtlOffset: 0, - warp: false + warp: false, }; } - componentWillUnmount () { + componentWillUnmount() { if (this.workspace) { this.workspace.dispose(); } } - setBlocks (blocksRef) { + setBlocks(blocksRef) { if (!blocksRef) return; this.blocks = blocksRef; - const workspaceConfig = defaultsDeep({}, + const workspaceConfig = defaultsDeep( + {}, CustomProcedures.defaultOptions, this.props.options, - {rtl: this.props.isRtl} + { rtl: this.props.isRtl } ); - const theme = ScratchBlocks.Theme.defineTheme('Scratch', { - 'base': ScratchBlocks.Themes.Zelos, - 'startHats': true - }); + const theme = new ScratchBlocks.Theme( + this.props.theme, + getColorsForTheme(this.props.theme) + ); workspaceConfig.theme = theme; - workspaceConfig.renderer = 'zelos'; this.workspace = ScratchBlocks.inject(this.blocks, workspaceConfig); // Create the procedure declaration block for editing the mutation. - this.mutationRoot = this.workspace.newBlock('procedures_declaration'); + this.mutationRoot = this.workspace.newBlock("procedures_declaration"); // Make the declaration immovable, undeletable and have no context menu this.mutationRoot.setMovable(false); this.mutationRoot.setDeletable(false); @@ -56,8 +57,9 @@ class CustomProcedures extends React.Component { this.mutationRoot.onChangeFn(); // Keep the block centered on the workspace const metrics = this.workspace.getMetrics(); - const {x, y} = this.mutationRoot.getRelativeToSurfaceXY(); - const dy = (metrics.viewHeight / 2) - (this.mutationRoot.height / 2) - y; + const { x, y } = this.mutationRoot.getRelativeToSurfaceXY(); + const dy = + metrics.viewHeight / 2 - this.mutationRoot.height / 2 - y; let dx; if (this.props.isRtl) { // // TODO: https://github.com/LLK/scratch-gui/issues/2838 @@ -69,8 +71,9 @@ class CustomProcedures extends React.Component { // Calculate a new left postion based on new width // Convert current x position into LTR (mirror) x position (uses original offset) // Use the difference between ltrX and mirrorX as the amount to move - const ltrX = ((metrics.viewWidth / 2) - (this.mutationRoot.width / 2) + 25); - const mirrorX = x - ((x - this.state.rtlOffset) * 2); + const ltrX = + metrics.viewWidth / 2 - this.mutationRoot.width / 2 + 25; + const mirrorX = x - (x - this.state.rtlOffset) * 2; if (mirrorX === ltrX) { return; } @@ -81,19 +84,25 @@ class CustomProcedures extends React.Component { if (this.mutationRoot.width < midPoint) { dx = ltrX; } else if (this.mutationRoot.width < metrics.viewWidth) { - dx = midPoint - ((metrics.viewWidth - this.mutationRoot.width) / 2); + dx = + midPoint - + (metrics.viewWidth - this.mutationRoot.width) / 2; } else { - dx = midPoint + (this.mutationRoot.width - metrics.viewWidth); + dx = + midPoint + + (this.mutationRoot.width - metrics.viewWidth); } this.mutationRoot.moveBy(dx, dy); - this.setState({rtlOffset: this.mutationRoot.getRelativeToSurfaceXY().x}); + this.setState({ + rtlOffset: this.mutationRoot.getRelativeToSurfaceXY().x, + }); return; } if (this.mutationRoot.width > metrics.viewWidth) { dx = dx + this.mutationRoot.width - metrics.viewWidth; } } else { - dx = (metrics.viewWidth / 2) - (this.mutationRoot.width / 2) - x; + dx = metrics.viewWidth / 2 - this.mutationRoot.width / 2 - x; // If the procedure declaration is wider than the view width, // keep the right-hand side of the procedure in view. if (this.mutationRoot.width > metrics.viewWidth) { @@ -105,42 +114,44 @@ class CustomProcedures extends React.Component { this.mutationRoot.domToMutation(this.props.mutator); this.mutationRoot.initSvg(); this.mutationRoot.render(); - this.setState({warp: this.mutationRoot.getWarp()}); + this.setState({ warp: this.mutationRoot.getWarp() }); // Allow the initial events to run to position this block, then focus. setTimeout(() => { this.mutationRoot.focusLastEditor_(); }); } - handleCancel () { + handleCancel() { this.props.onRequestClose(); } - handleOk () { - const newMutation = this.mutationRoot ? this.mutationRoot.mutationToDom(true) : null; + handleOk() { + const newMutation = this.mutationRoot + ? this.mutationRoot.mutationToDom(true) + : null; this.props.onRequestClose(newMutation); } - handleAddLabel () { + handleAddLabel() { if (this.mutationRoot) { this.mutationRoot.addLabelExternal(); } } - handleAddBoolean () { + handleAddBoolean() { if (this.mutationRoot) { this.mutationRoot.addBooleanExternal(); } } - handleAddTextNumber () { + handleAddTextNumber() { if (this.mutationRoot) { this.mutationRoot.addStringNumberExternal(); } } - handleToggleWarp () { + handleToggleWarp() { if (this.mutationRoot) { const newWarp = !this.mutationRoot.getWarp(); this.mutationRoot.setWarp(newWarp); - this.setState({warp: newWarp}); + this.setState({ warp: newWarp }); } } - render () { + render() { return ( ({ +const mapStateToProps = (state) => ({ isRtl: state.locales.isRtl, - mutator: state.scratchGui.customProcedures.mutator + mutator: state.scratchGui.customProcedures.mutator, }); -export default connect( - mapStateToProps -)(CustomProcedures); +export default connect(mapStateToProps)(CustomProcedures); diff --git a/packages/scratch-gui/src/lib/define-dynamic-block.js b/packages/scratch-gui/src/lib/define-dynamic-block.js index 14b0ad9a9ab..30727f48e7f 100644 --- a/packages/scratch-gui/src/lib/define-dynamic-block.js +++ b/packages/scratch-gui/src/lib/define-dynamic-block.js @@ -1,6 +1,6 @@ // TODO: access `BlockType` and `ArgumentType` without reaching into VM // Should we move these into a new extension support module or something? -import {ArgumentType, BlockType} from '@scratch/scratch-vm'; +import { ArgumentType, BlockType } from "@scratch/scratch-vm"; /** * Define a block using extension info which has the ability to dynamically determine (and update) its layout. @@ -13,74 +13,72 @@ import {ArgumentType, BlockType} from '@scratch/scratch-vm'; * @param {string} extendedOpcode - The opcode for the block (including the extension ID). */ // TODO: grow this until it can fully replace `_convertForScratchBlocks` in the VM runtime -const defineDynamicBlock = (ScratchBlocks, categoryInfo, staticBlockInfo, extendedOpcode) => ({ +const defineDynamicBlock = ( + ScratchBlocks, + categoryInfo, + staticBlockInfo, + extendedOpcode +) => ({ init: function () { const blockJson = { type: extendedOpcode, inputsInline: true, category: categoryInfo.name, - colour: categoryInfo.color1, - colourSecondary: categoryInfo.color2, - colourTertiary: categoryInfo.color3 + style: categoryInfo.id, }; // There is a scratch-blocks / Blockly extension called "scratch_extension" which adjusts the styling of // blocks to allow for an icon, a feature of Scratch extension blocks. However, Scratch "core" extension // blocks don't have icons and so they should not use 'scratch_extension'. Adding a scratch-blocks / Blockly // extension after `jsonInit` isn't fully supported (?), so we decide now whether there will be an icon. if (staticBlockInfo.blockIconURI || categoryInfo.blockIconURI) { - blockJson.extensions = ['scratch_extension']; + blockJson.extensions = ["scratch_extension"]; } // initialize the basics of the block, to be overridden & extended later by `domToMutation` this.jsonInit(blockJson); // initialize the cached block info used to carry block info from `domToMutation` to `mutationToDom` - this.blockInfoText = '{}'; + this.blockInfoText = "{}"; // we need a block info update (through `domToMutation`) before we have a completely initialized block this.needsBlockInfoUpdate = true; }, mutationToDom: function () { - const container = document.createElement('mutation'); - container.setAttribute('blockInfo', this.blockInfoText); + const container = document.createElement("mutation"); + container.setAttribute("blockInfo", this.blockInfoText); return container; }, domToMutation: function (xmlElement) { - const blockInfoText = xmlElement.getAttribute('blockInfo'); + const blockInfoText = xmlElement.getAttribute("blockInfo"); if (!blockInfoText) return; if (!this.needsBlockInfoUpdate) { - throw new Error('Attempted to update block info twice'); + throw new Error("Attempted to update block info twice"); } delete this.needsBlockInfoUpdate; this.blockInfoText = blockInfoText; const blockInfo = JSON.parse(blockInfoText); switch (blockInfo.blockType) { - case BlockType.COMMAND: - case BlockType.CONDITIONAL: - case BlockType.LOOP: - this.setOutputShape(ScratchBlocks.OUTPUT_SHAPE_SQUARE); - this.setPreviousStatement(true); - this.setNextStatement(!blockInfo.isTerminal); - break; - case BlockType.REPORTER: - this.setOutput(true); - this.setOutputShape(ScratchBlocks.OUTPUT_SHAPE_ROUND); - if (!blockInfo.disableMonitor) { - this.setCheckboxInFlyout(true); - } - break; - case BlockType.BOOLEAN: - this.setOutput(true); - this.setOutputShape(ScratchBlocks.OUTPUT_SHAPE_HEXAGONAL); - break; - case BlockType.HAT: - case BlockType.EVENT: - this.setOutputShape(ScratchBlocks.OUTPUT_SHAPE_SQUARE); - this.setNextStatement(true); - break; - } - - if (blockInfo.color1 || blockInfo.color2 || blockInfo.color3) { - // `setColour` handles undefined parameters by adjusting defined colors - this.setColour(blockInfo.color1, blockInfo.color2, blockInfo.color3); + case BlockType.COMMAND: + case BlockType.CONDITIONAL: + case BlockType.LOOP: + this.setOutputShape(ScratchBlocks.OUTPUT_SHAPE_SQUARE); + this.setPreviousStatement(true); + this.setNextStatement(!blockInfo.isTerminal); + break; + case BlockType.REPORTER: + this.setOutput(true); + this.setOutputShape(ScratchBlocks.OUTPUT_SHAPE_ROUND); + if (!blockInfo.disableMonitor) { + this.setCheckboxInFlyout(true); + } + break; + case BlockType.BOOLEAN: + this.setOutput(true); + this.setOutputShape(ScratchBlocks.OUTPUT_SHAPE_HEXAGONAL); + break; + case BlockType.HAT: + case BlockType.EVENT: + this.setOutputShape(ScratchBlocks.OUTPUT_SHAPE_SQUARE); + this.setNextStatement(true); + break; } // Layout block arguments @@ -88,20 +86,27 @@ const defineDynamicBlock = (ScratchBlocks, categoryInfo, staticBlockInfo, extend const blockText = blockInfo.text; const args = []; let argCount = 0; - const scratchBlocksStyleText = blockText.replace(/\[(.+?)]/g, (match, argName) => { - const arg = blockInfo.arguments[argName]; - switch (arg.type) { - case ArgumentType.STRING: - args.push({type: 'input_value', name: argName}); - break; - case ArgumentType.BOOLEAN: - args.push({type: 'input_value', name: argName, check: 'Boolean'}); - break; + const scratchBlocksStyleText = blockText.replace( + /\[(.+?)]/g, + (match, argName) => { + const arg = blockInfo.arguments[argName]; + switch (arg.type) { + case ArgumentType.STRING: + args.push({ type: "input_value", name: argName }); + break; + case ArgumentType.BOOLEAN: + args.push({ + type: "input_value", + name: argName, + check: "Boolean", + }); + break; + } + return `%${++argCount}`; } - return `%${++argCount}`; - }); + ); this.interpolate_(scratchBlocksStyleText, args); - } + }, }); export default defineDynamicBlock; diff --git a/packages/scratch-gui/src/lib/make-toolbox-xml.js b/packages/scratch-gui/src/lib/make-toolbox-xml.js index 532f9e14c0a..7d6acc24aba 100644 --- a/packages/scratch-gui/src/lib/make-toolbox-xml.js +++ b/packages/scratch-gui/src/lib/make-toolbox-xml.js @@ -1,5 +1,5 @@ -import {ScratchBlocks} from 'scratch-blocks'; -import {defaultColors} from './themes'; +import { ScratchBlocks } from "scratch-blocks"; +import { defaultColors } from "./themes"; const categorySeparator = ''; @@ -8,15 +8,25 @@ const blockSeparator = ''; // At default scale, about 28px /* eslint-disable no-unused-vars */ const motion = function (isInitialSetup, isStage, targetId, colors) { const stageSelected = ScratchBlocks.ScratchMsgs.translate( - 'MOTION_STAGE_SELECTED', - 'Stage selected: no motion blocks' + "MOTION_STAGE_SELECTED", + "Stage selected: no motion blocks" ); - // Note: the category's secondaryColour matches up with the blocks' tertiary color, both used for border color. + // Note: the category's secondaryColour matches up with the blocks' tertiary + // color, both used for border color. Since Blockly uses the UK spelling of + // "colour", certain attributes are named accordingly. return ` - - ${isStage ? ` + + ${ + isStage + ? ` - ` : ` + ` + : ` @@ -135,31 +145,52 @@ const motion = function (isInitialSetup, isStage, targetId, colors) { ${blockSeparator} - `} + ` + } ${categorySeparator} `; }; const xmlEscape = function (unsafe) { - return unsafe.replace(/[<>&'"]/g, c => { + return unsafe.replace(/[<>&'"]/g, (c) => { switch (c) { - case '<': return '<'; - case '>': return '>'; - case '&': return '&'; - case '\'': return '''; - case '"': return '"'; + case "<": + return "<"; + case ">": + return ">"; + case "&": + return "&"; + case "'": + return "'"; + case '"': + return """; } }); }; -const looks = function (isInitialSetup, isStage, targetId, costumeName, backdropName, colors) { - const hello = ScratchBlocks.ScratchMsgs.translate('LOOKS_HELLO', 'Hello!'); - const hmm = ScratchBlocks.ScratchMsgs.translate('LOOKS_HMM', 'Hmm...'); +const looks = function ( + isInitialSetup, + isStage, + targetId, + costumeName, + backdropName, + colors +) { + const hello = ScratchBlocks.ScratchMsgs.translate("LOOKS_HELLO", "Hello!"); + const hmm = ScratchBlocks.ScratchMsgs.translate("LOOKS_HMM", "Hmm..."); // Note: the category's secondaryColour matches up with the blocks' tertiary color, both used for border color. return ` - - ${isStage ? '' : ` + + ${ + isStage + ? "" + : ` @@ -199,8 +230,11 @@ const looks = function (isInitialSetup, isStage, targetId, costumeName, backdrop ${blockSeparator} - `} - ${isStage ? ` + ` + } + ${ + isStage + ? ` @@ -216,7 +250,8 @@ const looks = function (isInitialSetup, isStage, targetId, costumeName, backdrop - ` : ` + ` + : ` @@ -248,7 +283,8 @@ const looks = function (isInitialSetup, isStage, targetId, costumeName, backdrop - `} + ` + } ${blockSeparator} @@ -266,7 +302,10 @@ const looks = function (isInitialSetup, isStage, targetId, costumeName, backdrop ${blockSeparator} - ${isStage ? '' : ` + ${ + isStage + ? "" + : ` ${blockSeparator} @@ -278,14 +317,19 @@ const looks = function (isInitialSetup, isStage, targetId, costumeName, backdrop - `} - ${isStage ? ` + ` + } + ${ + isStage + ? ` - ` : ` + ` + : ` - `} + ` + } ${categorySeparator} `; @@ -294,7 +338,12 @@ const looks = function (isInitialSetup, isStage, targetId, costumeName, backdrop const sound = function (isInitialSetup, isStage, targetId, soundName, colors) { // Note: the category's secondaryColour matches up with the blocks' tertiary color, both used for border color. return ` - + @@ -350,15 +399,24 @@ const sound = function (isInitialSetup, isStage, targetId, soundName, colors) { const events = function (isInitialSetup, isStage, targetId, colors) { // Note: the category's secondaryColour matches up with the blocks' tertiary color, both used for border color. return ` - + - ${isStage ? ` + ${ + isStage + ? ` - ` : ` + ` + : ` - `} + ` + } ${blockSeparator} @@ -391,10 +449,13 @@ const control = function (isInitialSetup, isStage, targetId, colors) { // Note: the category's secondaryColour matches up with the blocks' tertiary color, both used for border color. return ` + colour="${colors.colourPrimary}" + secondaryColour="${colors.colourTertiary}"> @@ -419,13 +480,16 @@ const control = function (isInitialSetup, isStage, targetId, colors) { ${blockSeparator} ${blockSeparator} - ${isStage ? ` + ${ + isStage + ? ` - ` : ` + ` + : ` @@ -433,22 +497,32 @@ const control = function (isInitialSetup, isStage, targetId, colors) { - `} + ` + } ${categorySeparator} `; }; const sensing = function (isInitialSetup, isStage, targetId, colors) { - const name = ScratchBlocks.ScratchMsgs.translate('SENSING_ASK_TEXT', 'What\'s your name?'); + const name = ScratchBlocks.ScratchMsgs.translate( + "SENSING_ASK_TEXT", + "What's your name?" + ); // Note: the category's secondaryColour matches up with the blocks' tertiary color, both used for border color. return ` - ${isStage ? '' : ` + colour="${colors.colourPrimary}" + secondaryColour="${colors.colourTertiary}"> + ${ + isStage + ? "" + : ` @@ -473,8 +547,12 @@ const sensing = function (isInitialSetup, isStage, targetId, colors) { ${blockSeparator} - `} - ${isInitialSetup ? '' : ` + ` + } + ${ + isInitialSetup + ? "" + : ` @@ -482,7 +560,8 @@ const sensing = function (isInitialSetup, isStage, targetId, colors) { - `} + ` + } ${blockSeparator} @@ -493,11 +572,15 @@ const sensing = function (isInitialSetup, isStage, targetId, colors) { - ${isStage ? '' : ` + ${ + isStage + ? "" + : ` ${blockSeparator} ''+ ${blockSeparator} - `} + ` + } ${blockSeparator} ${blockSeparator} @@ -520,16 +603,28 @@ const sensing = function (isInitialSetup, isStage, targetId, colors) { }; const operators = function (isInitialSetup, isStage, targetId, colors) { - const apple = ScratchBlocks.ScratchMsgs.translate('OPERATORS_JOIN_APPLE', 'apple'); - const banana = ScratchBlocks.ScratchMsgs.translate('OPERATORS_JOIN_BANANA', 'banana'); - const letter = ScratchBlocks.ScratchMsgs.translate('OPERATORS_LETTEROF_APPLE', 'a'); + const apple = ScratchBlocks.ScratchMsgs.translate( + "OPERATORS_JOIN_APPLE", + "apple" + ); + const banana = ScratchBlocks.ScratchMsgs.translate( + "OPERATORS_JOIN_BANANA", + "banana" + ); + const letter = ScratchBlocks.ScratchMsgs.translate( + "OPERATORS_LETTEROF_APPLE", + "a" + ); // Note: the category's secondaryColour matches up with the blocks' tertiary color, both used for border color. return ` + colour="${colors.colourPrimary}" + secondaryColour="${colors.colourTertiary}"> @@ -633,7 +728,10 @@ const operators = function (isInitialSetup, isStage, targetId, colors) { ${blockSeparator} - ${isInitialSetup ? '' : ` + ${ + isInitialSetup + ? "" + : ` @@ -677,7 +775,8 @@ const operators = function (isInitialSetup, isStage, targetId, colors) { - `} + ` + } ${blockSeparator} @@ -715,10 +814,13 @@ const variables = function (isInitialSetup, isStage, targetId, colors) { // Note: the category's secondaryColour matches up with the blocks' tertiary color, both used for border color. return ` `; @@ -728,10 +830,13 @@ const myBlocks = function (isInitialSetup, isStage, targetId, colors) { // Note: the category's secondaryColour matches up with the blocks' tertiary color, both used for border color. return ` `; @@ -739,7 +844,7 @@ const myBlocks = function (isInitialSetup, isStage, targetId, colors) { /* eslint-enable no-unused-vars */ const xmlOpen = ''; -const xmlClose = ''; +const xmlClose = ""; /** * @param {!boolean} isInitialSetup - Whether the toolbox is for initial setup. If the mode is "initial setup", @@ -757,8 +862,16 @@ const xmlClose = ''; * @param {?object} colors - The colors for the theme. * @returns {string} - a ScratchBlocks-style XML document for the contents of the toolbox. */ -const makeToolboxXML = function (isInitialSetup, isStage = true, targetId, categoriesXML = [], - costumeName = '', backdropName = '', soundName = '', colors = defaultColors) { +const makeToolboxXML = function ( + isInitialSetup, + isStage = true, + targetId, + categoriesXML = [], + costumeName = "", + backdropName = "", + soundName = "", + colors = defaultColors +) { isStage = isInitialSetup || isStage; const gap = [categorySeparator]; @@ -767,8 +880,10 @@ const makeToolboxXML = function (isInitialSetup, isStage = true, targetId, categ soundName = xmlEscape(soundName); categoriesXML = categoriesXML.slice(); - const moveCategory = categoryId => { - const index = categoriesXML.findIndex(categoryInfo => categoryInfo.id === categoryId); + const moveCategory = (categoryId) => { + const index = categoriesXML.findIndex( + (categoryInfo) => categoryInfo.id === categoryId + ); if (index >= 0) { // remove the category from categoriesXML and return its XML const [categoryInfo] = categoriesXML.splice(index, 1); @@ -776,28 +891,60 @@ const makeToolboxXML = function (isInitialSetup, isStage = true, targetId, categ } // return `undefined` }; - const motionXML = moveCategory('motion') || motion(isInitialSetup, isStage, targetId, colors.motion); - const looksXML = moveCategory('looks') || - looks(isInitialSetup, isStage, targetId, costumeName, backdropName, colors.looks); - const soundXML = moveCategory('sound') || sound(isInitialSetup, isStage, targetId, soundName, colors.sounds); - const eventsXML = moveCategory('event') || events(isInitialSetup, isStage, targetId, colors.event); - const controlXML = moveCategory('control') || control(isInitialSetup, isStage, targetId, colors.control); - const sensingXML = moveCategory('sensing') || sensing(isInitialSetup, isStage, targetId, colors.sensing); - const operatorsXML = moveCategory('operators') || operators(isInitialSetup, isStage, targetId, colors.operators); - const variablesXML = moveCategory('data') || variables(isInitialSetup, isStage, targetId, colors.data); - const myBlocksXML = moveCategory('procedures') || myBlocks(isInitialSetup, isStage, targetId, colors.more); + const motionXML = + moveCategory("motion") || + motion(isInitialSetup, isStage, targetId, colors.motion); + const looksXML = + moveCategory("looks") || + looks( + isInitialSetup, + isStage, + targetId, + costumeName, + backdropName, + colors.looks + ); + const soundXML = + moveCategory("sound") || + sound(isInitialSetup, isStage, targetId, soundName, colors.sounds); + const eventsXML = + moveCategory("event") || + events(isInitialSetup, isStage, targetId, colors.event); + const controlXML = + moveCategory("control") || + control(isInitialSetup, isStage, targetId, colors.control); + const sensingXML = + moveCategory("sensing") || + sensing(isInitialSetup, isStage, targetId, colors.sensing); + const operatorsXML = + moveCategory("operators") || + operators(isInitialSetup, isStage, targetId, colors.operators); + const variablesXML = + moveCategory("data") || + variables(isInitialSetup, isStage, targetId, colors.data); + const myBlocksXML = + moveCategory("procedures") || + myBlocks(isInitialSetup, isStage, targetId, colors.more); const everything = [ xmlOpen, - motionXML, gap, - looksXML, gap, - soundXML, gap, - eventsXML, gap, - controlXML, gap, - sensingXML, gap, - operatorsXML, gap, - variablesXML, gap, - myBlocksXML + motionXML, + gap, + looksXML, + gap, + soundXML, + gap, + eventsXML, + gap, + controlXML, + gap, + sensingXML, + gap, + operatorsXML, + gap, + variablesXML, + gap, + myBlocksXML, ]; for (const extensionCategory of categoriesXML) { @@ -805,7 +952,7 @@ const makeToolboxXML = function (isInitialSetup, isStage = true, targetId, categ } everything.push(xmlClose); - return everything.join('\n'); + return everything.join("\n"); }; export default makeToolboxXML; diff --git a/packages/scratch-gui/src/lib/themes/blockHelpers.js b/packages/scratch-gui/src/lib/themes/blockHelpers.js index b201241eebb..696c0b57855 100644 --- a/packages/scratch-gui/src/lib/themes/blockHelpers.js +++ b/packages/scratch-gui/src/lib/themes/blockHelpers.js @@ -1,19 +1,19 @@ -import {DEFAULT_THEME, getColorsForTheme, themeMap} from '.'; +import { DEFAULT_THEME, getColorsForTheme, themeMap } from "."; -const getBlockIconURI = extensionIcons => { +const getBlockIconURI = (extensionIcons) => { if (!extensionIcons) return null; return extensionIcons.blockIconURI || extensionIcons.menuIconURI; }; -const getCategoryIconURI = extensionIcons => { +const getCategoryIconURI = (extensionIcons) => { if (!extensionIcons) return null; return extensionIcons.menuIconURI || extensionIcons.blockIconURI; }; // scratch-blocks colours has a pen property that scratch-gui uses for all extensions -const getExtensionColors = theme => getColorsForTheme(theme).pen; +const getExtensionColors = (theme) => getColorsForTheme(theme).pen; /** * Applies extension color theme to categories. @@ -33,32 +33,52 @@ const injectExtensionCategoryTheme = (dynamicBlockXML, theme) => { const parser = new DOMParser(); const serializer = new XMLSerializer(); - return dynamicBlockXML.map(extension => { - const dom = parser.parseFromString(extension.xml, 'text/xml'); + return dynamicBlockXML.map((extension) => { + const dom = parser.parseFromString(extension.xml, "text/xml"); - dom.documentElement.setAttribute('colour', extensionColors.primary); + // This element is deserialized by Blockly, which uses the UK spelling + // of "colour". + dom.documentElement.setAttribute( + "colour", + extensionColors.colourPrimary + ); // Note: the category's secondaryColour matches up with the blocks' tertiary color, both used for border color. - dom.documentElement.setAttribute('secondaryColour', extensionColors.tertiary); - - const categoryIconURI = getCategoryIconURI(extensionIcons[extension.id]); + dom.documentElement.setAttribute( + "secondaryColour", + extensionColors.colourTertiary + ); + + const categoryIconURI = getCategoryIconURI( + extensionIcons[extension.id] + ); if (categoryIconURI) { - dom.documentElement.setAttribute('iconURI', categoryIconURI); + dom.documentElement.setAttribute("iconURI", categoryIconURI); } return { ...extension, - xml: serializer.serializeToString(dom) + xml: serializer.serializeToString(dom), }; }); }; -const injectBlockIcons = (blockInfoJson, theme) => { +const injectExtensionBlockIcons = (blockInfoJson, theme) => { + // Don't do any manipulation for the default theme + if (theme === DEFAULT_THEME) return blockInfoJson; + // Block icons are the first element of `args0` - if (!blockInfoJson.args0 || blockInfoJson.args0.length < 1 || - blockInfoJson.args0[0].type !== 'field_image') return blockInfoJson; + if ( + !blockInfoJson.args0 || + blockInfoJson.args0.length < 1 || + blockInfoJson.args0[0].type !== "field_image" + ) + return blockInfoJson; const extensionIcons = themeMap[theme].extensions; - const extensionId = blockInfoJson.type.substring(0, blockInfoJson.type.indexOf('_')); + const extensionId = blockInfoJson.type.substring( + 0, + blockInfoJson.type.indexOf("_") + ); const blockIconURI = getBlockIconURI(extensionIcons[extensionId]); if (!blockIconURI) return blockInfoJson; @@ -70,35 +90,14 @@ const injectBlockIcons = (blockInfoJson, theme) => { return { ...value, - src: blockIconURI + src: blockIconURI, }; - }) - }; -}; - -/** - * Applies extension color theme to static block json. - * No changes are applied if called with the default theme, allowing extensions to provide their own colors. - * @param {object} blockInfoJson - Static block json - * @param {string} theme - Theme name - * @returns {object} Block info json with updated colors. The original blockInfoJson is not modified. - */ -const injectExtensionBlockTheme = (blockInfoJson, theme) => { - // Don't do any manipulation for the default theme - if (theme === DEFAULT_THEME) return blockInfoJson; - - const extensionColors = getExtensionColors(theme); - - return { - ...injectBlockIcons(blockInfoJson, theme), - colour: extensionColors.primary, - colourSecondary: extensionColors.secondary, - colourTertiary: extensionColors.tertiary, - colourQuaternary: extensionColors.quaternary + }), }; }; export { - injectExtensionBlockTheme, - injectExtensionCategoryTheme + injectExtensionBlockIcons, + injectExtensionCategoryTheme, + getExtensionColors, }; diff --git a/packages/scratch-gui/src/lib/themes/default/index.js b/packages/scratch-gui/src/lib/themes/default/index.js index 3a754dca37f..7047a1c7fd6 100644 --- a/packages/scratch-gui/src/lib/themes/default/index.js +++ b/packages/scratch-gui/src/lib/themes/default/index.js @@ -1,105 +1,105 @@ +// This object is passed directly to Blockly, hence the colour* fields need to +// be named exactly as they are, including the UK spelling of "colour". const blockColors = { motion: { - primary: '#4C97FF', - secondary: '#4280D7', - tertiary: '#3373CC', - quaternary: '#3373CC' + colourPrimary: "#4C97FF", + colourSecondary: "#4280D7", + colourTertiary: "#3373CC", + colourQuaternary: "#3373CC", }, looks: { - primary: '#9966FF', - secondary: '#855CD6', - tertiary: '#774DCB', - quaternary: '#774DCB' + colourPrimary: "#9966FF", + colourSecondary: "#855CD6", + colourTertiary: "#774DCB", + colourQuaternary: "#774DCB", }, sounds: { - primary: '#CF63CF', - secondary: '#C94FC9', - tertiary: '#BD42BD', - quaternary: '#BD42BD' + colourPrimary: "#CF63CF", + colourSecondary: "#C94FC9", + colourTertiary: "#BD42BD", + colourQuaternary: "#BD42BD", }, control: { - primary: '#FFAB19', - secondary: '#EC9C13', - tertiary: '#CF8B17', - quaternary: '#CF8B17' + colourPrimary: "#FFAB19", + colourSecondary: "#EC9C13", + colourTertiary: "#CF8B17", + colourQuaternary: "#CF8B17", }, event: { - primary: '#FFBF00', - secondary: '#E6AC00', - tertiary: '#CC9900', - quaternary: '#CC9900' + colourPrimary: "#FFBF00", + colourSecondary: "#E6AC00", + colourTertiary: "#CC9900", + colourQuaternary: "#CC9900", }, sensing: { - primary: '#5CB1D6', - secondary: '#47A8D1', - tertiary: '#2E8EB8', - quaternary: '#2E8EB8' + colourPrimary: "#5CB1D6", + colourSecondary: "#47A8D1", + colourTertiary: "#2E8EB8", + colourQuaternary: "#2E8EB8", }, pen: { - primary: '#0fBD8C', - secondary: '#0DA57A', - tertiary: '#0B8E69', - quaternary: '#0B8E69' + colourPrimary: "#0fBD8C", + colourSecondary: "#0DA57A", + colourTertiary: "#0B8E69", + colourQuaternary: "#0B8E69", }, operators: { - primary: '#59C059', - secondary: '#46B946', - tertiary: '#389438', - quaternary: '#389438' + colourPrimary: "#59C059", + colourSecondary: "#46B946", + colourTertiary: "#389438", + colourQuaternary: "#389438", }, data: { - primary: '#FF8C1A', - secondary: '#FF8000', - tertiary: '#DB6E00', - quaternary: '#DB6E00' + colourPrimary: "#FF8C1A", + colourSecondary: "#FF8000", + colourTertiary: "#DB6E00", + colourQuaternary: "#DB6E00", }, // This is not a new category, but rather for differentiation // between lists and scalar variables. data_lists: { - primary: '#FF661A', - secondary: '#FF5500', - tertiary: '#E64D00', - quaternary: '#E64D00' + colourPrimary: "#FF661A", + colourSecondary: "#FF5500", + colourTertiary: "#E64D00", + colourQuaternary: "#E64D00", }, more: { - primary: '#FF6680', - secondary: '#FF4D6A', - tertiary: '#FF3355', - quaternary: '#FF3355' + colourPrimary: "#FF6680", + colourSecondary: "#FF4D6A", + colourTertiary: "#FF3355", + colourQuaternary: "#FF3355", }, - text: '#FFFFFF', - workspace: '#F9F9F9', - toolboxHover: '#4C97FF', - toolboxSelected: '#E9EEF2', - toolboxText: '#575E75', - toolbox: '#FFFFFF', - flyout: '#F9F9F9', - scrollbar: '#CECDCE', - scrollbarHover: '#CECDCE', - textField: '#FFFFFF', - textFieldText: '#575E75', - insertionMarker: '#000000', + text: "#FFFFFF", + workspace: "#F9F9F9", + toolboxHover: "#4C97FF", + toolboxSelected: "#E9EEF2", + toolboxText: "#575E75", + toolbox: "#FFFFFF", + flyout: "#F9F9F9", + scrollbar: "#CECDCE", + scrollbarHover: "#CECDCE", + textField: "#FFFFFF", + textFieldText: "#575E75", + insertionMarker: "#000000", insertionMarkerOpacity: 0.2, dragShadowOpacity: 0.6, - stackGlow: '#FFF200', + stackGlow: "#FFF200", stackGlowSize: 4, stackGlowOpacity: 1, - replacementGlow: '#FFFFFF', + replacementGlow: "#FFFFFF", replacementGlowSize: 2, replacementGlowOpacity: 1, - colourPickerStroke: '#FFFFFF', + colourPickerStroke: "#FFFFFF", // CSS colours: support RGBA - fieldShadow: 'rgba(255, 255, 255, 0.3)', - dropDownShadow: 'rgba(0, 0, 0, .3)', - numPadBackground: '#547AB2', - numPadBorder: '#435F91', - numPadActiveBackground: '#435F91', - numPadText: 'white', // Do not use hex here, it cannot be inlined with data-uri SVG - valueReportBackground: '#FFFFFF', - valueReportBorder: '#AAAAAA', - menuHover: 'rgba(0, 0, 0, 0.2)' + fieldShadow: "rgba(255, 255, 255, 0.3)", + dropDownShadow: "rgba(0, 0, 0, .3)", + numPadBackground: "#547AB2", + numPadBorder: "#435F91", + numPadActiveBackground: "#435F91", + numPadText: "white", // Do not use hex here, it cannot be inlined with data-uri SVG + valueReportBackground: "#FFFFFF", + valueReportBorder: "#AAAAAA", + menuHover: "rgba(0, 0, 0, 0.2)", }; -export { - blockColors -}; +export { blockColors }; diff --git a/packages/scratch-gui/src/lib/themes/high-contrast/index.js b/packages/scratch-gui/src/lib/themes/high-contrast/index.js index 8a5dd941559..853ff7947ce 100644 --- a/packages/scratch-gui/src/lib/themes/high-contrast/index.js +++ b/packages/scratch-gui/src/lib/themes/high-contrast/index.js @@ -1,110 +1,108 @@ -import musicIcon from './extensions/musicIcon.svg'; -import penIcon from './extensions/penIcon.svg'; -import text2speechIcon from './extensions/text2speechIcon.svg'; -import translateIcon from './extensions/translateIcon.svg'; -import videoSensingIcon from './extensions/videoSensingIcon.svg'; +import musicIcon from "./extensions/musicIcon.svg"; +import penIcon from "./extensions/penIcon.svg"; +import text2speechIcon from "./extensions/text2speechIcon.svg"; +import translateIcon from "./extensions/translateIcon.svg"; +import videoSensingIcon from "./extensions/videoSensingIcon.svg"; +// This object is passed directly to Blockly, hence the colour* fields need to +// be named exactly as they are, including the UK spelling of "colour". const blockColors = { motion: { - primary: '#80B5FF', - secondary: '#B3D2FF', - tertiary: '#3373CC', - quaternary: '#CCE1FF' + colourPrimary: "#80B5FF", + colourSecondary: "#B3D2FF", + colourTertiary: "#3373CC", + colourQuaternary: "#CCE1FF", }, looks: { - primary: '#CCB3FF', - secondary: '#DDCCFF', - tertiary: '#774DCB', - quaternary: '#EEE5FF' + colourPrimary: "#CCB3FF", + colourSecondary: "#DDCCFF", + colourTertiary: "#774DCB", + colourQuaternary: "#EEE5FF", }, sounds: { - primary: '#E19DE1', - secondary: '#FFB3FF', - tertiary: '#BD42BD', - quaternary: '#FFCCFF' - + colourPrimary: "#E19DE1", + colourSecondary: "#FFB3FF", + colourTertiary: "#BD42BD", + colourQuaternary: "#FFCCFF", }, control: { - primary: '#FFBE4C', - secondary: '#FFDA99', - tertiary: '#CF8B17', - quaternary: '#FFE3B3' + colourPrimary: "#FFBE4C", + colourSecondary: "#FFDA99", + colourTertiary: "#CF8B17", + colourQuaternary: "#FFE3B3", }, event: { - primary: '#FFD966', - secondary: '#FFECB3', - tertiary: '#CC9900', - quaternary: '#FFF2CC' + colourPrimary: "#FFD966", + colourSecondary: "#FFECB3", + colourTertiary: "#CC9900", + colourQuaternary: "#FFF2CC", }, sensing: { - primary: '#85C4E0', - secondary: '#AED8EA', - tertiary: '#2E8EB8', - quaternary: '#C2E2F0' + colourPrimary: "#85C4E0", + colourSecondary: "#AED8EA", + colourTertiary: "#2E8EB8", + colourQuaternary: "#C2E2F0", }, pen: { - primary: '#13ECAF', - secondary: '#75F0CD', - tertiary: '#0B8E69', - quaternary: '#A3F5DE' + colourPrimary: "#13ECAF", + colourSecondary: "#75F0CD", + colourTertiary: "#0B8E69", + colourQuaternary: "#A3F5DE", }, operators: { - primary: '#7ECE7E', - secondary: '#B5E3B5', - tertiary: '#389438', - quaternary: '#DAF1DA' + colourPrimary: "#7ECE7E", + colourSecondary: "#B5E3B5", + colourTertiary: "#389438", + colourQuaternary: "#DAF1DA", }, data: { - primary: '#FFA54C', - secondary: '#FFCC99', - tertiary: '#DB6E00', - quaternary: '#FFE5CC' + colourPrimary: "#FFA54C", + colourSecondary: "#FFCC99", + colourTertiary: "#DB6E00", + colourQuaternary: "#FFE5CC", }, // This is not a new category, but rather for differentiation // between lists and scalar variables. data_lists: { - primary: '#FF9966', - secondary: '#FFCAB0', // I don't think this is used, b/c we don't have any droppable fields in list blocks - tertiary: '#E64D00', - quaternary: '#FFDDCC' + colourPrimary: "#FF9966", + colourSecondary: "#FFCAB0", // I don't think this is used, b/c we don't have any droppable fields in list blocks + colourTertiary: "#E64D00", + colourQuaternary: "#FFDDCC", }, more: { - primary: '#FF99AA', - secondary: '#FFCCD5', - tertiary: '#FF3355', - quaternary: '#FFE5EA' - }, - text: '#000000', - textFieldText: '#000000', // Text inside of inputs e.g. 90 in [point in direction (90)] - toolboxText: '#000000', // Toolbox text, color picker text (used to be #575E75) + colourPrimary: "#FF99AA", + colourSecondary: "#FFCCD5", + colourTertiary: "#FF3355", + colourQuaternary: "#FFE5EA", + }, + text: "#000000", + textFieldText: "#000000", // Text inside of inputs e.g. 90 in [point in direction (90)] + toolboxText: "#000000", // Toolbox text, color picker text (used to be #575E75) // The color that the category menu label (e.g. 'motion', 'looks', etc.) changes to on hover - toolboxHover: '#3373CC', - insertionMarker: '#000000', + toolboxHover: "#3373CC", + insertionMarker: "#000000", insertionMarkerOpacity: 0.2, - fieldShadow: 'rgba(255, 255, 255, 0.3)', + fieldShadow: "rgba(255, 255, 255, 0.3)", dragShadowOpacity: 0.6, - menuHover: 'rgba(255, 255, 255, 0.3)' + menuHover: "rgba(255, 255, 255, 0.3)", }; const extensions = { music: { - blockIconURI: musicIcon + blockIconURI: musicIcon, }, pen: { - blockIconURI: penIcon + blockIconURI: penIcon, }, text2speech: { - blockIconURI: text2speechIcon + blockIconURI: text2speechIcon, }, translate: { - blockIconURI: translateIcon + blockIconURI: translateIcon, }, videoSensing: { - blockIconURI: videoSensingIcon - } + blockIconURI: videoSensingIcon, + }, }; -export { - blockColors, - extensions -}; +export { blockColors, extensions }; From 9703bc6531e101d7684ebb394f5afacb287f36fd Mon Sep 17 00:00:00 2001 From: Aaron Dodson Date: Thu, 12 Sep 2024 09:42:07 -0700 Subject: [PATCH 043/521] refactor: improve efficiency of toolbox updates (#24) --- packages/scratch-gui/src/containers/blocks.jsx | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/packages/scratch-gui/src/containers/blocks.jsx b/packages/scratch-gui/src/containers/blocks.jsx index ecdc577443a..6795150e782 100644 --- a/packages/scratch-gui/src/containers/blocks.jsx +++ b/packages/scratch-gui/src/containers/blocks.jsx @@ -238,16 +238,6 @@ class Blocks extends React.Component { this.ScratchBlocks.hideChaff(); } - // Only rerender the toolbox when the blocks are visible and the xml is - // different from the previously rendered toolbox xml. - // Do not check against prevProps.toolboxXML because that may not have been rendered. - if ( - this.props.isVisible && - this.props.toolboxXML !== this._renderedToolboxXML - ) { - this.requestToolboxUpdate(); - } - if (this.props.isVisible === prevProps.isVisible) { if (this.props.stageSize !== prevProps.stageSize) { // force workspace to redraw for the new stage size @@ -269,7 +259,6 @@ class Blocks extends React.Component { this.setLocale(); } else { this.props.vm.refreshWorkspace(); - this.requestToolboxUpdate(); } window.dispatchEvent(new Event("resize")); @@ -298,7 +287,6 @@ class Blocks extends React.Component { .then(() => { this.workspace.getFlyout().setRecyclingEnabled(false); this.props.vm.refreshWorkspace(); - this.requestToolboxUpdate(); this.withToolboxUpdates(() => { this.workspace.getFlyout().setRecyclingEnabled(true); }); @@ -744,7 +732,6 @@ class Blocks extends React.Component { ) .then(() => { this.props.vm.refreshWorkspace(); - this.updateToolbox(); // To show new variables/custom blocks }); } render() { From 52ac75295c487d703baa26fdc05af28bf90837d3 Mon Sep 17 00:00:00 2001 From: Aaron Dodson Date: Mon, 16 Sep 2024 09:48:17 -0700 Subject: [PATCH 044/521] fix: partially roll back flyout optimization (#25) --- packages/scratch-gui/src/containers/blocks.jsx | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/packages/scratch-gui/src/containers/blocks.jsx b/packages/scratch-gui/src/containers/blocks.jsx index 6795150e782..328733db015 100644 --- a/packages/scratch-gui/src/containers/blocks.jsx +++ b/packages/scratch-gui/src/containers/blocks.jsx @@ -238,6 +238,16 @@ class Blocks extends React.Component { this.ScratchBlocks.hideChaff(); } + // Only rerender the toolbox when the blocks are visible and the xml is + // different from the previously rendered toolbox xml. + // Do not check against prevProps.toolboxXML because that may not have been rendered. + if ( + this.props.isVisible && + this.props.toolboxXML !== this._renderedToolboxXML + ) { + this.requestToolboxUpdate(); + } + if (this.props.isVisible === prevProps.isVisible) { if (this.props.stageSize !== prevProps.stageSize) { // force workspace to redraw for the new stage size From 15904a23e1b00ff6d858b2d7f4ddad3eb84411f7 Mon Sep 17 00:00:00 2001 From: Aaron Dodson Date: Wed, 18 Sep 2024 12:04:08 -0700 Subject: [PATCH 045/521] fix: prevent exception when switching languages (#27) --- packages/scratch-gui/src/containers/blocks.jsx | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/packages/scratch-gui/src/containers/blocks.jsx b/packages/scratch-gui/src/containers/blocks.jsx index 328733db015..ca6018fb590 100644 --- a/packages/scratch-gui/src/containers/blocks.jsx +++ b/packages/scratch-gui/src/containers/blocks.jsx @@ -323,14 +323,17 @@ class Blocks extends React.Component { this.workspace.getToolbox().forceRerender(); this._renderedToolboxXML = this.props.toolboxXML; - const newCategoryScrollPosition = + const newCategoryScrollPosition = this.workspace + .getFlyout() + .getCategoryScrollPosition(selectedCategoryName); + if (newCategoryScrollPosition) { this.workspace .getFlyout() - .getCategoryScrollPosition(selectedCategoryName).y * scale; - this.workspace - .getFlyout() - .getWorkspace() - .scrollbar.setY(newCategoryScrollPosition + offsetWithinCategory); + .getWorkspace() + .scrollbar.setY( + newCategoryScrollPosition.y * scale + offsetWithinCategory + ); + } const queue = this.toolboxUpdateQueue; this.toolboxUpdateQueue = []; From 1955a6fecdb266ef94e514a71651a0fd40eb6092 Mon Sep 17 00:00:00 2001 From: Aaron Dodson Date: Wed, 18 Sep 2024 12:12:28 -0700 Subject: [PATCH 046/521] fix: fix bug that prevented displaying the procedure editor modal on mobile (#26) --- packages/scratch-gui/src/containers/blocks.jsx | 1 + packages/scratch-gui/src/containers/custom-procedures.jsx | 1 + 2 files changed, 2 insertions(+) diff --git a/packages/scratch-gui/src/containers/blocks.jsx b/packages/scratch-gui/src/containers/blocks.jsx index ca6018fb590..f534400db67 100644 --- a/packages/scratch-gui/src/containers/blocks.jsx +++ b/packages/scratch-gui/src/containers/blocks.jsx @@ -877,6 +877,7 @@ Blocks.defaultOptions = { collapse: false, sounds: false, trashcan: false, + modalInputs: false, }; Blocks.defaultProps = { diff --git a/packages/scratch-gui/src/containers/custom-procedures.jsx b/packages/scratch-gui/src/containers/custom-procedures.jsx index 20dd9146e3a..068b9097b16 100644 --- a/packages/scratch-gui/src/containers/custom-procedures.jsx +++ b/packages/scratch-gui/src/containers/custom-procedures.jsx @@ -193,6 +193,7 @@ CustomProcedures.defaultOptions = { comments: false, collapse: false, scrollbars: true, + modalInputs: false, }; CustomProcedures.defaultProps = { From 565acd676a25d0f17bf622a361feb891277513b7 Mon Sep 17 00:00:00 2001 From: Aaron Dodson Date: Wed, 2 Oct 2024 09:21:22 -0700 Subject: [PATCH 047/521] fix: avoid clearing the state of the sensing_of block by refreshing the toolbox (#28) --- packages/scratch-gui/src/containers/blocks.jsx | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/packages/scratch-gui/src/containers/blocks.jsx b/packages/scratch-gui/src/containers/blocks.jsx index f534400db67..ea572244951 100644 --- a/packages/scratch-gui/src/containers/blocks.jsx +++ b/packages/scratch-gui/src/containers/blocks.jsx @@ -145,7 +145,8 @@ class Blocks extends React.Component { "PROCEDURE", this.ScratchBlocks.ScratchProcedures.getProceduresCategory ); - this.workspace.addChangeListener((event) => { + + this.toolboxUpdateChangeListener = (event) => { if ( event.type === this.ScratchBlocks.Events.VAR_CREATE || event.type === this.ScratchBlocks.Events.VAR_RENAME || @@ -161,7 +162,8 @@ class Blocks extends React.Component { ) { this.requestToolboxUpdate(); } - }); + }; + this.workspace.addChangeListener(this.toolboxUpdateChangeListener); // Register buttons under new callback keys for creating variables, // lists, and procedures from extensions. @@ -515,6 +517,7 @@ class Blocks extends React.Component { // Remove and reattach the workspace listener (but allow flyout events) this.workspace.removeChangeListener(this.props.vm.blockListener); + this.workspace.removeChangeListener(this.toolboxUpdateChangeListener); const dom = this.ScratchBlocks.utils.xml.textToDom(data.xml); try { this.ScratchBlocks.Xml.clearWorkspaceAndLoadFromXml( @@ -556,6 +559,15 @@ class Blocks extends React.Component { // fresh workspace and we don't want any changes made to another sprites // workspace to be 'undone' here. this.workspace.clearUndo(); + // Let events get flushed before readding the toolbox-updater listener + // to avoid unneeded refreshes. + requestAnimationFrame(() => { + setTimeout(() => { + this.workspace.addChangeListener( + this.toolboxUpdateChangeListener + ); + }); + }); } handleMonitorsUpdate(monitors) { // Update the checkboxes of the relevant monitors. From 3fbb1325a39e463334e406292e6b9f3c1a4d3e97 Mon Sep 17 00:00:00 2001 From: Aaron Dodson Date: Mon, 14 Oct 2024 08:23:44 -0700 Subject: [PATCH 048/521] refactor: fix compatibility with checkboxes and category status indicators (#29) * refactor: fix compatibility with checkboxes and category status indicators * chore: remove errant logging --- .../scratch-gui/src/containers/blocks.jsx | 6 ++--- packages/scratch-gui/src/lib/blocks.js | 25 ++++++++++--------- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/packages/scratch-gui/src/containers/blocks.jsx b/packages/scratch-gui/src/containers/blocks.jsx index ea572244951..1c759423c8a 100644 --- a/packages/scratch-gui/src/containers/blocks.jsx +++ b/packages/scratch-gui/src/containers/blocks.jsx @@ -94,7 +94,7 @@ class Blocks extends React.Component { this.ScratchBlocks.ScratchVariables.setPromptHandler( this.handlePromptStart ); - this.ScratchBlocks.statusButtonCallback = + this.ScratchBlocks.StatusIndicatorLabel.statusButtonCallback = this.handleConnectionModalStart; this.ScratchBlocks.recordSoundCallback = this.handleOpenSoundRecorder; @@ -110,7 +110,7 @@ class Blocks extends React.Component { this.props.useCatBlocks ); this.ScratchBlocks.dialog.setPrompt(this.handlePromptStart); - this.ScratchBlocks.statusButtonCallback = + this.ScratchBlocks.StatusIndicatorLabel.statusButtonCallback = this.handleConnectionModalStart; this.ScratchBlocks.recordSoundCallback = this.handleOpenSoundRecorder; @@ -716,7 +716,7 @@ class Blocks extends React.Component { this.props.onOpenConnectionModal(extensionId); } handleStatusButtonUpdate() { - this.ScratchBlocks.refreshStatusButtons(this.workspace); + this.workspace.getFlyout().refreshStatusButtons(); } handleOpenSoundRecorder() { this.props.onOpenSoundRecorder(); diff --git a/packages/scratch-gui/src/lib/blocks.js b/packages/scratch-gui/src/lib/blocks.js index 149d67897f9..298307cab35 100644 --- a/packages/scratch-gui/src/lib/blocks.js +++ b/packages/scratch-gui/src/lib/blocks.js @@ -396,19 +396,20 @@ export default function (vm, useCatBlocks) { this.jsonInit(json); }; - ScratchBlocks.CheckableContinuousFlyout.prototype.getCheckboxState = - function (blockId) { - const monitoredBlock = vm.runtime.monitorBlocks._blocks[blockId]; - return monitoredBlock ? monitoredBlock.isMonitored : false; - }; + ScratchBlocks.CheckboxBubble.prototype.isChecked = function (blockId) { + const monitoredBlock = vm.runtime.monitorBlocks._blocks[blockId]; + return monitoredBlock ? monitoredBlock.isMonitored : false; + }; + + ScratchBlocks.StatusIndicatorLabel.prototype.getExtensionState = function ( + extensionId + ) { + if (vm.getPeripheralIsConnected(extensionId)) { + return ScratchBlocks.StatusButtonState.READY; + } + return ScratchBlocks.StatusButtonState.NOT_READY; + }; - // ScratchBlocks.FlyoutExtensionCategoryHeader.getExtensionState = function (extensionId) { - // if (vm.getPeripheralIsConnected(extensionId)) { - // return ScratchBlocks.StatusButtonState.READY; - // } - // return ScratchBlocks.StatusButtonState.NOT_READY; - // }; - // // ScratchBlocks.FieldNote.playNote_ = function (noteNum, extensionId) { // vm.runtime.emit('PLAY_NOTE', noteNum, extensionId); // }; From 800b185225dcef879eec23041a9a82706bbb85e2 Mon Sep 17 00:00:00 2001 From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com> Date: Fri, 18 Oct 2024 16:35:21 -0700 Subject: [PATCH 049/521] chore(deps): update scratch-blocks for unforking test --- package-lock.json | 313 +++++++++++++++++++++++++----- packages/scratch-gui/package.json | 2 +- 2 files changed, 270 insertions(+), 45 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7e083672a81..2fe1ac2e562 100644 --- a/package-lock.json +++ b/package-lock.json @@ -31018,65 +31018,292 @@ } }, "node_modules/scratch-blocks": { - "version": "1.1.206", - "resolved": "https://registry.npmjs.org/scratch-blocks/-/scratch-blocks-1.1.206.tgz", - "integrity": "sha512-pjry8XGFlP2Gm3VJEuz7983oJE3fp2Gd1AzLDGaQSV8hDcAISzEd5GF0PoTZ2qQStp5G4b3eK/Xs9M+LEKmuJw==", - "license": "Apache-2.0", + "version": "2.0.0-beta.2", + "resolved": "https://registry.npmjs.org/scratch-blocks/-/scratch-blocks-2.0.0-beta.2.tgz", + "integrity": "sha512-j/2F1/tIGoPMeQHVIDXzEh21fdQTwhLDSCv9Qo8J0wIq+v2EYipHMbV3QvQloheBaXdTpLsn9SJnUjOmiICFUA==", + "deprecated": "Moved Blockly unforking test to 'spork' channel", "dependencies": { - "exports-loader": "^0.7.0", - "google-closure-library": "^20190301.0.0", - "imports-loader": "^0.8.0", - "scratch-l10n": "^3.18.3" + "@blockly/continuous-toolbox": "^6.0.9", + "@blockly/field-colour": "^5.0.9", + "blockly": "^11.0.0" } }, - "node_modules/scratch-blocks/node_modules/exports-loader": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/exports-loader/-/exports-loader-0.7.0.tgz", - "integrity": "sha512-RKwCrO4A6IiKm0pG3c9V46JxIHcDplwwGJn6+JJ1RcVnh/WSGJa0xkmk5cRVtgOPzCAtTMGj2F7nluh9L0vpSA==", - "license": "MIT", + "node_modules/scratch-blocks/node_modules/@blockly/continuous-toolbox": { + "version": "6.0.12", + "resolved": "https://registry.npmjs.org/@blockly/continuous-toolbox/-/continuous-toolbox-6.0.12.tgz", + "integrity": "sha512-I2jsxN/f+wytrzUQkSrxOKLWHPgsjiIz/w0Tpdo9PcDB5mwoBnG8l0ldh5Yj55CRMZbY/q9tANPWR8V8acgMIw==", + "engines": { + "node": ">=8.17.0" + }, + "peerDependencies": { + "blockly": "^11.0.0" + } + }, + "node_modules/scratch-blocks/node_modules/@blockly/field-colour": { + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/@blockly/field-colour/-/field-colour-5.0.12.tgz", + "integrity": "sha512-vNw6L/B0cpf+j0S6pShX31bOI16KJu+eACpsfHGOBZbb7+LT3bYKcGHe6+VRe+KtIE3jGlY7vYfnaJdOCrYlfQ==", + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "blockly": "^11.0.0" + } + }, + "node_modules/scratch-blocks/node_modules/blockly": { + "version": "11.2.1", + "resolved": "https://registry.npmjs.org/blockly/-/blockly-11.2.1.tgz", + "integrity": "sha512-20sCwSwX2Z6UxR/er0B5y6wRFukuIdvOjc7jMuIwyCO/yT35+UbAqYueMga3JFA9NoWPwQc+3s6/XnLkyceAww==", "dependencies": { - "loader-utils": "^1.1.0", - "source-map": "0.5.0" + "jsdom": "25.0.1" }, "engines": { - "node": ">= 4" + "node": ">=18" } }, - "node_modules/scratch-blocks/node_modules/exports-loader/node_modules/source-map": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.0.tgz", - "integrity": "sha512-gjGnxNN0K+/Pr4Mi4fs/pOtda10dKB6Wn9QvjOrH6v5TWsI7ghHuJUHoIgyM6DkUL5kr2GtPFGererzKpMBWfA==", - "license": "BSD-3-Clause", + "node_modules/scratch-blocks/node_modules/cssstyle": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.2.1.tgz", + "integrity": "sha512-9+vem03dMXG7gDmZ62uqmRiMRNtinIZ9ZyuF6BdxzfOD+FdN5hretzynkn0ReS2DO2GSw76RWHs0UmJPI2zUjw==", + "dependencies": { + "@asamuzakjp/css-color": "^2.8.2", + "rrweb-cssom": "^0.8.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=18" } }, - "node_modules/scratch-blocks/node_modules/imports-loader": { + "node_modules/scratch-blocks/node_modules/cssstyle/node_modules/rrweb-cssom": { "version": "0.8.0", - "resolved": "https://registry.npmjs.org/imports-loader/-/imports-loader-0.8.0.tgz", - "integrity": "sha512-kXWL7Scp8KQ4552ZcdVTeaQCZSLW+e6nJfp3cwUMB673T7Hr98Xjx5JK+ql7ADlJUvj1JS5O01RLbKoutN5QDQ==", - "license": "MIT", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", + "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==" + }, + "node_modules/scratch-blocks/node_modules/data-urls": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", + "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", "dependencies": { - "loader-utils": "^1.0.2", - "source-map": "^0.6.1" + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0" }, "engines": { - "node": ">= 4" + "node": ">=18" } }, - "node_modules/scratch-blocks/node_modules/scratch-l10n": { - "version": "3.18.357", - "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-3.18.357.tgz", - "integrity": "sha512-Rs3YmUa2dzpYqT1O/YT15g99sIwnC7j9TOOmOhUphVKLeiYUvJWiRPKZCugA7/hbIMYZV5VLkmuDgGXhgfSOBw==", - "license": "BSD-3-Clause", + "node_modules/scratch-blocks/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/scratch-blocks/node_modules/form-data": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", + "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", "dependencies": { - "@transifex/api": "4.3.0", - "download": "8.0.0", - "transifex": "1.6.6" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "mime-types": "^2.1.12" }, - "bin": { - "build-i18n-src": "scripts/build-i18n-src.js", - "tx-push-src": "scripts/tx-push-src.js" + "engines": { + "node": ">= 6" + } + }, + "node_modules/scratch-blocks/node_modules/html-encoding-sniffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", + "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", + "dependencies": { + "whatwg-encoding": "^3.1.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/scratch-blocks/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==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/scratch-blocks/node_modules/jsdom": { + "version": "25.0.1", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-25.0.1.tgz", + "integrity": "sha512-8i7LzZj7BF8uplX+ZyOlIz86V6TAsSs+np6m1kpW9u0JWi4z/1t+FzcK1aek+ybTnAC4KhBL4uXCNT0wcUIeCw==", + "dependencies": { + "cssstyle": "^4.1.0", + "data-urls": "^5.0.0", + "decimal.js": "^10.4.3", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^4.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.5", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.12", + "parse5": "^7.1.2", + "rrweb-cssom": "^0.7.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^5.0.0", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^3.1.1", + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0", + "ws": "^8.18.0", + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "canvas": "^2.11.2" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/scratch-blocks/node_modules/parse5": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", + "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", + "dependencies": { + "entities": "^4.5.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/scratch-blocks/node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/scratch-blocks/node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "node_modules/scratch-blocks/node_modules/tough-cookie": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.1.tgz", + "integrity": "sha512-Ek7HndSVkp10hmHP9V4qZO1u+pn1RU5sI0Fw+jCU3lyvuMZcgqsNgc6CmJJZyByK4Vm/qotGRJlfgAX8q+4JiA==", + "dependencies": { + "tldts": "^6.1.32" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/scratch-blocks/node_modules/tr46": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz", + "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/scratch-blocks/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==", + "dependencies": { + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/scratch-blocks/node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "engines": { + "node": ">=12" + } + }, + "node_modules/scratch-blocks/node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/scratch-blocks/node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "engines": { + "node": ">=18" + } + }, + "node_modules/scratch-blocks/node_modules/whatwg-url": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.1.1.tgz", + "integrity": "sha512-mDGf9diDad/giZ/Sm9Xi2YcyzaFpbdLpJPr+E9fSkyQ7KpQD4SdFcugkRQYzhmfI4KeV4Qpnn2sKPdo+kmsgRQ==", + "dependencies": { + "tr46": "^5.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/scratch-blocks/node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/scratch-blocks/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==", + "engines": { + "node": ">=18" } }, "node_modules/scratch-l10n": { @@ -35981,7 +36208,6 @@ "version": "6.1.77", "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.77.tgz", "integrity": "sha512-lBpoWgy+kYmuXWQ83+R7LlJCnsd9YW8DGpZSHhrMl4b8Ly/1vzOie3OdtmUJDkKxcgRGOehDu5btKkty+JEe+g==", - "dev": true, "dependencies": { "tldts-core": "^6.1.77" }, @@ -35992,8 +36218,7 @@ "node_modules/tldts-core": { "version": "6.1.77", "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.77.tgz", - "integrity": "sha512-bCaqm24FPk8OgBkM0u/SrEWJgHnhBWYqeBo6yUmcZJDCHt/IfyWBb+14CXdGi4RInMv4v7eUAin15W0DoA+Ytg==", - "dev": true + "integrity": "sha512-bCaqm24FPk8OgBkM0u/SrEWJgHnhBWYqeBo6yUmcZJDCHt/IfyWBb+14CXdGi4RInMv4v7eUAin15W0DoA+Ytg==" }, "node_modules/tmp": { "version": "0.0.30", @@ -38258,7 +38483,7 @@ "react-virtualized": "9.22.5", "redux-throttle": "0.1.1", "scratch-audio": "2.0.73", - "scratch-blocks": "1.1.206", + "scratch-blocks": "^2.0.0-beta", "scratch-l10n": "5.0.134", "scratch-paint": "3.0.144", "scratch-render-fonts": "1.0.165", diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index 1fb967bab4b..15f216db688 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -94,7 +94,7 @@ "react-virtualized": "9.22.5", "redux-throttle": "0.1.1", "scratch-audio": "2.0.73", - "scratch-blocks": "1.1.206", + "scratch-blocks": "^2.0.0-beta", "scratch-l10n": "5.0.134", "scratch-paint": "3.0.144", "scratch-render-fonts": "1.0.165", From 50f031c0866ecfbca6e6695c358a782959e4052a Mon Sep 17 00:00:00 2001 From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com> Date: Fri, 18 Oct 2024 23:48:45 -0700 Subject: [PATCH 050/521] fix(release): release beta branch under beta label(?) --- packages/scratch-gui/release.config.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/packages/scratch-gui/release.config.js b/packages/scratch-gui/release.config.js index 48275010925..c09249000b0 100644 --- a/packages/scratch-gui/release.config.js +++ b/packages/scratch-gui/release.config.js @@ -6,14 +6,19 @@ module.exports = { // default channel }, { - name: 'hotfix/REPLACE', // replace with actual hotfix branch name - channel: 'hotfix', - prerelease: 'hotfix' + name: 'alpha', + channel: 'alpha', + prerelease: true }, { name: 'beta', channel: 'beta', prerelease: true + }, + { + name: 'hotfix/REPLACE', // replace with actual hotfix branch name + channel: 'hotfix', + prerelease: 'hotfix' } ] }; From 6d07604b3bf445a5a6131270192ca81f57d206a9 Mon Sep 17 00:00:00 2001 From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com> Date: Sun, 20 Oct 2024 19:06:26 -0700 Subject: [PATCH 051/521] chore(deps): update deps for spork test --- package-lock.json | 9 ++++----- packages/scratch-gui/package.json | 2 +- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2fe1ac2e562..9261f315d04 100644 --- a/package-lock.json +++ b/package-lock.json @@ -31018,10 +31018,9 @@ } }, "node_modules/scratch-blocks": { - "version": "2.0.0-beta.2", - "resolved": "https://registry.npmjs.org/scratch-blocks/-/scratch-blocks-2.0.0-beta.2.tgz", - "integrity": "sha512-j/2F1/tIGoPMeQHVIDXzEh21fdQTwhLDSCv9Qo8J0wIq+v2EYipHMbV3QvQloheBaXdTpLsn9SJnUjOmiICFUA==", - "deprecated": "Moved Blockly unforking test to 'spork' channel", + "version": "2.0.0-spork.1", + "resolved": "https://registry.npmjs.org/scratch-blocks/-/scratch-blocks-2.0.0-spork.1.tgz", + "integrity": "sha512-kA9T2rg1UZk6JVKwxZoPCz8uOZBhZ0eLi7nnFnZ4VZzzfItjCQQpdgPzbeBycEuEzlp3TIE2zP1G3jpthpkW0g==", "dependencies": { "@blockly/continuous-toolbox": "^6.0.9", "@blockly/field-colour": "^5.0.9", @@ -38483,7 +38482,7 @@ "react-virtualized": "9.22.5", "redux-throttle": "0.1.1", "scratch-audio": "2.0.73", - "scratch-blocks": "^2.0.0-beta", + "scratch-blocks": "2.0.0-spork.1", "scratch-l10n": "5.0.134", "scratch-paint": "3.0.144", "scratch-render-fonts": "1.0.165", diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index 15f216db688..f5d73b6c779 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -94,7 +94,7 @@ "react-virtualized": "9.22.5", "redux-throttle": "0.1.1", "scratch-audio": "2.0.73", - "scratch-blocks": "^2.0.0-beta", + "scratch-blocks": "2.0.0-spork.1", "scratch-l10n": "5.0.134", "scratch-paint": "3.0.144", "scratch-render-fonts": "1.0.165", From f28a71de37b3881474ff3446e58df2c7f6bece1c Mon Sep 17 00:00:00 2001 From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com> Date: Wed, 11 Dec 2024 09:36:58 -0800 Subject: [PATCH 052/521] chore(deps): update deps for spork test --- package-lock.json | 16 ++++++++-------- packages/scratch-gui/package.json | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9261f315d04..1d8030deaea 100644 --- a/package-lock.json +++ b/package-lock.json @@ -31018,13 +31018,13 @@ } }, "node_modules/scratch-blocks": { - "version": "2.0.0-spork.1", - "resolved": "https://registry.npmjs.org/scratch-blocks/-/scratch-blocks-2.0.0-spork.1.tgz", - "integrity": "sha512-kA9T2rg1UZk6JVKwxZoPCz8uOZBhZ0eLi7nnFnZ4VZzzfItjCQQpdgPzbeBycEuEzlp3TIE2zP1G3jpthpkW0g==", + "version": "2.0.0-spork.3", + "resolved": "https://registry.npmjs.org/scratch-blocks/-/scratch-blocks-2.0.0-spork.3.tgz", + "integrity": "sha512-luy2QtACBjhHT2rH2Zcvwevjb9zBnMWGwLnp9ydEXzbcFTptmYxFTmC8iFRPm6szxGiCw1pH48Qr3BwTGRKp8Q==", "dependencies": { "@blockly/continuous-toolbox": "^6.0.9", "@blockly/field-colour": "^5.0.9", - "blockly": "^11.0.0" + "blockly": "^12.0.0-beta.0" } }, "node_modules/scratch-blocks/node_modules/@blockly/continuous-toolbox": { @@ -31050,9 +31050,9 @@ } }, "node_modules/scratch-blocks/node_modules/blockly": { - "version": "11.2.1", - "resolved": "https://registry.npmjs.org/blockly/-/blockly-11.2.1.tgz", - "integrity": "sha512-20sCwSwX2Z6UxR/er0B5y6wRFukuIdvOjc7jMuIwyCO/yT35+UbAqYueMga3JFA9NoWPwQc+3s6/XnLkyceAww==", + "version": "12.0.0-beta.1", + "resolved": "https://registry.npmjs.org/blockly/-/blockly-12.0.0-beta.1.tgz", + "integrity": "sha512-lECwZ4K+YuLXMM0yxWTz1lwkmDl424sst7h/dhtSefuCki8afjI/F87byYK/ZIZsMKBEz2+8wEJ1Wlx5cYWIAg==", "dependencies": { "jsdom": "25.0.1" }, @@ -38482,7 +38482,7 @@ "react-virtualized": "9.22.5", "redux-throttle": "0.1.1", "scratch-audio": "2.0.73", - "scratch-blocks": "2.0.0-spork.1", + "scratch-blocks": "2.0.0-spork.3", "scratch-l10n": "5.0.134", "scratch-paint": "3.0.144", "scratch-render-fonts": "1.0.165", diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index f5d73b6c779..3c55c42a513 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -94,7 +94,7 @@ "react-virtualized": "9.22.5", "redux-throttle": "0.1.1", "scratch-audio": "2.0.73", - "scratch-blocks": "2.0.0-spork.1", + "scratch-blocks": "2.0.0-spork.3", "scratch-l10n": "5.0.134", "scratch-paint": "3.0.144", "scratch-render-fonts": "1.0.165", From c2a5fe2cfae801ae8e5eca43ba2f852ce9f497df Mon Sep 17 00:00:00 2001 From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com> Date: Wed, 11 Dec 2024 10:50:25 -0800 Subject: [PATCH 053/521] style: re-apply existing lint rules --- .../src/components/monitor/monitor.jsx | 121 ++-- .../scratch-gui/src/containers/blocks.jsx | 597 +++++++----------- .../src/containers/custom-procedures.jsx | 111 ++-- packages/scratch-gui/src/lib/blocks.js | 293 +++------ .../src/lib/define-dynamic-block.js | 100 ++- .../scratch-gui/src/lib/make-toolbox-xml.js | 315 +++------ .../src/lib/themes/blockHelpers.js | 51 +- .../src/lib/themes/default/index.js | 140 ++-- .../src/lib/themes/high-contrast/index.js | 131 ++-- 9 files changed, 736 insertions(+), 1123 deletions(-) diff --git a/packages/scratch-gui/src/components/monitor/monitor.jsx b/packages/scratch-gui/src/components/monitor/monitor.jsx index e398445708f..52be964d83d 100644 --- a/packages/scratch-gui/src/components/monitor/monitor.jsx +++ b/packages/scratch-gui/src/components/monitor/monitor.jsx @@ -1,56 +1,52 @@ -import React from "react"; -import ReactDOM from "react-dom"; -import PropTypes from "prop-types"; -import Draggable from "react-draggable"; -import { FormattedMessage } from "react-intl"; -import { ContextMenuTrigger } from "react-contextmenu"; -import { - BorderedMenuItem, - ContextMenu, - MenuItem, -} from "../context-menu/context-menu.jsx"; -import Box from "../box/box.jsx"; -import DefaultMonitor from "./default-monitor.jsx"; -import LargeMonitor from "./large-monitor.jsx"; -import SliderMonitor from "../../containers/slider-monitor.jsx"; -import ListMonitor from "../../containers/list-monitor.jsx"; -import { getColorsForTheme } from "../../lib/themes/index.js"; +import React from 'react'; +import ReactDOM from 'react-dom'; +import PropTypes from 'prop-types'; +import Draggable from 'react-draggable'; +import {FormattedMessage} from 'react-intl'; +import {ContextMenuTrigger} from 'react-contextmenu'; +import {BorderedMenuItem, ContextMenu, MenuItem} from '../context-menu/context-menu.jsx'; +import Box from '../box/box.jsx'; +import DefaultMonitor from './default-monitor.jsx'; +import LargeMonitor from './large-monitor.jsx'; +import SliderMonitor from '../../containers/slider-monitor.jsx'; +import ListMonitor from '../../containers/list-monitor.jsx'; +import {getColorsForTheme} from '../../lib/themes/index.js'; -import styles from "./monitor.css"; +import styles from './monitor.css'; // Map category name to color name used in scratch-blocks Blockly.Colours. Note // that Blockly uses the UK spelling of "colour", so fields that interact // directly with Blockly follow that convention, while Scratch code uses the US // spelling of "color". const categoryColorMap = { - data: "data", - sensing: "sensing", - sound: "sounds", - looks: "looks", - motion: "motion", - list: "data_lists", - extension: "pen", + data: 'data', + sensing: 'sensing', + sound: 'sounds', + looks: 'looks', + motion: 'motion', + list: 'data_lists', + extension: 'pen' }; const modes = { default: DefaultMonitor, large: LargeMonitor, slider: SliderMonitor, - list: ListMonitor, + list: ListMonitor }; const getCategoryColor = (theme, category) => { const colors = getColorsForTheme(theme); return { background: colors[categoryColorMap[category]].colourPrimary, - text: colors.text, + text: colors.text }; }; -const MonitorComponent = (props) => ( +const MonitorComponent = props => ( ( {React.createElement(modes[props.mode], { - categoryColor: getCategoryColor( - props.theme, - props.category - ), - ...props, + categoryColor: getCategoryColor(props.theme, props.category), + ...props })} - {ReactDOM.createPortal( + {ReactDOM.createPortal(( // Use a portal to render the context menu outside the flow to avoid // positioning conflicts between the monitors `transform: scale` and // the context menus `position: fixed`. For more details, see // http://meyerweb.com/eric/thoughts/2011/09/12/un-fixing-fixed-elements-with-css-transforms/ - {props.onSetModeToDefault && ( + {props.onSetModeToDefault && - - )} - {props.onSetModeToLarge && ( + } + {props.onSetModeToLarge && - - )} - {props.onSetModeToSlider && ( + } + {props.onSetModeToSlider && - - )} - {props.onSliderPromptOpen && props.mode === "slider" && ( + } + {props.onSliderPromptOpen && props.mode === 'slider' && - - )} - {props.onImport && ( + } + {props.onImport && - - )} - {props.onExport && ( + } + {props.onExport && - - )} - {props.onHide && ( + } + {props.onHide && - - )} - , - document.body - )} + } + + ), document.body)} + ); const monitorModes = Object.keys(modes); @@ -170,12 +152,15 @@ MonitorComponent.propTypes = { onSetModeToLarge: PropTypes.func, onSetModeToSlider: PropTypes.func, onSliderPromptOpen: PropTypes.func, - theme: PropTypes.string.isRequired, + theme: PropTypes.string.isRequired }; MonitorComponent.defaultProps = { - category: "extension", - mode: "default", + category: 'extension', + mode: 'default' }; -export { MonitorComponent as default, monitorModes }; +export { + MonitorComponent as default, + monitorModes +}; diff --git a/packages/scratch-gui/src/containers/blocks.jsx b/packages/scratch-gui/src/containers/blocks.jsx index 1c759423c8a..f1cd7ee618c 100644 --- a/packages/scratch-gui/src/containers/blocks.jsx +++ b/packages/scratch-gui/src/containers/blocks.jsx @@ -1,50 +1,43 @@ -import bindAll from "lodash.bindall"; -import debounce from "lodash.debounce"; -import defaultsDeep from "lodash.defaultsdeep"; -import makeToolboxXML from "../lib/make-toolbox-xml"; -import PropTypes from "prop-types"; -import React from "react"; -import VMScratchBlocks from "../lib/blocks"; -import VM from "@scratch/scratch-vm"; - -import log from "../lib/log.js"; -import Prompt from "./prompt.jsx"; -import BlocksComponent from "../components/blocks/blocks.jsx"; -import ExtensionLibrary from "./extension-library.jsx"; -import extensionData from "../lib/libraries/extensions/index.jsx"; -import CustomProcedures from "./custom-procedures.jsx"; -import errorBoundaryHOC from "../lib/error-boundary-hoc.jsx"; -import { - BLOCKS_DEFAULT_SCALE, - STAGE_DISPLAY_SIZES, -} from "../lib/layout-constants"; -import DropAreaHOC from "../lib/drop-area-hoc.jsx"; -import DragConstants from "../lib/drag-constants"; -import defineDynamicBlock from "../lib/define-dynamic-block"; -import { DEFAULT_THEME, getColorsForTheme, themeMap } from "../lib/themes"; +import bindAll from 'lodash.bindall'; +import debounce from 'lodash.debounce'; +import defaultsDeep from 'lodash.defaultsdeep'; +import makeToolboxXML from '../lib/make-toolbox-xml'; +import PropTypes from 'prop-types'; +import React from 'react'; +import VMScratchBlocks from '../lib/blocks'; +import VM from '@scratch/scratch-vm'; + +import log from '../lib/log.js'; +import Prompt from './prompt.jsx'; +import BlocksComponent from '../components/blocks/blocks.jsx'; +import ExtensionLibrary from './extension-library.jsx'; +import extensionData from '../lib/libraries/extensions/index.jsx'; +import CustomProcedures from './custom-procedures.jsx'; +import errorBoundaryHOC from '../lib/error-boundary-hoc.jsx'; +import {BLOCKS_DEFAULT_SCALE, STAGE_DISPLAY_SIZES} from '../lib/layout-constants'; +import DropAreaHOC from '../lib/drop-area-hoc.jsx'; +import DragConstants from '../lib/drag-constants'; +import defineDynamicBlock from '../lib/define-dynamic-block'; +import {DEFAULT_THEME, getColorsForTheme, themeMap} from '../lib/themes'; import { injectExtensionBlockIcons, injectExtensionCategoryTheme, - getExtensionColors, -} from "../lib/themes/blockHelpers"; + getExtensionColors +} from '../lib/themes/blockHelpers'; + +import {connect} from 'react-redux'; +import {updateToolbox} from '../reducers/toolbox'; +import {activateColorPicker} from '../reducers/color-picker'; +import {closeExtensionLibrary, openSoundRecorder, openConnectionModal} from '../reducers/modals'; +import {activateCustomProcedures, deactivateCustomProcedures} from '../reducers/custom-procedures'; +import {setConnectionModalExtensionId} from '../reducers/connection-modal'; +import {updateMetrics} from '../reducers/workspace-metrics'; +import {isTimeTravel2020} from '../reducers/time-travel'; -import { connect } from "react-redux"; -import { updateToolbox } from "../reducers/toolbox"; -import { activateColorPicker } from "../reducers/color-picker"; -import { - closeExtensionLibrary, - openSoundRecorder, - openConnectionModal, -} from "../reducers/modals"; import { - activateCustomProcedures, - deactivateCustomProcedures, -} from "../reducers/custom-procedures"; -import { setConnectionModalExtensionId } from "../reducers/connection-modal"; -import { updateMetrics } from "../reducers/workspace-metrics"; -import { isTimeTravel2020 } from "../reducers/time-travel"; - -import { activateTab, SOUNDS_TAB_INDEX } from "../reducers/editor-tab"; + activateTab, + SOUNDS_TAB_INDEX +} from '../reducers/editor-tab'; const addFunctionListener = (object, property, callback) => { const oldFn = object[property]; @@ -55,73 +48,65 @@ const addFunctionListener = (object, property, callback) => { }; }; -const DroppableBlocks = DropAreaHOC([DragConstants.BACKPACK_CODE])( - BlocksComponent -); +const DroppableBlocks = DropAreaHOC([ + DragConstants.BACKPACK_CODE +])(BlocksComponent); class Blocks extends React.Component { - constructor(props) { + constructor (props) { super(props); this.ScratchBlocks = VMScratchBlocks(props.vm, false); bindAll(this, [ - "attachVM", - "detachVM", - "getToolboxXML", - "handleCategorySelected", - "handleConnectionModalStart", - "handleDrop", - "handleStatusButtonUpdate", - "handleOpenSoundRecorder", - "handlePromptStart", - "handlePromptCallback", - "handlePromptClose", - "handleCustomProceduresClose", - "onScriptGlowOn", - "onScriptGlowOff", - "onBlockGlowOn", - "onBlockGlowOff", - "handleMonitorsUpdate", - "handleExtensionAdded", - "handleBlocksInfoUpdate", - "onTargetsUpdate", - "onVisualReport", - "onWorkspaceUpdate", - "onWorkspaceMetricsChange", - "setBlocks", - "setLocale", + 'attachVM', + 'detachVM', + 'getToolboxXML', + 'handleCategorySelected', + 'handleConnectionModalStart', + 'handleDrop', + 'handleStatusButtonUpdate', + 'handleOpenSoundRecorder', + 'handlePromptStart', + 'handlePromptCallback', + 'handlePromptClose', + 'handleCustomProceduresClose', + 'onScriptGlowOn', + 'onScriptGlowOff', + 'onBlockGlowOn', + 'onBlockGlowOff', + 'handleMonitorsUpdate', + 'handleExtensionAdded', + 'handleBlocksInfoUpdate', + 'onTargetsUpdate', + 'onVisualReport', + 'onWorkspaceUpdate', + 'onWorkspaceMetricsChange', + 'setBlocks', + 'setLocale' ]); this.ScratchBlocks.dialog.setPrompt(this.handlePromptStart); this.ScratchBlocks.ScratchVariables.setPromptHandler( this.handlePromptStart ); - this.ScratchBlocks.StatusIndicatorLabel.statusButtonCallback = - this.handleConnectionModalStart; + this.ScratchBlocks.StatusIndicatorLabel.statusButtonCallback = this.handleConnectionModalStart; this.ScratchBlocks.recordSoundCallback = this.handleOpenSoundRecorder; this.state = { - prompt: null, + prompt: null }; this.onTargetsUpdate = debounce(this.onTargetsUpdate, 100); this.toolboxUpdateQueue = []; } - componentDidMount() { - this.ScratchBlocks = VMScratchBlocks( - this.props.vm, - this.props.useCatBlocks - ); + componentDidMount () { + this.ScratchBlocks = VMScratchBlocks(this.props.vm, this.props.useCatBlocks); this.ScratchBlocks.dialog.setPrompt(this.handlePromptStart); - this.ScratchBlocks.StatusIndicatorLabel.statusButtonCallback = - this.handleConnectionModalStart; + this.ScratchBlocks.StatusIndicatorLabel.statusButtonCallback = this.handleConnectionModalStart; this.ScratchBlocks.recordSoundCallback = this.handleOpenSoundRecorder; - this.ScratchBlocks.FieldColourSlider.activateEyedropper_ = - this.props.onActivateColorPicker; - this.ScratchBlocks.ScratchProcedures.externalProcedureDefCallback = - this.props.onActivateCustomProcedures; + this.ScratchBlocks.FieldColourSlider.activateEyedropper_ = this.props.onActivateColorPicker; + this.ScratchBlocks.ScratchProcedures.externalProcedureDefCallback = this.props.onActivateCustomProcedures; this.ScratchBlocks.ScratchMsgs.setLocale(this.props.locale); - const workspaceConfig = defaultsDeep( - {}, + const workspaceConfig = defaultsDeep({}, Blocks.defaultOptions, this.props.options, { @@ -130,34 +115,31 @@ class Blocks extends React.Component { theme: new this.ScratchBlocks.Theme( this.props.theme, getColorsForTheme(this.props.theme) - ), + ) } ); - this.workspace = this.ScratchBlocks.inject( - this.blocks, - workspaceConfig - ); + this.workspace = this.ScratchBlocks.inject(this.blocks, workspaceConfig); this.workspace.registerToolboxCategoryCallback( - "VARIABLE", + 'VARIABLE', this.ScratchBlocks.ScratchVariables.getVariablesCategory ); this.workspace.registerToolboxCategoryCallback( - "PROCEDURE", + 'PROCEDURE', this.ScratchBlocks.ScratchProcedures.getProceduresCategory ); - this.toolboxUpdateChangeListener = (event) => { + this.toolboxUpdateChangeListener = event => { if ( event.type === this.ScratchBlocks.Events.VAR_CREATE || event.type === this.ScratchBlocks.Events.VAR_RENAME || event.type === this.ScratchBlocks.Events.VAR_DELETE || (event.type === this.ScratchBlocks.Events.BLOCK_DELETE && - event.oldJson.type === "procedures_definition") || + event.oldJson.type === 'procedures_definition') || // Only refresh the toolbox when procedure block creations are // triggered by undoing a deletion (implied by recordUndo being // false on the event). (event.type === this.ScratchBlocks.Events.BLOCK_CREATE && - event.json.type === "procedures_definition" && + event.json.type === 'procedures_definition' && !event.recordUndo) ) { this.requestToolboxUpdate(); @@ -170,30 +152,15 @@ class Blocks extends React.Component { const toolboxWorkspace = this.workspace.getFlyout().getWorkspace(); - const varListButtonCallback = (type) => () => - this.ScratchBlocks.ScratchVariables.createVariable( - this.workspace, - null, - type - ); + const varListButtonCallback = type => + (() => this.ScratchBlocks.ScratchVariables.createVariable(this.workspace, null, type)); const procButtonCallback = () => { - this.ScratchBlocks.ScratchProcedures.createProcedureDefCallback( - this.workspace - ); + this.ScratchBlocks.ScratchProcedures.createProcedureDefCallback(this.workspace); }; - toolboxWorkspace.registerButtonCallback( - "MAKE_A_VARIABLE", - varListButtonCallback("") - ); - toolboxWorkspace.registerButtonCallback( - "MAKE_A_LIST", - varListButtonCallback("list") - ); - toolboxWorkspace.registerButtonCallback( - "MAKE_A_PROCEDURE", - procButtonCallback - ); + toolboxWorkspace.registerButtonCallback('MAKE_A_VARIABLE', varListButtonCallback('')); + toolboxWorkspace.registerButtonCallback('MAKE_A_LIST', varListButtonCallback('list')); + toolboxWorkspace.registerButtonCallback('MAKE_A_PROCEDURE', procButtonCallback); // Store the xml of the toolbox that is actually rendered. // This is used in componentDidUpdate instead of prevProps, because @@ -201,16 +168,8 @@ class Blocks extends React.Component { this._renderedToolboxXML = this.props.toolboxXML; // @todo change this when blockly supports UI events - addFunctionListener( - this.workspace, - "translate", - this.onWorkspaceMetricsChange - ); - addFunctionListener( - this.workspace, - "zoom", - this.onWorkspaceMetricsChange - ); + addFunctionListener(this.workspace, 'translate', this.onWorkspaceMetricsChange); + addFunctionListener(this.workspace, 'zoom', this.onWorkspaceMetricsChange); this.workspace.getToolbox().selectItemByPosition(0); this.attachVM(); @@ -220,21 +179,19 @@ class Blocks extends React.Component { this.setLocale(); } } - shouldComponentUpdate(nextProps, nextState) { + shouldComponentUpdate (nextProps, nextState) { return ( this.state.prompt !== nextState.prompt || this.props.isVisible !== nextProps.isVisible || this._renderedToolboxXML !== nextProps.toolboxXML || - this.props.extensionLibraryVisible !== - nextProps.extensionLibraryVisible || - this.props.customProceduresVisible !== - nextProps.customProceduresVisible || + this.props.extensionLibraryVisible !== nextProps.extensionLibraryVisible || + this.props.customProceduresVisible !== nextProps.customProceduresVisible || this.props.locale !== nextProps.locale || this.props.anyModalVisible !== nextProps.anyModalVisible || this.props.stageSize !== nextProps.stageSize ); } - componentDidUpdate(prevProps) { + componentDidUpdate (prevProps) { // If any modals are open, call hideChaff to close z-indexed field editors if (this.props.anyModalVisible && !prevProps.anyModalVisible) { this.ScratchBlocks.hideChaff(); @@ -243,29 +200,22 @@ class Blocks extends React.Component { // Only rerender the toolbox when the blocks are visible and the xml is // different from the previously rendered toolbox xml. // Do not check against prevProps.toolboxXML because that may not have been rendered. - if ( - this.props.isVisible && - this.props.toolboxXML !== this._renderedToolboxXML - ) { + if (this.props.isVisible && this.props.toolboxXML !== this._renderedToolboxXML) { this.requestToolboxUpdate(); } if (this.props.isVisible === prevProps.isVisible) { if (this.props.stageSize !== prevProps.stageSize) { // force workspace to redraw for the new stage size - window.dispatchEvent(new Event("resize")); + window.dispatchEvent(new Event('resize')); } return; } // @todo hack to resize blockly manually in case resize happened while hidden // @todo hack to reload the workspace due to gui bug #413 - if (this.props.isVisible) { - // Scripts tab + if (this.props.isVisible) { // Scripts tab this.workspace.setVisible(true); - if ( - prevProps.locale !== this.props.locale || - this.props.locale !== this.props.vm.getLocale() - ) { + if (prevProps.locale !== this.props.locale || this.props.locale !== this.props.vm.getLocale()) { // call setLocale if the locale has changed, or changed while the blocks were hidden. // vm.getLocale() will be out of sync if locale was changed while not visible this.setLocale(); @@ -273,12 +223,12 @@ class Blocks extends React.Component { this.props.vm.refreshWorkspace(); } - window.dispatchEvent(new Event("resize")); + window.dispatchEvent(new Event('resize')); } else { this.workspace.setVisible(false); } } - componentWillUnmount() { + componentWillUnmount () { this.detachVM(); this.workspace.dispose(); clearTimeout(this.toolboxUpdateTimeout); @@ -286,16 +236,15 @@ class Blocks extends React.Component { // Clear the flyout blocks so that they can be recreated on mount. this.props.vm.clearFlyoutBlocks(); } - requestToolboxUpdate() { + requestToolboxUpdate () { clearTimeout(this.toolboxUpdateTimeout); this.toolboxUpdateTimeout = setTimeout(() => { this.updateToolbox(); }, 0); } - setLocale() { + setLocale () { this.ScratchBlocks.ScratchMsgs.setLocale(this.props.locale); - this.props.vm - .setLocale(this.props.locale, this.props.messages) + this.props.vm.setLocale(this.props.locale, this.props.messages) .then(() => { this.workspace.getFlyout().setRecyclingEnabled(false); this.props.vm.refreshWorkspace(); @@ -305,7 +254,7 @@ class Blocks extends React.Component { }); } - updateToolbox() { + updateToolbox () { this.toolboxUpdateTimeout = false; const scale = this.workspace.getFlyout().getWorkspace().scale; @@ -318,7 +267,8 @@ class Blocks extends React.Component { .getFlyout() .getCategoryScrollPosition(selectedCategoryName).y * scale; const offsetWithinCategory = - this.workspace.getFlyout().getWorkspace().getMetrics().viewTop - + this.workspace.getFlyout().getWorkspace() + .getMetrics().viewTop - selectedCategoryScrollPosition; this.workspace.updateToolbox(this.props.toolboxXML); @@ -333,16 +283,16 @@ class Blocks extends React.Component { .getFlyout() .getWorkspace() .scrollbar.setY( - newCategoryScrollPosition.y * scale + offsetWithinCategory + (newCategoryScrollPosition.y * scale) + offsetWithinCategory ); } const queue = this.toolboxUpdateQueue; this.toolboxUpdateQueue = []; - queue.forEach((fn) => fn()); + queue.forEach(fn => fn()); } - withToolboxUpdates(fn) { + withToolboxUpdates (fn) { // if there is a queued toolbox update, we need to wait if (this.toolboxUpdateTimeout) { this.toolboxUpdateQueue.push(fn); @@ -351,68 +301,42 @@ class Blocks extends React.Component { } } - attachVM() { + attachVM () { this.workspace.addChangeListener(this.props.vm.blockListener); - this.flyoutWorkspace = this.workspace.getFlyout().getWorkspace(); - this.flyoutWorkspace.addChangeListener( - this.props.vm.flyoutBlockListener - ); - this.flyoutWorkspace.addChangeListener( - this.props.vm.monitorBlockListener - ); - this.props.vm.addListener("SCRIPT_GLOW_ON", this.onScriptGlowOn); - this.props.vm.addListener("SCRIPT_GLOW_OFF", this.onScriptGlowOff); - this.props.vm.addListener("BLOCK_GLOW_ON", this.onBlockGlowOn); - this.props.vm.addListener("BLOCK_GLOW_OFF", this.onBlockGlowOff); - this.props.vm.addListener("VISUAL_REPORT", this.onVisualReport); - this.props.vm.addListener("workspaceUpdate", this.onWorkspaceUpdate); - this.props.vm.addListener("targetsUpdate", this.onTargetsUpdate); - this.props.vm.addListener("MONITORS_UPDATE", this.handleMonitorsUpdate); - this.props.vm.addListener("EXTENSION_ADDED", this.handleExtensionAdded); - this.props.vm.addListener( - "BLOCKSINFO_UPDATE", - this.handleBlocksInfoUpdate - ); - this.props.vm.addListener( - "PERIPHERAL_CONNECTED", - this.handleStatusButtonUpdate - ); - this.props.vm.addListener( - "PERIPHERAL_DISCONNECTED", - this.handleStatusButtonUpdate - ); - } - detachVM() { - this.props.vm.removeListener("SCRIPT_GLOW_ON", this.onScriptGlowOn); - this.props.vm.removeListener("SCRIPT_GLOW_OFF", this.onScriptGlowOff); - this.props.vm.removeListener("BLOCK_GLOW_ON", this.onBlockGlowOn); - this.props.vm.removeListener("BLOCK_GLOW_OFF", this.onBlockGlowOff); - this.props.vm.removeListener("VISUAL_REPORT", this.onVisualReport); - this.props.vm.removeListener("workspaceUpdate", this.onWorkspaceUpdate); - this.props.vm.removeListener("targetsUpdate", this.onTargetsUpdate); - this.props.vm.removeListener( - "MONITORS_UPDATE", - this.handleMonitorsUpdate - ); - this.props.vm.removeListener( - "EXTENSION_ADDED", - this.handleExtensionAdded - ); - this.props.vm.removeListener( - "BLOCKSINFO_UPDATE", - this.handleBlocksInfoUpdate - ); - this.props.vm.removeListener( - "PERIPHERAL_CONNECTED", - this.handleStatusButtonUpdate - ); - this.props.vm.removeListener( - "PERIPHERAL_DISCONNECTED", - this.handleStatusButtonUpdate - ); - } - - updateToolboxBlockValue(id, value) { + this.flyoutWorkspace = this.workspace + .getFlyout() + .getWorkspace(); + this.flyoutWorkspace.addChangeListener(this.props.vm.flyoutBlockListener); + this.flyoutWorkspace.addChangeListener(this.props.vm.monitorBlockListener); + this.props.vm.addListener('SCRIPT_GLOW_ON', this.onScriptGlowOn); + this.props.vm.addListener('SCRIPT_GLOW_OFF', this.onScriptGlowOff); + this.props.vm.addListener('BLOCK_GLOW_ON', this.onBlockGlowOn); + this.props.vm.addListener('BLOCK_GLOW_OFF', this.onBlockGlowOff); + this.props.vm.addListener('VISUAL_REPORT', this.onVisualReport); + this.props.vm.addListener('workspaceUpdate', this.onWorkspaceUpdate); + this.props.vm.addListener('targetsUpdate', this.onTargetsUpdate); + this.props.vm.addListener('MONITORS_UPDATE', this.handleMonitorsUpdate); + this.props.vm.addListener('EXTENSION_ADDED', this.handleExtensionAdded); + this.props.vm.addListener('BLOCKSINFO_UPDATE', this.handleBlocksInfoUpdate); + this.props.vm.addListener('PERIPHERAL_CONNECTED', this.handleStatusButtonUpdate); + this.props.vm.addListener('PERIPHERAL_DISCONNECTED', this.handleStatusButtonUpdate); + } + detachVM () { + this.props.vm.removeListener('SCRIPT_GLOW_ON', this.onScriptGlowOn); + this.props.vm.removeListener('SCRIPT_GLOW_OFF', this.onScriptGlowOff); + this.props.vm.removeListener('BLOCK_GLOW_ON', this.onBlockGlowOn); + this.props.vm.removeListener('BLOCK_GLOW_OFF', this.onBlockGlowOff); + this.props.vm.removeListener('VISUAL_REPORT', this.onVisualReport); + this.props.vm.removeListener('workspaceUpdate', this.onWorkspaceUpdate); + this.props.vm.removeListener('targetsUpdate', this.onTargetsUpdate); + this.props.vm.removeListener('MONITORS_UPDATE', this.handleMonitorsUpdate); + this.props.vm.removeListener('EXTENSION_ADDED', this.handleExtensionAdded); + this.props.vm.removeListener('BLOCKSINFO_UPDATE', this.handleBlocksInfoUpdate); + this.props.vm.removeListener('PERIPHERAL_CONNECTED', this.handleStatusButtonUpdate); + this.props.vm.removeListener('PERIPHERAL_DISCONNECTED', this.handleStatusButtonUpdate); + } + + updateToolboxBlockValue (id, value) { this.withToolboxUpdates(() => { const block = this.workspace .getFlyout() @@ -424,21 +348,15 @@ class Blocks extends React.Component { }); } - onTargetsUpdate() { + onTargetsUpdate () { if (this.props.vm.editingTarget && this.workspace.getFlyout()) { - ["glide", "move", "set"].forEach((prefix) => { - this.updateToolboxBlockValue( - `${prefix}x`, - Math.round(this.props.vm.editingTarget.x).toString() - ); - this.updateToolboxBlockValue( - `${prefix}y`, - Math.round(this.props.vm.editingTarget.y).toString() - ); + ['glide', 'move', 'set'].forEach(prefix => { + this.updateToolboxBlockValue(`${prefix}x`, Math.round(this.props.vm.editingTarget.x).toString()); + this.updateToolboxBlockValue(`${prefix}y`, Math.round(this.props.vm.editingTarget.y).toString()); }); } } - onWorkspaceMetricsChange() { + onWorkspaceMetricsChange () { const target = this.props.vm.editingTarget; if (target && target.id) { // Dispatch updateMetrics later, since onWorkspaceMetricsChange may be (very indirectly) @@ -449,32 +367,32 @@ class Blocks extends React.Component { targetID: target.id, scrollX: this.workspace.scrollX, scrollY: this.workspace.scrollY, - scale: this.workspace.scale, + scale: this.workspace.scale }); }, 0); } } - onScriptGlowOn(data) { + onScriptGlowOn (data) { this.ScratchBlocks.glowStack(data.id, true); } - onScriptGlowOff(data) { + onScriptGlowOff (data) { this.ScratchBlocks.glowStack(data.id, false); } - onBlockGlowOn(data) { + onBlockGlowOn (/* data */) { // No-op, support may be added in the future } - onBlockGlowOff(data) { + onBlockGlowOff (/* data */) { // No-op, support may be added in the future } - onVisualReport(data) { + onVisualReport (data) { this.ScratchBlocks.reportValue(data.id, data.value); } - getToolboxXML() { + getToolboxXML () { // Use try/catch because this requires digging pretty deep into the VM // Code inside intentionally ignores several error situations (no stage, etc.) // Because they would get caught by this try/catch try { - let { editingTarget: target, runtime } = this.props.vm; + let {editingTarget: target, runtime} = this.props.vm; const stage = runtime.getTargetForStage(); if (!target) target = stage; // If no editingTarget, use the stage @@ -485,33 +403,24 @@ class Blocks extends React.Component { this.props.vm.runtime.getBlocksXML(target), this.props.theme ); - return makeToolboxXML( - false, - target.isStage, - target.id, - dynamicBlocksXML, + return makeToolboxXML(false, target.isStage, target.id, dynamicBlocksXML, targetCostumes[targetCostumes.length - 1].name, stageCostumes[stageCostumes.length - 1].name, - targetSounds.length > 0 - ? targetSounds[targetSounds.length - 1].name - : "", + targetSounds.length > 0 ? targetSounds[targetSounds.length - 1].name : '', getColorsForTheme(this.props.theme) ); } catch { return null; } } - onWorkspaceUpdate(data) { + onWorkspaceUpdate (data) { // When we change sprites, update the toolbox to have the new sprite's blocks const toolboxXML = this.getToolboxXML(); if (toolboxXML) { this.props.updateToolboxState(toolboxXML); } - if ( - this.props.vm.editingTarget && - !this.props.workspaceMetrics.targets[this.props.vm.editingTarget.id] - ) { + if (this.props.vm.editingTarget && !this.props.workspaceMetrics.targets[this.props.vm.editingTarget.id]) { this.onWorkspaceMetricsChange(); } @@ -520,10 +429,7 @@ class Blocks extends React.Component { this.workspace.removeChangeListener(this.toolboxUpdateChangeListener); const dom = this.ScratchBlocks.utils.xml.textToDom(data.xml); try { - this.ScratchBlocks.Xml.clearWorkspaceAndLoadFromXml( - dom, - this.workspace - ); + this.ScratchBlocks.Xml.clearWorkspaceAndLoadFromXml(dom, this.workspace); } catch (error) { // The workspace is likely incomplete. What did update should be // functional. @@ -541,14 +447,8 @@ class Blocks extends React.Component { } this.workspace.addChangeListener(this.props.vm.blockListener); - if ( - this.props.vm.editingTarget && - this.props.workspaceMetrics.targets[this.props.vm.editingTarget.id] - ) { - const { scrollX, scrollY, scale } = - this.props.workspaceMetrics.targets[ - this.props.vm.editingTarget.id - ]; + if (this.props.vm.editingTarget && this.props.workspaceMetrics.targets[this.props.vm.editingTarget.id]) { + const {scrollX, scrollY, scale} = this.props.workspaceMetrics.targets[this.props.vm.editingTarget.id]; this.workspace.scrollX = scrollX; this.workspace.scrollY = scrollY; this.workspace.scale = scale; @@ -569,14 +469,14 @@ class Blocks extends React.Component { }); }); } - handleMonitorsUpdate(monitors) { + handleMonitorsUpdate (monitors) { // Update the checkboxes of the relevant monitors. // TODO: What about monitors that have fields? See todo in scratch-vm blocks.js changeBlock: // https://github.com/LLK/scratch-vm/blob/2373f9483edaf705f11d62662f7bb2a57fbb5e28/src/engine/blocks.js#L569-L576 const flyout = this.workspace.getFlyout(); for (const monitor of monitors.values()) { - const blockId = monitor.get("id"); - const isVisible = monitor.get("visible"); + const blockId = monitor.get('id'); + const isVisible = monitor.get('visible'); flyout.setCheckboxState(blockId, isVisible); // We also need to update the isMonitored flag for this block on the VM, since it's used to determine // whether the checkbox is activated or not when the checkbox is re-displayed (e.g. local variables/blocks @@ -587,37 +487,28 @@ class Blocks extends React.Component { } } } - handleExtensionAdded(categoryInfo) { - const defineBlocks = (blockInfoArray) => { + handleExtensionAdded (categoryInfo) { + const defineBlocks = blockInfoArray => { if (blockInfoArray && blockInfoArray.length > 0) { const staticBlocksJson = []; const dynamicBlocksInfo = []; - blockInfoArray.forEach((blockInfo) => { + blockInfoArray.forEach(blockInfo => { if (blockInfo.info && blockInfo.info.isDynamic) { dynamicBlocksInfo.push(blockInfo); } else if (blockInfo.json) { - staticBlocksJson.push( - injectExtensionBlockIcons( - blockInfo.json, - this.props.theme - ) - ); + staticBlocksJson.push(injectExtensionBlockIcons(blockInfo.json, this.props.theme)); } // otherwise it's a non-block entry such as '---' }); this.ScratchBlocks.defineBlocksWithJsonArray(staticBlocksJson); - dynamicBlocksInfo.forEach((blockInfo) => { + dynamicBlocksInfo.forEach(blockInfo => { // This is creating the block factory / constructor -- NOT a specific instance of the block. // The factory should only know static info about the block: the category info and the opcode. // Anything else will be picked up from the XML attached to the block instance. const extendedOpcode = `${categoryInfo.id}_${blockInfo.info.opcode}`; - const blockDefinition = defineDynamicBlock( - this.ScratchBlocks, - categoryInfo, - blockInfo, - extendedOpcode - ); + const blockDefinition = + defineDynamicBlock(this.ScratchBlocks, categoryInfo, blockInfo, extendedOpcode); this.ScratchBlocks.Blocks[extendedOpcode] = blockDefinition; }); } @@ -626,12 +517,8 @@ class Blocks extends React.Component { // scratch-blocks implements a menu or custom field as a special kind of block ("shadow" block) // these actually define blocks and MUST run regardless of the UI state defineBlocks( - Object.getOwnPropertyNames(categoryInfo.customFieldTypes).map( - (fieldTypeName) => - categoryInfo.customFieldTypes[fieldTypeName] - .scratchBlocksDefinition - ) - ); + Object.getOwnPropertyNames(categoryInfo.customFieldTypes) + .map(fieldTypeName => categoryInfo.customFieldTypes[fieldTypeName].scratchBlocksDefinition)); defineBlocks(categoryInfo.menus); defineBlocks(categoryInfo.blocks); // Note that Blockly uses the UK spelling of "colour", so fields that @@ -654,7 +541,7 @@ class Blocks extends React.Component { colourPrimary, colourSecondary, colourTertiary, - colourQuaternary, + colourQuaternary }); this.ScratchBlocks.getMainWorkspace() .getTheme() @@ -662,7 +549,7 @@ class Blocks extends React.Component { colourPrimary: colourQuaternary, colourSecondary: colourQuaternary, colourTertiary: colourQuaternary, - colourQuaternary: colourQuaternary, + colourQuaternary: colourQuaternary }); this.ScratchBlocks.getMainWorkspace().setTheme( this.ScratchBlocks.getMainWorkspace().getTheme() @@ -673,14 +560,12 @@ class Blocks extends React.Component { this.props.updateToolboxState(toolboxXML); } } - handleBlocksInfoUpdate(categoryInfo) { + handleBlocksInfoUpdate (categoryInfo) { // @todo Later we should replace this to avoid all the warnings from redefining blocks. this.handleExtensionAdded(categoryInfo); } - handleCategorySelected(categoryId) { - const extension = extensionData.find( - (ext) => ext.extensionId === categoryId - ); + handleCategorySelected (categoryId) { + const extension = extensionData.find(ext => ext.extensionId === categoryId); if (extension && extension.launchPeripheralConnectionFlow) { this.handleConnectionModalStart(categoryId); } @@ -690,35 +575,29 @@ class Blocks extends React.Component { toolbox.setSelectedItem(toolbox.getToolboxItemById(categoryId)); }); } - setBlocks(blocks) { + setBlocks (blocks) { this.blocks = blocks; } - handlePromptStart(message, defaultValue, callback, optTitle, optVarType) { - const p = { prompt: { callback, message, defaultValue } }; - p.prompt.title = optTitle - ? optTitle - : this.ScratchBlocks.Msg.VARIABLE_MODAL_TITLE; - p.prompt.varType = - typeof optVarType === "string" - ? optVarType - : this.ScratchBlocks.SCALAR_VARIABLE_TYPE; + handlePromptStart (message, defaultValue, callback, optTitle, optVarType) { + const p = {prompt: {callback, message, defaultValue}}; + p.prompt.title = optTitle ? optTitle : + this.ScratchBlocks.Msg.VARIABLE_MODAL_TITLE; + p.prompt.varType = typeof optVarType === 'string' ? + optVarType : this.ScratchBlocks.SCALAR_VARIABLE_TYPE; p.prompt.showVariableOptions = // This flag means that we should show variable/list options about scope optVarType !== this.ScratchBlocks.BROADCAST_MESSAGE_VARIABLE_TYPE && - p.prompt.title !== - this.ScratchBlocks.Msg.RENAME_VARIABLE_MODAL_TITLE && + p.prompt.title !== this.ScratchBlocks.Msg.RENAME_VARIABLE_MODAL_TITLE && p.prompt.title !== this.ScratchBlocks.Msg.RENAME_LIST_MODAL_TITLE; - p.prompt.showCloudOption = - optVarType === this.ScratchBlocks.SCALAR_VARIABLE_TYPE && - this.props.canUseCloud; + p.prompt.showCloudOption = (optVarType === this.ScratchBlocks.SCALAR_VARIABLE_TYPE) && this.props.canUseCloud; this.setState(p); } - handleConnectionModalStart(extensionId) { + handleConnectionModalStart (extensionId) { this.props.onOpenConnectionModal(extensionId); } - handleStatusButtonUpdate() { + handleStatusButtonUpdate () { this.workspace.getFlyout().refreshStatusButtons(); } - handleOpenSoundRecorder() { + handleOpenSoundRecorder () { this.props.onOpenSoundRecorder(); } @@ -727,39 +606,31 @@ class Blocks extends React.Component { * and additional potentially conflicting variable names from the VM * to the variable validation prompt callback used in scratch-blocks. */ - handlePromptCallback(input, variableOptions) { + handlePromptCallback (input, variableOptions) { this.state.prompt.callback( input, - this.props.vm.runtime.getAllVarNamesOfType( - this.state.prompt.varType - ), - variableOptions - ); + this.props.vm.runtime.getAllVarNamesOfType(this.state.prompt.varType), + variableOptions); this.handlePromptClose(); } - handlePromptClose() { - this.setState({ prompt: null }); + handlePromptClose () { + this.setState({prompt: null}); } - handleCustomProceduresClose(data) { + handleCustomProceduresClose (data) { this.props.onRequestCloseCustomProcedures(data); const ws = this.workspace; this.updateToolbox(); - ws.getToolbox().selectCategoryByName("myBlocks"); + ws.getToolbox().selectCategoryByName('myBlocks'); } - handleDrop(dragInfo) { + handleDrop (dragInfo) { fetch(dragInfo.payload.bodyUrl) - .then((response) => response.json()) - .then((blocks) => - this.props.vm.shareBlocksToTarget( - blocks, - this.props.vm.editingTarget.id - ) - ) + .then(response => response.json()) + .then(blocks => this.props.vm.shareBlocksToTarget(blocks, this.props.vm.editingTarget.id)) .then(() => { this.props.vm.refreshWorkspace(); }); } - render() { + render () { /* eslint-disable no-unused-vars */ const { anyModalVisible, @@ -797,15 +668,10 @@ class Blocks extends React.Component { ({ - anyModalVisible: - Object.keys(state.scratchGui.modals).some( - (key) => state.scratchGui.modals[key] - ) || state.scratchGui.mode.isFullScreen, +const mapStateToProps = state => ({ + anyModalVisible: ( + Object.keys(state.scratchGui.modals).some(key => state.scratchGui.modals[key]) || + state.scratchGui.mode.isFullScreen + ), extensionLibraryVisible: state.scratchGui.modals.extensionLibrary, isRtl: state.locales.isRtl, locale: state.locales.locale, @@ -910,15 +776,13 @@ const mapStateToProps = (state) => ({ toolboxXML: state.scratchGui.toolbox.toolboxXML, customProceduresVisible: state.scratchGui.customProcedures.active, workspaceMetrics: state.scratchGui.workspaceMetrics, - useCatBlocks: isTimeTravel2020(state), + useCatBlocks: isTimeTravel2020(state) }); -const mapDispatchToProps = (dispatch) => ({ - onActivateColorPicker: (callback) => - dispatch(activateColorPicker(callback)), - onActivateCustomProcedures: (data, callback) => - dispatch(activateCustomProcedures(data, callback)), - onOpenConnectionModal: (id) => { +const mapDispatchToProps = dispatch => ({ + onActivateColorPicker: callback => dispatch(activateColorPicker(callback)), + onActivateCustomProcedures: (data, callback) => dispatch(activateCustomProcedures(data, callback)), + onOpenConnectionModal: id => { dispatch(setConnectionModalExtensionId(id)); dispatch(openConnectionModal()); }, @@ -929,17 +793,20 @@ const mapDispatchToProps = (dispatch) => ({ onRequestCloseExtensionLibrary: () => { dispatch(closeExtensionLibrary()); }, - onRequestCloseCustomProcedures: (data) => { + onRequestCloseCustomProcedures: data => { dispatch(deactivateCustomProcedures(data)); }, - updateToolboxState: (toolboxXML) => { + updateToolboxState: toolboxXML => { dispatch(updateToolbox(toolboxXML)); }, - updateMetrics: (metrics) => { + updateMetrics: metrics => { dispatch(updateMetrics(metrics)); - }, + } }); -export default errorBoundaryHOC("Blocks")( - connect(mapStateToProps, mapDispatchToProps)(Blocks) +export default errorBoundaryHOC('Blocks')( + connect( + mapStateToProps, + mapDispatchToProps + )(Blocks) ); diff --git a/packages/scratch-gui/src/containers/custom-procedures.jsx b/packages/scratch-gui/src/containers/custom-procedures.jsx index 068b9097b16..522a8059a09 100644 --- a/packages/scratch-gui/src/containers/custom-procedures.jsx +++ b/packages/scratch-gui/src/containers/custom-procedures.jsx @@ -1,42 +1,41 @@ -import bindAll from "lodash.bindall"; -import defaultsDeep from "lodash.defaultsdeep"; -import PropTypes from "prop-types"; -import React from "react"; -import CustomProceduresComponent from "../components/custom-procedures/custom-procedures.jsx"; -import { getColorsForTheme, themeMap } from "../lib/themes"; -import { ScratchBlocks } from "scratch-blocks"; -import { connect } from "react-redux"; +import bindAll from 'lodash.bindall'; +import defaultsDeep from 'lodash.defaultsdeep'; +import PropTypes from 'prop-types'; +import React from 'react'; +import CustomProceduresComponent from '../components/custom-procedures/custom-procedures.jsx'; +import {getColorsForTheme, themeMap} from '../lib/themes'; +import {ScratchBlocks} from 'scratch-blocks'; +import {connect} from 'react-redux'; class CustomProcedures extends React.Component { - constructor(props) { + constructor (props) { super(props); bindAll(this, [ - "handleAddLabel", - "handleAddBoolean", - "handleAddTextNumber", - "handleToggleWarp", - "handleCancel", - "handleOk", - "setBlocks", + 'handleAddLabel', + 'handleAddBoolean', + 'handleAddTextNumber', + 'handleToggleWarp', + 'handleCancel', + 'handleOk', + 'setBlocks' ]); this.state = { rtlOffset: 0, - warp: false, + warp: false }; } - componentWillUnmount() { + componentWillUnmount () { if (this.workspace) { this.workspace.dispose(); } } - setBlocks(blocksRef) { + setBlocks (blocksRef) { if (!blocksRef) return; this.blocks = blocksRef; - const workspaceConfig = defaultsDeep( - {}, + const workspaceConfig = defaultsDeep({}, CustomProcedures.defaultOptions, this.props.options, - { rtl: this.props.isRtl } + {rtl: this.props.isRtl} ); const theme = new ScratchBlocks.Theme( @@ -47,7 +46,7 @@ class CustomProcedures extends React.Component { this.workspace = ScratchBlocks.inject(this.blocks, workspaceConfig); // Create the procedure declaration block for editing the mutation. - this.mutationRoot = this.workspace.newBlock("procedures_declaration"); + this.mutationRoot = this.workspace.newBlock('procedures_declaration'); // Make the declaration immovable, undeletable and have no context menu this.mutationRoot.setMovable(false); this.mutationRoot.setDeletable(false); @@ -57,9 +56,8 @@ class CustomProcedures extends React.Component { this.mutationRoot.onChangeFn(); // Keep the block centered on the workspace const metrics = this.workspace.getMetrics(); - const { x, y } = this.mutationRoot.getRelativeToSurfaceXY(); - const dy = - metrics.viewHeight / 2 - this.mutationRoot.height / 2 - y; + const {x, y} = this.mutationRoot.getRelativeToSurfaceXY(); + const dy = (metrics.viewHeight / 2) - (this.mutationRoot.height / 2) - y; let dx; if (this.props.isRtl) { // // TODO: https://github.com/LLK/scratch-gui/issues/2838 @@ -71,9 +69,8 @@ class CustomProcedures extends React.Component { // Calculate a new left postion based on new width // Convert current x position into LTR (mirror) x position (uses original offset) // Use the difference between ltrX and mirrorX as the amount to move - const ltrX = - metrics.viewWidth / 2 - this.mutationRoot.width / 2 + 25; - const mirrorX = x - (x - this.state.rtlOffset) * 2; + const ltrX = ((metrics.viewWidth / 2) - (this.mutationRoot.width / 2) + 25); + const mirrorX = x - ((x - this.state.rtlOffset) * 2); if (mirrorX === ltrX) { return; } @@ -84,25 +81,19 @@ class CustomProcedures extends React.Component { if (this.mutationRoot.width < midPoint) { dx = ltrX; } else if (this.mutationRoot.width < metrics.viewWidth) { - dx = - midPoint - - (metrics.viewWidth - this.mutationRoot.width) / 2; + dx = midPoint - ((metrics.viewWidth - this.mutationRoot.width) / 2); } else { - dx = - midPoint + - (this.mutationRoot.width - metrics.viewWidth); + dx = midPoint + (this.mutationRoot.width - metrics.viewWidth); } this.mutationRoot.moveBy(dx, dy); - this.setState({ - rtlOffset: this.mutationRoot.getRelativeToSurfaceXY().x, - }); + this.setState({rtlOffset: this.mutationRoot.getRelativeToSurfaceXY().x}); return; } if (this.mutationRoot.width > metrics.viewWidth) { dx = dx + this.mutationRoot.width - metrics.viewWidth; } } else { - dx = metrics.viewWidth / 2 - this.mutationRoot.width / 2 - x; + dx = (metrics.viewWidth / 2) - (this.mutationRoot.width / 2) - x; // If the procedure declaration is wider than the view width, // keep the right-hand side of the procedure in view. if (this.mutationRoot.width > metrics.viewWidth) { @@ -114,44 +105,42 @@ class CustomProcedures extends React.Component { this.mutationRoot.domToMutation(this.props.mutator); this.mutationRoot.initSvg(); this.mutationRoot.render(); - this.setState({ warp: this.mutationRoot.getWarp() }); + this.setState({warp: this.mutationRoot.getWarp()}); // Allow the initial events to run to position this block, then focus. setTimeout(() => { this.mutationRoot.focusLastEditor_(); }); } - handleCancel() { + handleCancel () { this.props.onRequestClose(); } - handleOk() { - const newMutation = this.mutationRoot - ? this.mutationRoot.mutationToDom(true) - : null; + handleOk () { + const newMutation = this.mutationRoot ? this.mutationRoot.mutationToDom(true) : null; this.props.onRequestClose(newMutation); } - handleAddLabel() { + handleAddLabel () { if (this.mutationRoot) { this.mutationRoot.addLabelExternal(); } } - handleAddBoolean() { + handleAddBoolean () { if (this.mutationRoot) { this.mutationRoot.addBooleanExternal(); } } - handleAddTextNumber() { + handleAddTextNumber () { if (this.mutationRoot) { this.mutationRoot.addStringNumberExternal(); } } - handleToggleWarp() { + handleToggleWarp () { if (this.mutationRoot) { const newWarp = !this.mutationRoot.getWarp(); this.mutationRoot.setWarp(newWarp); - this.setState({ warp: newWarp }); + this.setState({warp: newWarp}); } } - render() { + render () { return ( ({ +const mapStateToProps = state => ({ isRtl: state.locales.isRtl, - mutator: state.scratchGui.customProcedures.mutator, + mutator: state.scratchGui.customProcedures.mutator }); -export default connect(mapStateToProps)(CustomProcedures); +export default connect( + mapStateToProps +)(CustomProcedures); diff --git a/packages/scratch-gui/src/lib/blocks.js b/packages/scratch-gui/src/lib/blocks.js index 298307cab35..47b7bcd771b 100644 --- a/packages/scratch-gui/src/lib/blocks.js +++ b/packages/scratch-gui/src/lib/blocks.js @@ -5,47 +5,39 @@ * @return {ScratchBlocks} ScratchBlocks connected with the vm */ export default function (vm, useCatBlocks) { - const { ScratchBlocks } = useCatBlocks - ? require("cat-blocks") - : require("scratch-blocks"); + const {ScratchBlocks} = useCatBlocks ? require('cat-blocks') : require('scratch-blocks'); const jsonForMenuBlock = function (name, menuOptionsFn, category, start) { return { - message0: "%1", + message0: '%1', args0: [ { - type: "field_dropdown", + type: 'field_dropdown', name: name, options: function () { return start.concat(menuOptionsFn()); - }, - }, + } + } ], inputsInline: true, - output: "String", + output: 'String', outputShape: ScratchBlocks.OUTPUT_SHAPE_ROUND, - extensions: [`colours_${category}`], + extensions: [`colours_${category}`] }; }; - const jsonForHatBlockMenu = function ( - hatName, - name, - menuOptionsFn, - category, - start - ) { + const jsonForHatBlockMenu = function (hatName, name, menuOptionsFn, category, start) { return { message0: hatName, args0: [ { - type: "field_dropdown", + type: 'field_dropdown', name: name, options: function () { return start.concat(menuOptionsFn()); - }, - }, + } + } ], - extensions: [`colours_${category}`, "shape_hat"], + extensions: [`colours_${category}`, 'shape_hat'] }; }; @@ -54,105 +46,73 @@ export default function (vm, useCatBlocks) { message0: ScratchBlocks.Msg.SENSING_OF, args0: [ { - type: "field_dropdown", - name: "PROPERTY", + type: 'field_dropdown', + name: 'PROPERTY', options: function () { return menuOptionsFn(); - }, + } }, { - type: "input_value", - name: "OBJECT", - }, + type: 'input_value', + name: 'OBJECT' + } ], output: true, outputShape: ScratchBlocks.OUTPUT_SHAPE_ROUND, - extensions: ["colours_sensing"], + extensions: ['colours_sensing'] }; }; const soundsMenu = function () { - let menu = [["", ""]]; + let menu = [['', '']]; if (vm.editingTarget && vm.editingTarget.sprite.sounds.length > 0) { - menu = vm.editingTarget.sprite.sounds.map((sound) => [ - sound.name, - sound.name, - ]); + menu = vm.editingTarget.sprite.sounds.map(sound => [sound.name, sound.name]); } menu.push([ - ScratchBlocks.ScratchMsgs.translate("SOUND_RECORD", "record..."), - "SOUND_RECORD", + ScratchBlocks.ScratchMsgs.translate('SOUND_RECORD', 'record...'), + 'SOUND_RECORD' ]); return menu; }; const costumesMenu = function () { if (vm.editingTarget && vm.editingTarget.getCostumes().length > 0) { - return vm.editingTarget - .getCostumes() - .map((costume) => [costume.name, costume.name]); + return vm.editingTarget.getCostumes().map(costume => [costume.name, costume.name]); } - return [["", ""]]; + return [['', '']]; }; const backdropsMenu = function () { - const next = ScratchBlocks.ScratchMsgs.translate( - "LOOKS_NEXTBACKDROP", - "next backdrop" - ); - const previous = ScratchBlocks.ScratchMsgs.translate( - "LOOKS_PREVIOUSBACKDROP", - "previous backdrop" - ); - const random = ScratchBlocks.ScratchMsgs.translate( - "LOOKS_RANDOMBACKDROP", - "random backdrop" - ); - if ( - vm.runtime.targets[0] && - vm.runtime.targets[0].getCostumes().length > 0 - ) { - return vm.runtime.targets[0] - .getCostumes() - .map((costume) => [costume.name, costume.name]) - .concat([ - [next, "next backdrop"], - [previous, "previous backdrop"], - [random, "random backdrop"], - ]); + const next = ScratchBlocks.ScratchMsgs.translate('LOOKS_NEXTBACKDROP', 'next backdrop'); + const previous = ScratchBlocks.ScratchMsgs.translate('LOOKS_PREVIOUSBACKDROP', 'previous backdrop'); + const random = ScratchBlocks.ScratchMsgs.translate('LOOKS_RANDOMBACKDROP', 'random backdrop'); + if (vm.runtime.targets[0] && vm.runtime.targets[0].getCostumes().length > 0) { + return vm.runtime.targets[0].getCostumes().map(costume => [costume.name, costume.name]) + .concat([[next, 'next backdrop'], + [previous, 'previous backdrop'], + [random, 'random backdrop']]); } - return [["", ""]]; + return [['', '']]; }; const backdropNamesMenu = function () { const stage = vm.runtime.getTargetForStage(); if (stage && stage.getCostumes().length > 0) { - return stage - .getCostumes() - .map((costume) => [costume.name, costume.name]); + return stage.getCostumes().map(costume => [costume.name, costume.name]); } - return [["", ""]]; + return [['', '']]; }; const spriteMenu = function () { const sprites = []; for (const targetId in vm.runtime.targets) { - if ( - !Object.prototype.hasOwnProperty.call( - vm.runtime.targets, - targetId - ) - ) - continue; + if (!Object.prototype.hasOwnProperty.call(vm.runtime.targets, targetId)) continue; if (vm.runtime.targets[targetId].isOriginal) { if (!vm.runtime.targets[targetId].isStage) { if (vm.runtime.targets[targetId] === vm.editingTarget) { continue; } - sprites.push([ - vm.runtime.targets[targetId].sprite.name, - vm.runtime.targets[targetId].sprite.name, - ]); + sprites.push([vm.runtime.targets[targetId].sprite.name, vm.runtime.targets[targetId].sprite.name]); } } } @@ -163,22 +123,19 @@ export default function (vm, useCatBlocks) { if (vm.editingTarget && vm.editingTarget.isStage) { const menu = spriteMenu(); if (menu.length === 0) { - return [["", ""]]; // Empty menu matches Scratch 2 behavior + return [['', '']]; // Empty menu matches Scratch 2 behavior } return menu; } - const myself = ScratchBlocks.ScratchMsgs.translate( - "CONTROL_CREATECLONEOF_MYSELF", - "myself" - ); - return [[myself, "_myself_"]].concat(spriteMenu()); + const myself = ScratchBlocks.ScratchMsgs.translate('CONTROL_CREATECLONEOF_MYSELF', 'myself'); + return [[myself, '_myself_']].concat(spriteMenu()); }; ScratchBlocks.Blocks.sound_sounds_menu.init = function () { - const json = jsonForMenuBlock("SOUND_MENU", soundsMenu, "sounds", []); + const json = jsonForMenuBlock('SOUND_MENU', soundsMenu, 'sounds', []); this.jsonInit(json); - this.getField("SOUND_MENU").setValidator((newValue) => { - if (newValue === "SOUND_RECORD") { + this.getField('SOUND_MENU').setValidator(newValue => { + if (newValue === 'SOUND_RECORD') { ScratchBlocks.recordSoundCallback(); return null; } @@ -187,76 +144,54 @@ export default function (vm, useCatBlocks) { }; ScratchBlocks.Blocks.looks_costume.init = function () { - const json = jsonForMenuBlock("COSTUME", costumesMenu, "looks", []); + const json = jsonForMenuBlock('COSTUME', costumesMenu, 'looks', []); this.jsonInit(json); }; ScratchBlocks.Blocks.looks_backdrops.init = function () { - const json = jsonForMenuBlock("BACKDROP", backdropsMenu, "looks", []); + const json = jsonForMenuBlock('BACKDROP', backdropsMenu, 'looks', []); this.jsonInit(json); }; ScratchBlocks.Blocks.event_whenbackdropswitchesto.init = function () { const json = jsonForHatBlockMenu( ScratchBlocks.Msg.EVENT_WHENBACKDROPSWITCHESTO, - "BACKDROP", - backdropNamesMenu, - "event", - [] - ); + 'BACKDROP', backdropNamesMenu, 'event', []); this.jsonInit(json); }; ScratchBlocks.Blocks.motion_pointtowards_menu.init = function () { - const mouse = ScratchBlocks.ScratchMsgs.translate( - "MOTION_POINTTOWARDS_POINTER", - "mouse-pointer" - ); - const json = jsonForMenuBlock("TOWARDS", spriteMenu, "motion", [ - [mouse, "_mouse_"], + const mouse = ScratchBlocks.ScratchMsgs.translate('MOTION_POINTTOWARDS_POINTER', 'mouse-pointer'); + const json = jsonForMenuBlock('TOWARDS', spriteMenu, 'motion', [ + [mouse, '_mouse_'] ]); this.jsonInit(json); }; ScratchBlocks.Blocks.motion_goto_menu.init = function () { - const random = ScratchBlocks.ScratchMsgs.translate( - "MOTION_GOTO_RANDOM", - "random position" - ); - const mouse = ScratchBlocks.ScratchMsgs.translate( - "MOTION_GOTO_POINTER", - "mouse-pointer" - ); - const json = jsonForMenuBlock("TO", spriteMenu, "motion", [ - [random, "_random_"], - [mouse, "_mouse_"], + const random = ScratchBlocks.ScratchMsgs.translate('MOTION_GOTO_RANDOM', 'random position'); + const mouse = ScratchBlocks.ScratchMsgs.translate('MOTION_GOTO_POINTER', 'mouse-pointer'); + const json = jsonForMenuBlock('TO', spriteMenu, 'motion', [ + [random, '_random_'], + [mouse, '_mouse_'] ]); this.jsonInit(json); }; ScratchBlocks.Blocks.motion_glideto_menu.init = function () { - const random = ScratchBlocks.ScratchMsgs.translate( - "MOTION_GLIDETO_RANDOM", - "random position" - ); - const mouse = ScratchBlocks.ScratchMsgs.translate( - "MOTION_GLIDETO_POINTER", - "mouse-pointer" - ); - const json = jsonForMenuBlock("TO", spriteMenu, "motion", [ - [random, "_random_"], - [mouse, "_mouse_"], + const random = ScratchBlocks.ScratchMsgs.translate('MOTION_GLIDETO_RANDOM', 'random position'); + const mouse = ScratchBlocks.ScratchMsgs.translate('MOTION_GLIDETO_POINTER', 'mouse-pointer'); + const json = jsonForMenuBlock('TO', spriteMenu, 'motion', [ + [random, '_random_'], + [mouse, '_mouse_'] ]); this.jsonInit(json); }; ScratchBlocks.Blocks.sensing_of_object_menu.init = function () { - const stage = ScratchBlocks.ScratchMsgs.translate( - "SENSING_OF_STAGE", - "Stage" - ); - const json = jsonForMenuBlock("OBJECT", spriteMenu, "sensing", [ - [stage, "_stage_"], + const stage = ScratchBlocks.ScratchMsgs.translate('SENSING_OF_STAGE', 'Stage'); + const json = jsonForMenuBlock('OBJECT', spriteMenu, 'sensing', [ + [stage, '_stage_'] ]); this.jsonInit(json); }; @@ -268,7 +203,7 @@ export default function (vm, useCatBlocks) { // Get the sensing_of block from vm. let defaultSensingOfBlock; const blocks = vm.runtime.flyoutBlocks._blocks; - Object.keys(blocks).forEach((id) => { + Object.keys(blocks).forEach(id => { const block = blocks[id]; if (id === blockType || (block && block.opcode === blockType)) { defaultSensingOfBlock = block; @@ -279,18 +214,18 @@ export default function (vm, useCatBlocks) { // Called every time it opens since it depends on the values in the other block input. const menuFn = function () { const stageOptions = [ - [ScratchBlocks.Msg.SENSING_OF_BACKDROPNUMBER, "backdrop #"], - [ScratchBlocks.Msg.SENSING_OF_BACKDROPNAME, "backdrop name"], - [ScratchBlocks.Msg.SENSING_OF_VOLUME, "volume"], + [ScratchBlocks.Msg.SENSING_OF_BACKDROPNUMBER, 'backdrop #'], + [ScratchBlocks.Msg.SENSING_OF_BACKDROPNAME, 'backdrop name'], + [ScratchBlocks.Msg.SENSING_OF_VOLUME, 'volume'] ]; const spriteOptions = [ - [ScratchBlocks.Msg.SENSING_OF_XPOSITION, "x position"], - [ScratchBlocks.Msg.SENSING_OF_YPOSITION, "y position"], - [ScratchBlocks.Msg.SENSING_OF_DIRECTION, "direction"], - [ScratchBlocks.Msg.SENSING_OF_COSTUMENUMBER, "costume #"], - [ScratchBlocks.Msg.SENSING_OF_COSTUMENAME, "costume name"], - [ScratchBlocks.Msg.SENSING_OF_SIZE, "size"], - [ScratchBlocks.Msg.SENSING_OF_VOLUME, "volume"], + [ScratchBlocks.Msg.SENSING_OF_XPOSITION, 'x position'], + [ScratchBlocks.Msg.SENSING_OF_YPOSITION, 'y position'], + [ScratchBlocks.Msg.SENSING_OF_DIRECTION, 'direction'], + [ScratchBlocks.Msg.SENSING_OF_COSTUMENUMBER, 'costume #'], + [ScratchBlocks.Msg.SENSING_OF_COSTUMENAME, 'costume name'], + [ScratchBlocks.Msg.SENSING_OF_SIZE, 'size'], + [ScratchBlocks.Msg.SENSING_OF_VOLUME, 'volume'] ]; if (vm.editingTarget) { let lookupBlocks = vm.editingTarget.blocks; @@ -298,44 +233,31 @@ export default function (vm, useCatBlocks) { // The block doesn't exist, but should be in the flyout. Look there. if (!sensingOfBlock) { - sensingOfBlock = - vm.runtime.flyoutBlocks.getBlock(blockId) || - defaultSensingOfBlock; + sensingOfBlock = vm.runtime.flyoutBlocks.getBlock(blockId) || defaultSensingOfBlock; // If we still don't have a block, just return an empty list . This happens during // scratch blocks construction. if (!sensingOfBlock) { - return [["", ""]]; + return [['', '']]; } // The block was in the flyout so look up future block info there. lookupBlocks = vm.runtime.flyoutBlocks; } const sort = function (options) { - options.sort( - ScratchBlocks.scratchBlocksUtils.compareStrings - ); + options.sort(ScratchBlocks.scratchBlocksUtils.compareStrings); }; // Get all the stage variables (no lists) so we can add them to menu when the stage is selected. - const stageVariableOptions = vm.runtime - .getTargetForStage() - .getAllVariableNamesInScopeByType(""); + const stageVariableOptions = vm.runtime.getTargetForStage().getAllVariableNamesInScopeByType(''); sort(stageVariableOptions); - const stageVariableMenuItems = stageVariableOptions.map( - (variable) => [variable, variable] - ); - if ( - sensingOfBlock.inputs.OBJECT.shadow !== - sensingOfBlock.inputs.OBJECT.block - ) { + const stageVariableMenuItems = stageVariableOptions.map(variable => [variable, variable]); + if (sensingOfBlock.inputs.OBJECT.shadow !== sensingOfBlock.inputs.OBJECT.block) { // There's a block dropped on top of the menu. It'd be nice to evaluate it and // return the correct list, but that is tricky. Scratch2 just returns stage options // so just do that here too. return stageOptions.concat(stageVariableMenuItems); } - const menuBlock = lookupBlocks.getBlock( - sensingOfBlock.inputs.OBJECT.shadow - ); + const menuBlock = lookupBlocks.getBlock(sensingOfBlock.inputs.OBJECT.shadow); const selectedItem = menuBlock.fields.OBJECT.value; - if (selectedItem === "_stage_") { + if (selectedItem === '_stage_') { return stageOptions.concat(stageVariableMenuItems); } // Get all the local variables (no lists) and add them to the menu. @@ -343,16 +265,13 @@ export default function (vm, useCatBlocks) { let spriteVariableOptions = []; // The target should exist, but there are ways for it not to (e.g. #4203). if (target) { - spriteVariableOptions = - target.getAllVariableNamesInScopeByType("", true); + spriteVariableOptions = target.getAllVariableNamesInScopeByType('', true); sort(spriteVariableOptions); } - const spriteVariableMenuItems = spriteVariableOptions.map( - (variable) => [variable, variable] - ); + const spriteVariableMenuItems = spriteVariableOptions.map(variable => [variable, variable]); return spriteOptions.concat(spriteVariableMenuItems); } - return [["", ""]]; + return [['', '']]; }; const json = jsonForSensingMenus(menuFn); @@ -360,39 +279,25 @@ export default function (vm, useCatBlocks) { }; ScratchBlocks.Blocks.sensing_distancetomenu.init = function () { - const mouse = ScratchBlocks.ScratchMsgs.translate( - "SENSING_DISTANCETO_POINTER", - "mouse-pointer" - ); - const json = jsonForMenuBlock("DISTANCETOMENU", spriteMenu, "sensing", [ - [mouse, "_mouse_"], + const mouse = ScratchBlocks.ScratchMsgs.translate('SENSING_DISTANCETO_POINTER', 'mouse-pointer'); + const json = jsonForMenuBlock('DISTANCETOMENU', spriteMenu, 'sensing', [ + [mouse, '_mouse_'] ]); this.jsonInit(json); }; ScratchBlocks.Blocks.sensing_touchingobjectmenu.init = function () { - const mouse = ScratchBlocks.ScratchMsgs.translate( - "SENSING_TOUCHINGOBJECT_POINTER", - "mouse-pointer" - ); - const edge = ScratchBlocks.ScratchMsgs.translate( - "SENSING_TOUCHINGOBJECT_EDGE", - "edge" - ); - const json = jsonForMenuBlock( - "TOUCHINGOBJECTMENU", - spriteMenu, - "sensing", - [ - [mouse, "_mouse_"], - [edge, "_edge_"], - ] - ); + const mouse = ScratchBlocks.ScratchMsgs.translate('SENSING_TOUCHINGOBJECT_POINTER', 'mouse-pointer'); + const edge = ScratchBlocks.ScratchMsgs.translate('SENSING_TOUCHINGOBJECT_EDGE', 'edge'); + const json = jsonForMenuBlock('TOUCHINGOBJECTMENU', spriteMenu, 'sensing', [ + [mouse, '_mouse_'], + [edge, '_edge_'] + ]); this.jsonInit(json); }; ScratchBlocks.Blocks.control_create_clone_of_menu.init = function () { - const json = jsonForMenuBlock("CLONE_OPTION", cloneMenu, "control", []); + const json = jsonForMenuBlock('CLONE_OPTION', cloneMenu, 'control', []); this.jsonInit(json); }; @@ -401,9 +306,7 @@ export default function (vm, useCatBlocks) { return monitoredBlock ? monitoredBlock.isMonitored : false; }; - ScratchBlocks.StatusIndicatorLabel.prototype.getExtensionState = function ( - extensionId - ) { + ScratchBlocks.StatusIndicatorLabel.prototype.getExtensionState = function (extensionId) { if (vm.getPeripheralIsConnected(extensionId)) { return ScratchBlocks.StatusButtonState.READY; } @@ -418,8 +321,8 @@ export default function (vm, useCatBlocks) { // creates a collator. Using this is a lot faster in browsers that create a // collator for every localeCompare call. const collator = new Intl.Collator([], { - sensitivity: "base", - numeric: true, + sensitivity: 'base', + numeric: true }); // ScratchBlocks.scratchBlocksUtils.compareStrings = function (str1, str2) { // return collator.compare(str1, str2); diff --git a/packages/scratch-gui/src/lib/define-dynamic-block.js b/packages/scratch-gui/src/lib/define-dynamic-block.js index 30727f48e7f..943a650ab0e 100644 --- a/packages/scratch-gui/src/lib/define-dynamic-block.js +++ b/packages/scratch-gui/src/lib/define-dynamic-block.js @@ -1,6 +1,6 @@ // TODO: access `BlockType` and `ArgumentType` without reaching into VM // Should we move these into a new extension support module or something? -import { ArgumentType, BlockType } from "@scratch/scratch-vm"; +import {ArgumentType, BlockType} from '@scratch/scratch-vm'; /** * Define a block using extension info which has the ability to dynamically determine (and update) its layout. @@ -13,72 +13,67 @@ import { ArgumentType, BlockType } from "@scratch/scratch-vm"; * @param {string} extendedOpcode - The opcode for the block (including the extension ID). */ // TODO: grow this until it can fully replace `_convertForScratchBlocks` in the VM runtime -const defineDynamicBlock = ( - ScratchBlocks, - categoryInfo, - staticBlockInfo, - extendedOpcode -) => ({ +const defineDynamicBlock = (ScratchBlocks, categoryInfo, staticBlockInfo, extendedOpcode) => ({ init: function () { const blockJson = { type: extendedOpcode, inputsInline: true, category: categoryInfo.name, - style: categoryInfo.id, + style: categoryInfo.id }; // There is a scratch-blocks / Blockly extension called "scratch_extension" which adjusts the styling of // blocks to allow for an icon, a feature of Scratch extension blocks. However, Scratch "core" extension // blocks don't have icons and so they should not use 'scratch_extension'. Adding a scratch-blocks / Blockly // extension after `jsonInit` isn't fully supported (?), so we decide now whether there will be an icon. if (staticBlockInfo.blockIconURI || categoryInfo.blockIconURI) { - blockJson.extensions = ["scratch_extension"]; + blockJson.extensions = ['scratch_extension']; } // initialize the basics of the block, to be overridden & extended later by `domToMutation` this.jsonInit(blockJson); // initialize the cached block info used to carry block info from `domToMutation` to `mutationToDom` - this.blockInfoText = "{}"; + this.blockInfoText = '{}'; // we need a block info update (through `domToMutation`) before we have a completely initialized block this.needsBlockInfoUpdate = true; }, mutationToDom: function () { - const container = document.createElement("mutation"); - container.setAttribute("blockInfo", this.blockInfoText); + const container = document.createElement('mutation'); + container.setAttribute('blockInfo', this.blockInfoText); return container; }, domToMutation: function (xmlElement) { - const blockInfoText = xmlElement.getAttribute("blockInfo"); + const blockInfoText = xmlElement.getAttribute('blockInfo'); if (!blockInfoText) return; if (!this.needsBlockInfoUpdate) { - throw new Error("Attempted to update block info twice"); + throw new Error('Attempted to update block info twice'); } delete this.needsBlockInfoUpdate; this.blockInfoText = blockInfoText; const blockInfo = JSON.parse(blockInfoText); switch (blockInfo.blockType) { - case BlockType.COMMAND: - case BlockType.CONDITIONAL: - case BlockType.LOOP: - this.setOutputShape(ScratchBlocks.OUTPUT_SHAPE_SQUARE); - this.setPreviousStatement(true); - this.setNextStatement(!blockInfo.isTerminal); - break; - case BlockType.REPORTER: - this.setOutput(true); - this.setOutputShape(ScratchBlocks.OUTPUT_SHAPE_ROUND); - if (!blockInfo.disableMonitor) { - this.setCheckboxInFlyout(true); - } - break; - case BlockType.BOOLEAN: - this.setOutput(true); - this.setOutputShape(ScratchBlocks.OUTPUT_SHAPE_HEXAGONAL); - break; - case BlockType.HAT: - case BlockType.EVENT: - this.setOutputShape(ScratchBlocks.OUTPUT_SHAPE_SQUARE); - this.setNextStatement(true); - break; + case BlockType.COMMAND: + case BlockType.CONDITIONAL: + case BlockType.LOOP: + this.setOutputShape(ScratchBlocks.OUTPUT_SHAPE_SQUARE); + this.setPreviousStatement(true); + this.setNextStatement(!blockInfo.isTerminal); + break; + case BlockType.REPORTER: + this.setOutput(true); + this.setOutputShape(ScratchBlocks.OUTPUT_SHAPE_ROUND); + if (!blockInfo.disableMonitor) { + this.setCheckboxInFlyout(true); + } + break; + case BlockType.BOOLEAN: + this.setOutput(true); + this.setOutputShape(ScratchBlocks.OUTPUT_SHAPE_HEXAGONAL); + break; + case BlockType.HAT: + case BlockType.EVENT: + this.setOutputShape(ScratchBlocks.OUTPUT_SHAPE_SQUARE); + this.setNextStatement(true); + break; } // Layout block arguments @@ -86,27 +81,20 @@ const defineDynamicBlock = ( const blockText = blockInfo.text; const args = []; let argCount = 0; - const scratchBlocksStyleText = blockText.replace( - /\[(.+?)]/g, - (match, argName) => { - const arg = blockInfo.arguments[argName]; - switch (arg.type) { - case ArgumentType.STRING: - args.push({ type: "input_value", name: argName }); - break; - case ArgumentType.BOOLEAN: - args.push({ - type: "input_value", - name: argName, - check: "Boolean", - }); - break; - } - return `%${++argCount}`; + const scratchBlocksStyleText = blockText.replace(/\[(.+?)]/g, (match, argName) => { + const arg = blockInfo.arguments[argName]; + switch (arg.type) { + case ArgumentType.STRING: + args.push({type: 'input_value', name: argName}); + break; + case ArgumentType.BOOLEAN: + args.push({type: 'input_value', name: argName, check: 'Boolean'}); + break; } - ); + return `%${++argCount}`; + }); this.interpolate_(scratchBlocksStyleText, args); - }, + } }); export default defineDynamicBlock; diff --git a/packages/scratch-gui/src/lib/make-toolbox-xml.js b/packages/scratch-gui/src/lib/make-toolbox-xml.js index 7d6acc24aba..ba3f7050c80 100644 --- a/packages/scratch-gui/src/lib/make-toolbox-xml.js +++ b/packages/scratch-gui/src/lib/make-toolbox-xml.js @@ -1,5 +1,5 @@ -import { ScratchBlocks } from "scratch-blocks"; -import { defaultColors } from "./themes"; +import {ScratchBlocks} from 'scratch-blocks'; +import {defaultColors} from './themes'; const categorySeparator = ''; @@ -8,25 +8,21 @@ const blockSeparator = ''; // At default scale, about 28px /* eslint-disable no-unused-vars */ const motion = function (isInitialSetup, isStage, targetId, colors) { const stageSelected = ScratchBlocks.ScratchMsgs.translate( - "MOTION_STAGE_SELECTED", - "Stage selected: no motion blocks" + 'MOTION_STAGE_SELECTED', + 'Stage selected: no motion blocks' ); - // Note: the category's secondaryColour matches up with the blocks' tertiary - // color, both used for border color. Since Blockly uses the UK spelling of - // "colour", certain attributes are named accordingly. + // Note: the category's secondaryColour matches up with the blocks' tertiary color, both used for border color. + // Since Blockly uses the UK spelling of "colour", certain attributes are named accordingly. return ` - ${ - isStage - ? ` + colors.colourPrimary +}" secondaryColour="${colors.colourTertiary}"> + ${isStage ? ` - ` - : ` + ` : ` @@ -145,52 +141,36 @@ const motion = function (isInitialSetup, isStage, targetId, colors) { ${blockSeparator} - ` - } + `} ${categorySeparator} `; }; const xmlEscape = function (unsafe) { - return unsafe.replace(/[<>&'"]/g, (c) => { + return unsafe.replace(/[<>&'"]/g, c => { switch (c) { - case "<": - return "<"; - case ">": - return ">"; - case "&": - return "&"; - case "'": - return "'"; - case '"': - return """; + case '<': return '<'; + case '>': return '>'; + case '&': return '&'; + case '\'': return '''; + case '"': return '"'; } }); }; -const looks = function ( - isInitialSetup, - isStage, - targetId, - costumeName, - backdropName, - colors -) { - const hello = ScratchBlocks.ScratchMsgs.translate("LOOKS_HELLO", "Hello!"); - const hmm = ScratchBlocks.ScratchMsgs.translate("LOOKS_HMM", "Hmm..."); +const looks = function (isInitialSetup, isStage, targetId, costumeName, backdropName, colors) { + const hello = ScratchBlocks.ScratchMsgs.translate('LOOKS_HELLO', 'Hello!'); + const hmm = ScratchBlocks.ScratchMsgs.translate('LOOKS_HMM', 'Hmm...'); // Note: the category's secondaryColour matches up with the blocks' tertiary color, both used for border color. return ` - ${ - isStage - ? "" - : ` + colors.colourPrimary +}" secondaryColour="${colors.colourTertiary}"> + ${isStage ? '' : ` @@ -230,11 +210,8 @@ const looks = function ( ${blockSeparator} - ` - } - ${ - isStage - ? ` + `} + ${isStage ? ` @@ -250,8 +227,7 @@ const looks = function ( - ` - : ` + ` : ` @@ -283,8 +259,7 @@ const looks = function ( - ` - } + `} ${blockSeparator} @@ -302,10 +277,7 @@ const looks = function ( ${blockSeparator} - ${ - isStage - ? "" - : ` + ${isStage ? '' : ` ${blockSeparator} @@ -317,19 +289,14 @@ const looks = function ( - ` - } - ${ - isStage - ? ` + `} + ${isStage ? ` - ` - : ` + ` : ` - ` - } + `} ${categorySeparator} `; @@ -339,11 +306,11 @@ const sound = function (isInitialSetup, isStage, targetId, soundName, colors) { // Note: the category's secondaryColour matches up with the blocks' tertiary color, both used for border color. return ` + colors.colourPrimary +}" secondaryColour="${colors.colourTertiary}"> @@ -400,23 +367,19 @@ const events = function (isInitialSetup, isStage, targetId, colors) { // Note: the category's secondaryColour matches up with the blocks' tertiary color, both used for border color. return ` + colors.colourPrimary +}" secondaryColour="${colors.colourTertiary}"> - ${ - isStage - ? ` + ${isStage ? ` - ` - : ` + ` : ` - ` - } + `} ${blockSeparator} @@ -450,9 +413,9 @@ const control = function (isInitialSetup, isStage, targetId, colors) { return ` @@ -480,16 +443,13 @@ const control = function (isInitialSetup, isStage, targetId, colors) { ${blockSeparator} ${blockSeparator} - ${ - isStage - ? ` + ${isStage ? ` - ` - : ` + ` : ` @@ -497,32 +457,25 @@ const control = function (isInitialSetup, isStage, targetId, colors) { - ` - } + `} ${categorySeparator} `; }; const sensing = function (isInitialSetup, isStage, targetId, colors) { - const name = ScratchBlocks.ScratchMsgs.translate( - "SENSING_ASK_TEXT", - "What's your name?" - ); + const name = ScratchBlocks.ScratchMsgs.translate('SENSING_ASK_TEXT', 'What\'s your name?'); // Note: the category's secondaryColour matches up with the blocks' tertiary color, both used for border color. return ` - ${ - isStage - ? "" - : ` + ${isStage ? '' : ` @@ -547,12 +500,8 @@ const sensing = function (isInitialSetup, isStage, targetId, colors) { ${blockSeparator} - ` - } - ${ - isInitialSetup - ? "" - : ` + `} + ${isInitialSetup ? '' : ` @@ -560,8 +509,7 @@ const sensing = function (isInitialSetup, isStage, targetId, colors) { - ` - } + `} ${blockSeparator} @@ -572,15 +520,11 @@ const sensing = function (isInitialSetup, isStage, targetId, colors) { - ${ - isStage - ? "" - : ` + ${isStage ? '' : ` ${blockSeparator} ''+ ${blockSeparator} - ` - } + `} ${blockSeparator} ${blockSeparator} @@ -603,25 +547,16 @@ const sensing = function (isInitialSetup, isStage, targetId, colors) { }; const operators = function (isInitialSetup, isStage, targetId, colors) { - const apple = ScratchBlocks.ScratchMsgs.translate( - "OPERATORS_JOIN_APPLE", - "apple" - ); - const banana = ScratchBlocks.ScratchMsgs.translate( - "OPERATORS_JOIN_BANANA", - "banana" - ); - const letter = ScratchBlocks.ScratchMsgs.translate( - "OPERATORS_LETTEROF_APPLE", - "a" - ); + const apple = ScratchBlocks.ScratchMsgs.translate('OPERATORS_JOIN_APPLE', 'apple'); + const banana = ScratchBlocks.ScratchMsgs.translate('OPERATORS_JOIN_BANANA', 'banana'); + const letter = ScratchBlocks.ScratchMsgs.translate('OPERATORS_LETTEROF_APPLE', 'a'); // Note: the category's secondaryColour matches up with the blocks' tertiary color, both used for border color. return ` @@ -728,10 +663,7 @@ const operators = function (isInitialSetup, isStage, targetId, colors) { ${blockSeparator} - ${ - isInitialSetup - ? "" - : ` + ${isInitialSetup ? '' : ` @@ -775,8 +707,7 @@ const operators = function (isInitialSetup, isStage, targetId, colors) { - ` - } + `} ${blockSeparator} @@ -815,9 +746,9 @@ const variables = function (isInitialSetup, isStage, targetId, colors) { return ` { - const index = categoriesXML.findIndex( - (categoryInfo) => categoryInfo.id === categoryId - ); + const moveCategory = categoryId => { + const index = categoriesXML.findIndex(categoryInfo => categoryInfo.id === categoryId); if (index >= 0) { // remove the category from categoriesXML and return its XML const [categoryInfo] = categoriesXML.splice(index, 1); @@ -891,60 +812,28 @@ const makeToolboxXML = function ( } // return `undefined` }; - const motionXML = - moveCategory("motion") || - motion(isInitialSetup, isStage, targetId, colors.motion); - const looksXML = - moveCategory("looks") || - looks( - isInitialSetup, - isStage, - targetId, - costumeName, - backdropName, - colors.looks - ); - const soundXML = - moveCategory("sound") || - sound(isInitialSetup, isStage, targetId, soundName, colors.sounds); - const eventsXML = - moveCategory("event") || - events(isInitialSetup, isStage, targetId, colors.event); - const controlXML = - moveCategory("control") || - control(isInitialSetup, isStage, targetId, colors.control); - const sensingXML = - moveCategory("sensing") || - sensing(isInitialSetup, isStage, targetId, colors.sensing); - const operatorsXML = - moveCategory("operators") || - operators(isInitialSetup, isStage, targetId, colors.operators); - const variablesXML = - moveCategory("data") || - variables(isInitialSetup, isStage, targetId, colors.data); - const myBlocksXML = - moveCategory("procedures") || - myBlocks(isInitialSetup, isStage, targetId, colors.more); + const motionXML = moveCategory('motion') || motion(isInitialSetup, isStage, targetId, colors.motion); + const looksXML = moveCategory('looks') || + looks(isInitialSetup, isStage, targetId, costumeName, backdropName, colors.looks); + const soundXML = moveCategory('sound') || sound(isInitialSetup, isStage, targetId, soundName, colors.sounds); + const eventsXML = moveCategory('event') || events(isInitialSetup, isStage, targetId, colors.event); + const controlXML = moveCategory('control') || control(isInitialSetup, isStage, targetId, colors.control); + const sensingXML = moveCategory('sensing') || sensing(isInitialSetup, isStage, targetId, colors.sensing); + const operatorsXML = moveCategory('operators') || operators(isInitialSetup, isStage, targetId, colors.operators); + const variablesXML = moveCategory('data') || variables(isInitialSetup, isStage, targetId, colors.data); + const myBlocksXML = moveCategory('procedures') || myBlocks(isInitialSetup, isStage, targetId, colors.more); const everything = [ xmlOpen, - motionXML, - gap, - looksXML, - gap, - soundXML, - gap, - eventsXML, - gap, - controlXML, - gap, - sensingXML, - gap, - operatorsXML, - gap, - variablesXML, - gap, - myBlocksXML, + motionXML, gap, + looksXML, gap, + soundXML, gap, + eventsXML, gap, + controlXML, gap, + sensingXML, gap, + operatorsXML, gap, + variablesXML, gap, + myBlocksXML ]; for (const extensionCategory of categoriesXML) { @@ -952,7 +841,7 @@ const makeToolboxXML = function ( } everything.push(xmlClose); - return everything.join("\n"); + return everything.join('\n'); }; export default makeToolboxXML; diff --git a/packages/scratch-gui/src/lib/themes/blockHelpers.js b/packages/scratch-gui/src/lib/themes/blockHelpers.js index 696c0b57855..1a0db3e5ad4 100644 --- a/packages/scratch-gui/src/lib/themes/blockHelpers.js +++ b/packages/scratch-gui/src/lib/themes/blockHelpers.js @@ -1,19 +1,19 @@ -import { DEFAULT_THEME, getColorsForTheme, themeMap } from "."; +import {DEFAULT_THEME, getColorsForTheme, themeMap} from '.'; -const getBlockIconURI = (extensionIcons) => { +const getBlockIconURI = extensionIcons => { if (!extensionIcons) return null; return extensionIcons.blockIconURI || extensionIcons.menuIconURI; }; -const getCategoryIconURI = (extensionIcons) => { +const getCategoryIconURI = extensionIcons => { if (!extensionIcons) return null; return extensionIcons.menuIconURI || extensionIcons.blockIconURI; }; // scratch-blocks colours has a pen property that scratch-gui uses for all extensions -const getExtensionColors = (theme) => getColorsForTheme(theme).pen; +const getExtensionColors = theme => getColorsForTheme(theme).pen; /** * Applies extension color theme to categories. @@ -33,31 +33,23 @@ const injectExtensionCategoryTheme = (dynamicBlockXML, theme) => { const parser = new DOMParser(); const serializer = new XMLSerializer(); - return dynamicBlockXML.map((extension) => { - const dom = parser.parseFromString(extension.xml, "text/xml"); + return dynamicBlockXML.map(extension => { + const dom = parser.parseFromString(extension.xml, 'text/xml'); // This element is deserialized by Blockly, which uses the UK spelling // of "colour". - dom.documentElement.setAttribute( - "colour", - extensionColors.colourPrimary - ); + dom.documentElement.setAttribute('colour', extensionColors.colourPrimary); // Note: the category's secondaryColour matches up with the blocks' tertiary color, both used for border color. - dom.documentElement.setAttribute( - "secondaryColour", - extensionColors.colourTertiary - ); - - const categoryIconURI = getCategoryIconURI( - extensionIcons[extension.id] - ); + dom.documentElement.setAttribute('secondaryColour', extensionColors.colourTertiary); + + const categoryIconURI = getCategoryIconURI(extensionIcons[extension.id]); if (categoryIconURI) { - dom.documentElement.setAttribute("iconURI", categoryIconURI); + dom.documentElement.setAttribute('iconURI', categoryIconURI); } return { ...extension, - xml: serializer.serializeToString(dom), + xml: serializer.serializeToString(dom) }; }); }; @@ -67,18 +59,11 @@ const injectExtensionBlockIcons = (blockInfoJson, theme) => { if (theme === DEFAULT_THEME) return blockInfoJson; // Block icons are the first element of `args0` - if ( - !blockInfoJson.args0 || - blockInfoJson.args0.length < 1 || - blockInfoJson.args0[0].type !== "field_image" - ) - return blockInfoJson; + if (!blockInfoJson.args0 || blockInfoJson.args0.length < 1 || + blockInfoJson.args0[0].type !== 'field_image') return blockInfoJson; const extensionIcons = themeMap[theme].extensions; - const extensionId = blockInfoJson.type.substring( - 0, - blockInfoJson.type.indexOf("_") - ); + const extensionId = blockInfoJson.type.substring(0, blockInfoJson.type.indexOf('_')); const blockIconURI = getBlockIconURI(extensionIcons[extensionId]); if (!blockIconURI) return blockInfoJson; @@ -90,14 +75,14 @@ const injectExtensionBlockIcons = (blockInfoJson, theme) => { return { ...value, - src: blockIconURI, + src: blockIconURI }; - }), + }) }; }; export { injectExtensionBlockIcons, injectExtensionCategoryTheme, - getExtensionColors, + getExtensionColors }; diff --git a/packages/scratch-gui/src/lib/themes/default/index.js b/packages/scratch-gui/src/lib/themes/default/index.js index 7047a1c7fd6..bc033fbf8ed 100644 --- a/packages/scratch-gui/src/lib/themes/default/index.js +++ b/packages/scratch-gui/src/lib/themes/default/index.js @@ -2,104 +2,106 @@ // be named exactly as they are, including the UK spelling of "colour". const blockColors = { motion: { - colourPrimary: "#4C97FF", - colourSecondary: "#4280D7", - colourTertiary: "#3373CC", - colourQuaternary: "#3373CC", + colourPrimary: '#4C97FF', + colourSecondary: '#4280D7', + colourTertiary: '#3373CC', + colourQuaternary: '#3373CC' }, looks: { - colourPrimary: "#9966FF", - colourSecondary: "#855CD6", - colourTertiary: "#774DCB", - colourQuaternary: "#774DCB", + colourPrimary: '#9966FF', + colourSecondary: '#855CD6', + colourTertiary: '#774DCB', + colourQuaternary: '#774DCB' }, sounds: { - colourPrimary: "#CF63CF", - colourSecondary: "#C94FC9", - colourTertiary: "#BD42BD", - colourQuaternary: "#BD42BD", + colourPrimary: '#CF63CF', + colourSecondary: '#C94FC9', + colourTertiary: '#BD42BD', + colourQuaternary: '#BD42BD' }, control: { - colourPrimary: "#FFAB19", - colourSecondary: "#EC9C13", - colourTertiary: "#CF8B17", - colourQuaternary: "#CF8B17", + colourPrimary: '#FFAB19', + colourSecondary: '#EC9C13', + colourTertiary: '#CF8B17', + colourQuaternary: '#CF8B17' }, event: { - colourPrimary: "#FFBF00", - colourSecondary: "#E6AC00", - colourTertiary: "#CC9900", - colourQuaternary: "#CC9900", + colourPrimary: '#FFBF00', + colourSecondary: '#E6AC00', + colourTertiary: '#CC9900', + colourQuaternary: '#CC9900' }, sensing: { - colourPrimary: "#5CB1D6", - colourSecondary: "#47A8D1", - colourTertiary: "#2E8EB8", - colourQuaternary: "#2E8EB8", + colourPrimary: '#5CB1D6', + colourSecondary: '#47A8D1', + colourTertiary: '#2E8EB8', + colourQuaternary: '#2E8EB8' }, pen: { - colourPrimary: "#0fBD8C", - colourSecondary: "#0DA57A", - colourTertiary: "#0B8E69", - colourQuaternary: "#0B8E69", + colourPrimary: '#0fBD8C', + colourSecondary: '#0DA57A', + colourTertiary: '#0B8E69', + colourQuaternary: '#0B8E69' }, operators: { - colourPrimary: "#59C059", - colourSecondary: "#46B946", - colourTertiary: "#389438", - colourQuaternary: "#389438", + colourPrimary: '#59C059', + colourSecondary: '#46B946', + colourTertiary: '#389438', + colourQuaternary: '#389438' }, data: { - colourPrimary: "#FF8C1A", - colourSecondary: "#FF8000", - colourTertiary: "#DB6E00", - colourQuaternary: "#DB6E00", + colourPrimary: '#FF8C1A', + colourSecondary: '#FF8000', + colourTertiary: '#DB6E00', + colourQuaternary: '#DB6E00' }, // This is not a new category, but rather for differentiation // between lists and scalar variables. data_lists: { - colourPrimary: "#FF661A", - colourSecondary: "#FF5500", - colourTertiary: "#E64D00", - colourQuaternary: "#E64D00", + colourPrimary: '#FF661A', + colourSecondary: '#FF5500', + colourTertiary: '#E64D00', + colourQuaternary: '#E64D00' }, more: { - colourPrimary: "#FF6680", - colourSecondary: "#FF4D6A", - colourTertiary: "#FF3355", - colourQuaternary: "#FF3355", + colourPrimary: '#FF6680', + colourSecondary: '#FF4D6A', + colourTertiary: '#FF3355', + colourQuaternary: '#FF3355' }, - text: "#FFFFFF", - workspace: "#F9F9F9", - toolboxHover: "#4C97FF", - toolboxSelected: "#E9EEF2", - toolboxText: "#575E75", - toolbox: "#FFFFFF", - flyout: "#F9F9F9", - scrollbar: "#CECDCE", - scrollbarHover: "#CECDCE", - textField: "#FFFFFF", - textFieldText: "#575E75", - insertionMarker: "#000000", + text: '#FFFFFF', + workspace: '#F9F9F9', + toolboxHover: '#4C97FF', + toolboxSelected: '#E9EEF2', + toolboxText: '#575E75', + toolbox: '#FFFFFF', + flyout: '#F9F9F9', + scrollbar: '#CECDCE', + scrollbarHover: '#CECDCE', + textField: '#FFFFFF', + textFieldText: '#575E75', + insertionMarker: '#000000', insertionMarkerOpacity: 0.2, dragShadowOpacity: 0.6, - stackGlow: "#FFF200", + stackGlow: '#FFF200', stackGlowSize: 4, stackGlowOpacity: 1, - replacementGlow: "#FFFFFF", + replacementGlow: '#FFFFFF', replacementGlowSize: 2, replacementGlowOpacity: 1, - colourPickerStroke: "#FFFFFF", + colourPickerStroke: '#FFFFFF', // CSS colours: support RGBA - fieldShadow: "rgba(255, 255, 255, 0.3)", - dropDownShadow: "rgba(0, 0, 0, .3)", - numPadBackground: "#547AB2", - numPadBorder: "#435F91", - numPadActiveBackground: "#435F91", - numPadText: "white", // Do not use hex here, it cannot be inlined with data-uri SVG - valueReportBackground: "#FFFFFF", - valueReportBorder: "#AAAAAA", - menuHover: "rgba(0, 0, 0, 0.2)", + fieldShadow: 'rgba(255, 255, 255, 0.3)', + dropDownShadow: 'rgba(0, 0, 0, .3)', + numPadBackground: '#547AB2', + numPadBorder: '#435F91', + numPadActiveBackground: '#435F91', + numPadText: 'white', // Do not use hex here, it cannot be inlined with data-uri SVG + valueReportBackground: '#FFFFFF', + valueReportBorder: '#AAAAAA', + menuHover: 'rgba(0, 0, 0, 0.2)' }; -export { blockColors }; +export { + blockColors +}; diff --git a/packages/scratch-gui/src/lib/themes/high-contrast/index.js b/packages/scratch-gui/src/lib/themes/high-contrast/index.js index 853ff7947ce..b5e7fe3cc97 100644 --- a/packages/scratch-gui/src/lib/themes/high-contrast/index.js +++ b/packages/scratch-gui/src/lib/themes/high-contrast/index.js @@ -1,108 +1,111 @@ -import musicIcon from "./extensions/musicIcon.svg"; -import penIcon from "./extensions/penIcon.svg"; -import text2speechIcon from "./extensions/text2speechIcon.svg"; -import translateIcon from "./extensions/translateIcon.svg"; -import videoSensingIcon from "./extensions/videoSensingIcon.svg"; +import musicIcon from './extensions/musicIcon.svg'; +import penIcon from './extensions/penIcon.svg'; +import text2speechIcon from './extensions/text2speechIcon.svg'; +import translateIcon from './extensions/translateIcon.svg'; +import videoSensingIcon from './extensions/videoSensingIcon.svg'; // This object is passed directly to Blockly, hence the colour* fields need to // be named exactly as they are, including the UK spelling of "colour". const blockColors = { motion: { - colourPrimary: "#80B5FF", - colourSecondary: "#B3D2FF", - colourTertiary: "#3373CC", - colourQuaternary: "#CCE1FF", + colourPrimary: '#80B5FF', + colourSecondary: '#B3D2FF', + colourTertiary: '#3373CC', + colourQuaternary: '#CCE1FF' }, looks: { - colourPrimary: "#CCB3FF", - colourSecondary: "#DDCCFF", - colourTertiary: "#774DCB", - colourQuaternary: "#EEE5FF", + colourPrimary: '#CCB3FF', + colourSecondary: '#DDCCFF', + colourTertiary: '#774DCB', + colourQuaternary: '#EEE5FF' }, sounds: { - colourPrimary: "#E19DE1", - colourSecondary: "#FFB3FF", - colourTertiary: "#BD42BD", - colourQuaternary: "#FFCCFF", + colourPrimary: '#E19DE1', + colourSecondary: '#FFB3FF', + colourTertiary: '#BD42BD', + colourQuaternary: '#FFCCFF' }, control: { - colourPrimary: "#FFBE4C", - colourSecondary: "#FFDA99", - colourTertiary: "#CF8B17", - colourQuaternary: "#FFE3B3", + colourPrimary: '#FFBE4C', + colourSecondary: '#FFDA99', + colourTertiary: '#CF8B17', + colourQuaternary: '#FFE3B3' }, event: { - colourPrimary: "#FFD966", - colourSecondary: "#FFECB3", - colourTertiary: "#CC9900", - colourQuaternary: "#FFF2CC", + colourPrimary: '#FFD966', + colourSecondary: '#FFECB3', + colourTertiary: '#CC9900', + colourQuaternary: '#FFF2CC' }, sensing: { - colourPrimary: "#85C4E0", - colourSecondary: "#AED8EA", - colourTertiary: "#2E8EB8", - colourQuaternary: "#C2E2F0", + colourPrimary: '#85C4E0', + colourSecondary: '#AED8EA', + colourTertiary: '#2E8EB8', + colourQuaternary: '#C2E2F0' }, pen: { - colourPrimary: "#13ECAF", - colourSecondary: "#75F0CD", - colourTertiary: "#0B8E69", - colourQuaternary: "#A3F5DE", + colourPrimary: '#13ECAF', + colourSecondary: '#75F0CD', + colourTertiary: '#0B8E69', + colourQuaternary: '#A3F5DE' }, operators: { - colourPrimary: "#7ECE7E", - colourSecondary: "#B5E3B5", - colourTertiary: "#389438", - colourQuaternary: "#DAF1DA", + colourPrimary: '#7ECE7E', + colourSecondary: '#B5E3B5', + colourTertiary: '#389438', + colourQuaternary: '#DAF1DA' }, data: { - colourPrimary: "#FFA54C", - colourSecondary: "#FFCC99", - colourTertiary: "#DB6E00", - colourQuaternary: "#FFE5CC", + colourPrimary: '#FFA54C', + colourSecondary: '#FFCC99', + colourTertiary: '#DB6E00', + colourQuaternary: '#FFE5CC' }, // This is not a new category, but rather for differentiation // between lists and scalar variables. data_lists: { - colourPrimary: "#FF9966", - colourSecondary: "#FFCAB0", // I don't think this is used, b/c we don't have any droppable fields in list blocks - colourTertiary: "#E64D00", - colourQuaternary: "#FFDDCC", + colourPrimary: '#FF9966', + colourSecondary: '#FFCAB0', // I don't think this is used, b/c we don't have any droppable fields in list blocks + colourTertiary: '#E64D00', + colourQuaternary: '#FFDDCC' }, more: { - colourPrimary: "#FF99AA", - colourSecondary: "#FFCCD5", - colourTertiary: "#FF3355", - colourQuaternary: "#FFE5EA", - }, - text: "#000000", - textFieldText: "#000000", // Text inside of inputs e.g. 90 in [point in direction (90)] - toolboxText: "#000000", // Toolbox text, color picker text (used to be #575E75) + colourPrimary: '#FF99AA', + colourSecondary: '#FFCCD5', + colourTertiary: '#FF3355', + colourQuaternary: '#FFE5EA' + }, + text: '#000000', + textFieldText: '#000000', // Text inside of inputs e.g. 90 in [point in direction (90)] + toolboxText: '#000000', // Toolbox text, color picker text (used to be #575E75) // The color that the category menu label (e.g. 'motion', 'looks', etc.) changes to on hover - toolboxHover: "#3373CC", - insertionMarker: "#000000", + toolboxHover: '#3373CC', + insertionMarker: '#000000', insertionMarkerOpacity: 0.2, - fieldShadow: "rgba(255, 255, 255, 0.3)", + fieldShadow: 'rgba(255, 255, 255, 0.3)', dragShadowOpacity: 0.6, - menuHover: "rgba(255, 255, 255, 0.3)", + menuHover: 'rgba(255, 255, 255, 0.3)' }; const extensions = { music: { - blockIconURI: musicIcon, + blockIconURI: musicIcon }, pen: { - blockIconURI: penIcon, + blockIconURI: penIcon }, text2speech: { - blockIconURI: text2speechIcon, + blockIconURI: text2speechIcon }, translate: { - blockIconURI: translateIcon, + blockIconURI: translateIcon }, videoSensing: { - blockIconURI: videoSensingIcon, - }, + blockIconURI: videoSensingIcon + } }; -export { blockColors, extensions }; +export { + blockColors, + extensions +}; From e017b95095c18e9440284ce02b28f1374c55011e Mon Sep 17 00:00:00 2001 From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com> Date: Tue, 17 Dec 2024 11:01:29 -0800 Subject: [PATCH 054/521] fix: update "colour" property names for dark theme and mocks --- .../src/lib/themes/dark/__mocks__/index.js | 8 +- .../scratch-gui/src/lib/themes/dark/index.js | 88 +++++++++---------- .../src/lib/themes/default/__mocks__/index.js | 12 +-- 3 files changed, 54 insertions(+), 54 deletions(-) diff --git a/packages/scratch-gui/src/lib/themes/dark/__mocks__/index.js b/packages/scratch-gui/src/lib/themes/dark/__mocks__/index.js index 6d1b817db6b..c8770c5b45e 100644 --- a/packages/scratch-gui/src/lib/themes/dark/__mocks__/index.js +++ b/packages/scratch-gui/src/lib/themes/dark/__mocks__/index.js @@ -1,11 +1,11 @@ const blockColors = { motion: { - primary: '#AAAAAA' + colourPrimary: '#AAAAAA' }, pen: { - primary: '#FFFFFF', - secondary: '#EEEEEE', - tertiary: '#DDDDDD' + colourPrimary: '#FFFFFF', + colourSecondary: '#EEEEEE', + colourTertiary: '#DDDDDD' }, text: '#BBBBBB' }; diff --git a/packages/scratch-gui/src/lib/themes/dark/index.js b/packages/scratch-gui/src/lib/themes/dark/index.js index d1e86516336..b3f9f36d397 100644 --- a/packages/scratch-gui/src/lib/themes/dark/index.js +++ b/packages/scratch-gui/src/lib/themes/dark/index.js @@ -1,69 +1,69 @@ const blockColors = { motion: { - primary: '#0F1E33', - secondary: '#4C4C4C', - tertiary: '#4C97FF', - quaternary: '#4C97FF' + colourPrimary: '#0F1E33', + colourSecondary: '#4C4C4C', + colourTertiary: '#4C97FF', + colorQuaternary: '#4C97FF' }, looks: { - primary: '#1E1433', - secondary: '#4C4C4C', - tertiary: '#9966FF', - quaternary: '#9966FF' + colourPrimary: '#1E1433', + colourSecondary: '#4C4C4C', + colourTertiary: '#9966FF', + colorQuaternary: '#9966FF' }, sounds: { - primary: '#291329', - secondary: '#4C4C4C', - tertiary: '#CF63CF', - quaternary: '#CF63CF' + colourPrimary: '#291329', + colourSecondary: '#4C4C4C', + colourTertiary: '#CF63CF', + colorQuaternary: '#CF63CF' }, control: { - primary: '#332205', - secondary: '#4C4C4C', - tertiary: '#FFAB19', - quaternary: '#FFAB19' + colourPrimary: '#332205', + colourSecondary: '#4C4C4C', + colourTertiary: '#FFAB19', + colorQuaternary: '#FFAB19' }, event: { - primary: '#332600', - secondary: '#4C4C4C', - tertiary: '#FFBF00', - quaternary: '#FFBF00' + colourPrimary: '#332600', + colourSecondary: '#4C4C4C', + colourTertiary: '#FFBF00', + colorQuaternary: '#FFBF00' }, sensing: { - primary: '#12232A', - secondary: '#4C4C4C', - tertiary: '#5CB1D6', - quaternary: '#5CB1D6' + colourPrimary: '#12232A', + colourSecondary: '#4C4C4C', + colourTertiary: '#5CB1D6', + colorQuaternary: '#5CB1D6' }, pen: { - primary: '#03251C', - secondary: '#4C4C4C', - tertiary: '#0fBD8C', - quaternary: '#0fBD8C' + colourPrimary: '#03251C', + colourSecondary: '#4C4C4C', + colourTertiary: '#0fBD8C', + colorQuaternary: '#0fBD8C' }, operators: { - primary: '#112611', - secondary: '#4C4C4C', - tertiary: '#59C059', - quaternary: '#59C059' + colourPrimary: '#112611', + colourSecondary: '#4C4C4C', + colourTertiary: '#59C059', + colorQuaternary: '#59C059' }, data: { - primary: '#331C05', - secondary: '#4C4C4C', - tertiary: '#FF8C1A', - quaternary: '#FF8C1A' + colourPrimary: '#331C05', + colourSecondary: '#4C4C4C', + colourTertiary: '#FF8C1A', + colorQuaternary: '#FF8C1A' }, data_lists: { - primary: '#331405', - secondary: '#4C4C4C', - tertiary: '#FF661A', - quaternary: '#FF661A' + colourPrimary: '#331405', + colourSecondary: '#4C4C4C', + colourTertiary: '#FF661A', + colorQuaternary: '#FF661A' }, more: { - primary: '#331419', - secondary: '#4C4C4C', - tertiary: '#FF6680', - quaternary: '#FF6680' + colourPrimary: '#331419', + colourSecondary: '#4C4C4C', + colourTertiary: '#FF6680', + colorQuaternary: '#FF6680' }, text: 'rgba(255, 255, 255, .7)', textFieldText: '#E5E5E5', diff --git a/packages/scratch-gui/src/lib/themes/default/__mocks__/index.js b/packages/scratch-gui/src/lib/themes/default/__mocks__/index.js index d3b3bc94b10..7e0d4efa1d8 100644 --- a/packages/scratch-gui/src/lib/themes/default/__mocks__/index.js +++ b/packages/scratch-gui/src/lib/themes/default/__mocks__/index.js @@ -1,13 +1,13 @@ const blockColors = { motion: { - primary: '#111111', - secondary: '#222222', - tertiary: '#333333' + colourPrimary: '#111111', + colourSecondary: '#222222', + colourTertiary: '#333333' }, pen: { - primary: '#121212', - secondary: '#232323', - tertiary: '#343434' + colourPrimary: '#121212', + colourSecondary: '#232323', + colourTertiary: '#343434' }, text: '#444444', workspace: '#555555' From 6177c0ee86dbe19ea6bc05b1e5d0e2fbb7235a73 Mon Sep 17 00:00:00 2001 From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com> Date: Tue, 17 Dec 2024 14:10:36 -0800 Subject: [PATCH 055/521] test: update dynamic block tests for colour -> style --- .../unit/util/define-dynamic-block.test.js | 30 +++++-------------- 1 file changed, 8 insertions(+), 22 deletions(-) diff --git a/packages/scratch-gui/test/unit/util/define-dynamic-block.test.js b/packages/scratch-gui/test/unit/util/define-dynamic-block.test.js index b755b0a1da5..365159af140 100644 --- a/packages/scratch-gui/test/unit/util/define-dynamic-block.test.js +++ b/packages/scratch-gui/test/unit/util/define-dynamic-block.test.js @@ -9,10 +9,8 @@ const MockScratchBlocks = { }; const categoryInfo = { - name: 'test category', - color1: '#111', - color2: '#222', - color3: '#333' + name: 'motion category', + id: 'motion' }; const penIconURI = 'data:image/svg+xml;base64,fake_pen_icon_svg_base64_data'; @@ -101,9 +99,7 @@ describe('defineDynamicBlock', () => { const block = new MockBlock(testBlockInfo.commandWithIcon, extendedOpcode); expect(block.result).toEqual({ category: categoryInfo.name, - colour: categoryInfo.color1, - colourSecondary: categoryInfo.color2, - colourTertiary: categoryInfo.color3, + style: categoryInfo.id, extensions: ['scratch_extension'], inputsInline: true, nextConnection: true, @@ -117,9 +113,7 @@ describe('defineDynamicBlock', () => { const block = new MockBlock(testBlockInfo.commandWithoutIcon, extendedOpcode); expect(block.result).toEqual({ category: categoryInfo.name, - colour: categoryInfo.color1, - colourSecondary: categoryInfo.color2, - colourTertiary: categoryInfo.color3, + style: categoryInfo.id, // extensions: undefined, // no icon means no extension inputsInline: true, nextConnection: true, @@ -133,9 +127,7 @@ describe('defineDynamicBlock', () => { const block = new MockBlock(testBlockInfo.terminalCommand, extendedOpcode); expect(block.result).toEqual({ category: categoryInfo.name, - colour: categoryInfo.color1, - colourSecondary: categoryInfo.color2, - colourTertiary: categoryInfo.color3, + style: categoryInfo.id, // extensions: undefined, // no icon means no extension inputsInline: true, nextConnection: false, // terminal @@ -149,10 +141,8 @@ describe('defineDynamicBlock', () => { const block = new MockBlock(testBlockInfo.reporter, extendedOpcode); expect(block.result).toEqual({ category: categoryInfo.name, + style: categoryInfo.id, checkboxInFlyout_: true, - colour: categoryInfo.color1, - colourSecondary: categoryInfo.color2, - colourTertiary: categoryInfo.color3, // extensions: undefined, // no icon means no extension inputsInline: true, // nextConnection: undefined, // reporter @@ -167,10 +157,8 @@ describe('defineDynamicBlock', () => { const block = new MockBlock(testBlockInfo.boolean, extendedOpcode); expect(block.result).toEqual({ category: categoryInfo.name, + style: categoryInfo.id, // checkboxInFlyout_: undefined, - colour: categoryInfo.color1, - colourSecondary: categoryInfo.color2, - colourTertiary: categoryInfo.color3, // extensions: undefined, // no icon means no extension inputsInline: true, // nextConnection: undefined, // reporter @@ -185,9 +173,7 @@ describe('defineDynamicBlock', () => { const block = new MockBlock(testBlockInfo.hat, extendedOpcode); expect(block.result).toEqual({ category: categoryInfo.name, - colour: categoryInfo.color1, - colourSecondary: categoryInfo.color2, - colourTertiary: categoryInfo.color3, + style: categoryInfo.id, // extensions: undefined, // no icon means no extension inputsInline: true, nextConnection: true, From 2f08990510a94dac5fe2953cedc4ac652479c390 Mon Sep 17 00:00:00 2001 From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com> Date: Tue, 17 Dec 2024 15:02:08 -0800 Subject: [PATCH 056/521] test: fix theme injection tests --- .../scratch-gui/test/unit/util/themes.test.js | 60 +++++++------------ 1 file changed, 20 insertions(+), 40 deletions(-) diff --git a/packages/scratch-gui/test/unit/util/themes.test.js b/packages/scratch-gui/test/unit/util/themes.test.js index 35d8fa25b9e..23f40bf8f37 100644 --- a/packages/scratch-gui/test/unit/util/themes.test.js +++ b/packages/scratch-gui/test/unit/util/themes.test.js @@ -5,7 +5,7 @@ import { getColorsForTheme, HIGH_CONTRAST_THEME } from '../../../src/lib/themes'; -import {injectExtensionBlockTheme, injectExtensionCategoryTheme} from '../../../src/lib/themes/blockHelpers'; +import {injectExtensionBlockIcons, injectExtensionCategoryTheme} from '../../../src/lib/themes/blockHelpers'; import {detectTheme, persistTheme} from '../../../src/lib/themes/themePersistance'; jest.mock('../../../src/lib/themes/default'); @@ -16,19 +16,19 @@ describe('themes', () => { describe('core functionality', () => { test('provides the default theme colors', () => { - expect(defaultColors.motion.primary).toEqual('#111111'); + expect(defaultColors.motion.colourPrimary).toEqual('#111111'); }); test('returns the dark mode', () => { const colors = getColorsForTheme(DARK_THEME); - expect(colors.motion.primary).toEqual('#AAAAAA'); + expect(colors.motion.colourPrimary).toEqual('#AAAAAA'); }); test('uses default theme colors when not specified', () => { const colors = getColorsForTheme(DARK_THEME); - expect(colors.motion.secondary).toEqual('#222222'); + expect(colors.motion.colourSecondary).toEqual('#222222'); }); }); @@ -45,26 +45,6 @@ describe('themes', () => { global.XMLSerializer = XMLSerializer; }); - test('updates extension block colors based on theme', () => { - const blockInfoJson = { - type: 'dummy_block', - colour: '#0FBD8C', - colourSecondary: '#0DA57A', - colourTertiary: '#0B8E69' - }; - - const updated = injectExtensionBlockTheme(blockInfoJson, DARK_THEME); - - expect(updated).toEqual({ - type: 'dummy_block', - colour: '#FFFFFF', - colourSecondary: '#EEEEEE', - colourTertiary: '#DDDDDD' - }); - // The original value was not modified - expect(blockInfoJson.colour).toBe('#0FBD8C'); - }); - test('updates extension block icon based on theme', () => { const blockInfoJson = { type: 'pen_block', @@ -73,13 +53,10 @@ describe('themes', () => { type: 'field_image', src: 'original' } - ], - colour: '#0FBD8C', - colourSecondary: '#0DA57A', - colourTertiary: '#0B8E69' + ] }; - const updated = injectExtensionBlockTheme(blockInfoJson, DARK_THEME); + const updated = injectExtensionBlockIcons(blockInfoJson, DARK_THEME); expect(updated).toEqual({ type: 'pen_block', @@ -88,10 +65,7 @@ describe('themes', () => { type: 'field_image', src: 'darkPenIcon' } - ], - colour: '#FFFFFF', - colourSecondary: '#EEEEEE', - colourTertiary: '#DDDDDD' + ] }); // The original value was not modified expect(blockInfoJson.args0[0].src).toBe('original'); @@ -100,18 +74,24 @@ describe('themes', () => { test('bypasses updates if using the default theme', () => { const blockInfoJson = { type: 'dummy_block', - colour: '#0FBD8C', - colourSecondary: '#0DA57A', - colourTertiary: '#0B8E69' + args0: [ + { + type: 'field_image', + src: 'original' + } + ] }; - const updated = injectExtensionBlockTheme(blockInfoJson, DEFAULT_THEME); + const updated = injectExtensionBlockIcons(blockInfoJson, DEFAULT_THEME); expect(updated).toEqual({ type: 'dummy_block', - colour: '#0FBD8C', - colourSecondary: '#0DA57A', - colourTertiary: '#0B8E69' + args0: [ + { + type: 'field_image', + src: 'original' + } + ] }); }); From fbae21e7642d1dff2cba66cfcd41382eb6bc75c0 Mon Sep 17 00:00:00 2001 From: Aaron Dodson Date: Tue, 4 Feb 2025 15:51:39 -0800 Subject: [PATCH 057/521] fix: fix preserving toolbox scroll position for new continuous toolbox plugin (#30) --- .../scratch-gui/src/containers/blocks.jsx | 27 ++++++++++--------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/packages/scratch-gui/src/containers/blocks.jsx b/packages/scratch-gui/src/containers/blocks.jsx index f1cd7ee618c..6093981f1e0 100644 --- a/packages/scratch-gui/src/containers/blocks.jsx +++ b/packages/scratch-gui/src/containers/blocks.jsx @@ -265,28 +265,29 @@ class Blocks extends React.Component { const selectedCategoryScrollPosition = this.workspace .getFlyout() - .getCategoryScrollPosition(selectedCategoryName).y * scale; + .getCategoryScrollPosition(selectedCategoryName) * scale; const offsetWithinCategory = this.workspace.getFlyout().getWorkspace() .getMetrics().viewTop - selectedCategoryScrollPosition; this.workspace.updateToolbox(this.props.toolboxXML); + this.workspace.getToolbox().runAfterRerender(() => { + const newCategoryScrollPosition = this.workspace + .getFlyout() + .getCategoryScrollPosition(selectedCategoryName); + if (newCategoryScrollPosition) { + this.workspace + .getFlyout() + .getWorkspace() + .scrollbar.setY( + (newCategoryScrollPosition * scale) + offsetWithinCategory + ); + } + }); this.workspace.getToolbox().forceRerender(); this._renderedToolboxXML = this.props.toolboxXML; - const newCategoryScrollPosition = this.workspace - .getFlyout() - .getCategoryScrollPosition(selectedCategoryName); - if (newCategoryScrollPosition) { - this.workspace - .getFlyout() - .getWorkspace() - .scrollbar.setY( - (newCategoryScrollPosition.y * scale) + offsetWithinCategory - ); - } - const queue = this.toolboxUpdateQueue; this.toolboxUpdateQueue = []; queue.forEach(fn => fn()); From fcdb0c383287a09aa3fca866ca95055e7e9555db Mon Sep 17 00:00:00 2001 From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com> Date: Tue, 11 Feb 2025 09:52:11 -0800 Subject: [PATCH 058/521] chore(deps): update deps for spork test --- package-lock.json | 364 +----------------------------- packages/scratch-gui/package.json | 2 +- 2 files changed, 13 insertions(+), 353 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1d8030deaea..44c4c83093b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2041,7 +2041,6 @@ "version": "4.0.4", "resolved": "https://registry.npmjs.org/@blockly/field-colour/-/field-colour-4.0.4.tgz", "integrity": "sha512-FUXnlReiyejaaT+tkweW386dFbj9mSHjUCVtHgTP6cP5Wbvh6vJHQmnFxlPUNLsHPDGtri8j+yRKxGH97UkJvA==", - "dev": true, "engines": { "node": ">=8.0.0" }, @@ -6086,7 +6085,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true, "peer": true, "engines": { "node": ">= 10" @@ -7147,8 +7145,7 @@ "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 + "deprecated": "Use your platform's native atob() and btoa() methods instead" }, "node_modules/accepts": { "version": "1.3.8", @@ -8786,7 +8783,6 @@ "version": "10.4.3", "resolved": "https://registry.npmjs.org/blockly/-/blockly-10.4.3.tgz", "integrity": "sha512-+opfBmQnSiv7vTiY/TkDEBOslxUyfj8luS3S+qs1NnQKjInC+Waf2l9cNsMh9J8BMkmiCIT+Ed/3mmjIaL9wug==", - "dev": true, "peer": true, "dependencies": { "jsdom": "22.1.0" @@ -8796,7 +8792,6 @@ "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, "peer": true, "dependencies": { "debug": "4" @@ -8809,7 +8804,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-3.0.0.tgz", "integrity": "sha512-N4u2ABATi3Qplzf0hWbVCdjenim8F3ojEXpBDF5hBpjzW182MjNGLqfmQ0SkSPeQ+V86ZXgeH8aXj6kayd4jgg==", - "dev": true, "peer": true, "dependencies": { "rrweb-cssom": "^0.6.0" @@ -8822,7 +8816,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-4.0.0.tgz", "integrity": "sha512-/mMTei/JXPqvFqQtfyTowxmJVwr2PVAeCcDxyFf6LhoOu/09TX2OX3kb2wzi4DMXcfj4OItwDOnhl5oziPnT6g==", - "dev": true, "peer": true, "dependencies": { "abab": "^2.0.6", @@ -8838,7 +8831,6 @@ "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", "deprecated": "Use your platform's native DOMException instead", - "dev": true, "peer": true, "dependencies": { "webidl-conversions": "^7.0.0" @@ -8851,7 +8843,6 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, "peer": true, "engines": { "node": ">=0.12" @@ -8864,7 +8855,6 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", - "dev": true, "peer": true, "dependencies": { "asynckit": "^0.4.0", @@ -8880,7 +8870,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", - "dev": true, "peer": true, "dependencies": { "whatwg-encoding": "^2.0.0" @@ -8893,7 +8882,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dev": true, "peer": true, "dependencies": { "@tootallnate/once": "2", @@ -8908,7 +8896,6 @@ "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, "peer": true, "dependencies": { "agent-base": "6", @@ -8922,7 +8909,6 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, "peer": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -8935,7 +8921,6 @@ "version": "22.1.0", "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-22.1.0.tgz", "integrity": "sha512-/9AVW7xNbsBv6GfWho4TTNjEo9fe6Zhf9O7s0Fhhr3u+awPwAJMKwAMXnkk5vBxflqLW9hTHX/0cs+P3gW+cQw==", - "dev": true, "peer": true, "dependencies": { "abab": "^2.0.6", @@ -8978,7 +8963,6 @@ "version": "7.2.1", "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", - "dev": true, "peer": true, "dependencies": { "entities": "^4.5.0" @@ -8991,7 +8975,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, "peer": true, "engines": { "node": ">=6" @@ -9001,14 +8984,12 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz", "integrity": "sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==", - "dev": true, "peer": true }, "node_modules/blockly/node_modules/saxes": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", - "dev": true, "peer": true, "dependencies": { "xmlchars": "^2.2.0" @@ -9021,7 +9002,6 @@ "version": "4.1.4", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", - "dev": true, "peer": true, "dependencies": { "psl": "^1.1.33", @@ -9037,7 +9017,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz", "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==", - "dev": true, "peer": true, "dependencies": { "punycode": "^2.3.0" @@ -9050,7 +9029,6 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "dev": true, "peer": true, "engines": { "node": ">= 4.0.0" @@ -9060,7 +9038,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", - "dev": true, "peer": true, "dependencies": { "xml-name-validator": "^4.0.0" @@ -9073,7 +9050,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "dev": true, "peer": true, "engines": { "node": ">=12" @@ -9083,7 +9059,6 @@ "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==", - "dev": true, "peer": true, "dependencies": { "iconv-lite": "0.6.3" @@ -9096,7 +9071,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", - "dev": true, "peer": true, "engines": { "node": ">=12" @@ -9106,7 +9080,6 @@ "version": "12.0.1", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-12.0.1.tgz", "integrity": "sha512-Ed/LrqB8EPlGxjS+TrsXcpUond1mhccS3pchLhzSgPCnTimUCKj3IZE75pAs5m6heB2U2TMerKFUXheyHY+VDQ==", - "dev": true, "peer": true, "dependencies": { "tr46": "^4.1.1", @@ -9120,7 +9093,6 @@ "version": "8.18.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", - "dev": true, "peer": true, "engines": { "node": ">=10.0.0" @@ -9142,7 +9114,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", - "dev": true, "peer": true, "engines": { "node": ">=12" @@ -31018,35 +30989,24 @@ } }, "node_modules/scratch-blocks": { - "version": "2.0.0-spork.3", - "resolved": "https://registry.npmjs.org/scratch-blocks/-/scratch-blocks-2.0.0-spork.3.tgz", - "integrity": "sha512-luy2QtACBjhHT2rH2Zcvwevjb9zBnMWGwLnp9ydEXzbcFTptmYxFTmC8iFRPm6szxGiCw1pH48Qr3BwTGRKp8Q==", + "version": "2.0.0-spork.4", + "resolved": "https://registry.npmjs.org/scratch-blocks/-/scratch-blocks-2.0.0-spork.4.tgz", + "integrity": "sha512-gG/w7a5bAKZAPoYLFbyNgtS7ZIGKpc6MrwmxtZG5oSA2WdJcwZMyYLeV9kMCnCh4P0pKBy+NaQEfQC4fDeXK9A==", "dependencies": { - "@blockly/continuous-toolbox": "^6.0.9", - "@blockly/field-colour": "^5.0.9", - "blockly": "^12.0.0-beta.0" + "@blockly/continuous-toolbox": "^7.0.0-beta.1", + "@blockly/field-colour": "^4.0.2", + "blockly": "^12.0.0-beta.1" } }, "node_modules/scratch-blocks/node_modules/@blockly/continuous-toolbox": { - "version": "6.0.12", - "resolved": "https://registry.npmjs.org/@blockly/continuous-toolbox/-/continuous-toolbox-6.0.12.tgz", - "integrity": "sha512-I2jsxN/f+wytrzUQkSrxOKLWHPgsjiIz/w0Tpdo9PcDB5mwoBnG8l0ldh5Yj55CRMZbY/q9tANPWR8V8acgMIw==", + "version": "7.0.0-beta.1", + "resolved": "https://registry.npmjs.org/@blockly/continuous-toolbox/-/continuous-toolbox-7.0.0-beta.1.tgz", + "integrity": "sha512-IKu0whdtRTmdXSB11efSJ5fCNzQtAp98fv+7KnZk/V7Q/xAhVAutWWQE+FJvr9lKJlkeYqm9m+cxDhOBtlVP1w==", "engines": { "node": ">=8.17.0" }, "peerDependencies": { - "blockly": "^11.0.0" - } - }, - "node_modules/scratch-blocks/node_modules/@blockly/field-colour": { - "version": "5.0.12", - "resolved": "https://registry.npmjs.org/@blockly/field-colour/-/field-colour-5.0.12.tgz", - "integrity": "sha512-vNw6L/B0cpf+j0S6pShX31bOI16KJu+eACpsfHGOBZbb7+LT3bYKcGHe6+VRe+KtIE3jGlY7vYfnaJdOCrYlfQ==", - "engines": { - "node": ">=8.0.0" - }, - "peerDependencies": { - "blockly": "^11.0.0" + "blockly": "^12.0.0-beta.0" } }, "node_modules/scratch-blocks/node_modules/blockly": { @@ -38482,7 +38442,7 @@ "react-virtualized": "9.22.5", "redux-throttle": "0.1.1", "scratch-audio": "2.0.73", - "scratch-blocks": "2.0.0-spork.3", + "scratch-blocks": "2.0.0-spork.4", "scratch-l10n": "5.0.134", "scratch-paint": "3.0.144", "scratch-render-fonts": "1.0.165", @@ -41013,18 +40973,6 @@ "webpack-dev-server": "3.11.3" } }, - "packages/scratch-vm/node_modules/@blockly/continuous-toolbox": { - "version": "7.0.0-beta.1", - "resolved": "https://registry.npmjs.org/@blockly/continuous-toolbox/-/continuous-toolbox-7.0.0-beta.1.tgz", - "integrity": "sha512-IKu0whdtRTmdXSB11efSJ5fCNzQtAp98fv+7KnZk/V7Q/xAhVAutWWQE+FJvr9lKJlkeYqm9m+cxDhOBtlVP1w==", - "dev": true, - "engines": { - "node": ">=8.17.0" - }, - "peerDependencies": { - "blockly": "^12.0.0-beta.0" - } - }, "packages/scratch-vm/node_modules/@webpack-cli/configtest": { "version": "1.2.0", "dev": true, @@ -41159,18 +41107,6 @@ "node": ">=0.10.0" } }, - "packages/scratch-vm/node_modules/blockly": { - "version": "12.0.0-beta.1", - "resolved": "https://registry.npmjs.org/blockly/-/blockly-12.0.0-beta.1.tgz", - "integrity": "sha512-lECwZ4K+YuLXMM0yxWTz1lwkmDl424sst7h/dhtSefuCki8afjI/F87byYK/ZIZsMKBEz2+8wEJ1Wlx5cYWIAg==", - "dev": true, - "dependencies": { - "jsdom": "25.0.1" - }, - "engines": { - "node": ">=18" - } - }, "packages/scratch-vm/node_modules/braces": { "version": "2.3.2", "dev": true, @@ -41325,38 +41261,6 @@ "node": ">= 4" } }, - "packages/scratch-vm/node_modules/cssstyle": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.2.1.tgz", - "integrity": "sha512-9+vem03dMXG7gDmZ62uqmRiMRNtinIZ9ZyuF6BdxzfOD+FdN5hretzynkn0ReS2DO2GSw76RWHs0UmJPI2zUjw==", - "dev": true, - "dependencies": { - "@asamuzakjp/css-color": "^2.8.2", - "rrweb-cssom": "^0.8.0" - }, - "engines": { - "node": ">=18" - } - }, - "packages/scratch-vm/node_modules/cssstyle/node_modules/rrweb-cssom": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", - "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==", - "dev": true - }, - "packages/scratch-vm/node_modules/data-urls": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", - "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", - "dev": true, - "dependencies": { - "whatwg-mimetype": "^4.0.0", - "whatwg-url": "^14.0.0" - }, - "engines": { - "node": ">=18" - } - }, "packages/scratch-vm/node_modules/define-property": { "version": "2.0.2", "dev": true, @@ -41440,18 +41344,6 @@ "dev": true, "license": "MIT" }, - "packages/scratch-vm/node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, "packages/scratch-vm/node_modules/expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", @@ -41573,21 +41465,6 @@ "node": ">=4" } }, - "packages/scratch-vm/node_modules/form-data": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", - "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, "packages/scratch-vm/node_modules/glob-parent": { "version": "3.1.0", "dev": true, @@ -41632,18 +41509,6 @@ "node": ">=4" } }, - "packages/scratch-vm/node_modules/html-encoding-sniffer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", - "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", - "dev": true, - "dependencies": { - "whatwg-encoding": "^3.1.1" - }, - "engines": { - "node": ">=18" - } - }, "packages/scratch-vm/node_modules/html-entities": { "version": "1.4.0", "dev": true, @@ -41663,18 +41528,6 @@ "node": ">=4.0.0" } }, - "packages/scratch-vm/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, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "packages/scratch-vm/node_modules/ignore": { "version": "3.3.10", "dev": true, @@ -41770,67 +41623,6 @@ "dev": true, "license": "MIT" }, - "packages/scratch-vm/node_modules/jsdom": { - "version": "25.0.1", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-25.0.1.tgz", - "integrity": "sha512-8i7LzZj7BF8uplX+ZyOlIz86V6TAsSs+np6m1kpW9u0JWi4z/1t+FzcK1aek+ybTnAC4KhBL4uXCNT0wcUIeCw==", - "dev": true, - "dependencies": { - "cssstyle": "^4.1.0", - "data-urls": "^5.0.0", - "decimal.js": "^10.4.3", - "form-data": "^4.0.0", - "html-encoding-sniffer": "^4.0.0", - "http-proxy-agent": "^7.0.2", - "https-proxy-agent": "^7.0.5", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.12", - "parse5": "^7.1.2", - "rrweb-cssom": "^0.7.1", - "saxes": "^6.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^5.0.0", - "w3c-xmlserializer": "^5.0.0", - "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^3.1.1", - "whatwg-mimetype": "^4.0.0", - "whatwg-url": "^14.0.0", - "ws": "^8.18.0", - "xml-name-validator": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "canvas": "^2.11.2" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "packages/scratch-vm/node_modules/jsdom/node_modules/ws": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", - "dev": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "packages/scratch-vm/node_modules/json-schema-traverse": { "version": "0.4.1", "dev": true, @@ -41999,18 +41791,6 @@ "node": ">=4" } }, - "packages/scratch-vm/node_modules/parse5": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", - "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", - "dev": true, - "dependencies": { - "entities": "^4.5.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, "packages/scratch-vm/node_modules/path-exists": { "version": "3.0.0", "dev": true, @@ -42041,15 +41821,6 @@ "node": ">=4" } }, - "packages/scratch-vm/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, - "engines": { - "node": ">=6" - } - }, "packages/scratch-vm/node_modules/readable-stream": { "version": "2.3.8", "dev": true, @@ -42127,18 +41898,6 @@ "dev": true, "license": "MIT" }, - "packages/scratch-vm/node_modules/saxes": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", - "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", - "dev": true, - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=v12.22.7" - } - }, "packages/scratch-vm/node_modules/schema-utils": { "version": "1.0.0", "dev": true, @@ -42152,17 +41911,6 @@ "node": ">= 4" } }, - "packages/scratch-vm/node_modules/scratch-blocks": { - "version": "2.0.0-spork.4", - "resolved": "https://registry.npmjs.org/scratch-blocks/-/scratch-blocks-2.0.0-spork.4.tgz", - "integrity": "sha512-gG/w7a5bAKZAPoYLFbyNgtS7ZIGKpc6MrwmxtZG5oSA2WdJcwZMyYLeV9kMCnCh4P0pKBy+NaQEfQC4fDeXK9A==", - "dev": true, - "dependencies": { - "@blockly/continuous-toolbox": "^7.0.0-beta.1", - "@blockly/field-colour": "^4.0.2", - "blockly": "^12.0.0-beta.1" - } - }, "packages/scratch-vm/node_modules/selfsigned": { "version": "1.10.14", "dev": true, @@ -42274,51 +42022,6 @@ "node": ">=0.10.0" } }, - "packages/scratch-vm/node_modules/tough-cookie": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.1.tgz", - "integrity": "sha512-Ek7HndSVkp10hmHP9V4qZO1u+pn1RU5sI0Fw+jCU3lyvuMZcgqsNgc6CmJJZyByK4Vm/qotGRJlfgAX8q+4JiA==", - "dev": true, - "dependencies": { - "tldts": "^6.1.32" - }, - "engines": { - "node": ">=16" - } - }, - "packages/scratch-vm/node_modules/tr46": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz", - "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==", - "dev": true, - "dependencies": { - "punycode": "^2.3.1" - }, - "engines": { - "node": ">=18" - } - }, - "packages/scratch-vm/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==", - "dev": true, - "dependencies": { - "xml-name-validator": "^5.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "packages/scratch-vm/node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "dev": true, - "engines": { - "node": ">=12" - } - }, "packages/scratch-vm/node_modules/webpack-cli": { "version": "4.10.0", "dev": true, @@ -42519,40 +42222,6 @@ "node": ">=6" } }, - "packages/scratch-vm/node_modules/whatwg-encoding": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", - "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", - "dev": true, - "dependencies": { - "iconv-lite": "0.6.3" - }, - "engines": { - "node": ">=18" - } - }, - "packages/scratch-vm/node_modules/whatwg-mimetype": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", - "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", - "dev": true, - "engines": { - "node": ">=18" - } - }, - "packages/scratch-vm/node_modules/whatwg-url": { - "version": "14.1.1", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.1.1.tgz", - "integrity": "sha512-mDGf9diDad/giZ/Sm9Xi2YcyzaFpbdLpJPr+E9fSkyQ7KpQD4SdFcugkRQYzhmfI4KeV4Qpnn2sKPdo+kmsgRQ==", - "dev": true, - "dependencies": { - "tr46": "^5.0.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=18" - } - }, "packages/scratch-vm/node_modules/wrap-ansi": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", @@ -42591,15 +42260,6 @@ "node": ">=6" } }, - "packages/scratch-vm/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, - "engines": { - "node": ">=18" - } - }, "packages/scratch-vm/node_modules/y18n": { "version": "4.0.3", "dev": true, diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index 3c55c42a513..89ef38bf9ef 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -94,7 +94,7 @@ "react-virtualized": "9.22.5", "redux-throttle": "0.1.1", "scratch-audio": "2.0.73", - "scratch-blocks": "2.0.0-spork.3", + "scratch-blocks": "2.0.0-spork.4", "scratch-l10n": "5.0.134", "scratch-paint": "3.0.144", "scratch-render-fonts": "1.0.165", From 4d1e43a177fae8e1b7ea7fe5e7f0fe5e6cf71b16 Mon Sep 17 00:00:00 2001 From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com> Date: Tue, 11 Feb 2025 09:55:21 -0800 Subject: [PATCH 059/521] style: lint fixes --- packages/scratch-gui/src/lib/blocks.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/scratch-gui/src/lib/blocks.js b/packages/scratch-gui/src/lib/blocks.js index 47b7bcd771b..28db2767ed1 100644 --- a/packages/scratch-gui/src/lib/blocks.js +++ b/packages/scratch-gui/src/lib/blocks.js @@ -320,10 +320,10 @@ export default function (vm, useCatBlocks) { // Use a collator's compare instead of localeCompare which internally // creates a collator. Using this is a lot faster in browsers that create a // collator for every localeCompare call. - const collator = new Intl.Collator([], { - sensitivity: 'base', - numeric: true - }); + // const collator = new Intl.Collator([], { + // sensitivity: 'base', + // numeric: true + // }); // ScratchBlocks.scratchBlocksUtils.compareStrings = function (str1, str2) { // return collator.compare(str1, str2); // }; From 199055e557d74862d515046713728a6ad7dfd697 Mon Sep 17 00:00:00 2001 From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com> Date: Thu, 13 Feb 2025 09:18:03 -0800 Subject: [PATCH 060/521] Revert "fix: adjust key event filtering to fix the when key pressed block (#13)" This reverts commit 87a9787cf5e977dd36bf77354ec4ca397bcc2969. --- packages/scratch-gui/src/lib/vm-listener-hoc.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/scratch-gui/src/lib/vm-listener-hoc.jsx b/packages/scratch-gui/src/lib/vm-listener-hoc.jsx index eceac440922..87b9dab7c67 100644 --- a/packages/scratch-gui/src/lib/vm-listener-hoc.jsx +++ b/packages/scratch-gui/src/lib/vm-listener-hoc.jsx @@ -85,7 +85,7 @@ const vmListenerHOC = function (WrappedComponent) { } handleKeyDown (e) { // Don't capture keys intended for Blockly inputs. - if (e.target instanceof HTMLInputElement || e.target instanceof HTMLTextAreaElement) return; + if (e.target !== document && e.target !== document.body) return; const key = (!e.key || e.key === 'Dead') ? e.keyCode : e.key; this.props.vm.postIOData('keyboard', { From fd6deb2fc982466f5a57247290a83ab7a2e9b331 Mon Sep 17 00:00:00 2001 From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com> Date: Wed, 19 Feb 2025 14:22:05 -0800 Subject: [PATCH 061/521] test: move Selenium debugging info to files in test-results/ Port 554c82efdaf0bb93fd82730ba0260c863c9f1d70 from the monorepo and apply a minor supporting `package.json` change --- packages/scratch-gui/.gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/scratch-gui/.gitignore b/packages/scratch-gui/.gitignore index c851a6e0cfa..eeb5311cb1d 100644 --- a/packages/scratch-gui/.gitignore +++ b/packages/scratch-gui/.gitignore @@ -8,6 +8,7 @@ npm-* # Testing /.nyc_output /coverage +/test-results # Build /build From 5127c736f85e10db6efaac756fee4e2b53cfde7a Mon Sep 17 00:00:00 2001 From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com> Date: Thu, 13 Feb 2025 12:52:15 -0800 Subject: [PATCH 062/521] test: update XPath expressions for Blockly v12 beta --- packages/scratch-gui/test/helpers/selenium-helper.js | 9 ++++++--- packages/scratch-gui/test/integration/blocks.test.js | 2 +- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/packages/scratch-gui/test/helpers/selenium-helper.js b/packages/scratch-gui/test/helpers/selenium-helper.js index 40be5f1fce8..4c76a69d88e 100644 --- a/packages/scratch-gui/test/helpers/selenium-helper.js +++ b/packages/scratch-gui/test/helpers/selenium-helper.js @@ -343,9 +343,12 @@ class SeleniumHelper { // then finally click the toolbox text. try { await this.setTitle(`clickBlocksCategory ${categoryText}`); - await this.findByXpath('//div[contains(@class, "blocks_blocks")]'); - await this.driver.sleep(100); - await this.clickText(categoryText, 'div[contains(@class, "blocks_blocks")]'); + + const desiredCategoryLabel = `*[contains(text(), "${categoryText}")]`; + const anyCategoryContainer = '*[contains(@class, "blocklyToolboxCategoryContainer")]'; + const desiredCategoryContainer = `//${desiredCategoryLabel}/ancestor::${anyCategoryContainer}`; + await this.clickXpath(desiredCategoryContainer); + await this.driver.sleep(500); // Wait for scroll to finish } catch (cause) { throw await enhanceError(outerError, cause); diff --git a/packages/scratch-gui/test/integration/blocks.test.js b/packages/scratch-gui/test/integration/blocks.test.js index 25211007885..dd44fcb17f3 100644 --- a/packages/scratch-gui/test/integration/blocks.test.js +++ b/packages/scratch-gui/test/integration/blocks.test.js @@ -297,7 +297,7 @@ describe('Working with the blocks', () => { test('Use variable blocks after switching languages', async () => { const myVariable = 'my\u00A0variable'; - const changeVariableByScope = "*[@data-id='data_changevariableby']"; + const changeVariableByScope = '*[contains(@class, "blocklyFlyout")]//*[contains(@class, "data_changevariableby")]'; await loadUri(uri); From f2e9e2b8920fc9d7e65c38252cef9dfcf46a654e Mon Sep 17 00:00:00 2001 From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com> Date: Mon, 24 Feb 2025 14:11:58 -0800 Subject: [PATCH 063/521] test: update more XPath expressions for Blockly v12 --- .../test/helpers/selenium-helper.js | 61 ++++++++++++++++--- .../integration/blocks-standalone.test.js | 3 +- .../test/integration/localization.test.js | 14 ++--- .../test/integration/menu-bar.test.js | 11 ++-- .../test/integration/project-loading.test.js | 10 ++- .../test/integration/sprites.test.js | 3 +- 6 files changed, 73 insertions(+), 29 deletions(-) diff --git a/packages/scratch-gui/test/helpers/selenium-helper.js b/packages/scratch-gui/test/helpers/selenium-helper.js index 4c76a69d88e..274fa4b33e7 100644 --- a/packages/scratch-gui/test/helpers/selenium-helper.js +++ b/packages/scratch-gui/test/helpers/selenium-helper.js @@ -98,6 +98,10 @@ class SeleniumHelper { 'clickText', 'clickButton', 'clickXpath', + 'scopeForBlockId', + 'scopeForBlockText', + 'scopeForCategoryId', + 'scopeForCategoryText', 'clickBlocksCategory', 'elementIsVisible', 'findByText', @@ -149,14 +153,15 @@ class SeleniumHelper { get scope () { return { blocksTab: "*[@id='react-tabs-1']", + categoryContainer: '*[contains(@class, "blocklyToolboxCategoryContainer")]', // matches any category + contextMenu: '*[starts-with(@class,"react-contextmenu")]', costumesTab: "*[@id='react-tabs-3']", + menuBar: '*[contains(@class,"menu-bar_menu-bar_")]', modal: '*[@class="ReactModalPortal"]', + monitors: '*[starts-with(@class,"stage_monitor-wrapper")]', reportedValue: '*[@class="blocklyDropDownContent"]', soundsTab: "*[@id='react-tabs-5']", - spriteTile: '*[starts-with(@class,"react-contextmenu-wrapper")]', - menuBar: '*[contains(@class,"menu-bar_menu-bar_")]', - monitors: '*[starts-with(@class,"stage_monitor-wrapper")]', - contextMenu: '*[starts-with(@class,"react-contextmenu")]' + spriteTile: '*[starts-with(@class,"react-contextmenu-wrapper")]' }; } @@ -332,7 +337,47 @@ class SeleniumHelper { } /** - * Click a category in the blocks pane. + * Calculate an XPath expression to find a block in the blocks panel. + * Clicking this the element at this XPath should run the block. + * @param {string} blockId The identifier (opcode) of the block to find. Example: 'motion_movesteps'. + * @returns {string} An XPath expression that finds the block. + */ + scopeForBlockId (blockId) { + return `*[contains(@class, "blocklyBlock") and contains(@class, "${blockId}")]`; + } + + /** + * Calculate an XPath expression to find a block in the blocks panel. + * Clicking this the element at this XPath should run the block. + * @param {string} blockText The text of the block to find. Depends on the current language! + * @returns {string} An XPath expression that finds the block. + */ + scopeForBlockText (blockText) { + return `*[contains(text(), "${blockText}")]/ancestor::*[contains(@class, "blocklyBlock")]`; + } + + /** + * Calculate an XPath expression to find a category in the blocks panel. + * Clicking this the element at this XPath should scroll the category into view. + * @param {string} categoryId The ID of the category to find. Example: 'motion'. + * @returns {string} An XPath expression that finds the category. + */ + scopeForCategoryId (categoryId) { + return `*[@id="${categoryId}"]/ancestor::${this.scope.categoryContainer}`; + } + + /** + * Calculate an XPath expression to find a category in the blocks panel. + * Clicking this the element at this XPath should scroll the category into view. + * @param {string} categoryText The text of the category to find. Depends on the current language! + * @returns {string} An XPath expression that finds the category. + */ + scopeForCategoryText (categoryText) { + return `*[contains(text(), "${categoryText}")]/ancestor::${this.scope.categoryContainer}`; + } + + /** + * Click a category in the blocks pane, then wait to allow scroll time. * @param {string} categoryText The text of the category to click. * @returns {Promise} A promise that resolves when the category is clicked. */ @@ -344,10 +389,8 @@ class SeleniumHelper { try { await this.setTitle(`clickBlocksCategory ${categoryText}`); - const desiredCategoryLabel = `*[contains(text(), "${categoryText}")]`; - const anyCategoryContainer = '*[contains(@class, "blocklyToolboxCategoryContainer")]'; - const desiredCategoryContainer = `//${desiredCategoryLabel}/ancestor::${anyCategoryContainer}`; - await this.clickXpath(desiredCategoryContainer); + const desiredCategoryContainer = this.scopeForCategoryText(categoryText); + await this.clickXpath(`//${desiredCategoryContainer}`); await this.driver.sleep(500); // Wait for scroll to finish } catch (cause) { diff --git a/packages/scratch-gui/test/integration/blocks-standalone.test.js b/packages/scratch-gui/test/integration/blocks-standalone.test.js index 35afe3ed54c..4a8611d6129 100644 --- a/packages/scratch-gui/test/integration/blocks-standalone.test.js +++ b/packages/scratch-gui/test/integration/blocks-standalone.test.js @@ -3,6 +3,7 @@ import SeleniumHelper from '../helpers/selenium-helper'; const { clickText, + scopeForBlockId, clickBlocksCategory, clickButton, clickXpath, @@ -299,7 +300,7 @@ describe('Working with the blocks', () => { test('Use variable blocks after switching languages', async () => { const myVariable = 'my\u00A0variable'; - const changeVariableByScope = "*[@data-id='data_changevariableby']"; + const changeVariableByScope = scopeForBlockId('data_changevariableby'); await loadUri(uri); diff --git a/packages/scratch-gui/test/integration/localization.test.js b/packages/scratch-gui/test/integration/localization.test.js index 00cae10ba49..d2aa3babc1c 100644 --- a/packages/scratch-gui/test/integration/localization.test.js +++ b/packages/scratch-gui/test/integration/localization.test.js @@ -2,6 +2,7 @@ import path from 'path'; import SeleniumHelper from '../helpers/selenium-helper'; const { + clickBlocksCategory, clickText, clickXpath, findByText, @@ -10,7 +11,8 @@ const { getLogs, loadUri, rightClickText, - scope + scope, + scopeForBlockText } = new SeleniumHelper(); const uri = path.resolve(__dirname, '../../build/index.html'); @@ -41,12 +43,10 @@ describe('Localization', () => { await clickXpath(SETTINGS_MENU_XPATH); await clickText('Language', scope.menuBar); await clickText('Deutsch'); - await new Promise(resolve => setTimeout(resolve, 1000)); // wait for blocks refresh // Make sure the blocks are translating - await clickText('Fühlen'); // Sensing category in German - await new Promise(resolve => setTimeout(resolve, 1000)); // wait for blocks to scroll - await clickText('Antwort'); // Find the "answer" block in German + await clickBlocksCategory('Fühlen'); // Sensing category in German & wait for scroll + await clickXpath(`//${scopeForBlockText('Antwort')}`); // Find the "answer" block in German // Change to the costumes tab to confirm other parts of the GUI are translating await clickText('Kostüme'); @@ -64,7 +64,7 @@ describe('Localization', () => { // Regression test for #4476, blocks in wrong language when loaded with locale test('Loading with locale shows correct blocks', async () => { await loadUri(`${uri}?locale=de`); - await clickText('Fühlen'); // Sensing category in German + await clickBlocksCategory('Fühlen'); // Sensing category in German await new Promise(resolve => setTimeout(resolve, 1000)); // wait for blocks to scroll await clickText('Antwort'); // Find the "answer" block in German const logs = await getLogs(); @@ -74,7 +74,7 @@ describe('Localization', () => { // test for #5445 test('Loading with locale shows correct translation for string length block parameter', async () => { await loadUri(`${uri}?locale=ja`); - await clickText('演算'); // Operators category in Japanese + await clickBlocksCategory('演算'); // Operators category in Japanese await new Promise(resolve => setTimeout(resolve, 1000)); // wait for blocks to scroll await clickText('の長さ', scope.blocksTab); // Click "length " block await findByText('3', scope.reportedValue); // Tooltip with result diff --git a/packages/scratch-gui/test/integration/menu-bar.test.js b/packages/scratch-gui/test/integration/menu-bar.test.js index 33a6353e61c..0494eb62e4c 100644 --- a/packages/scratch-gui/test/integration/menu-bar.test.js +++ b/packages/scratch-gui/test/integration/menu-bar.test.js @@ -9,7 +9,8 @@ const { getDriver, loadUri, rightClickText, - scope + scope, + scopeForCategoryId } = new SeleniumHelper(); const uri = path.resolve(__dirname, '../../build/index.html'); @@ -110,12 +111,12 @@ describe('Menu bar settings', () => { await clickText('Color Mode', scope.menuBar); await clickText('High Contrast', scope.menuBar); + const motionBubblePath = `//${scopeForCategoryId('motion')}//*[contains(@class, "categoryBubble")]`; + // There is a tiny delay for the color theme to be applied to the categories. await driver.wait(async () => { - const motionCategoryDiv = await findByXpath( - '//div[contains(@class, "scratchCategoryMenuItem") and ' + - 'contains(@class, "scratchCategoryId-motion")]/*[1]'); - const color = await motionCategoryDiv.getCssValue('background-color'); + const motionCategoryBubble = await findByXpath(motionBubblePath); + const color = await motionCategoryBubble.getCssValue('background-color'); // Documentation for getCssValue says it depends on how the browser // returns the value. Locally I am seeing 'rgba(128, 181, 255, 1)', diff --git a/packages/scratch-gui/test/integration/project-loading.test.js b/packages/scratch-gui/test/integration/project-loading.test.js index 697b136ef87..dc4c0523371 100644 --- a/packages/scratch-gui/test/integration/project-loading.test.js +++ b/packages/scratch-gui/test/integration/project-loading.test.js @@ -2,6 +2,7 @@ import path from 'path'; import SeleniumHelper from '../helpers/selenium-helper'; const { + clickBlocksCategory, clickText, clickXpath, findByText, @@ -87,16 +88,14 @@ describe('Loading scratch gui', () => { await clickText('Costumes'); await clickXpath(FILE_MENU_XPATH); await clickXpath('//li[span[text()="New"]]'); - await findByXpath('//div[@class="scratchCategoryMenu"]'); - await clickText('Operators', scope.blocksTab); + await clickBlocksCategory('Operators'); }); test('Not logged in->made no changes to project->create new project should not show alert', async () => { await loadUri(uri); await clickXpath(FILE_MENU_XPATH); await clickXpath('//li[span[text()="New"]]'); - await findByXpath('//*[div[@class="scratchCategoryMenu"]]'); - await clickText('Operators', scope.blocksTab); + await clickBlocksCategory('Operators'); }); test.skip('Not logged in->made a change to project->create new project should show alert', async () => { @@ -110,8 +109,7 @@ describe('Loading scratch gui', () => { driver.switchTo() .alert() .accept(); - await findByXpath('//*[div[@class="scratchCategoryMenu"]]'); - await clickText('Operators', scope.blocksTab); + await clickBlocksCategory('Operators'); }); }); }); diff --git a/packages/scratch-gui/test/integration/sprites.test.js b/packages/scratch-gui/test/integration/sprites.test.js index c798e0a1792..d8f1a6d8c8c 100644 --- a/packages/scratch-gui/test/integration/sprites.test.js +++ b/packages/scratch-gui/test/integration/sprites.test.js @@ -4,6 +4,7 @@ import {StaleElementReferenceError} from 'selenium-webdriver/lib/error'; import until from 'selenium-webdriver/lib/until'; const { + clickBlocksCategory, clickText, clickXpath, elementIsVisible, @@ -35,7 +36,7 @@ describe('Working with sprites', () => { await clickXpath('//button[@aria-label="Choose a Sprite"]'); await clickText('Apple', scope.modal); // Closes modal await rightClickText('Apple', scope.spriteTile); // Make sure it is there - await clickText('Motion'); // Make sure we are back to the code tab + await clickBlocksCategory('Motion'); // Make sure we are back to the code tab const logs = await getLogs(); await expect(logs).toEqual([]); }); From d985234ab6cbf3f2aec161b4d32372a525c65ff1 Mon Sep 17 00:00:00 2001 From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com> Date: Tue, 25 Feb 2025 14:24:11 -0800 Subject: [PATCH 064/521] fix: variables got shy when flipping between code and project view Reverts one line of 9703bc6531e101d7684ebb394f5afacb287f36fd --- packages/scratch-gui/src/containers/blocks.jsx | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/scratch-gui/src/containers/blocks.jsx b/packages/scratch-gui/src/containers/blocks.jsx index 6093981f1e0..65ed4f99a09 100644 --- a/packages/scratch-gui/src/containers/blocks.jsx +++ b/packages/scratch-gui/src/containers/blocks.jsx @@ -248,6 +248,7 @@ class Blocks extends React.Component { .then(() => { this.workspace.getFlyout().setRecyclingEnabled(false); this.props.vm.refreshWorkspace(); + this.requestToolboxUpdate(); this.withToolboxUpdates(() => { this.workspace.getFlyout().setRecyclingEnabled(true); }); From c5054bad7c4a71788b62e124b39b9eae6de40cc1 Mon Sep 17 00:00:00 2001 From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com> Date: Wed, 5 Mar 2025 06:36:47 -0800 Subject: [PATCH 065/521] test: avoid false positives in xpath @class tests --- .../test/helpers/selenium-helper.js | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/packages/scratch-gui/test/helpers/selenium-helper.js b/packages/scratch-gui/test/helpers/selenium-helper.js index 274fa4b33e7..b6eb2e56575 100644 --- a/packages/scratch-gui/test/helpers/selenium-helper.js +++ b/packages/scratch-gui/test/helpers/selenium-helper.js @@ -149,19 +149,24 @@ class SeleniumHelper { /** * List of useful xpath scopes for finding elements. * @returns {object} An object mapping names to xpath strings. + * @note Do not check for an exact class name with `contains(@class, "foo")`: that will match `class="foo2"`. + * Instead, use `contains(concat(" ", @class, " "), " foo ")`, which in this example will correctly report that + * " foo2 " does not contain " foo ". Similarly, to check if an element has any class starting with "foo", use + * `contains(concat(" ", @class), " foo")`. Checking with `starts-with(@class, "foo")`, for example, will only + * work if the whole "class" attribute starts with "foo" -- it will fail if another class is listed first. */ get scope () { return { blocksTab: "*[@id='react-tabs-1']", - categoryContainer: '*[contains(@class, "blocklyToolboxCategoryContainer")]', // matches any category - contextMenu: '*[starts-with(@class,"react-contextmenu")]', + categoryContainer: '*[contains(concat(" ", @class, " "), " blocklyToolboxCategoryContainer ")]', costumesTab: "*[@id='react-tabs-3']", - menuBar: '*[contains(@class,"menu-bar_menu-bar_")]', - modal: '*[@class="ReactModalPortal"]', - monitors: '*[starts-with(@class,"stage_monitor-wrapper")]', - reportedValue: '*[@class="blocklyDropDownContent"]', + modal: '*[contains(concat(" ", @class, " "), " ReactModalPortal ")]', + reportedValue: '*[contains(concat(" ", @class, " "), " blocklyDropDownContent ")]', soundsTab: "*[@id='react-tabs-5']", - spriteTile: '*[starts-with(@class,"react-contextmenu-wrapper")]' + spriteTile: '*[contains(concat(" ", @class, " "), " react-contextmenu-wrapper ")]', + menuBar: '*[contains(concat(" ", @class), " menu-bar_menu-bar_")]', + monitors: '*[contains(concat(" ", @class), " stage_monitor-wrapper_")]', + contextMenu: '*[contains(concat(" ", @class, " "), " react-contextmenu ")]' }; } @@ -343,7 +348,8 @@ class SeleniumHelper { * @returns {string} An XPath expression that finds the block. */ scopeForBlockId (blockId) { - return `*[contains(@class, "blocklyBlock") and contains(@class, "${blockId}")]`; + return `*[contains(concat(" ", @class, " "), " blocklyBlock ") and contains(concat(" ", @class, " "), " ${ + blockId} ")]`; } /** @@ -353,7 +359,7 @@ class SeleniumHelper { * @returns {string} An XPath expression that finds the block. */ scopeForBlockText (blockText) { - return `*[contains(text(), "${blockText}")]/ancestor::*[contains(@class, "blocklyBlock")]`; + return `*[contains(text(), "${blockText}")]/ancestor::*[contains(concat(" ", @class, " "), " blocklyBlock ")]`; } /** From 08891cef317c07146f0a5fe2bb90d7d0a456c4fc Mon Sep 17 00:00:00 2001 From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com> Date: Wed, 5 Mar 2025 15:00:54 -0800 Subject: [PATCH 066/521] ci: fix(?) pushing from the publish workflow --- .github/workflows/publish.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index d8e4b353eca..ee3c337efa6 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -11,6 +11,8 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + with: + token: ${{ secrets.PAT_RELEASE_PUSH }} # persists the token for pushing to the repo later - uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4 with: cache: 'npm' From cd8f57aa336bc6efe01958240f9bac5877745deb Mon Sep 17 00:00:00 2001 From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com> Date: Wed, 5 Mar 2025 15:08:56 -0800 Subject: [PATCH 067/521] ci: move commitlint into its own separate workflow This way it doesn't prevent other tests from running --- .github/workflows/ci.yml | 1 - .github/workflows/commitlint.yml | 9 +++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/commitlint.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index eadc3978b46..afba1bc5c99 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -21,7 +21,6 @@ jobs: with: cache: 'npm' node-version-file: '.nvmrc' - - uses: wagoid/commitlint-github-action@9763196e10f27aef304c9b8b660d31d97fce0f99 # v5 - name: Debug info run: | cat < Date: Wed, 5 Mar 2025 15:31:51 -0800 Subject: [PATCH 068/521] ci: try again to get the push to work --- .github/workflows/publish.yml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index ee3c337efa6..9ecf7b7b6d7 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -10,21 +10,22 @@ jobs: cd: runs-on: ubuntu-latest steps: + - name: Config GitHub user + shell: bash + run: | + git config --global user.name 'GitHub Actions' + git config --global user.email 'github-actions@localhost' + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 with: token: ${{ secrets.PAT_RELEASE_PUSH }} # persists the token for pushing to the repo later + - uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4 with: cache: 'npm' node-version-file: '.nvmrc' registry-url: 'https://registry.npmjs.org' - - name: Config GitHub user - shell: bash - run: | - git config --global user.name 'GitHub Actions' - git config --global user.email 'github-actions@localhost' - - uses: ./.github/actions/install-dependencies - name: Update the version in the package files From 9030d5cc939a1a0fa2c615db944d23128109082f Mon Sep 17 00:00:00 2001 From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com> Date: Wed, 5 Mar 2025 19:00:06 -0800 Subject: [PATCH 069/521] ci: temporarily disable publishing to NPM --- .github/workflows/publish.yml | 38 +++++++++++++++++------------------ 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 9ecf7b7b6d7..165e7433a3d 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -40,25 +40,25 @@ jobs: - name: Build packages run: npm run build - - name: Publish scratch-svg-renderer - run: npm publish --access=public --workspace=@scratch/scratch-svg-renderer - env: - NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} - - - name: Publish scratch-render - run: npm publish --access=public --workspace=@scratch/scratch-render - env: - NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} - - - name: Publish scratch-vm - run: npm publish --access=public --workspace=@scratch/scratch-vm - env: - NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} - - - name: Publish scratch-gui - run: npm publish --access=public --workspace=@scratch/scratch-gui - env: - NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} + # - name: Publish scratch-svg-renderer + # run: npm publish --access=public --workspace=@scratch/scratch-svg-renderer + # env: + # NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} + + # - name: Publish scratch-render + # run: npm publish --access=public --workspace=@scratch/scratch-render + # env: + # NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} + + # - name: Publish scratch-vm + # run: npm publish --access=public --workspace=@scratch/scratch-vm + # env: + # NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} + + # - name: Publish scratch-gui + # run: npm publish --access=public --workspace=@scratch/scratch-gui + # env: + # NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} - name: Push to develop shell: bash From a2338604dfa11150135a164e8c48ad30a33249d8 Mon Sep 17 00:00:00 2001 From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com> Date: Thu, 6 Mar 2025 08:14:52 -0800 Subject: [PATCH 070/521] ci: temporarily disable pre-build/test in publish workflow --- .github/workflows/publish.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 165e7433a3d..8a93ec7dd80 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -5,9 +5,11 @@ on: types: [published] jobs: - ci: - uses: ./.github/workflows/ci.yml + # ci: + # uses: ./.github/workflows/ci.yml cd: + # needs: + # - ci runs-on: ubuntu-latest steps: - name: Config GitHub user @@ -113,5 +115,3 @@ jobs: publish_dir: ./packages/scratch-gui/build destination_dir: scratch-gui full_commit_message: "Build for ${{ github.sha }} ${{ github.event.head_commit.message }}" - needs: - - ci From c34518ba1a8c99386f40af79c2ec0dc7ddaf1418 Mon Sep 17 00:00:00 2001 From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com> Date: Thu, 6 Mar 2025 07:19:07 -0800 Subject: [PATCH 071/521] ci: determine tag for "npm publish" from branch name --- .github/workflows/publish.yml | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 8a93ec7dd80..49a5a95e0bf 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -12,6 +12,39 @@ jobs: # - ci runs-on: ubuntu-latest steps: + - name: Debug info + run: | + cat <> "$GITHUB_OUTPUT" + - name: Check NPM tag + run: | + if [ -z "${{ steps.npm_tag.outputs.npm_tag }}" ]; then + echo "Refusing to publish with empty NPM tag." + exit 1 + fi + - name: Config GitHub user shell: bash run: | From 8408a2abcb232ccc8fa1fdc9dbba318ca4b804cd Mon Sep 17 00:00:00 2001 From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com> Date: Thu, 6 Mar 2025 08:32:20 -0800 Subject: [PATCH 072/521] ci: make release commit message pass commitlint --- .github/workflows/publish.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 49a5a95e0bf..3c4975ad855 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -70,7 +70,7 @@ jobs: NEW_VERSION="${GIT_TAG/v/}" npm version "$NEW_VERSION" --no-git-tag-version - git add package* && git commit -m "Release $NEW_VERSION" + git add package* && git commit -m "chore(release): $NEW_VERSION [skip ci]" - name: Build packages run: npm run build From 5aa2727885e7cc91ad55621a6daca2b82da4eb9a Mon Sep 17 00:00:00 2001 From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com> Date: Thu, 6 Mar 2025 08:47:32 -0800 Subject: [PATCH 073/521] ci: re-enable publish steps that were disabled for testing purposes --- .github/workflows/publish.yml | 46 +++++++++++++++++------------------ 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 3c4975ad855..6ffc9ab523c 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -5,11 +5,11 @@ on: types: [published] jobs: - # ci: - # uses: ./.github/workflows/ci.yml + ci: + uses: ./.github/workflows/ci.yml cd: - # needs: - # - ci + needs: + - ci runs-on: ubuntu-latest steps: - name: Debug info @@ -75,25 +75,25 @@ jobs: - name: Build packages run: npm run build - # - name: Publish scratch-svg-renderer - # run: npm publish --access=public --workspace=@scratch/scratch-svg-renderer - # env: - # NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} - - # - name: Publish scratch-render - # run: npm publish --access=public --workspace=@scratch/scratch-render - # env: - # NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} - - # - name: Publish scratch-vm - # run: npm publish --access=public --workspace=@scratch/scratch-vm - # env: - # NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} - - # - name: Publish scratch-gui - # run: npm publish --access=public --workspace=@scratch/scratch-gui - # env: - # NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} + - name: Publish scratch-svg-renderer + run: npm publish --access=public --workspace=@scratch/scratch-svg-renderer + env: + NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} + + - name: Publish scratch-render + run: npm publish --access=public --workspace=@scratch/scratch-render + env: + NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} + + - name: Publish scratch-vm + run: npm publish --access=public --workspace=@scratch/scratch-vm + env: + NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} + + - name: Publish scratch-gui + run: npm publish --access=public --workspace=@scratch/scratch-gui + env: + NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} - name: Push to develop shell: bash From 8942bddd73043015cc4c8e86051954f5415db725 Mon Sep 17 00:00:00 2001 From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com> Date: Thu, 6 Mar 2025 08:48:39 -0800 Subject: [PATCH 074/521] ci: publish to NPM under a tag determined by branch --- .github/workflows/publish.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 6ffc9ab523c..8a1cc701b2f 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -76,22 +76,22 @@ jobs: run: npm run build - name: Publish scratch-svg-renderer - run: npm publish --access=public --workspace=@scratch/scratch-svg-renderer + run: npm publish --access=public --tag="${{steps.npm_tag.outputs.npm_tag}}" --workspace=@scratch/scratch-svg-renderer env: NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} - name: Publish scratch-render - run: npm publish --access=public --workspace=@scratch/scratch-render + run: npm publish --access=public --tag="${{steps.npm_tag.outputs.npm_tag}}" --workspace=@scratch/scratch-render env: NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} - name: Publish scratch-vm - run: npm publish --access=public --workspace=@scratch/scratch-vm + run: npm publish --access=public --tag="${{steps.npm_tag.outputs.npm_tag}}" --workspace=@scratch/scratch-vm env: NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} - name: Publish scratch-gui - run: npm publish --access=public --workspace=@scratch/scratch-gui + run: npm publish --access=public --tag="${{steps.npm_tag.outputs.npm_tag}}" --workspace=@scratch/scratch-gui env: NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} From d19570db5615baa2b6c3d82bd3477c860e3b366f Mon Sep 17 00:00:00 2001 From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com> Date: Fri, 2 May 2025 14:24:26 -0700 Subject: [PATCH 075/521] ci: publish all builds to GH Pages --- .github/workflows/ci.yml | 41 +++++++++++++++++++++++++++++++++++ .github/workflows/publish.yml | 32 --------------------------- 2 files changed, 41 insertions(+), 32 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index afba1bc5c99..26bb8799c2e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -86,3 +86,44 @@ jobs: uses: ./.github/actions/test-package with: package_name: scratch-gui + + - name: Determine GitHub Pages directory name + id: branch_dir_name + run: | + if [ "$GITHUB_REF_NAME" == "develop" ]; then + echo "result=." + else + echo "result=${GITHUB_REF_NAME//[^A-Za-z0-9._-]/_}" + fi | tee --append "$GITHUB_OUTPUT" + + - name: Deploy scratch-svg-renderer to GitHub Pages + uses: peaceiris/actions-gh-pages@4f9cc6602d3f66b9c108549d475ec49e8ef4d45e # v4 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ./packages/scratch-svg-renderer/playground + destination_dir: "${{steps.branch_dir_name.outputs.result}}/scratch-svg-renderer" + full_commit_message: "Build for ${{ github.sha }} ${{ github.event.head_commit.message }}" + + - name: Deploy scratch-render to GitHub Pages + uses: peaceiris/actions-gh-pages@4f9cc6602d3f66b9c108549d475ec49e8ef4d45e # v4 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ./packages/scratch-render/playground + destination_dir: "${{steps.branch_dir_name.outputs.result}}/scratch-render" + full_commit_message: "Build for ${{ github.sha }} ${{ github.event.head_commit.message }}" + + - name: Deploy scratch-vm to GitHub Pages + uses: peaceiris/actions-gh-pages@4f9cc6602d3f66b9c108549d475ec49e8ef4d45e # v4 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ./packages/scratch-vm/playground + destination_dir: "${{steps.branch_dir_name.outputs.result}}/scratch-vm" + full_commit_message: "Build for ${{ github.sha }} ${{ github.event.head_commit.message }}" + + - name: Deploy scratch-gui to GitHub Pages + uses: peaceiris/actions-gh-pages@4f9cc6602d3f66b9c108549d475ec49e8ef4d45e # v4 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ./packages/scratch-gui/build + destination_dir: "${{steps.branch_dir_name.outputs.result}}/scratch-gui" + full_commit_message: "Build for ${{ github.sha }} ${{ github.event.head_commit.message }}" diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 8a1cc701b2f..9305250f486 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -116,35 +116,3 @@ jobs: run: | git tag -f "${{github.event.release.tag_name}}" HEAD git push -f origin "refs/tags/${{github.event.release.tag_name}}" - - - name: Deploy scratch-svg-renderer to GitHub Pages - uses: peaceiris/actions-gh-pages@4f9cc6602d3f66b9c108549d475ec49e8ef4d45e # v4 - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: ./packages/scratch-svg-renderer/playground - destination_dir: scratch-svg-renderer - full_commit_message: "Build for ${{ github.sha }} ${{ github.event.head_commit.message }}" - - - name: Deploy scratch-render to GitHub Pages - uses: peaceiris/actions-gh-pages@4f9cc6602d3f66b9c108549d475ec49e8ef4d45e # v4 - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: ./packages/scratch-render/playground - destination_dir: scratch-render - full_commit_message: "Build for ${{ github.sha }} ${{ github.event.head_commit.message }}" - - - name: Deploy scratch-vm to GitHub Pages - uses: peaceiris/actions-gh-pages@4f9cc6602d3f66b9c108549d475ec49e8ef4d45e # v4 - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: ./packages/scratch-vm/playground - destination_dir: scratch-vm - full_commit_message: "Build for ${{ github.sha }} ${{ github.event.head_commit.message }}" - - - name: Deploy scratch-gui to GitHub Pages - uses: peaceiris/actions-gh-pages@4f9cc6602d3f66b9c108549d475ec49e8ef4d45e # v4 - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: ./packages/scratch-gui/build - destination_dir: scratch-gui - full_commit_message: "Build for ${{ github.sha }} ${{ github.event.head_commit.message }}" From 4b31377da72e188cc79a86bc671e712282c80c23 Mon Sep 17 00:00:00 2001 From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com> Date: Fri, 2 May 2025 14:44:44 -0700 Subject: [PATCH 076/521] ci: clean up stale GH Pages subdirectories --- .github/workflows/ghpages-cleanup.yml | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 .github/workflows/ghpages-cleanup.yml diff --git a/.github/workflows/ghpages-cleanup.yml b/.github/workflows/ghpages-cleanup.yml new file mode 100644 index 00000000000..75f6efd3804 --- /dev/null +++ b/.github/workflows/ghpages-cleanup.yml @@ -0,0 +1,27 @@ +on: + schedule: + - cron: 0 0 * * 6 # midnight on Saturdays + workflow_dispatch: + +jobs: + cleanup: + runs-on: ubuntu-latest + steps: + - name: Check out GH Pages branch + uses: actions/checkout + with: + # replace `fetch-depth` with `shallow-since` if and when actions/checkout#619 (or an equivalent) gets merged + fetch-depth: 0 + ref: gh-pages + - name: Mark stale directories for removal + run: | + for dir in */; do + if [ -z "$(git log -n 1 --since "1 month ago" -- "$dir")" ]; then + git rm -r "$dir" + fi + done + git status + - name: Commit + run: "git commit -m 'chore: remove stale GH Pages branches'" + - name: Push + run: "git push" From dce9a0855eb11433c5a5e39e463ae0e777b36ac9 Mon Sep 17 00:00:00 2001 From: Aaron Dodson Date: Mon, 24 Feb 2025 08:18:36 -0800 Subject: [PATCH 077/521] fix: use derived IDs for block comments (#11) --- packages/scratch-vm/src/engine/adapter.js | 2 +- packages/scratch-vm/src/serialization/sb3.js | 10 +++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/packages/scratch-vm/src/engine/adapter.js b/packages/scratch-vm/src/engine/adapter.js index d10c6874ac9..ce840fde149 100644 --- a/packages/scratch-vm/src/engine/adapter.js +++ b/packages/scratch-vm/src/engine/adapter.js @@ -88,7 +88,7 @@ const domToBlock = function (blockDOM, blocks, isTopBlock, parent) { } case 'comment': { - block.comment = xmlChild.attribs.id; + block.comment = `${block.id}_comment`; break; } case 'value': diff --git a/packages/scratch-vm/src/serialization/sb3.js b/packages/scratch-vm/src/serialization/sb3.js index c7db58d0b37..18636d17535 100644 --- a/packages/scratch-vm/src/serialization/sb3.js +++ b/packages/scratch-vm/src/serialization/sb3.js @@ -842,6 +842,14 @@ const deserializeBlocks = function (blocks) { block.id = blockId; // add id back to block since it wasn't serialized block.inputs = deserializeInputs(block.inputs, blockId, blocks); block.fields = deserializeFields(block.fields); + + if (block.comment) { + // Pre-Blockly v12 Scratch used arbitrary IDs for block comments. + // Newer versions use an ID based on the parent block's ID instead, + // so disregard the actual saved value and replace it with the + // synthesized one. + block.comment = `${block.id}_comment`; + } } return blocks; }; @@ -1047,7 +1055,7 @@ const parseScratchObject = function (object, runtime, extensions, zip, assets) { for (const commentId in object.comments) { const comment = object.comments[commentId]; const newComment = new Comment( - commentId, + comment.blockId ? `${comment.blockId}_comment` : commentId, comment.text, comment.x, comment.y, From 198e941140496456afdb381e9232f1a8b1c1d46b Mon Sep 17 00:00:00 2001 From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com> Date: Tue, 2 Sep 2025 09:56:13 -0700 Subject: [PATCH 078/521] fix(deps): update to scratch-blocks@2.0.0-spork.5 --- package-lock.json | 536 ++++++++++++++---------------- packages/scratch-gui/package.json | 2 +- packages/scratch-vm/package.json | 2 +- 3 files changed, 247 insertions(+), 293 deletions(-) diff --git a/package-lock.json b/package-lock.json index f4e423b1571..035b24a5e3a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1625,16 +1625,43 @@ "node": ">=6.9.0" } }, + "node_modules/@blockly/continuous-toolbox": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@blockly/continuous-toolbox/-/continuous-toolbox-7.0.2.tgz", + "integrity": "sha512-xx65PX+hqynNxqHonFfd1taRkCEGDJYS66oUDbBkwL9lmHI/sXcPCy7E8NhKnYweYOISc0NO2p8G732U8uI0kw==", + "license": "Apache-2.0", + "engines": { + "node": ">=8.17.0" + }, + "peerDependencies": { + "blockly": "^12.0.0" + } + }, "node_modules/@blockly/field-colour": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@blockly/field-colour/-/field-colour-4.0.4.tgz", - "integrity": "sha512-FUXnlReiyejaaT+tkweW386dFbj9mSHjUCVtHgTP6cP5Wbvh6vJHQmnFxlPUNLsHPDGtri8j+yRKxGH97UkJvA==", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@blockly/field-colour/-/field-colour-6.0.4.tgz", + "integrity": "sha512-/sNTrP/wQHwpLN8sEbBDvRBFkY9+7U+WAfnA66wmgRJc4N02F41kX89C29CLUS4SUVkElUuh9spYH6Lj7G4KRQ==", "license": "Apache-2.0", + "dependencies": { + "@blockly/field-grid-dropdown": "^6.0.3" + }, "engines": { "node": ">=8.0.0" }, "peerDependencies": { - "blockly": "^10.4.3" + "blockly": "^12.0.0" + } + }, + "node_modules/@blockly/field-grid-dropdown": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@blockly/field-grid-dropdown/-/field-grid-dropdown-6.0.3.tgz", + "integrity": "sha512-BeCmxNz4FuvZ9GRTw+RM8jWADK2DhQupacKRdhFlEnhR9akOSTwIgeaWoqnIvBkLvXLtSwAJTuQG5wyXoGGd0A==", + "license": "Apache 2.0", + "engines": { + "node": ">=8.17.0" + }, + "peerDependencies": { + "blockly": "^12.0.0" } }, "node_modules/@colors/colors": { @@ -1887,7 +1914,9 @@ } }, "node_modules/@csstools/color-helpers": { - "version": "5.0.1", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", + "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==", "funding": [ { "type": "github", @@ -1904,7 +1933,9 @@ } }, "node_modules/@csstools/css-calc": { - "version": "2.1.1", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", + "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", "funding": [ { "type": "github", @@ -1920,12 +1951,14 @@ "node": ">=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3" + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" } }, "node_modules/@csstools/css-color-parser": { - "version": "3.0.7", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz", + "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==", "funding": [ { "type": "github", @@ -1938,19 +1971,21 @@ ], "license": "MIT", "dependencies": { - "@csstools/color-helpers": "^5.0.1", - "@csstools/css-calc": "^2.1.1" + "@csstools/color-helpers": "^5.1.0", + "@csstools/css-calc": "^2.1.4" }, "engines": { "node": ">=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3" + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" } }, "node_modules/@csstools/css-parser-algorithms": { - "version": "3.0.4", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", "funding": [ { "type": "github", @@ -1966,11 +2001,13 @@ "node": ">=18" }, "peerDependencies": { - "@csstools/css-tokenizer": "^3.0.3" + "@csstools/css-tokenizer": "^3.0.4" } }, "node_modules/@csstools/css-tokenizer": { - "version": "3.0.3", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", "funding": [ { "type": "github", @@ -5447,16 +5484,6 @@ "node": ">=4" } }, - "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==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 10" - } - }, "node_modules/@transifex/api": { "version": "4.3.0", "license": "Apache-2.0", @@ -6396,6 +6423,7 @@ }, "node_modules/abab": { "version": "2.0.6", + "dev": true, "license": "BSD-3-Clause" }, "node_modules/accepts": { @@ -6476,13 +6504,10 @@ } }, "node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", - "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", "license": "MIT", - "dependencies": { - "debug": "^4.3.4" - }, "engines": { "node": ">= 14" } @@ -7832,74 +7857,64 @@ "license": "MIT" }, "node_modules/blockly": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/blockly/-/blockly-10.4.3.tgz", - "integrity": "sha512-+opfBmQnSiv7vTiY/TkDEBOslxUyfj8luS3S+qs1NnQKjInC+Waf2l9cNsMh9J8BMkmiCIT+Ed/3mmjIaL9wug==", + "version": "12.3.0", + "resolved": "https://registry.npmjs.org/blockly/-/blockly-12.3.0.tgz", + "integrity": "sha512-dtxM6Dk8cm0QW4vMJTXmn7xi7a4GnQdXu28Esuuofx7DsYfq73456O5tm3ShUMDcXaFg8w3GVfgoH8I9v6gSVA==", "license": "Apache-2.0", "peer": true, "dependencies": { - "jsdom": "22.1.0" - } - }, - "node_modules/blockly/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==", - "license": "MIT", - "peer": true, - "dependencies": { - "debug": "4" + "jsdom": "26.1.0" }, "engines": { - "node": ">= 6.0.0" + "node": ">=18" } }, - "node_modules/blockly/node_modules/cssstyle": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-3.0.0.tgz", - "integrity": "sha512-N4u2ABATi3Qplzf0hWbVCdjenim8F3ojEXpBDF5hBpjzW182MjNGLqfmQ0SkSPeQ+V86ZXgeH8aXj6kayd4jgg==", + "node_modules/blockly/node_modules/@asamuzakjp/css-color": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-3.2.0.tgz", + "integrity": "sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==", "license": "MIT", "peer": true, "dependencies": { - "rrweb-cssom": "^0.6.0" - }, - "engines": { - "node": ">=14" + "@csstools/css-calc": "^2.1.3", + "@csstools/css-color-parser": "^3.0.9", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "lru-cache": "^10.4.3" } }, - "node_modules/blockly/node_modules/data-urls": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-4.0.0.tgz", - "integrity": "sha512-/mMTei/JXPqvFqQtfyTowxmJVwr2PVAeCcDxyFf6LhoOu/09TX2OX3kb2wzi4DMXcfj4OItwDOnhl5oziPnT6g==", + "node_modules/blockly/node_modules/cssstyle": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.6.0.tgz", + "integrity": "sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==", "license": "MIT", "peer": true, "dependencies": { - "abab": "^2.0.6", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^12.0.0" + "@asamuzakjp/css-color": "^3.2.0", + "rrweb-cssom": "^0.8.0" }, "engines": { - "node": ">=14" + "node": ">=18" } }, - "node_modules/blockly/node_modules/domexception": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", - "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", - "deprecated": "Use your platform's native DOMException instead", + "node_modules/blockly/node_modules/data-urls": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", + "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", "license": "MIT", "peer": true, "dependencies": { - "webidl-conversions": "^7.0.0" + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0" }, "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/blockly/node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", "license": "BSD-2-Clause", "peer": true, "engines": { @@ -7909,62 +7924,17 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/blockly/node_modules/form-data": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", - "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", - "license": "MIT", - "peer": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/blockly/node_modules/html-encoding-sniffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", - "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", - "license": "MIT", - "peer": true, - "dependencies": { - "whatwg-encoding": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/blockly/node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "license": "MIT", - "peer": true, - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/blockly/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": "4.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", + "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", "license": "MIT", "peer": true, "dependencies": { - "agent-base": "6", - "debug": "4" + "whatwg-encoding": "^3.1.1" }, "engines": { - "node": ">= 6" + "node": ">=18" } }, "node_modules/blockly/node_modules/iconv-lite": { @@ -7981,41 +7951,38 @@ } }, "node_modules/blockly/node_modules/jsdom": { - "version": "22.1.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-22.1.0.tgz", - "integrity": "sha512-/9AVW7xNbsBv6GfWho4TTNjEo9fe6Zhf9O7s0Fhhr3u+awPwAJMKwAMXnkk5vBxflqLW9hTHX/0cs+P3gW+cQw==", + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-26.1.0.tgz", + "integrity": "sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==", "license": "MIT", "peer": true, "dependencies": { - "abab": "^2.0.6", - "cssstyle": "^3.0.0", - "data-urls": "^4.0.0", - "decimal.js": "^10.4.3", - "domexception": "^4.0.0", - "form-data": "^4.0.0", - "html-encoding-sniffer": "^3.0.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.1", + "cssstyle": "^4.2.1", + "data-urls": "^5.0.0", + "decimal.js": "^10.5.0", + "html-encoding-sniffer": "^4.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.6", "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.4", - "parse5": "^7.1.2", - "rrweb-cssom": "^0.6.0", + "nwsapi": "^2.2.16", + "parse5": "^7.2.1", + "rrweb-cssom": "^0.8.0", "saxes": "^6.0.0", "symbol-tree": "^3.2.4", - "tough-cookie": "^4.1.2", - "w3c-xmlserializer": "^4.0.0", + "tough-cookie": "^5.1.1", + "w3c-xmlserializer": "^5.0.0", "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^2.0.0", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^12.0.1", - "ws": "^8.13.0", - "xml-name-validator": "^4.0.0" + "whatwg-encoding": "^3.1.1", + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.1.1", + "ws": "^8.18.0", + "xml-name-validator": "^5.0.0" }, "engines": { - "node": ">=16" + "node": ">=18" }, "peerDependencies": { - "canvas": "^2.5.0" + "canvas": "^3.0.0" }, "peerDependenciesMeta": { "canvas": { @@ -8023,14 +7990,21 @@ } } }, + "node_modules/blockly/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", + "peer": true + }, "node_modules/blockly/node_modules/parse5": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", - "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", "license": "MIT", "peer": true, "dependencies": { - "entities": "^4.5.0" + "entities": "^6.0.0" }, "funding": { "url": "https://github.com/inikulin/parse5?sponsor=1" @@ -8047,9 +8021,9 @@ } }, "node_modules/blockly/node_modules/rrweb-cssom": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz", - "integrity": "sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==", + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", + "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==", "license": "MIT", "peer": true }, @@ -8067,55 +8041,42 @@ } }, "node_modules/blockly/node_modules/tough-cookie": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", - "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz", + "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==", "license": "BSD-3-Clause", "peer": true, "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" + "tldts": "^6.1.32" }, "engines": { - "node": ">=6" + "node": ">=16" } }, "node_modules/blockly/node_modules/tr46": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz", - "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", + "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", "license": "MIT", "peer": true, "dependencies": { - "punycode": "^2.3.0" + "punycode": "^2.3.1" }, "engines": { - "node": ">=14" - } - }, - "node_modules/blockly/node_modules/universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 4.0.0" + "node": ">=18" } }, "node_modules/blockly/node_modules/w3c-xmlserializer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", - "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", "license": "MIT", "peer": true, "dependencies": { - "xml-name-validator": "^4.0.0" + "xml-name-validator": "^5.0.0" }, "engines": { - "node": ">=14" + "node": ">=18" } }, "node_modules/blockly/node_modules/webidl-conversions": { @@ -8129,46 +8090,46 @@ } }, "node_modules/blockly/node_modules/whatwg-encoding": { - "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==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", "license": "MIT", "peer": true, "dependencies": { "iconv-lite": "0.6.3" }, "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/blockly/node_modules/whatwg-mimetype": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", - "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", "license": "MIT", "peer": true, "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/blockly/node_modules/whatwg-url": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-12.0.1.tgz", - "integrity": "sha512-Ed/LrqB8EPlGxjS+TrsXcpUond1mhccS3pchLhzSgPCnTimUCKj3IZE75pAs5m6heB2U2TMerKFUXheyHY+VDQ==", + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", + "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", "license": "MIT", "peer": true, "dependencies": { - "tr46": "^4.1.1", + "tr46": "^5.1.0", "webidl-conversions": "^7.0.0" }, "engines": { - "node": ">=14" + "node": ">=18" } }, "node_modules/blockly/node_modules/ws": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==", + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", "license": "MIT", "peer": true, "engines": { @@ -8188,13 +8149,13 @@ } }, "node_modules/blockly/node_modules/xml-name-validator": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", - "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", "license": "Apache-2.0", "peer": true, "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/bluebird": { @@ -10665,7 +10626,9 @@ } }, "node_modules/decimal.js": { - "version": "10.4.3", + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", "license": "MIT" }, "node_modules/decode-html": { @@ -15288,7 +15251,7 @@ "license": "MIT" }, "node_modules/https-proxy-agent": { - "version": "7.0.5", + "version": "7.0.6", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "license": "MIT", @@ -23698,9 +23661,9 @@ "license": "MIT" }, "node_modules/nwsapi": { - "version": "2.2.12", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.18.tgz", - "integrity": "sha512-p1TRH/edngVEHVbwqWnxUViEmq5znDvyB+Sik5cmuLpGOIfDf/39zLiq3swPF8Vakqn+gvNiOQAZu8djYlQILA==", + "version": "2.2.21", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.21.tgz", + "integrity": "sha512-o6nIY3qwiSXl7/LuOU0Dmuctd34Yay0yeuZRLFmDPrrdHpXKFndPj3hM+YEPVHYC5fx2otBx4Ilc/gyYSAUaIA==", "license": "MIT" }, "node_modules/nyc": { @@ -27531,59 +27494,54 @@ } }, "node_modules/scratch-blocks": { - "version": "2.0.0-spork.4", - "resolved": "https://registry.npmjs.org/scratch-blocks/-/scratch-blocks-2.0.0-spork.4.tgz", - "integrity": "sha512-gG/w7a5bAKZAPoYLFbyNgtS7ZIGKpc6MrwmxtZG5oSA2WdJcwZMyYLeV9kMCnCh4P0pKBy+NaQEfQC4fDeXK9A==", + "version": "2.0.0-spork.5", + "resolved": "https://registry.npmjs.org/scratch-blocks/-/scratch-blocks-2.0.0-spork.5.tgz", + "integrity": "sha512-exqIdW4K9PiamjF3kT9Z29yJUxZKTHNMOFIXO92RU3FNcoGQ6sJPzFKvDcUkLdbbZ/XZl6xLZF8fV7a9QWHIrg==", "license": "Apache-2.0", "dependencies": { - "@blockly/continuous-toolbox": "^7.0.0-beta.1", - "@blockly/field-colour": "^4.0.2", - "blockly": "^12.0.0-beta.1" + "@blockly/continuous-toolbox": "^7.0.1", + "@blockly/field-colour": "^6.0.3", + "blockly": "12.3.0-beta.0" } }, - "node_modules/scratch-blocks/node_modules/@blockly/continuous-toolbox": { - "version": "7.0.0-beta.1", - "resolved": "https://registry.npmjs.org/@blockly/continuous-toolbox/-/continuous-toolbox-7.0.0-beta.1.tgz", - "integrity": "sha512-IKu0whdtRTmdXSB11efSJ5fCNzQtAp98fv+7KnZk/V7Q/xAhVAutWWQE+FJvr9lKJlkeYqm9m+cxDhOBtlVP1w==", - "license": "Apache-2.0", - "engines": { - "node": ">=8.17.0" - }, - "peerDependencies": { - "blockly": "^12.0.0-beta.0" + "node_modules/scratch-blocks/node_modules/@asamuzakjp/css-color": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-3.2.0.tgz", + "integrity": "sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==", + "license": "MIT", + "dependencies": { + "@csstools/css-calc": "^2.1.3", + "@csstools/css-color-parser": "^3.0.9", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "lru-cache": "^10.4.3" } }, "node_modules/scratch-blocks/node_modules/blockly": { - "version": "12.0.0-beta.1", - "resolved": "https://registry.npmjs.org/blockly/-/blockly-12.0.0-beta.1.tgz", - "integrity": "sha512-lECwZ4K+YuLXMM0yxWTz1lwkmDl424sst7h/dhtSefuCki8afjI/F87byYK/ZIZsMKBEz2+8wEJ1Wlx5cYWIAg==", + "version": "12.3.0-beta.0", + "resolved": "https://registry.npmjs.org/blockly/-/blockly-12.3.0-beta.0.tgz", + "integrity": "sha512-QXD6dXbsYFLzBs9umZRDhpllkM3Mdxtc9JnDMKksLzEFdFbl2CDl2JaKaw/rP5B0InpD1UrZPF7xT1ZRvJLS9w==", "license": "Apache-2.0", "dependencies": { - "jsdom": "25.0.1" + "jsdom": "26.1.0" }, "engines": { "node": ">=18" } }, "node_modules/scratch-blocks/node_modules/cssstyle": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.2.1.tgz", - "integrity": "sha512-9+vem03dMXG7gDmZ62uqmRiMRNtinIZ9ZyuF6BdxzfOD+FdN5hretzynkn0ReS2DO2GSw76RWHs0UmJPI2zUjw==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.6.0.tgz", + "integrity": "sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==", "license": "MIT", "dependencies": { - "@asamuzakjp/css-color": "^2.8.2", + "@asamuzakjp/css-color": "^3.2.0", "rrweb-cssom": "^0.8.0" }, "engines": { "node": ">=18" } }, - "node_modules/scratch-blocks/node_modules/cssstyle/node_modules/rrweb-cssom": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", - "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==", - "license": "MIT" - }, "node_modules/scratch-blocks/node_modules/data-urls": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", @@ -27598,9 +27556,9 @@ } }, "node_modules/scratch-blocks/node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", "license": "BSD-2-Clause", "engines": { "node": ">=0.12" @@ -27609,21 +27567,6 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/scratch-blocks/node_modules/form-data": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", - "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/scratch-blocks/node_modules/html-encoding-sniffer": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", @@ -27649,30 +27592,29 @@ } }, "node_modules/scratch-blocks/node_modules/jsdom": { - "version": "25.0.1", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-25.0.1.tgz", - "integrity": "sha512-8i7LzZj7BF8uplX+ZyOlIz86V6TAsSs+np6m1kpW9u0JWi4z/1t+FzcK1aek+ybTnAC4KhBL4uXCNT0wcUIeCw==", + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-26.1.0.tgz", + "integrity": "sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==", "license": "MIT", "dependencies": { - "cssstyle": "^4.1.0", + "cssstyle": "^4.2.1", "data-urls": "^5.0.0", - "decimal.js": "^10.4.3", - "form-data": "^4.0.0", + "decimal.js": "^10.5.0", "html-encoding-sniffer": "^4.0.0", "http-proxy-agent": "^7.0.2", - "https-proxy-agent": "^7.0.5", + "https-proxy-agent": "^7.0.6", "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.12", - "parse5": "^7.1.2", - "rrweb-cssom": "^0.7.1", + "nwsapi": "^2.2.16", + "parse5": "^7.2.1", + "rrweb-cssom": "^0.8.0", "saxes": "^6.0.0", "symbol-tree": "^3.2.4", - "tough-cookie": "^5.0.0", + "tough-cookie": "^5.1.1", "w3c-xmlserializer": "^5.0.0", "webidl-conversions": "^7.0.0", "whatwg-encoding": "^3.1.1", "whatwg-mimetype": "^4.0.0", - "whatwg-url": "^14.0.0", + "whatwg-url": "^14.1.1", "ws": "^8.18.0", "xml-name-validator": "^5.0.0" }, @@ -27680,7 +27622,7 @@ "node": ">=18" }, "peerDependencies": { - "canvas": "^2.11.2" + "canvas": "^3.0.0" }, "peerDependenciesMeta": { "canvas": { @@ -27688,13 +27630,19 @@ } } }, + "node_modules/scratch-blocks/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/scratch-blocks/node_modules/parse5": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", - "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", "license": "MIT", "dependencies": { - "entities": "^4.5.0" + "entities": "^6.0.0" }, "funding": { "url": "https://github.com/inikulin/parse5?sponsor=1" @@ -27709,6 +27657,12 @@ "node": ">=6" } }, + "node_modules/scratch-blocks/node_modules/rrweb-cssom": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", + "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==", + "license": "MIT" + }, "node_modules/scratch-blocks/node_modules/saxes": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", @@ -27734,9 +27688,9 @@ } }, "node_modules/scratch-blocks/node_modules/tr46": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz", - "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", + "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", "license": "MIT", "dependencies": { "punycode": "^2.3.1" @@ -27788,12 +27742,12 @@ } }, "node_modules/scratch-blocks/node_modules/whatwg-url": { - "version": "14.1.1", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.1.1.tgz", - "integrity": "sha512-mDGf9diDad/giZ/Sm9Xi2YcyzaFpbdLpJPr+E9fSkyQ7KpQD4SdFcugkRQYzhmfI4KeV4Qpnn2sKPdo+kmsgRQ==", + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", + "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", "license": "MIT", "dependencies": { - "tr46": "^5.0.0", + "tr46": "^5.1.0", "webidl-conversions": "^7.0.0" }, "engines": { @@ -27801,9 +27755,9 @@ } }, "node_modules/scratch-blocks/node_modules/ws": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==", + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", "license": "MIT", "engines": { "node": ">=10.0.0" @@ -32333,21 +32287,21 @@ "license": "MIT" }, "node_modules/tldts": { - "version": "6.1.82", - "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.82.tgz", - "integrity": "sha512-KCTjNL9F7j8MzxgfTgjT+v21oYH38OidFty7dH00maWANAI2IsLw2AnThtTJi9HKALHZKQQWnNebYheadacD+g==", + "version": "6.1.86", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.86.tgz", + "integrity": "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==", "license": "MIT", "dependencies": { - "tldts-core": "^6.1.82" + "tldts-core": "^6.1.86" }, "bin": { "tldts": "bin/cli.js" } }, "node_modules/tldts-core": { - "version": "6.1.82", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.82.tgz", - "integrity": "sha512-Jabl32m21tt/d/PbDO88R43F8aY98Piiz6BVH9ShUlOAiiAELhEqwrAmBocjAqnCfoUeIsRU+h3IEzZd318F3w==", + "version": "6.1.86", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.86.tgz", + "integrity": "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==", "license": "MIT" }, "node_modules/tmp": { @@ -34205,7 +34159,7 @@ "react-virtualized": "9.22.6", "redux-throttle": "0.1.1", "scratch-audio": "2.0.86", - "scratch-blocks": "2.0.0-spork.4", + "scratch-blocks": "2.0.0-spork.5", "scratch-l10n": "5.0.152", "scratch-paint": "3.0.164", "scratch-render-fonts": "1.0.170", @@ -35623,7 +35577,7 @@ "jsdoc": "3.6.11", "json": "^9.0.4", "pngjs": "3.4.0", - "scratch-blocks": "2.0.0-spork.4", + "scratch-blocks": "2.0.0-spork.5", "scratch-l10n": "5.0.152", "scratch-render-fonts": "1.0.170", "scratch-semantic-release-config": "3.0.0", diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index adb15e89dd8..f4fcb2da515 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -94,7 +94,7 @@ "react-virtualized": "9.22.6", "redux-throttle": "0.1.1", "scratch-audio": "2.0.86", - "scratch-blocks": "2.0.0-spork.4", + "scratch-blocks": "2.0.0-spork.5", "scratch-l10n": "5.0.152", "scratch-paint": "3.0.164", "scratch-render-fonts": "1.0.170", diff --git a/packages/scratch-vm/package.json b/packages/scratch-vm/package.json index ab04ae01392..326829d516a 100644 --- a/packages/scratch-vm/package.json +++ b/packages/scratch-vm/package.json @@ -92,7 +92,7 @@ "jsdoc": "3.6.11", "json": "^9.0.4", "pngjs": "3.4.0", - "scratch-blocks": "2.0.0-spork.4", + "scratch-blocks": "2.0.0-spork.5", "scratch-l10n": "5.0.152", "scratch-render-fonts": "1.0.170", "scratch-semantic-release-config": "3.0.0", From 78c4e2ed592959a1806e143685851ab0375148f5 Mon Sep 17 00:00:00 2001 From: Aaron Dodson Date: Fri, 1 Aug 2025 08:48:04 -0700 Subject: [PATCH 079/521] fix: use serialization wrapper (#32) --- packages/scratch-gui/src/containers/blocks.jsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/scratch-gui/src/containers/blocks.jsx b/packages/scratch-gui/src/containers/blocks.jsx index 65ed4f99a09..aade9da954c 100644 --- a/packages/scratch-gui/src/containers/blocks.jsx +++ b/packages/scratch-gui/src/containers/blocks.jsx @@ -431,7 +431,10 @@ class Blocks extends React.Component { this.workspace.removeChangeListener(this.toolboxUpdateChangeListener); const dom = this.ScratchBlocks.utils.xml.textToDom(data.xml); try { - this.ScratchBlocks.Xml.clearWorkspaceAndLoadFromXml(dom, this.workspace); + this.ScratchBlocks.clearWorkspaceAndLoadFromXml( + dom, + this.workspace + ); } catch (error) { // The workspace is likely incomplete. What did update should be // functional. From 26ffd97e4ad63ca47ce2cd925fdf36ec6f9af68f Mon Sep 17 00:00:00 2001 From: Aaron Dodson Date: Fri, 1 Aug 2025 08:49:17 -0700 Subject: [PATCH 080/521] fix: plumb `FieldNote` through to the VM (#33) --- packages/scratch-gui/src/lib/blocks.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/scratch-gui/src/lib/blocks.js b/packages/scratch-gui/src/lib/blocks.js index 28db2767ed1..856b6875060 100644 --- a/packages/scratch-gui/src/lib/blocks.js +++ b/packages/scratch-gui/src/lib/blocks.js @@ -313,9 +313,9 @@ export default function (vm, useCatBlocks) { return ScratchBlocks.StatusButtonState.NOT_READY; }; - // ScratchBlocks.FieldNote.playNote_ = function (noteNum, extensionId) { - // vm.runtime.emit('PLAY_NOTE', noteNum, extensionId); - // }; + ScratchBlocks.FieldNote.playNote_ = function (noteNum, extensionId) { + vm.runtime.emit("PLAY_NOTE", noteNum, extensionId); + }; // Use a collator's compare instead of localeCompare which internally // creates a collator. Using this is a lot faster in browsers that create a From d0a73c56d6b0f06ab1945e5e78e8012c7c09746a Mon Sep 17 00:00:00 2001 From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com> Date: Wed, 3 Sep 2025 07:39:30 -0700 Subject: [PATCH 081/521] style: use single quotes to fix lint --- packages/scratch-gui/src/lib/blocks.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/scratch-gui/src/lib/blocks.js b/packages/scratch-gui/src/lib/blocks.js index 856b6875060..27717e9bc38 100644 --- a/packages/scratch-gui/src/lib/blocks.js +++ b/packages/scratch-gui/src/lib/blocks.js @@ -314,7 +314,7 @@ export default function (vm, useCatBlocks) { }; ScratchBlocks.FieldNote.playNote_ = function (noteNum, extensionId) { - vm.runtime.emit("PLAY_NOTE", noteNum, extensionId); + vm.runtime.emit('PLAY_NOTE', noteNum, extensionId); }; // Use a collator's compare instead of localeCompare which internally From 677f663918beae2805bfe662d2e39878b8457731 Mon Sep 17 00:00:00 2001 From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com> Date: Wed, 3 Sep 2025 08:00:19 -0700 Subject: [PATCH 082/521] test: update comment ID in engine adapter test --- packages/scratch-vm/test/unit/engine_adapter.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/scratch-vm/test/unit/engine_adapter.js b/packages/scratch-vm/test/unit/engine_adapter.js index 814ff9ffc29..1b21e664eb2 100644 --- a/packages/scratch-vm/test/unit/engine_adapter.js +++ b/packages/scratch-vm/test/unit/engine_adapter.js @@ -52,8 +52,12 @@ test('create with comment', t => { t.ok(Array.isArray(result)); t.equal(result.length, 2); + t.type(result[0].id, 'string'); t.type(result[0].comment, 'string'); - t.equal(result[0].comment, 'aCommentId'); + + // as of scratch-blocks@^2, the comment ID is derived from the block ID + t.equal(result[0].id, 'z!+#Nqr,_(V=xz0y7a@d'); + t.equal(result[0].comment, 'z!+#Nqr,_(V=xz0y7a@d_comment'); t.end(); }); From ab6093148c6308dca8116747fd2f397b385184d9 Mon Sep 17 00:00:00 2001 From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com> Date: Wed, 3 Sep 2025 10:11:13 -0700 Subject: [PATCH 083/521] ci: de-matrix GH Pages deploy --- .github/workflows/ci.yml | 59 ++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 35 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4d7d58d6ca0..f7c1cf79476 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -89,18 +89,9 @@ jobs: preview: runs-on: ubuntu-latest - needs: - - build - - test + needs: build if: ${{ needs.build.outputs.any-workspace == 'true' }} - strategy: - fail-fast: false - matrix: - package: ${{ fromJSON(needs.build.outputs.packages) }} - exclude: - - package: global - - package: any-workspace - name: Preview ${{ matrix.package }} on GH Pages + name: Publish preview playgrounds to GH Pages steps: - name: Determine GitHub Pages directory name id: branch_dir_name @@ -114,21 +105,35 @@ jobs: with: name: build path: packages - - name: Deploy ${{ matrix.package }} testing playground to GitHub Pages + - name: Prepare playgrounds for GH Pages + working-directory: ./packages + run: | + mkdir -p ../pages/ + for pkg in *; do + if [ -d "${pkg}/playground" ]; then + # using symlinks is quick and artifact generation will dereference them + # if the GH Pages action stops dereferencing these links, we'll need to copy the files instead + ln -s "../packages/${pkg}/playground" "../pages/${pkg}" + fi + done + + # scratch-gui doesn't follow the pattern above + ln -s "../packages/scratch-gui/build" "../pages/scratch-gui" + + ls -l ../pages/ + - name: Deploy playgrounds to GitHub Pages uses: peaceiris/actions-gh-pages@4f9cc6602d3f66b9c108549d475ec49e8ef4d45e # v4 with: github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: ./packages/${{ matrix.package }}/playground - destination_dir: "${{steps.branch_dir_name.outputs.result}}/${{ matrix.package }}" + publish_dir: ./pages + destination_dir: "${{steps.branch_dir_name.outputs.result}}" full_commit_message: "Build for ${{ github.sha }} ${{ github.event.head_commit.message }}" results: - name: Results + name: Test Results runs-on: ubuntu-latest - needs: - - test - - preview - if: ${{ always() }} + needs: test + if: ${{ !cancelled() }} steps: - run: | case "${{ needs.test.result }}" in @@ -146,19 +151,3 @@ jobs: exit 1 ;; esac - - run: | - case "${{ needs.preview.result }}" in - success) - echo "GitHub Pages previews published successfully." - exit 0 - ;; - skipped) - echo "Previews were unnecessary for these changes, so they were skipped." - echo "If this is unexpected, check the path filters." - exit 0 - ;; - *) - echo "Publishing GitHub Pages previews failed." - exit 1 - ;; - esac From 92427b6435ead8acb11ec9955aee1f84abdc7b53 Mon Sep 17 00:00:00 2001 From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com> Date: Thu, 4 Sep 2025 09:45:31 -0700 Subject: [PATCH 084/521] ci: output more info for debugging GHA --- .github/workflows/ci.yml | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f7c1cf79476..23ba2b8ec3c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -27,15 +27,14 @@ jobs: - name: Debug info # https://docs.github.com/en/actions/reference/security/secure-use#use-an-intermediate-environment-variable env: - GH_HEAD_REF: ${{ github.head_ref }} + # `env:` values are printed to the log even without using them in `run:` + GH_CONTEXT: ${{ toJson(github) }} run: | cat <' }} + Working directory: $(pwd) Node version: $(node --version) NPM version: $(npm --version) - GitHub ref: ${{ github.ref }} - GitHub head ref: ${GH_HEAD_REF} - Working directory: $(pwd) + Scratch environment: ${{ vars.SCRATCH_ENV || '' }} EOF - uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3 From 0f959e1f077bd49db7d876f18844702f2c7f6c8c Mon Sep 17 00:00:00 2001 From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com> Date: Thu, 4 Sep 2025 09:11:42 -0700 Subject: [PATCH 085/521] ci: skip GH Pages publish from fork PRs --- .github/workflows/ci.yml | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 23ba2b8ec3c..d9f6af4b91b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -89,7 +89,18 @@ jobs: preview: runs-on: ubuntu-latest needs: build - if: ${{ needs.build.outputs.any-workspace == 'true' }} + # We don't want to give forks free reign to publish to our GH Pages, so run this job only if both: + # - any workspace changed (otherwise there's no work to do) + # - and either + # - this is not a PR (so it's some other event that happened in our fork, like a push or merge group) + # - or it's a PR from our fork (not some other fork) + if: ${{ + (needs.build.outputs.any-workspace == 'true') && + ( + (!github.event.pull_request) || + (github.event.pull_request.head.repo.full_name == github.repository) + ) + }} name: Publish preview playgrounds to GH Pages steps: - name: Determine GitHub Pages directory name From a630a646bbcb51943774023913803410e4dc07bc Mon Sep 17 00:00:00 2001 From: Georgi Angelov Date: Wed, 22 Oct 2025 11:35:02 +0300 Subject: [PATCH 086/521] feat: add onClickLogin on the main GUI component Allows overriding what happens when the Login button in the header is clicked. In some cases we want to be able to open a popup, not just render a user/pass dialog as in current Scratch. --- packages/scratch-gui/src/components/gui/gui.jsx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/scratch-gui/src/components/gui/gui.jsx b/packages/scratch-gui/src/components/gui/gui.jsx index b5d2f6d3329..315e3e7c411 100644 --- a/packages/scratch-gui/src/components/gui/gui.jsx +++ b/packages/scratch-gui/src/components/gui/gui.jsx @@ -99,6 +99,7 @@ const GUIComponent = props => { onClickAccountNav, onCloseAccountNav, onLogOut, + onClickLogin, onOpenRegistration, onToggleLoginOpen, onActivateCostumesTab, @@ -274,6 +275,7 @@ const GUIComponent = props => { onClickLogo={onClickLogo} onCloseAccountNav={onCloseAccountNav} onLogOut={onLogOut} + onClickLogin={onClickLogin} onOpenRegistration={onOpenRegistration} onProjectTelemetryEvent={onProjectTelemetryEvent} onSeeCommunity={onSeeCommunity} @@ -463,6 +465,7 @@ GUIComponent.propTypes = { onLogOut: PropTypes.func, onNewSpriteClick: PropTypes.func, onNewLibraryCostumeClick: PropTypes.func, + onClickLogin: PropTypes.func, onOpenRegistration: PropTypes.func, onRequestCloseBackdropLibrary: PropTypes.func, onRequestCloseCostumeLibrary: PropTypes.func, From a33649e255ce6174b690d12039b04ac80d5a46ee Mon Sep 17 00:00:00 2001 From: Kaloyan Manolov Date: Tue, 4 Nov 2025 17:04:18 +0200 Subject: [PATCH 087/521] feat: make cat-blocks a configurable theme --- packages/scratch-gui/src/containers/blocks.jsx | 6 +++++- packages/scratch-gui/src/lib/blocks.js | 5 ++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/scratch-gui/src/containers/blocks.jsx b/packages/scratch-gui/src/containers/blocks.jsx index f5ea9d561bf..6a8efb97304 100644 --- a/packages/scratch-gui/src/containers/blocks.jsx +++ b/packages/scratch-gui/src/containers/blocks.jsx @@ -165,6 +165,10 @@ class Blocks extends React.Component { ); } componentDidUpdate (prevProps) { + if (this.props.useCatBlocks !== prevProps.useCatBlocks) { + this.ScratchBlocks = VMScratchBlocks(this.props.vm, this.props.useCatBlocks); + } + // If any modals are open, call hideChaff to close z-indexed field editors if (this.props.anyModalVisible && !prevProps.anyModalVisible) { this.ScratchBlocks.hideChaff(); @@ -699,7 +703,7 @@ const mapStateToProps = state => ({ toolboxXML: state.scratchGui.toolbox.toolboxXML, customProceduresVisible: state.scratchGui.customProcedures.active, workspaceMetrics: state.scratchGui.workspaceMetrics, - useCatBlocks: isTimeTravel2020(state) + useCatBlocks: isTimeTravel2020(state) || state.scratchGui.theme.theme === 'high-contrast' }); const mapDispatchToProps = dispatch => ({ diff --git a/packages/scratch-gui/src/lib/blocks.js b/packages/scratch-gui/src/lib/blocks.js index 14fafc92c90..4468b85d36a 100644 --- a/packages/scratch-gui/src/lib/blocks.js +++ b/packages/scratch-gui/src/lib/blocks.js @@ -5,7 +5,10 @@ * @returns {ScratchBlocks} ScratchBlocks connected with the vm */ export default function (vm, useCatBlocks) { - const ScratchBlocks = useCatBlocks ? require('cat-blocks') : require('scratch-blocks'); + const ScratchBlocks = require('scratch-blocks'); + + ScratchBlocks.useCatBlocks = useCatBlocks; + const jsonForMenuBlock = function (name, menuOptionsFn, colors, start) { return { message0: '%1', From 55f6bbabff4f72ed20b6f45896ab9ae68baa2b8d Mon Sep 17 00:00:00 2001 From: Kaloyan Manolov Date: Thu, 13 Nov 2025 17:31:12 +0200 Subject: [PATCH 088/521] feat: adhere to scratch-blocks interface when passing theme --- packages/scratch-gui/src/lib/blocks.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/scratch-gui/src/lib/blocks.js b/packages/scratch-gui/src/lib/blocks.js index 4468b85d36a..2768ac06d7b 100644 --- a/packages/scratch-gui/src/lib/blocks.js +++ b/packages/scratch-gui/src/lib/blocks.js @@ -7,7 +7,12 @@ export default function (vm, useCatBlocks) { const ScratchBlocks = require('scratch-blocks'); - ScratchBlocks.useCatBlocks = useCatBlocks; + // TODO: Set theme from editor settings + if (useCatBlocks) { + ScratchBlocks.setTheme(ScratchBlocks.Themes.CAT_BLOCKS); + } else { + ScratchBlocks.setTheme(ScratchBlocks.Themes.CLASSIC); + } const jsonForMenuBlock = function (name, menuOptionsFn, colors, start) { return { From e28d5575fdc76662814058094324398aec8c4cde Mon Sep 17 00:00:00 2001 From: Ayshe Dzhindzhi Date: Fri, 14 Nov 2025 15:10:08 +0200 Subject: [PATCH 089/521] feat: add the ability to display avatar badge for users with active membership --- .../scratch-gui/src/components/gui/gui.jsx | 3 +++ .../src/components/menu-bar/account-nav.jsx | 5 +++- .../src/components/menu-bar/author-info.jsx | 7 ++++-- .../src/components/menu-bar/cat-ears.svg | 3 +++ .../src/components/menu-bar/menu-bar.jsx | 5 ++++ .../src/components/menu-bar/user-avatar.css | 25 +++++++++++++++++++ .../src/components/menu-bar/user-avatar.jsx | 25 +++++++++++-------- packages/scratch-gui/src/css/colors.css | 1 + 8 files changed, 61 insertions(+), 13 deletions(-) create mode 100644 packages/scratch-gui/src/components/menu-bar/cat-ears.svg diff --git a/packages/scratch-gui/src/components/gui/gui.jsx b/packages/scratch-gui/src/components/gui/gui.jsx index 1fa06119e2e..ba11a94696d 100644 --- a/packages/scratch-gui/src/components/gui/gui.jsx +++ b/packages/scratch-gui/src/components/gui/gui.jsx @@ -59,6 +59,7 @@ const GUIComponent = props => { authorId, authorThumbnailUrl, authorUsername, + authorAvatarBadge, basePath, backdropLibraryVisible, backpackHost, @@ -257,6 +258,7 @@ const GUIComponent = props => { authorId={authorId} authorThumbnailUrl={authorThumbnailUrl} authorUsername={authorUsername} + authorAvatarBadge={authorAvatarBadge} canChangeLanguage={canChangeLanguage} canChangeTheme={canChangeTheme} canCreateCopy={canCreateCopy} @@ -435,6 +437,7 @@ GUIComponent.propTypes = { authorId: PropTypes.oneOfType([PropTypes.string, PropTypes.bool]), // can be false authorThumbnailUrl: PropTypes.string, authorUsername: PropTypes.oneOfType([PropTypes.string, PropTypes.bool]), // can be false + authorAvatarBadge: PropTypes.number, backdropLibraryVisible: PropTypes.bool, backpackHost: PropTypes.string, backpackVisible: PropTypes.bool, diff --git a/packages/scratch-gui/src/components/menu-bar/account-nav.jsx b/packages/scratch-gui/src/components/menu-bar/account-nav.jsx index 2cb7d37e49a..eb79d5d4a34 100644 --- a/packages/scratch-gui/src/components/menu-bar/account-nav.jsx +++ b/packages/scratch-gui/src/components/menu-bar/account-nav.jsx @@ -31,7 +31,8 @@ const AccountNavComponent = ({ myClassesUrl, myClassUrl, accountSettingsUrl, - username + username, + avatarBadge }) => (
) : null} @@ -143,6 +145,7 @@ AccountNavComponent.propTypes = { onLogOut: PropTypes.func, username: PropTypes.string, + avatarBadge: PropTypes.number, avatarUrl: PropTypes.string, myStuffUrl: PropTypes.string, diff --git a/packages/scratch-gui/src/components/menu-bar/author-info.jsx b/packages/scratch-gui/src/components/menu-bar/author-info.jsx index 50379d62634..4c769297bed 100644 --- a/packages/scratch-gui/src/components/menu-bar/author-info.jsx +++ b/packages/scratch-gui/src/components/menu-bar/author-info.jsx @@ -12,7 +12,8 @@ const AuthorInfo = ({ projectTitle, // TODO: use userId to link to user's profile userId, - username + username, + avatarBadge }) => (
@@ -54,7 +56,8 @@ AuthorInfo.propTypes = { imageUrl: PropTypes.string, projectTitle: PropTypes.string, userId: PropTypes.oneOfType([PropTypes.string, PropTypes.bool]), - username: PropTypes.oneOfType([PropTypes.string, PropTypes.bool]) + username: PropTypes.oneOfType([PropTypes.string, PropTypes.bool]), + avatarBadge: PropTypes.number }; export default AuthorInfo; diff --git a/packages/scratch-gui/src/components/menu-bar/cat-ears.svg b/packages/scratch-gui/src/components/menu-bar/cat-ears.svg new file mode 100644 index 00000000000..046de35b076 --- /dev/null +++ b/packages/scratch-gui/src/components/menu-bar/cat-ears.svg @@ -0,0 +1,3 @@ + + + diff --git a/packages/scratch-gui/src/components/menu-bar/menu-bar.jsx b/packages/scratch-gui/src/components/menu-bar/menu-bar.jsx index 58f955a1bbb..e77e4114635 100644 --- a/packages/scratch-gui/src/components/menu-bar/menu-bar.jsx +++ b/packages/scratch-gui/src/components/menu-bar/menu-bar.jsx @@ -648,6 +648,7 @@ class MenuBar extends React.Component { projectTitle={this.props.projectTitle} userId={this.props.authorId} username={this.props.authorUsername} + avatarBadge={this.props.authorAvatarBadge} /> ) : null)}
@@ -782,6 +783,7 @@ class MenuBar extends React.Component { onLogOut={menuOpts.canLogout ? this.props.onLogOut : null} username={this.props.username} + avatarBadge={this.props.avatarBadge} avatarUrl={menuOpts.avatarUrl} myStuffUrl={menuOpts.myStuffUrl} @@ -899,6 +901,7 @@ MenuBar.propTypes = { authorId: PropTypes.oneOfType([PropTypes.string, PropTypes.bool]), authorThumbnailUrl: PropTypes.string, authorUsername: PropTypes.oneOfType([PropTypes.string, PropTypes.bool]), + authorAvatarBadge: PropTypes.number, autoUpdateProject: PropTypes.func, canChangeLanguage: PropTypes.bool, canChangeTheme: PropTypes.bool, @@ -975,6 +978,7 @@ MenuBar.propTypes = { shouldSaveBeforeTransition: PropTypes.func, showComingSoon: PropTypes.bool, username: PropTypes.string, + avatarBadge: PropTypes.number, userOwnsProject: PropTypes.bool, accountMenuOptions: AccountMenuOptionsPropTypes, @@ -1008,6 +1012,7 @@ const mapStateToProps = (state, ownProps) => { projectTitle: state.scratchGui.projectTitle, settingsMenuOpen: settingsMenuOpen(state), username: ownProps.username ?? (user ? user.username : null), + avatarBadge: ownProps.avatarBadge ?? (user ? user.membership_avatar_badge : null), userIsEducator: permissions && permissions.educator, vm: state.scratchGui.vm, mode220022BC: isTimeTravel220022BC(state), diff --git a/packages/scratch-gui/src/components/menu-bar/user-avatar.css b/packages/scratch-gui/src/components/menu-bar/user-avatar.css index 2d1ac6fefdd..7caef71fae3 100644 --- a/packages/scratch-gui/src/components/menu-bar/user-avatar.css +++ b/packages/scratch-gui/src/components/menu-bar/user-avatar.css @@ -8,3 +8,28 @@ vertical-align: middle; box-shadow: 0 0 0 1px $ui-black-transparent; } + +.avatar-badge { + border: 1px solid $ui-orange; + box-sizing: border-box; + border-radius: 17%; + box-shadow: none; +} + +.avatar-badge-wrapper { + display: inline-block; + background: url('./cat-ears.svg') no-repeat top ; + background-size: contain; + align-content: end; + + width: $menu-bar-button-size; + height: calc($menu-bar-button-size * 1.28); +} + +[dir="ltr"] .avatar-badge-wrapper { + margin-right: calc($space * .8125); +} + +[dir="rtl"] .avatar-badge-wrapper { + margin-left: calc($space * .8125); +} diff --git a/packages/scratch-gui/src/components/menu-bar/user-avatar.jsx b/packages/scratch-gui/src/components/menu-bar/user-avatar.jsx index df0f042afa2..5df3597ec3b 100644 --- a/packages/scratch-gui/src/components/menu-bar/user-avatar.jsx +++ b/packages/scratch-gui/src/components/menu-bar/user-avatar.jsx @@ -6,21 +6,26 @@ import styles from './user-avatar.css'; const UserAvatar = ({ className, - imageUrl + imageUrl, + showAvatarBadge = false }) => ( - +
+ +
); UserAvatar.propTypes = { className: PropTypes.string, - imageUrl: PropTypes.string + imageUrl: PropTypes.string, + showAvatarBadge: PropTypes.bool, }; export default UserAvatar; diff --git a/packages/scratch-gui/src/css/colors.css b/packages/scratch-gui/src/css/colors.css index 538d4e8d032..f01a3f69090 100644 --- a/packages/scratch-gui/src/css/colors.css +++ b/packages/scratch-gui/src/css/colors.css @@ -15,6 +15,7 @@ $ui-black-transparent-10: hsla(0, 0%, 0%, 0.10); /* 10% transparent version of b $ui-green: hsla(163, 85%, 35%, 1); /* #0DA57A */ $ui-green-2: hsla(163, 85%, 40%, 1); /* #0FBD8C */ +$ui-orange: hsla(37, 96%, 55%, 1); /* #FAA51D */ $text-primary: hsla(225, 15%, 40%, 1); /* #575E75 */ $text-primary-transparent: hsla(225, 15%, 40%, 0.75); From 2fbf7352c69b1d69ac0286914bf0b1cf2f48eee1 Mon Sep 17 00:00:00 2001 From: Ayshe Dzhindzhi Date: Fri, 14 Nov 2025 15:36:42 +0200 Subject: [PATCH 090/521] fix: remove trailing comma --- packages/scratch-gui/src/components/menu-bar/user-avatar.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/scratch-gui/src/components/menu-bar/user-avatar.jsx b/packages/scratch-gui/src/components/menu-bar/user-avatar.jsx index 5df3597ec3b..f6e05510c92 100644 --- a/packages/scratch-gui/src/components/menu-bar/user-avatar.jsx +++ b/packages/scratch-gui/src/components/menu-bar/user-avatar.jsx @@ -25,7 +25,7 @@ const UserAvatar = ({ UserAvatar.propTypes = { className: PropTypes.string, imageUrl: PropTypes.string, - showAvatarBadge: PropTypes.bool, + showAvatarBadge: PropTypes.bool }; export default UserAvatar; From a52a1e7b8915a71e09bdf95637707e43835c63e5 Mon Sep 17 00:00:00 2001 From: Kaloyan Manolov Date: Tue, 18 Nov 2025 12:21:00 +0200 Subject: [PATCH 091/521] feat: rename theme to colorMode and abstract away a preferences component --- .../scratch-gui/src/components/gui/gui.jsx | 22 ++-- .../src/components/menu-bar/menu-bar.jsx | 6 +- .../components/menu-bar/preference-menu.jsx | 114 +++++++++++++++++ .../src/components/menu-bar/settings-menu.css | 3 +- .../src/components/menu-bar/settings-menu.jsx | 116 +++++++++++------ .../src/components/menu-bar/theme-menu.jsx | 118 ------------------ .../src/components/monitor/monitor.jsx | 10 +- .../scratch-gui/src/containers/blocks.jsx | 21 ++-- .../scratch-gui/src/containers/monitor.jsx | 10 +- .../scratch-gui/src/lib/make-toolbox-xml.js | 4 +- .../color-mode}/blockHelpers.js | 44 +++---- .../color-mode}/dark/__mocks__/index.js | 0 .../color-mode}/dark/index.js | 0 .../color-mode}/default/__mocks__/index.js | 0 .../color-mode}/default/icon.svg | 0 .../color-mode}/default/index.js | 0 .../blocks-media/comment-arrow-down.svg | 0 .../blocks-media/comment-arrow-up.svg | 0 .../high-contrast/blocks-media/delete-x.svg | 0 .../blocks-media/dropdown-arrow.svg | 0 .../high-contrast/blocks-media/eyedropper.svg | 0 .../blocks-media/icons/arrow_button.svg | 0 .../high-contrast/blocks-media/repeat.svg | 0 .../blocks-media/rotate-left.svg | 0 .../blocks-media/rotate-right.svg | 0 .../high-contrast/blocks-media/zoom-in.svg | 0 .../high-contrast/blocks-media/zoom-out.svg | 0 .../high-contrast/blocks-media/zoom-reset.svg | 0 .../extensions/faceSensingIcon.svg | 0 .../high-contrast/extensions/musicIcon.svg | 0 .../high-contrast/extensions/penIcon.svg | 0 .../extensions/text2speechIcon.svg | 0 .../extensions/translateIcon.svg | 0 .../extensions/videoSensingIcon.svg | 0 .../color-mode}/high-contrast/icon.svg | 0 .../color-mode}/high-contrast/index.js | 0 .../{themes => settings/color-mode}/index.js | 52 ++++---- .../lib/settings/color-mode/persistence.js | 47 +++++++ .../src/lib/system-preferences-hoc.jsx | 12 +- .../src/lib/themes/themePersistance.js | 45 ------- packages/scratch-gui/src/reducers/gui.ts | 6 +- packages/scratch-gui/src/reducers/menus.js | 15 +-- packages/scratch-gui/src/reducers/settings.js | 27 ++++ packages/scratch-gui/src/reducers/theme.js | 27 ---- .../test/integration/menu-bar.test.js | 12 +- .../test/unit/components/menu-bar.test.jsx | 6 +- .../unit/components/monitor-list.test.jsx | 6 +- .../test/unit/components/monitor.test.jsx | 14 +-- .../scratch-gui/test/unit/util/themes.test.js | 72 +++++------ packages/scratch-gui/webpack.config.js | 2 +- 50 files changed, 425 insertions(+), 386 deletions(-) create mode 100644 packages/scratch-gui/src/components/menu-bar/preference-menu.jsx delete mode 100644 packages/scratch-gui/src/components/menu-bar/theme-menu.jsx rename packages/scratch-gui/src/lib/{themes => settings/color-mode}/blockHelpers.js (66%) rename packages/scratch-gui/src/lib/{themes => settings/color-mode}/dark/__mocks__/index.js (100%) rename packages/scratch-gui/src/lib/{themes => settings/color-mode}/dark/index.js (100%) rename packages/scratch-gui/src/lib/{themes => settings/color-mode}/default/__mocks__/index.js (100%) rename packages/scratch-gui/src/lib/{themes => settings/color-mode}/default/icon.svg (100%) rename packages/scratch-gui/src/lib/{themes => settings/color-mode}/default/index.js (100%) rename packages/scratch-gui/src/lib/{themes => settings/color-mode}/high-contrast/blocks-media/comment-arrow-down.svg (100%) rename packages/scratch-gui/src/lib/{themes => settings/color-mode}/high-contrast/blocks-media/comment-arrow-up.svg (100%) rename packages/scratch-gui/src/lib/{themes => settings/color-mode}/high-contrast/blocks-media/delete-x.svg (100%) rename packages/scratch-gui/src/lib/{themes => settings/color-mode}/high-contrast/blocks-media/dropdown-arrow.svg (100%) rename packages/scratch-gui/src/lib/{themes => settings/color-mode}/high-contrast/blocks-media/eyedropper.svg (100%) rename packages/scratch-gui/src/lib/{themes => settings/color-mode}/high-contrast/blocks-media/icons/arrow_button.svg (100%) rename packages/scratch-gui/src/lib/{themes => settings/color-mode}/high-contrast/blocks-media/repeat.svg (100%) rename packages/scratch-gui/src/lib/{themes => settings/color-mode}/high-contrast/blocks-media/rotate-left.svg (100%) rename packages/scratch-gui/src/lib/{themes => settings/color-mode}/high-contrast/blocks-media/rotate-right.svg (100%) rename packages/scratch-gui/src/lib/{themes => settings/color-mode}/high-contrast/blocks-media/zoom-in.svg (100%) rename packages/scratch-gui/src/lib/{themes => settings/color-mode}/high-contrast/blocks-media/zoom-out.svg (100%) rename packages/scratch-gui/src/lib/{themes => settings/color-mode}/high-contrast/blocks-media/zoom-reset.svg (100%) rename packages/scratch-gui/src/lib/{themes => settings/color-mode}/high-contrast/extensions/faceSensingIcon.svg (100%) rename packages/scratch-gui/src/lib/{themes => settings/color-mode}/high-contrast/extensions/musicIcon.svg (100%) rename packages/scratch-gui/src/lib/{themes => settings/color-mode}/high-contrast/extensions/penIcon.svg (100%) rename packages/scratch-gui/src/lib/{themes => settings/color-mode}/high-contrast/extensions/text2speechIcon.svg (100%) rename packages/scratch-gui/src/lib/{themes => settings/color-mode}/high-contrast/extensions/translateIcon.svg (100%) rename packages/scratch-gui/src/lib/{themes => settings/color-mode}/high-contrast/extensions/videoSensingIcon.svg (100%) rename packages/scratch-gui/src/lib/{themes => settings/color-mode}/high-contrast/icon.svg (100%) rename packages/scratch-gui/src/lib/{themes => settings/color-mode}/high-contrast/index.js (100%) rename packages/scratch-gui/src/lib/{themes => settings/color-mode}/index.js (62%) create mode 100644 packages/scratch-gui/src/lib/settings/color-mode/persistence.js delete mode 100644 packages/scratch-gui/src/lib/themes/themePersistance.js create mode 100644 packages/scratch-gui/src/reducers/settings.js delete mode 100644 packages/scratch-gui/src/reducers/theme.js diff --git a/packages/scratch-gui/src/components/gui/gui.jsx b/packages/scratch-gui/src/components/gui/gui.jsx index 1fa06119e2e..42018beaa9c 100644 --- a/packages/scratch-gui/src/components/gui/gui.jsx +++ b/packages/scratch-gui/src/components/gui/gui.jsx @@ -34,7 +34,7 @@ import TelemetryModal from '../telemetry-modal/telemetry-modal.jsx'; import layout, {STAGE_SIZE_MODES} from '../../lib/layout-constants'; import {resolveStageSize} from '../../lib/screen-utils'; -import {themeMap} from '../../lib/themes'; +import {colorModeMap} from '../../lib/settings/color-mode/index.js'; import {AccountMenuOptionsPropTypes} from '../../lib/account-menu-options'; import styles from './gui.css'; @@ -67,7 +67,7 @@ const GUIComponent = props => { blocksTabVisible, cardsVisible, canChangeLanguage, - canChangeTheme, + canChangeColorMode, canCreateNew, canEditTitle, canManageFiles, @@ -129,7 +129,7 @@ const GUIComponent = props => { stageSizeMode, targetIsStage, telemetryModalVisible, - theme, + colorMode, tipsLibraryVisible, useExternalPeripheralList, username, @@ -258,7 +258,7 @@ const GUIComponent = props => { authorThumbnailUrl={authorThumbnailUrl} authorUsername={authorUsername} canChangeLanguage={canChangeLanguage} - canChangeTheme={canChangeTheme} + canChangeColorMode={canChangeColorMode} canCreateCopy={canCreateCopy} canCreateNew={canCreateNew} canEditTitle={canEditTitle} @@ -362,15 +362,15 @@ const GUIComponent = props => { ({ // This is the button's mode, as opposed to the actual current state blocksId: state.scratchGui.timeTravel.year.toString(), stageSizeMode: state.scratchGui.stageSize.stageSize, - theme: state.scratchGui.theme.theme + colorMode: state.scratchGui.settings.colorMode }); const mapDispatchToProps = dispatch => ({ diff --git a/packages/scratch-gui/src/components/menu-bar/menu-bar.jsx b/packages/scratch-gui/src/components/menu-bar/menu-bar.jsx index 58f955a1bbb..03eba0419e1 100644 --- a/packages/scratch-gui/src/components/menu-bar/menu-bar.jsx +++ b/packages/scratch-gui/src/components/menu-bar/menu-bar.jsx @@ -452,9 +452,9 @@ class MenuBar extends React.Component { onClick={this.props.onClickLogo} />
- {(this.props.canChangeTheme || this.props.canChangeLanguage) && ( { + const item = props.item; + + return ( + +
+ + {item.icon && } + +
+
); +}; + +PreferenceItem.propTypes = { + isSelected: PropTypes.bool, + onClick: PropTypes.func, + item: PropTypes.shape({ + icon: PropTypes.string, + label: intlMessageShape.isRequired + }) +}; + +const PreferenceMenu = ({ + itemsMap, + onChange, + defaultMenuIconSrc, + submenuLabel, + selectedItemKey, + isRtl +}) => { + const [isOpen, setIsOpen] = useState(false); + const itemKeys = useMemo(() => Object.keys(itemsMap), [itemsMap]); + const selectedItem = useMemo(() => itemsMap[selectedItemKey], [itemsMap, selectedItemKey]); + const onClick = useCallback(() => { + setIsOpen(!isOpen); + }, [isOpen]); + return ( + +
+ + + + + +
+ + {itemKeys.map(itemKey => ( + onChange(itemKey)} + item={itemsMap[itemKey]} + />) + )} + +
+ ); +}; + +PreferenceMenu.propTypes = { + itemsMap: PropTypes.objectOf(PropTypes.shape({ + icon: PropTypes.string, + label: intlMessageShape.isRequired + })).isRequired, + onChange: PropTypes.func, + defaultMenuIconSrc: PropTypes.string, + submenuLabel: intlMessageShape.isRequired, + selectedItemKey: PropTypes.string, + isRtl: PropTypes.bool, + onRequestCloseSettings: PropTypes.func +}; + +const mapStateToProps = state => ({ + isRtl: state.locales.isRtl +}); + +export default connect( + mapStateToProps +)(PreferenceMenu); diff --git a/packages/scratch-gui/src/components/menu-bar/settings-menu.css b/packages/scratch-gui/src/components/menu-bar/settings-menu.css index 4171aa1505f..7d096717763 100644 --- a/packages/scratch-gui/src/components/menu-bar/settings-menu.css +++ b/packages/scratch-gui/src/components/menu-bar/settings-menu.css @@ -2,7 +2,8 @@ width: 1.5rem; } -.theme-label { +/* Unused? */ +.color-mode-label { flex: 1; } diff --git a/packages/scratch-gui/src/components/menu-bar/settings-menu.jsx b/packages/scratch-gui/src/components/menu-bar/settings-menu.jsx index 683f08a9262..e104a2235f8 100644 --- a/packages/scratch-gui/src/components/menu-bar/settings-menu.jsx +++ b/packages/scratch-gui/src/components/menu-bar/settings-menu.jsx @@ -1,12 +1,17 @@ import classNames from 'classnames'; import PropTypes from 'prop-types'; -import React from 'react'; +import React, {useMemo} from 'react'; import {FormattedMessage} from 'react-intl'; +import {connect} from 'react-redux'; import LanguageMenu from './language-menu.jsx'; import MenuBarMenu from './menu-bar-menu.jsx'; -import ThemeMenu from './theme-menu.jsx'; import {MenuSection} from '../menu/menu.jsx'; +import PreferenceMenu from './preference-menu.jsx'; + +import {DEFAULT_MODE, HIGH_CONTRAST_MODE, colorModeMap} from '../../lib/settings/color-mode/index.js'; +import {persistColorMode} from '../../lib/settings/color-mode/persistence.js'; +import {setColorMode} from '../../reducers/settings.js'; import menuBarStyles from './menu-bar.css'; import styles from './settings-menu.css'; @@ -14,52 +19,93 @@ import styles from './settings-menu.css'; import dropdownCaret from './dropdown-caret.svg'; import settingsIcon from './icon--settings.svg'; +const enabledColorModes = [DEFAULT_MODE, HIGH_CONTRAST_MODE]; + const SettingsMenu = ({ canChangeLanguage, - canChangeTheme, + canChangeColorMode, isRtl, + activeColorMode, + onChangeColorMode, onRequestClose, onRequestOpen, settingsMenuOpen -}) => ( -
- - - - - - { + const enabledColorModesMap = useMemo(() => Object.keys(colorModeMap).reduce((acc, colorMode) => { + if (enabledColorModes.includes(colorMode)) { + acc[colorMode] = colorModeMap[colorMode]; + } + return acc; + }, {}), []); + + return ( +
- - {canChangeLanguage && } - {canChangeTheme && } - - -
-); + + + + + + + + {canChangeLanguage && } + {canChangeColorMode && } + + +
+ ); +}; SettingsMenu.propTypes = { canChangeLanguage: PropTypes.bool, - canChangeTheme: PropTypes.bool, + canChangeColorMode: PropTypes.bool, isRtl: PropTypes.bool, + activeColorMode: PropTypes.string, + onChangeColorMode: PropTypes.func, onRequestClose: PropTypes.func, onRequestOpen: PropTypes.func, settingsMenuOpen: PropTypes.bool }; -export default SettingsMenu; +const mapStateToProps = state => ({ + activeColorMode: state.scratchGui.settings.colorMode +}); + +const mapDispatchToProps = (dispatch, ownProps) => ({ + onChangeColorMode: colorMode => { + dispatch(setColorMode(colorMode)); + ownProps.onRequestClose(); + persistColorMode(colorMode); + } +}); + +export default connect( + mapStateToProps, + mapDispatchToProps +)(SettingsMenu); diff --git a/packages/scratch-gui/src/components/menu-bar/theme-menu.jsx b/packages/scratch-gui/src/components/menu-bar/theme-menu.jsx deleted file mode 100644 index e9ce24f1de2..00000000000 --- a/packages/scratch-gui/src/components/menu-bar/theme-menu.jsx +++ /dev/null @@ -1,118 +0,0 @@ -import classNames from 'classnames'; -import PropTypes from 'prop-types'; -import React from 'react'; -import {FormattedMessage} from 'react-intl'; -import {connect} from 'react-redux'; - -import check from './check.svg'; -import {MenuItem, Submenu} from '../menu/menu.jsx'; -import {DEFAULT_THEME, HIGH_CONTRAST_THEME, themeMap} from '../../lib/themes'; -import {persistTheme} from '../../lib/themes/themePersistance'; -import {openThemeMenu, themeMenuOpen} from '../../reducers/menus.js'; -import {setTheme} from '../../reducers/theme.js'; - -import styles from './settings-menu.css'; - -import dropdownCaret from './dropdown-caret.svg'; - -const ThemeMenuItem = props => { - const themeInfo = themeMap[props.theme]; - - return ( - -
- - - -
-
); -}; - -ThemeMenuItem.propTypes = { - isSelected: PropTypes.bool, - onClick: PropTypes.func, - theme: PropTypes.string -}; - -const ThemeMenu = ({ - isRtl, - menuOpen, - onChangeTheme, - onRequestOpen, - theme -}) => { - const enabledThemes = [DEFAULT_THEME, HIGH_CONTRAST_THEME]; - const themeInfo = themeMap[theme]; - - return ( - -
- - - - - -
- - {enabledThemes.map(enabledTheme => ( - onChangeTheme(enabledTheme)} - theme={enabledTheme} - />) - )} - -
- ); -}; - -ThemeMenu.propTypes = { - isRtl: PropTypes.bool, - menuOpen: PropTypes.bool, - onChangeTheme: PropTypes.func, - // eslint-disable-next-line react/no-unused-prop-types - onRequestCloseSettings: PropTypes.func, - onRequestOpen: PropTypes.func, - theme: PropTypes.string -}; - -const mapStateToProps = state => ({ - isRtl: state.locales.isRtl, - menuOpen: themeMenuOpen(state), - theme: state.scratchGui.theme.theme -}); - -const mapDispatchToProps = (dispatch, ownProps) => ({ - onChangeTheme: theme => { - dispatch(setTheme(theme)); - ownProps.onRequestCloseSettings(); - persistTheme(theme); - }, - onRequestOpen: () => dispatch(openThemeMenu()) -}); - -export default connect( - mapStateToProps, - mapDispatchToProps -)(ThemeMenu); diff --git a/packages/scratch-gui/src/components/monitor/monitor.jsx b/packages/scratch-gui/src/components/monitor/monitor.jsx index d79e34fc9a0..df2f3374832 100644 --- a/packages/scratch-gui/src/components/monitor/monitor.jsx +++ b/packages/scratch-gui/src/components/monitor/monitor.jsx @@ -8,7 +8,7 @@ import DefaultMonitor from './default-monitor.jsx'; import LargeMonitor from './large-monitor.jsx'; import SliderMonitor from '../../containers/slider-monitor.jsx'; import ListMonitor from '../../containers/list-monitor.jsx'; -import {getColorsForTheme} from '../../lib/themes/index.js'; +import {getColorsForMode} from '../../lib/settings/color-mode/index.js'; import contextMenuStyles from '../context-menu/context-menu.css'; import {MenuItem, BorderedMenuItem} from '../context-menu/context-menu.jsx'; @@ -33,8 +33,8 @@ const modes = { list: ListMonitor }; -const getCategoryColor = (theme, category) => { - const colors = getColorsForTheme(theme); +const getCategoryColor = (colorMode, category) => { + const colors = getColorsForMode(colorMode); return { background: colors[categoryColorMap[category]].primary, text: colors.text @@ -62,7 +62,7 @@ const MonitorComponent = props => ( {React.createElement(modes[props.mode], { categoryColor: getCategoryColor( - props.theme, + props.colorMode, props.category ), ...props @@ -159,7 +159,7 @@ MonitorComponent.propTypes = { onSetModeToLarge: PropTypes.func, onSetModeToSlider: PropTypes.func, onSliderPromptOpen: PropTypes.func, - theme: PropTypes.string.isRequired + colorMode: PropTypes.string.isRequired }; MonitorComponent.defaultProps = { diff --git a/packages/scratch-gui/src/containers/blocks.jsx b/packages/scratch-gui/src/containers/blocks.jsx index 6a8efb97304..9232d39a7e5 100644 --- a/packages/scratch-gui/src/containers/blocks.jsx +++ b/packages/scratch-gui/src/containers/blocks.jsx @@ -19,8 +19,8 @@ import {BLOCKS_DEFAULT_SCALE, STAGE_DISPLAY_SIZES} from '../lib/layout-constants import DropAreaHOC from '../lib/drop-area-hoc.jsx'; import DragConstants from '../lib/drag-constants'; import defineDynamicBlock from '../lib/define-dynamic-block'; -import {DEFAULT_THEME, getColorsForTheme, themeMap} from '../lib/themes'; -import {injectExtensionBlockTheme, injectExtensionCategoryTheme} from '../lib/themes/blockHelpers'; +import {DEFAULT_MODE, getColorsForMode, colorModeMap} from '../lib/settings/color-mode'; +import {injectExtensionBlockMode, injectExtensionCategoryMode} from '../lib/settings/color-mode/blockHelpers'; import {connect} from 'react-redux'; import {updateToolbox} from '../reducers/toolbox'; @@ -103,7 +103,7 @@ class Blocks extends React.Component { const workspaceConfig = defaultsDeep({}, Blocks.defaultOptions, this.props.options, - {rtl: this.props.isRtl, toolbox: this.props.toolboxXML, colours: getColorsForTheme(this.props.theme)} + {rtl: this.props.isRtl, toolbox: this.props.toolboxXML, colours: getColorsForMode(this.props.colorMode)} ); this.workspace = this.ScratchBlocks.inject(this.blocks, workspaceConfig); @@ -366,15 +366,15 @@ class Blocks extends React.Component { const stageCostumes = stage.getCostumes(); const targetCostumes = target.getCostumes(); const targetSounds = target.getSounds(); - const dynamicBlocksXML = injectExtensionCategoryTheme( + const dynamicBlocksXML = injectExtensionCategoryMode( this.props.vm.runtime.getBlocksXML(target), - this.props.theme + this.props.colorMode ); return makeToolboxXML(false, target.isStage, target.id, dynamicBlocksXML, targetCostumes[targetCostumes.length - 1].name, stageCostumes[stageCostumes.length - 1].name, targetSounds.length > 0 ? targetSounds[targetSounds.length - 1].name : '', - getColorsForTheme(this.props.theme) + getColorsForMode(this.props.colorMode) ); } catch { return null; @@ -459,7 +459,7 @@ class Blocks extends React.Component { if (blockInfo.info && blockInfo.info.isDynamic) { dynamicBlocksInfo.push(blockInfo); } else if (blockInfo.json) { - staticBlocksJson.push(injectExtensionBlockTheme(blockInfo.json, this.props.theme)); + staticBlocksJson.push(injectExtensionBlockMode(blockInfo.json, this.props.colorMode)); } // otherwise it's a non-block entry such as '---' }); @@ -656,7 +656,7 @@ Blocks.propTypes = { collapse: PropTypes.bool }), stageSize: PropTypes.oneOf(Object.keys(STAGE_DISPLAY_SIZES)).isRequired, - theme: PropTypes.oneOf(Object.keys(themeMap)), + colorMode: PropTypes.oneOf(Object.keys(colorModeMap)), toolboxXML: PropTypes.string, updateMetrics: PropTypes.func, updateToolboxState: PropTypes.func, @@ -688,7 +688,7 @@ Blocks.defaultOptions = { Blocks.defaultProps = { isVisible: true, options: Blocks.defaultOptions, - theme: DEFAULT_THEME + colorMode: DEFAULT_MODE }; const mapStateToProps = state => ({ @@ -703,7 +703,8 @@ const mapStateToProps = state => ({ toolboxXML: state.scratchGui.toolbox.toolboxXML, customProceduresVisible: state.scratchGui.customProcedures.active, workspaceMetrics: state.scratchGui.workspaceMetrics, - useCatBlocks: isTimeTravel2020(state) || state.scratchGui.theme.theme === 'high-contrast' + // TODO: Remove `state.scratchGui.settings.colorMode === 'high-contrast'` + useCatBlocks: isTimeTravel2020(state) || state.scratchGui.settings.colorMode === 'high-contrast' }); const mapDispatchToProps = dispatch => ({ diff --git a/packages/scratch-gui/src/containers/monitor.jsx b/packages/scratch-gui/src/containers/monitor.jsx index 69489fc34a9..110766ab2ad 100644 --- a/packages/scratch-gui/src/containers/monitor.jsx +++ b/packages/scratch-gui/src/containers/monitor.jsx @@ -10,7 +10,7 @@ import {addMonitorRect, getInitialPosition, resizeMonitorRect, removeMonitorRect import {getVariable, setVariableValue} from '../lib/variable-utils'; import importCSV from '../lib/import-csv'; import downloadBlob from '../lib/download-blob'; -import {DEFAULT_THEME} from '../lib/themes'; +import {DEFAULT_MODE} from '../lib/settings/color-mode/index.js'; import SliderPrompt from './slider-prompt.jsx'; import {connect} from 'react-redux'; @@ -215,7 +215,7 @@ class Monitor extends React.Component { min={this.props.min} mode={this.props.mode} targetId={this.props.targetId} - theme={this.props.theme} + colorMode={this.props.colorMode} width={this.props.width} onDragEnd={this.handleDragEnd} onExport={isList ? this.handleExport : null} @@ -253,7 +253,7 @@ Monitor.propTypes = { resizeMonitorRect: PropTypes.func.isRequired, spriteName: PropTypes.string, targetId: PropTypes.string, - theme: PropTypes.string, + colorMode: PropTypes.string, toolboxXML: PropTypes.string, value: PropTypes.oneOfType([ PropTypes.string, @@ -269,11 +269,11 @@ Monitor.propTypes = { y: PropTypes.number }; Monitor.defaultProps = { - theme: DEFAULT_THEME + colorMode: DEFAULT_MODE }; const mapStateToProps = state => ({ monitorLayout: state.scratchGui.monitorLayout, - theme: state.scratchGui.theme.theme, + colorMode: state.scratchGui.settings.colorMode, // render on toolbox updates since changes to the blocks could affect monitor labels, i.e. updated locale toolboxXML: state.scratchGui.toolbox.toolboxXML, vm: state.scratchGui.vm diff --git a/packages/scratch-gui/src/lib/make-toolbox-xml.js b/packages/scratch-gui/src/lib/make-toolbox-xml.js index 90346b8b034..74faccf99c6 100644 --- a/packages/scratch-gui/src/lib/make-toolbox-xml.js +++ b/packages/scratch-gui/src/lib/make-toolbox-xml.js @@ -1,5 +1,5 @@ import ScratchBlocks from 'scratch-blocks'; -import {defaultColors} from './themes'; +import {defaultColors} from './settings/color-mode'; const categorySeparator = ''; @@ -754,7 +754,7 @@ const xmlClose = ''; * @param {?string} costumeName - The name of the default selected costume dropdown. * @param {?string} backdropName - The name of the default selected backdrop dropdown. * @param {?string} soundName - The name of the default selected sound dropdown. - * @param {?object} colors - The colors for the theme. + * @param {?object} colors - The colors for the color mode. * @returns {string} - a ScratchBlocks-style XML document for the contents of the toolbox. */ const makeToolboxXML = function (isInitialSetup, isStage = true, targetId, categoriesXML = [], diff --git a/packages/scratch-gui/src/lib/themes/blockHelpers.js b/packages/scratch-gui/src/lib/settings/color-mode/blockHelpers.js similarity index 66% rename from packages/scratch-gui/src/lib/themes/blockHelpers.js rename to packages/scratch-gui/src/lib/settings/color-mode/blockHelpers.js index b201241eebb..56e5dd6129d 100644 --- a/packages/scratch-gui/src/lib/themes/blockHelpers.js +++ b/packages/scratch-gui/src/lib/settings/color-mode/blockHelpers.js @@ -1,4 +1,4 @@ -import {DEFAULT_THEME, getColorsForTheme, themeMap} from '.'; +import {DEFAULT_MODE, getColorsForMode, colorModeMap} from '.'; const getBlockIconURI = extensionIcons => { if (!extensionIcons) return null; @@ -13,23 +13,23 @@ const getCategoryIconURI = extensionIcons => { }; // scratch-blocks colours has a pen property that scratch-gui uses for all extensions -const getExtensionColors = theme => getColorsForTheme(theme).pen; +const getExtensionColors = mode => getColorsForMode(mode).pen; /** - * Applies extension color theme to categories. - * No changes are applied if called with the default theme, allowing extensions to provide their own colors. + * Applies extension color mode to categories. + * No changes are applied if called with the default color mode, allowing extensions to provide their own colors. * These colors are not seen if the category provides a blockIconURI. * @param {Array.} dynamicBlockXML - XML for each category of extension blocks, returned from getBlocksXML * in the vm runtime. - * @param {string} theme - Theme name + * @param {string} mode - Color Mode name * @returns {Array.} Dynamic block XML updated with colors. */ -const injectExtensionCategoryTheme = (dynamicBlockXML, theme) => { - // Don't do any manipulation for the default theme - if (theme === DEFAULT_THEME) return dynamicBlockXML; +const injectExtensionCategoryMode = (dynamicBlockXML, mode) => { + // Don't do any manipulation for the default mode + if (mode === DEFAULT_MODE) return dynamicBlockXML; - const extensionColors = getExtensionColors(theme); - const extensionIcons = themeMap[theme].extensions; + const extensionColors = getExtensionColors(mode); + const extensionIcons = colorModeMap[mode].extensions; const parser = new DOMParser(); const serializer = new XMLSerializer(); @@ -52,12 +52,12 @@ const injectExtensionCategoryTheme = (dynamicBlockXML, theme) => { }); }; -const injectBlockIcons = (blockInfoJson, theme) => { +const injectBlockIcons = (blockInfoJson, mode) => { // Block icons are the first element of `args0` if (!blockInfoJson.args0 || blockInfoJson.args0.length < 1 || blockInfoJson.args0[0].type !== 'field_image') return blockInfoJson; - const extensionIcons = themeMap[theme].extensions; + const extensionIcons = colorModeMap[mode].extensions; const extensionId = blockInfoJson.type.substring(0, blockInfoJson.type.indexOf('_')); const blockIconURI = getBlockIconURI(extensionIcons[extensionId]); @@ -77,20 +77,20 @@ const injectBlockIcons = (blockInfoJson, theme) => { }; /** - * Applies extension color theme to static block json. - * No changes are applied if called with the default theme, allowing extensions to provide their own colors. + * Applies extension color mode to static block json. + * No changes are applied if called with the default mode, allowing extensions to provide their own colors. * @param {object} blockInfoJson - Static block json - * @param {string} theme - Theme name + * @param {string} mode - Color Mode name * @returns {object} Block info json with updated colors. The original blockInfoJson is not modified. */ -const injectExtensionBlockTheme = (blockInfoJson, theme) => { - // Don't do any manipulation for the default theme - if (theme === DEFAULT_THEME) return blockInfoJson; +const injectExtensionBlockMode = (blockInfoJson, mode) => { + // Don't do any manipulation for the default mode + if (mode === DEFAULT_MODE) return blockInfoJson; - const extensionColors = getExtensionColors(theme); + const extensionColors = getExtensionColors(mode); return { - ...injectBlockIcons(blockInfoJson, theme), + ...injectBlockIcons(blockInfoJson, mode), colour: extensionColors.primary, colourSecondary: extensionColors.secondary, colourTertiary: extensionColors.tertiary, @@ -99,6 +99,6 @@ const injectExtensionBlockTheme = (blockInfoJson, theme) => { }; export { - injectExtensionBlockTheme, - injectExtensionCategoryTheme + injectExtensionBlockMode, + injectExtensionCategoryMode }; diff --git a/packages/scratch-gui/src/lib/themes/dark/__mocks__/index.js b/packages/scratch-gui/src/lib/settings/color-mode/dark/__mocks__/index.js similarity index 100% rename from packages/scratch-gui/src/lib/themes/dark/__mocks__/index.js rename to packages/scratch-gui/src/lib/settings/color-mode/dark/__mocks__/index.js diff --git a/packages/scratch-gui/src/lib/themes/dark/index.js b/packages/scratch-gui/src/lib/settings/color-mode/dark/index.js similarity index 100% rename from packages/scratch-gui/src/lib/themes/dark/index.js rename to packages/scratch-gui/src/lib/settings/color-mode/dark/index.js diff --git a/packages/scratch-gui/src/lib/themes/default/__mocks__/index.js b/packages/scratch-gui/src/lib/settings/color-mode/default/__mocks__/index.js similarity index 100% rename from packages/scratch-gui/src/lib/themes/default/__mocks__/index.js rename to packages/scratch-gui/src/lib/settings/color-mode/default/__mocks__/index.js diff --git a/packages/scratch-gui/src/lib/themes/default/icon.svg b/packages/scratch-gui/src/lib/settings/color-mode/default/icon.svg similarity index 100% rename from packages/scratch-gui/src/lib/themes/default/icon.svg rename to packages/scratch-gui/src/lib/settings/color-mode/default/icon.svg diff --git a/packages/scratch-gui/src/lib/themes/default/index.js b/packages/scratch-gui/src/lib/settings/color-mode/default/index.js similarity index 100% rename from packages/scratch-gui/src/lib/themes/default/index.js rename to packages/scratch-gui/src/lib/settings/color-mode/default/index.js diff --git a/packages/scratch-gui/src/lib/themes/high-contrast/blocks-media/comment-arrow-down.svg b/packages/scratch-gui/src/lib/settings/color-mode/high-contrast/blocks-media/comment-arrow-down.svg similarity index 100% rename from packages/scratch-gui/src/lib/themes/high-contrast/blocks-media/comment-arrow-down.svg rename to packages/scratch-gui/src/lib/settings/color-mode/high-contrast/blocks-media/comment-arrow-down.svg diff --git a/packages/scratch-gui/src/lib/themes/high-contrast/blocks-media/comment-arrow-up.svg b/packages/scratch-gui/src/lib/settings/color-mode/high-contrast/blocks-media/comment-arrow-up.svg similarity index 100% rename from packages/scratch-gui/src/lib/themes/high-contrast/blocks-media/comment-arrow-up.svg rename to packages/scratch-gui/src/lib/settings/color-mode/high-contrast/blocks-media/comment-arrow-up.svg diff --git a/packages/scratch-gui/src/lib/themes/high-contrast/blocks-media/delete-x.svg b/packages/scratch-gui/src/lib/settings/color-mode/high-contrast/blocks-media/delete-x.svg similarity index 100% rename from packages/scratch-gui/src/lib/themes/high-contrast/blocks-media/delete-x.svg rename to packages/scratch-gui/src/lib/settings/color-mode/high-contrast/blocks-media/delete-x.svg diff --git a/packages/scratch-gui/src/lib/themes/high-contrast/blocks-media/dropdown-arrow.svg b/packages/scratch-gui/src/lib/settings/color-mode/high-contrast/blocks-media/dropdown-arrow.svg similarity index 100% rename from packages/scratch-gui/src/lib/themes/high-contrast/blocks-media/dropdown-arrow.svg rename to packages/scratch-gui/src/lib/settings/color-mode/high-contrast/blocks-media/dropdown-arrow.svg diff --git a/packages/scratch-gui/src/lib/themes/high-contrast/blocks-media/eyedropper.svg b/packages/scratch-gui/src/lib/settings/color-mode/high-contrast/blocks-media/eyedropper.svg similarity index 100% rename from packages/scratch-gui/src/lib/themes/high-contrast/blocks-media/eyedropper.svg rename to packages/scratch-gui/src/lib/settings/color-mode/high-contrast/blocks-media/eyedropper.svg diff --git a/packages/scratch-gui/src/lib/themes/high-contrast/blocks-media/icons/arrow_button.svg b/packages/scratch-gui/src/lib/settings/color-mode/high-contrast/blocks-media/icons/arrow_button.svg similarity index 100% rename from packages/scratch-gui/src/lib/themes/high-contrast/blocks-media/icons/arrow_button.svg rename to packages/scratch-gui/src/lib/settings/color-mode/high-contrast/blocks-media/icons/arrow_button.svg diff --git a/packages/scratch-gui/src/lib/themes/high-contrast/blocks-media/repeat.svg b/packages/scratch-gui/src/lib/settings/color-mode/high-contrast/blocks-media/repeat.svg similarity index 100% rename from packages/scratch-gui/src/lib/themes/high-contrast/blocks-media/repeat.svg rename to packages/scratch-gui/src/lib/settings/color-mode/high-contrast/blocks-media/repeat.svg diff --git a/packages/scratch-gui/src/lib/themes/high-contrast/blocks-media/rotate-left.svg b/packages/scratch-gui/src/lib/settings/color-mode/high-contrast/blocks-media/rotate-left.svg similarity index 100% rename from packages/scratch-gui/src/lib/themes/high-contrast/blocks-media/rotate-left.svg rename to packages/scratch-gui/src/lib/settings/color-mode/high-contrast/blocks-media/rotate-left.svg diff --git a/packages/scratch-gui/src/lib/themes/high-contrast/blocks-media/rotate-right.svg b/packages/scratch-gui/src/lib/settings/color-mode/high-contrast/blocks-media/rotate-right.svg similarity index 100% rename from packages/scratch-gui/src/lib/themes/high-contrast/blocks-media/rotate-right.svg rename to packages/scratch-gui/src/lib/settings/color-mode/high-contrast/blocks-media/rotate-right.svg diff --git a/packages/scratch-gui/src/lib/themes/high-contrast/blocks-media/zoom-in.svg b/packages/scratch-gui/src/lib/settings/color-mode/high-contrast/blocks-media/zoom-in.svg similarity index 100% rename from packages/scratch-gui/src/lib/themes/high-contrast/blocks-media/zoom-in.svg rename to packages/scratch-gui/src/lib/settings/color-mode/high-contrast/blocks-media/zoom-in.svg diff --git a/packages/scratch-gui/src/lib/themes/high-contrast/blocks-media/zoom-out.svg b/packages/scratch-gui/src/lib/settings/color-mode/high-contrast/blocks-media/zoom-out.svg similarity index 100% rename from packages/scratch-gui/src/lib/themes/high-contrast/blocks-media/zoom-out.svg rename to packages/scratch-gui/src/lib/settings/color-mode/high-contrast/blocks-media/zoom-out.svg diff --git a/packages/scratch-gui/src/lib/themes/high-contrast/blocks-media/zoom-reset.svg b/packages/scratch-gui/src/lib/settings/color-mode/high-contrast/blocks-media/zoom-reset.svg similarity index 100% rename from packages/scratch-gui/src/lib/themes/high-contrast/blocks-media/zoom-reset.svg rename to packages/scratch-gui/src/lib/settings/color-mode/high-contrast/blocks-media/zoom-reset.svg diff --git a/packages/scratch-gui/src/lib/themes/high-contrast/extensions/faceSensingIcon.svg b/packages/scratch-gui/src/lib/settings/color-mode/high-contrast/extensions/faceSensingIcon.svg similarity index 100% rename from packages/scratch-gui/src/lib/themes/high-contrast/extensions/faceSensingIcon.svg rename to packages/scratch-gui/src/lib/settings/color-mode/high-contrast/extensions/faceSensingIcon.svg diff --git a/packages/scratch-gui/src/lib/themes/high-contrast/extensions/musicIcon.svg b/packages/scratch-gui/src/lib/settings/color-mode/high-contrast/extensions/musicIcon.svg similarity index 100% rename from packages/scratch-gui/src/lib/themes/high-contrast/extensions/musicIcon.svg rename to packages/scratch-gui/src/lib/settings/color-mode/high-contrast/extensions/musicIcon.svg diff --git a/packages/scratch-gui/src/lib/themes/high-contrast/extensions/penIcon.svg b/packages/scratch-gui/src/lib/settings/color-mode/high-contrast/extensions/penIcon.svg similarity index 100% rename from packages/scratch-gui/src/lib/themes/high-contrast/extensions/penIcon.svg rename to packages/scratch-gui/src/lib/settings/color-mode/high-contrast/extensions/penIcon.svg diff --git a/packages/scratch-gui/src/lib/themes/high-contrast/extensions/text2speechIcon.svg b/packages/scratch-gui/src/lib/settings/color-mode/high-contrast/extensions/text2speechIcon.svg similarity index 100% rename from packages/scratch-gui/src/lib/themes/high-contrast/extensions/text2speechIcon.svg rename to packages/scratch-gui/src/lib/settings/color-mode/high-contrast/extensions/text2speechIcon.svg diff --git a/packages/scratch-gui/src/lib/themes/high-contrast/extensions/translateIcon.svg b/packages/scratch-gui/src/lib/settings/color-mode/high-contrast/extensions/translateIcon.svg similarity index 100% rename from packages/scratch-gui/src/lib/themes/high-contrast/extensions/translateIcon.svg rename to packages/scratch-gui/src/lib/settings/color-mode/high-contrast/extensions/translateIcon.svg diff --git a/packages/scratch-gui/src/lib/themes/high-contrast/extensions/videoSensingIcon.svg b/packages/scratch-gui/src/lib/settings/color-mode/high-contrast/extensions/videoSensingIcon.svg similarity index 100% rename from packages/scratch-gui/src/lib/themes/high-contrast/extensions/videoSensingIcon.svg rename to packages/scratch-gui/src/lib/settings/color-mode/high-contrast/extensions/videoSensingIcon.svg diff --git a/packages/scratch-gui/src/lib/themes/high-contrast/icon.svg b/packages/scratch-gui/src/lib/settings/color-mode/high-contrast/icon.svg similarity index 100% rename from packages/scratch-gui/src/lib/themes/high-contrast/icon.svg rename to packages/scratch-gui/src/lib/settings/color-mode/high-contrast/icon.svg diff --git a/packages/scratch-gui/src/lib/themes/high-contrast/index.js b/packages/scratch-gui/src/lib/settings/color-mode/high-contrast/index.js similarity index 100% rename from packages/scratch-gui/src/lib/themes/high-contrast/index.js rename to packages/scratch-gui/src/lib/settings/color-mode/high-contrast/index.js diff --git a/packages/scratch-gui/src/lib/themes/index.js b/packages/scratch-gui/src/lib/settings/color-mode/index.js similarity index 62% rename from packages/scratch-gui/src/lib/themes/index.js rename to packages/scratch-gui/src/lib/settings/color-mode/index.js index 673d453e741..a014d91b8e2 100644 --- a/packages/scratch-gui/src/lib/themes/index.js +++ b/packages/scratch-gui/src/lib/settings/color-mode/index.js @@ -14,68 +14,68 @@ import {blockColors as defaultColors} from './default'; import defaultIcon from './default/icon.svg'; import highContrastIcon from './high-contrast/icon.svg'; -const DEFAULT_THEME = 'default'; -const HIGH_CONTRAST_THEME = 'high-contrast'; -const DARK_THEME = 'dark'; +const DEFAULT_MODE = 'default'; +const HIGH_CONTRAST_MODE = 'high-contrast'; +const DARK_MODE = 'dark'; const mergeWithDefaults = colors => defaultsDeep({}, colors, defaultColors); const messages = defineMessages({ - [DEFAULT_THEME]: { + [DEFAULT_MODE]: { id: 'gui.theme.default', defaultMessage: 'Original', - description: 'label for original theme' + description: 'label for original color mode' }, - [DARK_THEME]: { + [DARK_MODE]: { id: 'gui.theme.dark', defaultMessage: 'Dark', - description: 'label for dark mode theme' + description: 'label for dark mode' }, - [HIGH_CONTRAST_THEME]: { + [HIGH_CONTRAST_MODE]: { id: 'gui.theme.highContrast', defaultMessage: 'High Contrast', - description: 'label for high theme' + description: 'label for high contrast mode' } }); -const themeMap = { - [DEFAULT_THEME]: { +const colorModeMap = { + [DEFAULT_MODE]: { blocksMediaFolder: 'blocks-media/default', colors: defaultColors, extensions: {}, - label: messages[DEFAULT_THEME], + label: messages[DEFAULT_MODE], icon: defaultIcon }, - [DARK_THEME]: { + [DARK_MODE]: { blocksMediaFolder: 'blocks-media/default', colors: mergeWithDefaults(darkModeBlockColors), extensions: darkModeExtensions, - label: messages[DARK_THEME] + label: messages[DARK_MODE] }, - [HIGH_CONTRAST_THEME]: { + [HIGH_CONTRAST_MODE]: { blocksMediaFolder: 'blocks-media/high-contrast', colors: mergeWithDefaults(highContrastBlockColors), extensions: highContrastExtensions, - label: messages[HIGH_CONTRAST_THEME], + label: messages[HIGH_CONTRAST_MODE], icon: highContrastIcon } }; -const getColorsForTheme = theme => { - const themeInfo = themeMap[theme]; +const getColorsForMode = colorMode => { + const modeInfo = colorModeMap[colorMode]; - if (!themeInfo) { - throw new Error(`Undefined theme ${theme}`); + if (!modeInfo) { + throw new Error(`Undefined color mode ${colorMode}`); } - return themeInfo.colors; + return modeInfo.colors; }; export { - DEFAULT_THEME, - DARK_THEME, - HIGH_CONTRAST_THEME, + DEFAULT_MODE, + DARK_MODE, + HIGH_CONTRAST_MODE, defaultColors, - getColorsForTheme, - themeMap + getColorsForMode, + colorModeMap }; diff --git a/packages/scratch-gui/src/lib/settings/color-mode/persistence.js b/packages/scratch-gui/src/lib/settings/color-mode/persistence.js new file mode 100644 index 00000000000..a26e79186d9 --- /dev/null +++ b/packages/scratch-gui/src/lib/settings/color-mode/persistence.js @@ -0,0 +1,47 @@ +import cookie from 'cookie'; + +import {DEFAULT_MODE, HIGH_CONTRAST_MODE} from '.'; + +const PREFERS_HIGH_CONTRAST_QUERY = '(prefers-contrast: more)'; +// Technically what we are persisting is the color mode, but for historical reasons, +// we should continue using 'scratchtheme' as the cookie key. +const COOKIE_KEY = 'scratchtheme'; + +// Dark mode isn't enabled yet +const isValidColorMode = colorMode => [DEFAULT_MODE, HIGH_CONTRAST_MODE].includes(colorMode); + +const systemPreferencesColorMode = () => { + if (window.matchMedia && window.matchMedia(PREFERS_HIGH_CONTRAST_QUERY).matches) return HIGH_CONTRAST_MODE; + + return DEFAULT_MODE; +}; + +const detectColorMode = () => { + const obj = cookie.parse(document.cookie) || {}; + const colorModeCookie = obj.scratchtheme; + + if (isValidColorMode(colorModeCookie)) return colorModeCookie; + + // No cookie set. Fall back to system preferences + return systemPreferencesColorMode(); +}; + +const persistColorMode = mode => { + if (!isValidColorMode(mode)) { + throw new Error(`Invalid color mode: ${mode}`); + } + + if (systemPreferencesColorMode() === mode) { + // Clear the cookie to represent using the system preferences + document.cookie = `${COOKIE_KEY}=;path=/`; + return; + } + + const expires = new Date(new Date().setYear(new Date().getFullYear() + 1)).toUTCString(); + document.cookie = `${COOKIE_KEY}=${mode};expires=${expires};path=/`; +}; + +export { + detectColorMode, + persistColorMode +}; diff --git a/packages/scratch-gui/src/lib/system-preferences-hoc.jsx b/packages/scratch-gui/src/lib/system-preferences-hoc.jsx index 2c9a4e251c4..99ce3aa56ef 100644 --- a/packages/scratch-gui/src/lib/system-preferences-hoc.jsx +++ b/packages/scratch-gui/src/lib/system-preferences-hoc.jsx @@ -2,8 +2,8 @@ import React from 'react'; import PropTypes from 'prop-types'; import {connect} from 'react-redux'; -import {setTheme} from '../reducers/theme'; -import {detectTheme} from './themes/themePersistance'; +import {setColorMode} from '../reducers/settings'; +import {detectColorMode} from './settings/color-mode/persistence'; // Dark mode is not yet supported // const prefersDarkQuery = '(prefers-color-scheme: dark)'; @@ -12,7 +12,7 @@ const prefersHighContrastQuery = '(prefers-contrast: more)'; const systemPreferencesHOC = function (WrappedComponent) { class SystemPreferences extends React.Component { componentDidMount () { - this.preferencesListener = () => this.props.onSetTheme(detectTheme()); + this.preferencesListener = () => this.props.onSetColorMode(detectColorMode()); if (window.matchMedia) { this.highContrastMatchMedia = window.matchMedia(prefersHighContrastQuery); @@ -39,7 +39,7 @@ const systemPreferencesHOC = function (WrappedComponent) { render () { const { - onSetTheme, + onSetColorMode, ...props } = this.props; @@ -48,11 +48,11 @@ const systemPreferencesHOC = function (WrappedComponent) { } SystemPreferences.propTypes = { - onSetTheme: PropTypes.func + onSetColorMode: PropTypes.func }; const mapDispatchToProps = dispatch => ({ - onSetTheme: theme => dispatch(setTheme(theme)) + onSetColorMode: mode => dispatch(setColorMode(mode)) }); return connect( diff --git a/packages/scratch-gui/src/lib/themes/themePersistance.js b/packages/scratch-gui/src/lib/themes/themePersistance.js deleted file mode 100644 index 6056708651a..00000000000 --- a/packages/scratch-gui/src/lib/themes/themePersistance.js +++ /dev/null @@ -1,45 +0,0 @@ -import cookie from 'cookie'; - -import {DEFAULT_THEME, HIGH_CONTRAST_THEME} from '.'; - -const PREFERS_HIGH_CONTRAST_QUERY = '(prefers-contrast: more)'; -const COOKIE_KEY = 'scratchtheme'; - -// Dark mode isn't enabled yet -const isValidTheme = theme => [DEFAULT_THEME, HIGH_CONTRAST_THEME].includes(theme); - -const systemPreferencesTheme = () => { - if (window.matchMedia && window.matchMedia(PREFERS_HIGH_CONTRAST_QUERY).matches) return HIGH_CONTRAST_THEME; - - return DEFAULT_THEME; -}; - -const detectTheme = () => { - const obj = cookie.parse(document.cookie) || {}; - const themeCookie = obj.scratchtheme; - - if (isValidTheme(themeCookie)) return themeCookie; - - // No cookie set. Fall back to system preferences - return systemPreferencesTheme(); -}; - -const persistTheme = theme => { - if (!isValidTheme(theme)) { - throw new Error(`Invalid theme: ${theme}`); - } - - if (systemPreferencesTheme() === theme) { - // Clear the cookie to represent using the system preferences - document.cookie = `${COOKIE_KEY}=;path=/`; - return; - } - - const expires = new Date(new Date().setYear(new Date().getFullYear() + 1)).toUTCString(); - document.cookie = `${COOKIE_KEY}=${theme};expires=${expires};path=/`; -}; - -export { - detectTheme, - persistTheme -}; diff --git a/packages/scratch-gui/src/reducers/gui.ts b/packages/scratch-gui/src/reducers/gui.ts index 327b4836897..516b651ac4f 100644 --- a/packages/scratch-gui/src/reducers/gui.ts +++ b/packages/scratch-gui/src/reducers/gui.ts @@ -22,7 +22,7 @@ import fontsLoadedReducer, {fontsLoadedInitialState} from './fonts-loaded'; import restoreDeletionReducer, {restoreDeletionInitialState} from './restore-deletion'; import stageSizeReducer, {stageSizeInitialState} from './stage-size'; import targetReducer, {targetsInitialState} from './targets'; -import themeReducer, {themeInitialState} from './theme'; +import settingsReducer, {settingsInitialState} from './settings'; import timeoutReducer, {timeoutInitialState} from './timeout'; import timeTravelReducer, {timeTravelInitialState} from './time-travel'; import toolboxReducer, {toolboxInitialState} from './toolbox'; @@ -61,7 +61,7 @@ const buildInitialState = (config: GUIConfig) => ({ fontsLoaded: fontsLoadedInitialState, restoreDeletion: restoreDeletionInitialState, targets: targetsInitialState, - theme: themeInitialState, + settings: settingsInitialState, timeout: timeoutInitialState, timeTravel: timeTravelInitialState, toolbox: toolboxInitialState, @@ -170,7 +170,7 @@ const guiReducer = combineReducers({ fontsLoaded: fontsLoadedReducer, restoreDeletion: restoreDeletionReducer, targets: targetReducer, - theme: themeReducer, + settings: settingsReducer, timeout: timeoutReducer, timeTravel: timeTravelReducer, toolbox: toolboxReducer, diff --git a/packages/scratch-gui/src/reducers/menus.js b/packages/scratch-gui/src/reducers/menus.js index 4fec54b8a63..f9a0f88fcf2 100644 --- a/packages/scratch-gui/src/reducers/menus.js +++ b/packages/scratch-gui/src/reducers/menus.js @@ -9,7 +9,7 @@ const MENU_LANGUAGE = 'languageMenu'; const MENU_LOGIN = 'loginMenu'; const MENU_MODE = 'modeMenu'; const MENU_SETTINGS = 'settingsMenu'; -const MENU_THEME = 'themeMenu'; +const MENU_COLOR_MODE = 'colorModeMenu'; class Menu { constructor (id) { @@ -51,7 +51,7 @@ const rootMenu = new Menu('root') .addChild( new Menu(MENU_SETTINGS) .addChild(new Menu(MENU_LANGUAGE)) - .addChild(new Menu(MENU_THEME)) + .addChild(new Menu(MENU_COLOR_MODE)) ) .addChild(new Menu(MENU_FILE)) .addChild(new Menu(MENU_EDIT)) @@ -70,7 +70,7 @@ const initialState = { [MENU_LOGIN]: false, [MENU_MODE]: false, [MENU_SETTINGS]: false, - [MENU_THEME]: false + [MENU_COLOR_MODE]: false }; const reducer = function (state, action) { @@ -142,10 +142,6 @@ const openSettingsMenu = () => openMenu(MENU_SETTINGS); const closeSettingsMenu = () => closeMenu(MENU_SETTINGS); const settingsMenuOpen = state => state.scratchGui.menus[MENU_SETTINGS]; -const openThemeMenu = () => openMenu(MENU_THEME); -const closeThemeMenu = () => closeMenu(MENU_THEME); -const themeMenuOpen = state => state.scratchGui.menus[MENU_THEME]; - export { reducer as default, initialState as menuInitialState, @@ -172,8 +168,5 @@ export { modeMenuOpen, openSettingsMenu, closeSettingsMenu, - settingsMenuOpen, - openThemeMenu, - closeThemeMenu, - themeMenuOpen + settingsMenuOpen }; diff --git a/packages/scratch-gui/src/reducers/settings.js b/packages/scratch-gui/src/reducers/settings.js new file mode 100644 index 00000000000..37ae36ec755 --- /dev/null +++ b/packages/scratch-gui/src/reducers/settings.js @@ -0,0 +1,27 @@ +import {detectColorMode} from '../lib/settings/color-mode/persistence'; + +const SET_COLOR_MODE = 'scratch-gui/settings/SET_COLOR_MODE'; + +const initialState = { + colorMode: detectColorMode() +}; + +const reducer = (state = initialState, action) => { + switch (action.type) { + case SET_COLOR_MODE: + return {...state, colorMode: action.colorMode}; + default: + return state; + } +}; + +const setColorMode = colorMode => ({ + type: SET_COLOR_MODE, + colorMode +}); + +export { + reducer as default, + initialState as settingsInitialState, + setColorMode +}; diff --git a/packages/scratch-gui/src/reducers/theme.js b/packages/scratch-gui/src/reducers/theme.js deleted file mode 100644 index 4330f94dad9..00000000000 --- a/packages/scratch-gui/src/reducers/theme.js +++ /dev/null @@ -1,27 +0,0 @@ -import {detectTheme} from '../lib/themes/themePersistance'; - -const SET_THEME = 'scratch-gui/theme/SET_THEME'; - -const initialState = { - theme: detectTheme() -}; - -const reducer = (state = initialState, action) => { - switch (action.type) { - case SET_THEME: - return {...state, theme: action.theme}; - default: - return state; - } -}; - -const setTheme = theme => ({ - type: SET_THEME, - theme -}); - -export { - reducer as default, - initialState as themeInitialState, - setTheme -}; diff --git a/packages/scratch-gui/test/integration/menu-bar.test.js b/packages/scratch-gui/test/integration/menu-bar.test.js index 46103bf7931..1927246177a 100644 --- a/packages/scratch-gui/test/integration/menu-bar.test.js +++ b/packages/scratch-gui/test/integration/menu-bar.test.js @@ -95,7 +95,7 @@ describe('Menu bar settings', () => { await findByText('project1-sprite'); }); - test('Theme picker shows themes', async () => { + test('Color mode picker shows color modes', async () => { await loadUri(uri); await clickXpath(SETTINGS_MENU_XPATH); await clickText('Color Mode', scope.menuBar); @@ -104,13 +104,13 @@ describe('Menu bar settings', () => { expect(await (await findByText('High Contrast', scope.menuBar)).isDisplayed()).toBe(true); }); - test('Theme picker switches to high contrast', async () => { + test('Color mode picker switches to high contrast', async () => { await loadUri(uri); await clickXpath(SETTINGS_MENU_XPATH); await clickText('Color Mode', scope.menuBar); await clickText('High Contrast', scope.menuBar); - // There is a tiny delay for the color theme to be applied to the categories. + // There is a tiny delay for the color color mode to be applied to the categories. await driver.wait(async () => { const motionCategoryDiv = await findByXpath( '//div[contains(@class, "scratchCategoryMenuItem") and ' + @@ -121,20 +121,20 @@ describe('Menu bar settings', () => { // returns the value. Locally I am seeing 'rgba(128, 181, 255, 1)', // but this is a bit flexible just in case. return /128,\s?181,\s?255/.test(color) || color.includes('80B5FF'); - }, 5000, 'Motion category color does not match high contrast theme'); + }, 5000, 'Motion category color does not match high contrast color mode'); }); test('Settings menu switches between submenus', async () => { await loadUri(uri); await clickXpath(SETTINGS_MENU_XPATH); - // Language and theme options not visible yet + // Language and color mode options not visible yet expect(await (await findByText('High Contrast', scope.menuBar)).isDisplayed()).toBe(false); expect(await (await findByText('Esperanto', scope.menuBar)).isDisplayed()).toBe(false); await clickText('Color Mode', scope.menuBar); - // Only theme options visible + // Only color mode options visible expect(await (await findByText('High Contrast', scope.menuBar)).isDisplayed()).toBe(true); expect(await (await findByText('Esperanto', scope.menuBar)).isDisplayed()).toBe(false); diff --git a/packages/scratch-gui/test/unit/components/menu-bar.test.jsx b/packages/scratch-gui/test/unit/components/menu-bar.test.jsx index 37ec9b61e84..483251cb311 100644 --- a/packages/scratch-gui/test/unit/components/menu-bar.test.jsx +++ b/packages/scratch-gui/test/unit/components/menu-bar.test.jsx @@ -3,7 +3,7 @@ import {renderWithIntl} from '../../helpers/intl-helpers.jsx'; import MenuBar from '../../../src/components/menu-bar/menu-bar'; import {menuInitialState} from '../../../src/reducers/menus'; import {LoadingState} from '../../../src/reducers/project-state'; -import {DEFAULT_THEME} from '../../../src/lib/themes'; +import {DEFAULT_MODE} from '../../../src/lib/settings/color-mode'; import {fireEvent} from '@testing-library/react'; import {PLATFORM} from '../../../src/lib/platform'; @@ -23,8 +23,8 @@ describe('MenuBar Component', () => { projectState: { loadingState: LoadingState.NOT_LOADED }, - theme: { - theme: DEFAULT_THEME + settings: { + colorMode: DEFAULT_MODE }, timeTravel: { year: 'NOW' diff --git a/packages/scratch-gui/test/unit/components/monitor-list.test.jsx b/packages/scratch-gui/test/unit/components/monitor-list.test.jsx index 51edd6caaad..8f60e5cb9ba 100644 --- a/packages/scratch-gui/test/unit/components/monitor-list.test.jsx +++ b/packages/scratch-gui/test/unit/components/monitor-list.test.jsx @@ -4,7 +4,7 @@ import configureStore from 'redux-mock-store'; import {Provider} from 'react-redux'; import {renderWithIntl} from '../../helpers/intl-helpers.jsx'; import MonitorList from '../../../src/components/monitor-list/monitor-list.jsx'; -import {DEFAULT_THEME} from '../../../src/lib/themes'; +import {DEFAULT_MODE} from '../../../src/lib/settings/color-mode'; describe('MonitorListComponent', () => { const store = configureStore()({ @@ -13,8 +13,8 @@ describe('MonitorListComponent', () => { monitors: {}, savedMonitorPositions: {} }, - theme: { - theme: DEFAULT_THEME + settings: { + colorMode: DEFAULT_MODE }, toolbox: { toolboxXML: '' diff --git a/packages/scratch-gui/test/unit/components/monitor.test.jsx b/packages/scratch-gui/test/unit/components/monitor.test.jsx index 7a5d0b0c28c..853510adcc1 100644 --- a/packages/scratch-gui/test/unit/components/monitor.test.jsx +++ b/packages/scratch-gui/test/unit/components/monitor.test.jsx @@ -1,10 +1,10 @@ import React from 'react'; import {render} from '@testing-library/react'; import Monitor from '../../../src/components/monitor/monitor'; -import {DARK_THEME, DEFAULT_THEME} from '../../../src/lib/themes'; +import {DARK_MODE, DEFAULT_MODE} from '../../../src/lib/settings/color-mode'; -jest.mock('../../../src/lib/themes/default'); -jest.mock('../../../src/lib/themes/dark'); +jest.mock('../../../src/lib/settings/color-mode/default'); +jest.mock('../../../src/lib/settings/color-mode/dark'); describe('Monitor Component', () => { const noop = jest.fn(); @@ -22,19 +22,19 @@ describe('Monitor Component', () => { onNextMode: noop }; - test('it selects the correct colors based on default theme', () => { + test('it selects the correct colors based on default color mode', () => { const {container} = render(); expect(container.firstChild).toMatchSnapshot(); }); - test('it selects the correct colors based on dark mode theme', () => { + test('it selects the correct colors based on dark mode', () => { const {container} = render(); expect(container.firstChild).toMatchSnapshot(); diff --git a/packages/scratch-gui/test/unit/util/themes.test.js b/packages/scratch-gui/test/unit/util/themes.test.js index 35d8fa25b9e..ba0e315daa5 100644 --- a/packages/scratch-gui/test/unit/util/themes.test.js +++ b/packages/scratch-gui/test/unit/util/themes.test.js @@ -1,32 +1,32 @@ import { - DARK_THEME, + DARK_MODE, defaultColors, - DEFAULT_THEME, - getColorsForTheme, - HIGH_CONTRAST_THEME -} from '../../../src/lib/themes'; -import {injectExtensionBlockTheme, injectExtensionCategoryTheme} from '../../../src/lib/themes/blockHelpers'; -import {detectTheme, persistTheme} from '../../../src/lib/themes/themePersistance'; + DEFAULT_MODE, + getColorsForMode, + HIGH_CONTRAST_MODE +} from '../../../src/lib/settings/color-mode'; +import {injectExtensionBlockMode, injectExtensionCategoryMode} from '../../../src/lib/settings/color-mode/blockHelpers'; +import {detectColorMode, persistColorMode} from '../../../src/lib/settings/color-mode/persistence'; -jest.mock('../../../src/lib/themes/default'); -jest.mock('../../../src/lib/themes/dark'); +jest.mock('../../../src/lib/settings/color-mode/default'); +jest.mock('../../../src/lib/settings/color-mode/dark'); -describe('themes', () => { +describe('color modes', () => { let serializeToString; describe('core functionality', () => { - test('provides the default theme colors', () => { + test('provides the default color mode colors', () => { expect(defaultColors.motion.primary).toEqual('#111111'); }); test('returns the dark mode', () => { - const colors = getColorsForTheme(DARK_THEME); + const colors = getColorsForMode(DARK_MODE); expect(colors.motion.primary).toEqual('#AAAAAA'); }); - test('uses default theme colors when not specified', () => { - const colors = getColorsForTheme(DARK_THEME); + test('uses default color mode colors when not specified', () => { + const colors = getColorsForMode(DARK_MODE); expect(colors.motion.secondary).toEqual('#222222'); }); @@ -45,7 +45,7 @@ describe('themes', () => { global.XMLSerializer = XMLSerializer; }); - test('updates extension block colors based on theme', () => { + test('updates extension block colors based on color mode', () => { const blockInfoJson = { type: 'dummy_block', colour: '#0FBD8C', @@ -53,7 +53,7 @@ describe('themes', () => { colourTertiary: '#0B8E69' }; - const updated = injectExtensionBlockTheme(blockInfoJson, DARK_THEME); + const updated = injectExtensionBlockMode(blockInfoJson, DARK_MODE); expect(updated).toEqual({ type: 'dummy_block', @@ -65,7 +65,7 @@ describe('themes', () => { expect(blockInfoJson.colour).toBe('#0FBD8C'); }); - test('updates extension block icon based on theme', () => { + test('updates extension block icon based on color mode', () => { const blockInfoJson = { type: 'pen_block', args0: [ @@ -79,7 +79,7 @@ describe('themes', () => { colourTertiary: '#0B8E69' }; - const updated = injectExtensionBlockTheme(blockInfoJson, DARK_THEME); + const updated = injectExtensionBlockMode(blockInfoJson, DARK_MODE); expect(updated).toEqual({ type: 'pen_block', @@ -97,7 +97,7 @@ describe('themes', () => { expect(blockInfoJson.args0[0].src).toBe('original'); }); - test('bypasses updates if using the default theme', () => { + test('bypasses updates if using the default color mode', () => { const blockInfoJson = { type: 'dummy_block', colour: '#0FBD8C', @@ -105,7 +105,7 @@ describe('themes', () => { colourTertiary: '#0B8E69' }; - const updated = injectExtensionBlockTheme(blockInfoJson, DEFAULT_THEME); + const updated = injectExtensionBlockMode(blockInfoJson, DEFAULT_MODE); expect(updated).toEqual({ type: 'dummy_block', @@ -115,7 +115,7 @@ describe('themes', () => { }); }); - test('updates extension category based on theme', () => { + test('updates extension category based on color mode', () => { const dynamicBlockXML = [ { id: 'pen', @@ -123,7 +123,7 @@ describe('themes', () => { } ]; - injectExtensionCategoryTheme(dynamicBlockXML, DARK_THEME); + injectExtensionCategoryMode(dynamicBlockXML, DARK_MODE); // XMLSerializer is not available outside the browser. // Verify the mocked XMLSerializer.serializeToString is called with updated colors. @@ -133,35 +133,35 @@ describe('themes', () => { }); }); - describe('theme persistance', () => { - test('returns the theme stored in a cookie', () => { - window.document.cookie = `scratchtheme=${HIGH_CONTRAST_THEME}`; + describe('color mode persistence', () => { + test('returns the color mode stored in a cookie', () => { + window.document.cookie = `scratchtheme=${HIGH_CONTRAST_MODE}`; - const theme = detectTheme(); + const colorMode = detectColorMode(); - expect(theme).toEqual(HIGH_CONTRAST_THEME); + expect(colorMode).toEqual(HIGH_CONTRAST_MODE); }); - test('returns the system theme when no cookie', () => { + test('returns the system color mode when no cookie', () => { window.document.cookie = 'scratchtheme='; - const theme = detectTheme(); + const colorMode = detectColorMode(); - expect(theme).toEqual(DEFAULT_THEME); + expect(colorMode).toEqual(DEFAULT_MODE); }); - test('persists theme to cookie', () => { + test('persists color mode to cookie', () => { window.document.cookie = 'scratchtheme='; - persistTheme(HIGH_CONTRAST_THEME); + persistColorMode(HIGH_CONTRAST_MODE); - expect(window.document.cookie).toEqual(`scratchtheme=${HIGH_CONTRAST_THEME}`); + expect(window.document.cookie).toEqual(`scratchtheme=${HIGH_CONTRAST_MODE}`); }); - test('clears theme when matching system preferences', () => { - window.document.cookie = `scratchtheme=${HIGH_CONTRAST_THEME}`; + test('clears color mode when matching system preferences', () => { + window.document.cookie = `scratchtheme=${HIGH_CONTRAST_MODE}`; - persistTheme(DEFAULT_THEME); + persistColorMode(DEFAULT_MODE); expect(window.document.cookie).toEqual('scratchtheme='); }); diff --git a/packages/scratch-gui/webpack.config.js b/packages/scratch-gui/webpack.config.js index 34e2eda2e33..57168477a30 100644 --- a/packages/scratch-gui/webpack.config.js +++ b/packages/scratch-gui/webpack.config.js @@ -77,7 +77,7 @@ const baseConfig = new ScratchWebpackConfigBuilder( { // overwrite some of the default block media with high-contrast versions // this entry must come after copying scratch-blocks/media into the high-contrast directory - from: 'src/lib/themes/high-contrast/blocks-media', + from: 'src/lib/settings/color-mode/high-contrast/blocks-media', to: 'static/blocks-media/high-contrast', force: true }, From e57442102a579cc3e5043c3ef50cf0da5182f638 Mon Sep 17 00:00:00 2001 From: Ayshe Dzhindzhi Date: Tue, 18 Nov 2025 13:26:30 +0200 Subject: [PATCH 092/521] fix: always get avatar_badge from the session --- packages/scratch-gui/src/components/menu-bar/menu-bar.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/scratch-gui/src/components/menu-bar/menu-bar.jsx b/packages/scratch-gui/src/components/menu-bar/menu-bar.jsx index e77e4114635..ff83c645cf2 100644 --- a/packages/scratch-gui/src/components/menu-bar/menu-bar.jsx +++ b/packages/scratch-gui/src/components/menu-bar/menu-bar.jsx @@ -1012,7 +1012,7 @@ const mapStateToProps = (state, ownProps) => { projectTitle: state.scratchGui.projectTitle, settingsMenuOpen: settingsMenuOpen(state), username: ownProps.username ?? (user ? user.username : null), - avatarBadge: ownProps.avatarBadge ?? (user ? user.membership_avatar_badge : null), + avatarBadge: user ? user.membership_avatar_badge : null, userIsEducator: permissions && permissions.educator, vm: state.scratchGui.vm, mode220022BC: isTimeTravel220022BC(state), From a702b4f78c566570c7015bc72765ec252517509f Mon Sep 17 00:00:00 2001 From: Kaloyan Manolov Date: Tue, 18 Nov 2025 16:56:17 +0200 Subject: [PATCH 093/521] feat: add theme settings menu and a cat-blocks theme option --- .../scratch-gui/src/components/gui/gui.jsx | 12 +++++-- .../src/components/menu-bar/menu-bar.jsx | 5 ++- .../src/components/menu-bar/settings-menu.jsx | 32 +++++++++++++++-- .../scratch-gui/src/containers/blocks.jsx | 8 ++--- .../src/lib/assets/icon--theme.svg | 3 ++ .../src/lib/settings/theme/index.js | 34 +++++++++++++++++++ .../src/lib/settings/theme/persistence.js | 31 +++++++++++++++++ packages/scratch-gui/src/reducers/menus.js | 5 ++- packages/scratch-gui/src/reducers/settings.js | 15 ++++++-- .../{themes.test.js => color-modes.test.js} | 0 10 files changed, 131 insertions(+), 14 deletions(-) create mode 100644 packages/scratch-gui/src/lib/assets/icon--theme.svg create mode 100644 packages/scratch-gui/src/lib/settings/theme/index.js create mode 100644 packages/scratch-gui/src/lib/settings/theme/persistence.js rename packages/scratch-gui/test/unit/util/{themes.test.js => color-modes.test.js} (100%) diff --git a/packages/scratch-gui/src/components/gui/gui.jsx b/packages/scratch-gui/src/components/gui/gui.jsx index 42018beaa9c..c5da6c87783 100644 --- a/packages/scratch-gui/src/components/gui/gui.jsx +++ b/packages/scratch-gui/src/components/gui/gui.jsx @@ -68,6 +68,7 @@ const GUIComponent = props => { cardsVisible, canChangeLanguage, canChangeColorMode, + canChangeTheme, canCreateNew, canEditTitle, canManageFiles, @@ -130,6 +131,7 @@ const GUIComponent = props => { targetIsStage, telemetryModalVisible, colorMode, + theme, tipsLibraryVisible, useExternalPeripheralList, username, @@ -259,6 +261,7 @@ const GUIComponent = props => { authorUsername={authorUsername} canChangeLanguage={canChangeLanguage} canChangeColorMode={canChangeColorMode} + canChangeTheme={canChangeTheme} canCreateCopy={canCreateCopy} canCreateNew={canCreateNew} canEditTitle={canEditTitle} @@ -362,7 +365,7 @@ const GUIComponent = props => { ({ // This is the button's mode, as opposed to the actual current state blocksId: state.scratchGui.timeTravel.year.toString(), stageSizeMode: state.scratchGui.stageSize.stageSize, - colorMode: state.scratchGui.settings.colorMode + colorMode: state.scratchGui.settings.colorMode, + theme: state.scratchGui.settings.theme }); const mapDispatchToProps = dispatch => ({ diff --git a/packages/scratch-gui/src/components/menu-bar/menu-bar.jsx b/packages/scratch-gui/src/components/menu-bar/menu-bar.jsx index 03eba0419e1..d8f43cbc30b 100644 --- a/packages/scratch-gui/src/components/menu-bar/menu-bar.jsx +++ b/packages/scratch-gui/src/components/menu-bar/menu-bar.jsx @@ -452,9 +452,11 @@ class MenuBar extends React.Component { onClick={this.props.onClickLogo} /> - {(this.props.canChangeColorMode || this.props.canChangeLanguage) && ( {canChangeLanguage && } + {canChangeTheme && } {canChangeColorMode && ({ - activeColorMode: state.scratchGui.settings.colorMode + activeColorMode: state.scratchGui.settings.colorMode, + activeTheme: state.scratchGui.settings.theme }); const mapDispatchToProps = (dispatch, ownProps) => ({ @@ -102,6 +125,11 @@ const mapDispatchToProps = (dispatch, ownProps) => ({ dispatch(setColorMode(colorMode)); ownProps.onRequestClose(); persistColorMode(colorMode); + }, + onChangeTheme: theme => { + dispatch(setTheme(theme)); + ownProps.onRequestClose(); + persistTheme(theme); } }); diff --git a/packages/scratch-gui/src/containers/blocks.jsx b/packages/scratch-gui/src/containers/blocks.jsx index 9232d39a7e5..295dcf1d9fd 100644 --- a/packages/scratch-gui/src/containers/blocks.jsx +++ b/packages/scratch-gui/src/containers/blocks.jsx @@ -20,6 +20,7 @@ import DropAreaHOC from '../lib/drop-area-hoc.jsx'; import DragConstants from '../lib/drag-constants'; import defineDynamicBlock from '../lib/define-dynamic-block'; import {DEFAULT_MODE, getColorsForMode, colorModeMap} from '../lib/settings/color-mode'; +import {CAT_BLOCKS_THEME} from '../lib/settings/theme'; import {injectExtensionBlockMode, injectExtensionCategoryMode} from '../lib/settings/color-mode/blockHelpers'; import {connect} from 'react-redux'; @@ -165,10 +166,6 @@ class Blocks extends React.Component { ); } componentDidUpdate (prevProps) { - if (this.props.useCatBlocks !== prevProps.useCatBlocks) { - this.ScratchBlocks = VMScratchBlocks(this.props.vm, this.props.useCatBlocks); - } - // If any modals are open, call hideChaff to close z-indexed field editors if (this.props.anyModalVisible && !prevProps.anyModalVisible) { this.ScratchBlocks.hideChaff(); @@ -703,8 +700,7 @@ const mapStateToProps = state => ({ toolboxXML: state.scratchGui.toolbox.toolboxXML, customProceduresVisible: state.scratchGui.customProcedures.active, workspaceMetrics: state.scratchGui.workspaceMetrics, - // TODO: Remove `state.scratchGui.settings.colorMode === 'high-contrast'` - useCatBlocks: isTimeTravel2020(state) || state.scratchGui.settings.colorMode === 'high-contrast' + useCatBlocks: isTimeTravel2020(state) || state.scratchGui.settings.theme === CAT_BLOCKS_THEME }); const mapDispatchToProps = dispatch => ({ diff --git a/packages/scratch-gui/src/lib/assets/icon--theme.svg b/packages/scratch-gui/src/lib/assets/icon--theme.svg new file mode 100644 index 00000000000..ae95a23fcd6 --- /dev/null +++ b/packages/scratch-gui/src/lib/assets/icon--theme.svg @@ -0,0 +1,3 @@ + + + diff --git a/packages/scratch-gui/src/lib/settings/theme/index.js b/packages/scratch-gui/src/lib/settings/theme/index.js new file mode 100644 index 00000000000..dfd8d033004 --- /dev/null +++ b/packages/scratch-gui/src/lib/settings/theme/index.js @@ -0,0 +1,34 @@ +import defaultsDeep from 'lodash.defaultsdeep'; +import {defineMessages} from 'react-intl'; + +const DEFAULT_THEME = 'default'; +const CAT_BLOCKS_THEME = 'cat-blocks'; + +const messages = defineMessages({ + [DEFAULT_THEME]: { + id: 'gui.blockTheme.default', + defaultMessage: 'Default', + description: 'label for default theme' + }, + [CAT_BLOCKS_THEME]: { + id: 'gui.blockTheme.catBlocks', + defaultMessage: 'Cat Blocks', + description: 'label for cat blocks theme' + } +}); + +// Keeping this as a map for consistency with the color modes +const themeMap = { + [DEFAULT_THEME]: { + label: messages[DEFAULT_THEME] + }, + [CAT_BLOCKS_THEME]: { + label: messages[CAT_BLOCKS_THEME] + } +}; + +export { + DEFAULT_THEME, + CAT_BLOCKS_THEME, + themeMap +}; diff --git a/packages/scratch-gui/src/lib/settings/theme/persistence.js b/packages/scratch-gui/src/lib/settings/theme/persistence.js new file mode 100644 index 00000000000..7d6a146c6ab --- /dev/null +++ b/packages/scratch-gui/src/lib/settings/theme/persistence.js @@ -0,0 +1,31 @@ +import cookie from 'cookie'; + +import {DEFAULT_THEME, CAT_BLOCKS_THEME} from '.'; + +const COOKIE_KEY = 'scratchblockstheme'; + +const isValidTheme = theme => [DEFAULT_THEME, CAT_BLOCKS_THEME].includes(theme); + +// TODO: This should also depend on membership status +const detectTheme = () => { + const obj = cookie.parse(document.cookie) || {}; + const themeCookie = obj[COOKIE_KEY]; + + if (isValidTheme(themeCookie)) return themeCookie; + + return DEFAULT_THEME; +}; + +const persistTheme = theme => { + if (!isValidTheme(theme)) { + throw new Error(`Invalid theme: ${theme}`); + } + + const expires = new Date(new Date().setYear(new Date().getFullYear() + 1)).toUTCString(); + document.cookie = `${COOKIE_KEY}=${theme};expires=${expires};path=/`; +}; + +export { + detectTheme, + persistTheme +}; diff --git a/packages/scratch-gui/src/reducers/menus.js b/packages/scratch-gui/src/reducers/menus.js index f9a0f88fcf2..f07ab0eab13 100644 --- a/packages/scratch-gui/src/reducers/menus.js +++ b/packages/scratch-gui/src/reducers/menus.js @@ -10,6 +10,7 @@ const MENU_LOGIN = 'loginMenu'; const MENU_MODE = 'modeMenu'; const MENU_SETTINGS = 'settingsMenu'; const MENU_COLOR_MODE = 'colorModeMenu'; +const MENU_THEME = 'themeMenu'; class Menu { constructor (id) { @@ -52,6 +53,7 @@ const rootMenu = new Menu('root') new Menu(MENU_SETTINGS) .addChild(new Menu(MENU_LANGUAGE)) .addChild(new Menu(MENU_COLOR_MODE)) + .addChild(new Menu(MENU_THEME)) ) .addChild(new Menu(MENU_FILE)) .addChild(new Menu(MENU_EDIT)) @@ -70,7 +72,8 @@ const initialState = { [MENU_LOGIN]: false, [MENU_MODE]: false, [MENU_SETTINGS]: false, - [MENU_COLOR_MODE]: false + [MENU_COLOR_MODE]: false, + [MENU_THEME]: false }; const reducer = function (state, action) { diff --git a/packages/scratch-gui/src/reducers/settings.js b/packages/scratch-gui/src/reducers/settings.js index 37ae36ec755..bf520ae58cf 100644 --- a/packages/scratch-gui/src/reducers/settings.js +++ b/packages/scratch-gui/src/reducers/settings.js @@ -1,15 +1,20 @@ import {detectColorMode} from '../lib/settings/color-mode/persistence'; +import {detectTheme} from '../lib/settings/theme/persistence'; const SET_COLOR_MODE = 'scratch-gui/settings/SET_COLOR_MODE'; +const SET_THEME = 'scratch-gui/settings/SET_THEME'; const initialState = { - colorMode: detectColorMode() + colorMode: detectColorMode(), + theme: detectTheme() }; const reducer = (state = initialState, action) => { switch (action.type) { case SET_COLOR_MODE: return {...state, colorMode: action.colorMode}; + case SET_THEME: + return {...state, theme: action.theme}; default: return state; } @@ -20,8 +25,14 @@ const setColorMode = colorMode => ({ colorMode }); +const setTheme = theme => ({ + type: SET_THEME, + theme +}); + export { reducer as default, initialState as settingsInitialState, - setColorMode + setColorMode, + setTheme }; diff --git a/packages/scratch-gui/test/unit/util/themes.test.js b/packages/scratch-gui/test/unit/util/color-modes.test.js similarity index 100% rename from packages/scratch-gui/test/unit/util/themes.test.js rename to packages/scratch-gui/test/unit/util/color-modes.test.js From bd17600b26cfaa541537dd9c65c00c4dba581db3 Mon Sep 17 00:00:00 2001 From: Kaloyan Manolov Date: Wed, 26 Nov 2025 16:04:43 +0200 Subject: [PATCH 094/521] feat: implement optional themes functionality --- .../scratch-gui/src/components/gui/gui.jsx | 23 ++++++++++- .../src/components/menu-bar/menu-bar.jsx | 2 + .../src/components/menu-bar/settings-menu.jsx | 39 ++++++++++++------- .../src/lib/settings/theme/index.js | 9 +++-- .../src/lib/settings/theme/persistence.js | 6 ++- 5 files changed, 60 insertions(+), 19 deletions(-) diff --git a/packages/scratch-gui/src/components/gui/gui.jsx b/packages/scratch-gui/src/components/gui/gui.jsx index c5da6c87783..34e60fac32b 100644 --- a/packages/scratch-gui/src/components/gui/gui.jsx +++ b/packages/scratch-gui/src/components/gui/gui.jsx @@ -35,6 +35,7 @@ import TelemetryModal from '../telemetry-modal/telemetry-modal.jsx'; import layout, {STAGE_SIZE_MODES} from '../../lib/layout-constants'; import {resolveStageSize} from '../../lib/screen-utils'; import {colorModeMap} from '../../lib/settings/color-mode/index.js'; +import {DEFAULT_THEME, themeMap} from '../../lib/settings/theme/index.js'; import {AccountMenuOptionsPropTypes} from '../../lib/account-menu-options'; import styles from './gui.css'; @@ -43,6 +44,7 @@ import costumesIcon from './icon--costumes.svg'; import soundsIcon from './icon--sounds.svg'; import DebugModal from '../debug-modal/debug-modal.jsx'; import {setPlatform} from '../../reducers/platform.js'; +import {setTheme} from '../../reducers/settings.js'; import {PLATFORM} from '../../lib/platform.js'; // Cache this value to only retrieve it once the first time. @@ -85,6 +87,7 @@ const GUIComponent = props => { onDebugModalClose, onTutorialSelect, enableCommunity, + hasActiveMembership, isCreating, isFullScreen, isPlayerOnly, @@ -146,10 +149,21 @@ const GUIComponent = props => { useEffect(() => { if (props.platform) { + // TODO: This uses the imported `setPlatform` directly, + // but it should probably use the dispatched version from props. setPlatform(props.platform); } }, [props.platform]); + useEffect(() => { + if (!themeMap[theme]?.isAvailable?.({hasActiveMembership})) { + // If the preferred theme is not available, fall back to default. + // This is not the best place for this, but the other solution is to make + // user specific info available on redux init. + props.setTheme(DEFAULT_THEME); + } + }, [theme, hasActiveMembership, props.setTheme]); + const tabClassNames = { tabs: styles.tabs, tab: classNames(tabStyles.reactTabsTab, styles.tab), @@ -271,6 +285,7 @@ const GUIComponent = props => { canShare={canShare} className={styles.menuBarPosition} enableCommunity={enableCommunity} + hasActiveMembership={hasActiveMembership} isShared={isShared} isTotallyNormal={isTotallyNormal} logo={logo} @@ -460,6 +475,7 @@ GUIComponent.propTypes = { costumeLibraryVisible: PropTypes.bool, costumesTabVisible: PropTypes.bool, debugModalVisible: PropTypes.bool, + hasActiveMembership: PropTypes.bool, onDebugModalClose: PropTypes.func, onTutorialSelect: PropTypes.func, enableCommunity: PropTypes.bool, @@ -500,6 +516,7 @@ GUIComponent.propTypes = { onUpdateProjectThumbnail: PropTypes.func, platform: PropTypes.oneOf(Object.keys(PLATFORM)), renderLogin: PropTypes.func, + setTheme: PropTypes.func.isRequired, showComingSoon: PropTypes.bool, showNewFeatureCallouts: PropTypes.bool, soundsTabVisible: PropTypes.bool, @@ -522,9 +539,9 @@ GUIComponent.defaultProps = { backpackVisible: false, basePath: './', blocksId: 'original', + // TODO: Currently all of those are always true. Do we actually need them? canChangeLanguage: true, canChangeColorMode: true, - // TODO: Make this depend on membership status canChangeTheme: true, canCreateNew: false, canEditTitle: false, @@ -535,6 +552,7 @@ GUIComponent.defaultProps = { canShare: false, canUseCloud: false, enableCommunity: false, + hasActiveMembership: false, isCreating: false, isShared: false, isTotallyNormal: false, @@ -555,7 +573,8 @@ const mapStateToProps = state => ({ }); const mapDispatchToProps = dispatch => ({ - setPlatform: platform => dispatch(setPlatform(platform)) + setPlatform: platform => dispatch(setPlatform(platform)), + setTheme: theme => dispatch(setTheme(theme)) }); export default connect(mapStateToProps, diff --git a/packages/scratch-gui/src/components/menu-bar/menu-bar.jsx b/packages/scratch-gui/src/components/menu-bar/menu-bar.jsx index d8f43cbc30b..ec00cc7cd33 100644 --- a/packages/scratch-gui/src/components/menu-bar/menu-bar.jsx +++ b/packages/scratch-gui/src/components/menu-bar/menu-bar.jsx @@ -457,6 +457,7 @@ class MenuBar extends React.Component { canChangeLanguage={this.props.canChangeLanguage} canChangeColorMode={this.props.canChangeColorMode} canChangeTheme={this.props.canChangeTheme} + hasActiveMembership={this.props.hasActiveMembership} isRtl={this.props.isRtl} onRequestClose={this.props.onRequestCloseSettings} onRequestOpen={this.props.onClickSettings} @@ -918,6 +919,7 @@ MenuBar.propTypes = { editMenuOpen: PropTypes.bool, enableCommunity: PropTypes.bool, fileMenuOpen: PropTypes.bool, + hasActiveMembership: PropTypes.bool, intl: intlShape, isRtl: PropTypes.bool, isShared: PropTypes.bool, diff --git a/packages/scratch-gui/src/components/menu-bar/settings-menu.jsx b/packages/scratch-gui/src/components/menu-bar/settings-menu.jsx index 490bd44f4c9..9993c484a8a 100644 --- a/packages/scratch-gui/src/components/menu-bar/settings-menu.jsx +++ b/packages/scratch-gui/src/components/menu-bar/settings-menu.jsx @@ -28,6 +28,7 @@ const SettingsMenu = ({ canChangeLanguage, canChangeColorMode, canChangeTheme, + hasActiveMembership, isRtl, activeColorMode, onChangeColorMode, @@ -43,6 +44,14 @@ const SettingsMenu = ({ } return acc; }, {}), []); + const availableThemesMap = useMemo(() => Object.keys(themeMap).reduce((acc, themeKey) => { + const theme = themeMap[themeKey]; + if (theme.isAvailable?.({hasActiveMembership})) { + acc[themeKey] = theme; + } + return acc; + }, {}), [hasActiveMembership]); + const availableThemesLength = useMemo(() => Object.keys(availableThemesMap).length, [availableThemesMap]); return (
{canChangeLanguage && } - {canChangeTheme && } + {canChangeTheme && + // TODO: Consider always showing the theme menu, even if there is a single available theme + availableThemesLength > 1 && + } {canChangeColorMode && true }, [CAT_BLOCKS_THEME]: { - label: messages[CAT_BLOCKS_THEME] + label: messages[CAT_BLOCKS_THEME], + // TODO: This should probably also depend on `isTimeTravel2020`, + // but it should be fine to stay as-is for now. + isAvailable: userInfo => userInfo?.hasActiveMembership } }; diff --git a/packages/scratch-gui/src/lib/settings/theme/persistence.js b/packages/scratch-gui/src/lib/settings/theme/persistence.js index 7d6a146c6ab..968ff504c7a 100644 --- a/packages/scratch-gui/src/lib/settings/theme/persistence.js +++ b/packages/scratch-gui/src/lib/settings/theme/persistence.js @@ -6,7 +6,11 @@ const COOKIE_KEY = 'scratchblockstheme'; const isValidTheme = theme => [DEFAULT_THEME, CAT_BLOCKS_THEME].includes(theme); -// TODO: This should also depend on membership status +// TODO: The correct way of implementing this would be to know the user info here +// (e.g., membership status) and filter out unavailable themes. However, there is no easy way to currently do this, +// as user info is generally passed as component properties to GUI, rather than through redux. +// For now, we'll take the user preference here as-is and switch to default theme if needed, +// once we have the user info available. const detectTheme = () => { const obj = cookie.parse(document.cookie) || {}; const themeCookie = obj[COOKIE_KEY]; From 4a5acba7442473be34b18d74af03df47d1938535 Mon Sep 17 00:00:00 2001 From: Kaloyan Manolov Date: Wed, 26 Nov 2025 16:16:53 +0200 Subject: [PATCH 095/521] fix: snapshot --- .../test/unit/components/__snapshots__/monitor.test.jsx.snap | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/scratch-gui/test/unit/components/__snapshots__/monitor.test.jsx.snap b/packages/scratch-gui/test/unit/components/__snapshots__/monitor.test.jsx.snap index 11230197cf0..e6770d0f102 100644 --- a/packages/scratch-gui/test/unit/components/__snapshots__/monitor.test.jsx.snap +++ b/packages/scratch-gui/test/unit/components/__snapshots__/monitor.test.jsx.snap @@ -1,6 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`Monitor Component it selects the correct colors based on dark mode theme 1`] = ` +exports[`Monitor Component it selects the correct colors based on dark mode 1`] = `
`; -exports[`Monitor Component it selects the correct colors based on default theme 1`] = ` +exports[`Monitor Component it selects the correct colors based on default color mode 1`] = `
Date: Wed, 26 Nov 2025 17:09:22 +0200 Subject: [PATCH 096/521] fix: make theme availability check more explicit --- packages/scratch-gui/src/components/gui/gui.jsx | 1 - packages/scratch-gui/src/lib/settings/theme/index.js | 5 ++++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/scratch-gui/src/components/gui/gui.jsx b/packages/scratch-gui/src/components/gui/gui.jsx index 34e60fac32b..b2ba785e78a 100644 --- a/packages/scratch-gui/src/components/gui/gui.jsx +++ b/packages/scratch-gui/src/components/gui/gui.jsx @@ -552,7 +552,6 @@ GUIComponent.defaultProps = { canShare: false, canUseCloud: false, enableCommunity: false, - hasActiveMembership: false, isCreating: false, isShared: false, isTotallyNormal: false, diff --git a/packages/scratch-gui/src/lib/settings/theme/index.js b/packages/scratch-gui/src/lib/settings/theme/index.js index 233e9a9584e..d06f6142030 100644 --- a/packages/scratch-gui/src/lib/settings/theme/index.js +++ b/packages/scratch-gui/src/lib/settings/theme/index.js @@ -26,7 +26,10 @@ const themeMap = { label: messages[CAT_BLOCKS_THEME], // TODO: This should probably also depend on `isTimeTravel2020`, // but it should be fine to stay as-is for now. - isAvailable: userInfo => userInfo?.hasActiveMembership + isAvailable: userInfo => + // Return true, unless we explicitly know the user's membership status + typeof userInfo.hasActiveMembership === 'undefined' || + userInfo.hasActiveMembership } }; From ac431397bb9d69cbe5ca42efa7fd57c7ef83f4a9 Mon Sep 17 00:00:00 2001 From: Kaloyan Manolov Date: Wed, 26 Nov 2025 17:34:44 +0200 Subject: [PATCH 097/521] fix: extract check to gui component effect --- packages/scratch-gui/src/components/gui/gui.jsx | 9 ++++++--- packages/scratch-gui/src/lib/settings/theme/index.js | 5 +---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/scratch-gui/src/components/gui/gui.jsx b/packages/scratch-gui/src/components/gui/gui.jsx index b2ba785e78a..1f90c8d098a 100644 --- a/packages/scratch-gui/src/components/gui/gui.jsx +++ b/packages/scratch-gui/src/components/gui/gui.jsx @@ -156,10 +156,13 @@ const GUIComponent = props => { }, [props.platform]); useEffect(() => { - if (!themeMap[theme]?.isAvailable?.({hasActiveMembership})) { + if ( + // Avoid making the switch before the user info is fetched. + typeof hasActiveMembership !== 'undefined' && + !themeMap[theme]?.isAvailable?.({hasActiveMembership}) + ) { // If the preferred theme is not available, fall back to default. - // This is not the best place for this, but the other solution is to make - // user specific info available on redux init. + // TODO: It would be cleaner to do this on redux init. props.setTheme(DEFAULT_THEME); } }, [theme, hasActiveMembership, props.setTheme]); diff --git a/packages/scratch-gui/src/lib/settings/theme/index.js b/packages/scratch-gui/src/lib/settings/theme/index.js index d06f6142030..7e3c44952e1 100644 --- a/packages/scratch-gui/src/lib/settings/theme/index.js +++ b/packages/scratch-gui/src/lib/settings/theme/index.js @@ -26,10 +26,7 @@ const themeMap = { label: messages[CAT_BLOCKS_THEME], // TODO: This should probably also depend on `isTimeTravel2020`, // but it should be fine to stay as-is for now. - isAvailable: userInfo => - // Return true, unless we explicitly know the user's membership status - typeof userInfo.hasActiveMembership === 'undefined' || - userInfo.hasActiveMembership + isAvailable: userInfo => userInfo.hasActiveMembership } }; From 8d23bcbe642780433df62501f5fe6d4c24f76bfe Mon Sep 17 00:00:00 2001 From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com> Date: Wed, 26 Nov 2025 10:49:17 -0800 Subject: [PATCH 098/521] feat(deps): update scratch-blocks to v1.3.0 --- package-lock.json | 222 +++++++----------------------- packages/scratch-gui/package.json | 6 +- packages/scratch-vm/package.json | 2 +- 3 files changed, 56 insertions(+), 174 deletions(-) diff --git a/package-lock.json b/package-lock.json index b22e1455eff..cf4a1de7428 100644 --- a/package-lock.json +++ b/package-lock.json @@ -95,6 +95,7 @@ "version": "7.28.3", "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.28.3.tgz", "integrity": "sha512-n1RU5vuCX0CsaqaXm9I0KUCNKNQMy5epmzl/xdSSm70bSqhg9GWhgeosypyQLc0bK24+Xpk1WGzZlI9pJtkZdg==", + "dev": true, "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "^0.3.28", @@ -124,6 +125,7 @@ "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": { "@jridgewell/resolve-uri": "^3.1.0", @@ -148,6 +150,7 @@ "version": "7.28.5", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", + "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -157,6 +160,7 @@ "version": "7.28.5", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", + "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", @@ -187,6 +191,7 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -235,6 +240,7 @@ "version": "7.28.5", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", + "dev": true, "license": "MIT", "dependencies": { "@babel/parser": "^7.28.5", @@ -251,6 +257,7 @@ "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": { "@jridgewell/resolve-uri": "^3.1.0", @@ -274,6 +281,7 @@ "version": "7.27.2", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "dev": true, "license": "MIT", "dependencies": { "@babel/compat-data": "^7.27.2", @@ -290,6 +298,7 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, "license": "ISC", "dependencies": { "yallist": "^3.0.2" @@ -299,6 +308,7 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -308,6 +318,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, "license": "ISC" }, "node_modules/@babel/helper-create-class-features-plugin": { @@ -391,6 +402,7 @@ "version": "7.28.0", "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -414,6 +426,7 @@ "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "dev": true, "license": "MIT", "dependencies": { "@babel/traverse": "^7.27.1", @@ -427,6 +440,7 @@ "version": "7.28.3", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.27.1", @@ -457,6 +471,7 @@ "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -516,6 +531,7 @@ "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -534,6 +550,7 @@ "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -558,6 +575,7 @@ "version": "7.28.4", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "dev": true, "license": "MIT", "dependencies": { "@babel/template": "^7.27.2", @@ -571,6 +589,7 @@ "version": "7.28.5", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", + "dev": true, "license": "MIT", "dependencies": { "@babel/types": "^7.28.5" @@ -2032,6 +2051,7 @@ "version": "7.27.2", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", @@ -2046,6 +2066,7 @@ "version": "7.28.5", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", + "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", @@ -2064,6 +2085,7 @@ "version": "7.28.5", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", @@ -4279,6 +4301,7 @@ "version": "2.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", @@ -4289,6 +4312,7 @@ "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": { "@jridgewell/resolve-uri": "^3.1.0", @@ -4505,6 +4529,7 @@ "version": "2.1.8-no-fsevents.3", "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz", "integrity": "sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==", + "dev": true, "license": "MIT", "optional": true }, @@ -10718,6 +10743,7 @@ "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, "license": "MIT", "dependencies": { "@babel/parser": "^7.20.7", @@ -10731,6 +10757,7 @@ "version": "7.27.0", "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, "license": "MIT", "dependencies": { "@babel/types": "^7.0.0" @@ -10740,6 +10767,7 @@ "version": "7.4.4", "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, "license": "MIT", "dependencies": { "@babel/parser": "^7.1.0", @@ -10750,6 +10778,7 @@ "version": "7.28.0", "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, "license": "MIT", "dependencies": { "@babel/types": "^7.28.2" @@ -12284,15 +12313,6 @@ "ajv": "^8.8.2" } }, - "node_modules/amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==", - "license": "BSD-3-Clause OR MIT", - "engines": { - "node": ">=0.4.2" - } - }, "node_modules/ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -12370,7 +12390,7 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "devOptional": true, + "dev": true, "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", @@ -13113,6 +13133,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-react-intl/-/babel-plugin-react-intl-3.5.1.tgz", "integrity": "sha512-1jlEJCSmLaJM4tjIKpu64UZ833COCHmwR77bFJDOye+zlwf80uR1b8p41l4tClx1QsrfI+qV6w/5AiPYQgaMUQ==", "deprecated": "this package has been renamed to babel-plugin-formatjs", + "dev": true, "license": "BSD-3-Clause", "dependencies": { "@babel/core": "^7.4.5", @@ -13126,6 +13147,7 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", @@ -13140,6 +13162,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, "license": "MIT", "optionalDependencies": { "graceful-fs": "^4.1.6" @@ -13149,6 +13172,7 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, "license": "MIT", "engines": { "node": ">= 4.0.0" @@ -13308,7 +13332,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "devOptional": true, + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -14182,36 +14206,6 @@ "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", "license": "Apache-2.0" }, - "node_modules/cat-blocks": { - "name": "scratch-blocks", - "version": "0.1.0-prerelease.20220318143026", - "resolved": "https://registry.npmjs.org/scratch-blocks/-/scratch-blocks-0.1.0-prerelease.20220318143026.tgz", - "integrity": "sha512-eYJYzjYt3fmF5a243eBIgQfNj+c3ApHFE8jkm1KV/tEiFanJ8XlLZay9LmbnhYhK0618+s0uEQrpJ9WC6xnX/Q==", - "deprecated": "Obsolete pre-release", - "license": "Apache-2.0", - "dependencies": { - "exports-loader": "0.6.3", - "google-closure-library": "20190301.0.0", - "imports-loader": "0.6.5", - "scratch-l10n": "3.14.20220317031619" - } - }, - "node_modules/cat-blocks/node_modules/scratch-l10n": { - "version": "3.14.20220317031619", - "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-3.14.20220317031619.tgz", - "integrity": "sha512-tDKXRFxKFob9htBeOu+873mujoePXc4sGQulWDdMVCM8cYz63geCWziX5fCwp2pu3pJKQLEth0ftd2eoXkT1RA==", - "license": "BSD-3-Clause", - "dependencies": { - "@babel/cli": "^7.1.2", - "@babel/core": "^7.1.2", - "babel-plugin-react-intl": "^3.0.1", - "transifex": "1.6.6" - }, - "bin": { - "build-i18n-src": "scripts/build-i18n-src.js", - "tx-push-src": "scripts/tx-push-src.js" - } - }, "node_modules/catharsis": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.9.0.tgz", @@ -14371,7 +14365,7 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "anymatch": "~3.1.2", @@ -14771,6 +14765,7 @@ "version": "6.2.1", "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "dev": true, "license": "MIT", "engines": { "node": ">= 6" @@ -15086,6 +15081,7 @@ "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/convert-to-spaces": { @@ -18166,65 +18162,6 @@ "dev": true, "license": "Apache-2.0" }, - "node_modules/exports-loader": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/exports-loader/-/exports-loader-0.6.3.tgz", - "integrity": "sha512-vBQgTnvmEB7qWmr7gzAzJRWptzYhkhvdXeH8sRnS//mIai6MgLZe1crlQ+VWTjCCXLlnhGuiuVMq0YfjA5AUOw==", - "dependencies": { - "loader-utils": "0.2.x", - "source-map": "0.1.x" - } - }, - "node_modules/exports-loader/node_modules/big.js": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", - "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/exports-loader/node_modules/emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha512-knHEZMgs8BB+MInokmNTg/OyPlAddghe1YBgNwJBc5zsJi/uyIcXoSDsL/W9ymOsBoBGdPIHXYJ9+qKFwRwDng==", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/exports-loader/node_modules/json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw==", - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/exports-loader/node_modules/loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "integrity": "sha512-tiv66G0SmiOx+pLWMtGEkfSEejxvb6N6uRrQjfWJIT79W9GMpgKeCAmm9aVBKtd4WEgntciI8CsGqjpDoCWJug==", - "license": "MIT", - "dependencies": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0", - "object-assign": "^4.0.1" - } - }, - "node_modules/exports-loader/node_modules/source-map": { - "version": "0.1.43", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", - "integrity": "sha512-VtCvB9SIQhk3aF6h+N85EaqIaBFIAfZ9Cu+NJHHVvc8BbEcnvDcFw6sqQ2dQrT6SlOrZq3tIvyD9+EGq/lJryQ==", - "dependencies": { - "amdefine": ">=0.0.4" - }, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/expose-loader": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/expose-loader/-/expose-loader-1.0.3.tgz", @@ -19888,6 +19825,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", + "dev": true, "license": "MIT" }, "node_modules/fs.realpath": { @@ -19978,6 +19916,7 @@ "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -21699,66 +21638,6 @@ "node": ">=8" } }, - "node_modules/imports-loader": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/imports-loader/-/imports-loader-0.6.5.tgz", - "integrity": "sha512-fYIzBL9JOzJszvfeSGSKVjAtkWEtPUwP+OWiUxIWApcxsYh3iqZWZAp8xjTuhsvqglhqaetxeLLTaYyxIv1d4Q==", - "license": "MIT", - "dependencies": { - "loader-utils": "0.2.x", - "source-map": "0.1.x" - } - }, - "node_modules/imports-loader/node_modules/big.js": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", - "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/imports-loader/node_modules/emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha512-knHEZMgs8BB+MInokmNTg/OyPlAddghe1YBgNwJBc5zsJi/uyIcXoSDsL/W9ymOsBoBGdPIHXYJ9+qKFwRwDng==", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/imports-loader/node_modules/json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw==", - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/imports-loader/node_modules/loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "integrity": "sha512-tiv66G0SmiOx+pLWMtGEkfSEejxvb6N6uRrQjfWJIT79W9GMpgKeCAmm9aVBKtd4WEgntciI8CsGqjpDoCWJug==", - "license": "MIT", - "dependencies": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0", - "object-assign": "^4.0.1" - } - }, - "node_modules/imports-loader/node_modules/source-map": { - "version": "0.1.43", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", - "integrity": "sha512-VtCvB9SIQhk3aF6h+N85EaqIaBFIAfZ9Cu+NJHHVvc8BbEcnvDcFw6sqQ2dQrT6SlOrZq3tIvyD9+EGq/lJryQ==", - "dependencies": { - "amdefine": ">=0.0.4" - }, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -22131,6 +22010,7 @@ "resolved": "https://registry.npmjs.org/intl-messageformat-parser/-/intl-messageformat-parser-1.8.1.tgz", "integrity": "sha512-IMSCKVf0USrM/959vj3xac7s8f87sc+80Y/ipBzdKy4ifBv5Gsj2tZ41EAaURVg01QU71fYr77uA8Meh6kELbg==", "deprecated": "We've written a new parser that's 6x faster and is backwards compatible. Please use @formatjs/icu-messageformat-parser", + "dev": true, "license": "BSD-3-Clause" }, "node_modules/intl-messageformat/node_modules/@formatjs/ecma402-abstract": { @@ -22308,7 +22188,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "binary-extensions": "^2.0.0" @@ -25085,6 +24965,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, "license": "MIT", "bin": { "jsesc": "bin/jsesc" @@ -34424,7 +34305,7 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "picomatch": "^2.2.1" @@ -35346,9 +35227,9 @@ } }, "node_modules/scratch-blocks": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/scratch-blocks/-/scratch-blocks-1.2.5.tgz", - "integrity": "sha512-S1cL7j0ajhOl/fJk6vKGtYwGHjGlEX5VOcAA/rjd5GhfneL6l3fopa5AXoVvYQHow3+s2wtFGaAJheYle/ygUg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/scratch-blocks/-/scratch-blocks-1.3.0.tgz", + "integrity": "sha512-RvTTClge6htuEml1nt77lh6VxLPkXK/GIeOPgeOzV6qyLquarsisIy+17F79CW/1E3rc8myE9JwC3iwKMcENgw==", "license": "Apache-2.0", "dependencies": { "exports-loader": "^0.7.0", @@ -36426,6 +36307,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -41311,7 +41193,6 @@ "balance-text": "3.3.1", "base64-loader": "1.0.0", "bowser": "1.9.4", - "cat-blocks": "npm:scratch-blocks@0.1.0-prerelease.20220318143026", "classnames": "2.5.1", "computed-style-to-inline-style": "3.0.0", "cookie": "0.6.0", @@ -41347,7 +41228,7 @@ "react-intl": "6.8.9", "react-modal": "3.16.3", "react-popover": "0.5.10", - "react-redux": "8.1.3", + "react-redux": "^8.0.0", "react-responsive": "9.0.2", "react-style-proptype": "3.2.2", "react-tabs": "5.2.0", @@ -41356,7 +41237,7 @@ "react-visibility-sensor": "5.1.1", "redux-throttle": "0.1.1", "scratch-audio": "2.0.268", - "scratch-blocks": "1.2.5", + "scratch-blocks": "1.3.0", "scratch-l10n": "6.1.25", "scratch-paint": "4.1.19", "scratch-render-fonts": "1.0.252", @@ -41380,6 +41261,7 @@ "@types/react-modal": "3.16.3", "babel-core": "7.0.0-bridge.0", "babel-loader": "9.2.1", + "babel-plugin-react-intl": "3.5.1", "buffer": "6.0.3", "cheerio": "1.1.2", "cross-env": "7.0.3", @@ -41708,7 +41590,7 @@ "js-md5": "0.7.3", "jsdoc": "3.6.11", "pngjs": "3.4.0", - "scratch-blocks": "1.2.5", + "scratch-blocks": "1.3.0", "scratch-l10n": "6.1.25", "scratch-render-fonts": "1.0.252", "scratch-semantic-release-config": "4.0.0", diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index 0417cc815df..6dbfff4cf6d 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -71,7 +71,6 @@ "balance-text": "3.3.1", "base64-loader": "1.0.0", "bowser": "1.9.4", - "cat-blocks": "npm:scratch-blocks@0.1.0-prerelease.20220318143026", "classnames": "2.5.1", "computed-style-to-inline-style": "3.0.0", "cookie": "0.6.0", @@ -107,7 +106,7 @@ "react-intl": "6.8.9", "react-modal": "3.16.3", "react-popover": "0.5.10", - "react-redux": "8.1.3", + "react-redux": "^8.0.0", "react-responsive": "9.0.2", "react-style-proptype": "3.2.2", "react-tabs": "5.2.0", @@ -116,7 +115,7 @@ "react-visibility-sensor": "5.1.1", "redux-throttle": "0.1.1", "scratch-audio": "2.0.268", - "scratch-blocks": "1.2.5", + "scratch-blocks": "1.3.0", "scratch-l10n": "6.1.25", "scratch-paint": "4.1.19", "scratch-render-fonts": "1.0.252", @@ -146,6 +145,7 @@ "@types/react-modal": "3.16.3", "babel-core": "7.0.0-bridge.0", "babel-loader": "9.2.1", + "babel-plugin-react-intl": "3.5.1", "buffer": "6.0.3", "cheerio": "1.1.2", "cross-env": "7.0.3", diff --git a/packages/scratch-vm/package.json b/packages/scratch-vm/package.json index 41939900169..71209c4e5c7 100644 --- a/packages/scratch-vm/package.json +++ b/packages/scratch-vm/package.json @@ -91,7 +91,7 @@ "js-md5": "0.7.3", "jsdoc": "3.6.11", "pngjs": "3.4.0", - "scratch-blocks": "1.2.5", + "scratch-blocks": "1.3.0", "scratch-l10n": "6.1.25", "scratch-render-fonts": "1.0.252", "scratch-semantic-release-config": "4.0.0", From 8c2aa5eec6588457bb007f91a1a0e0b3dcc6a0b6 Mon Sep 17 00:00:00 2001 From: Kaloyan Manolov Date: Thu, 27 Nov 2025 12:11:35 +0200 Subject: [PATCH 099/521] fix: add color mode and theme menus to the redux menu control mechanism --- .../components/menu-bar/preference-menu.jsx | 18 +++++++-------- .../src/components/menu-bar/settings-menu.jsx | 23 ++++++++++++++++++- packages/scratch-gui/src/reducers/menus.js | 16 ++++++++++++- 3 files changed, 46 insertions(+), 11 deletions(-) diff --git a/packages/scratch-gui/src/components/menu-bar/preference-menu.jsx b/packages/scratch-gui/src/components/menu-bar/preference-menu.jsx index e9bf0992279..b1a863e44c1 100644 --- a/packages/scratch-gui/src/components/menu-bar/preference-menu.jsx +++ b/packages/scratch-gui/src/components/menu-bar/preference-menu.jsx @@ -1,6 +1,6 @@ import classNames from 'classnames'; import PropTypes from 'prop-types'; -import React, {useState, useMemo, useCallback} from 'react'; +import React, {useMemo} from 'react'; import {FormattedMessage} from 'react-intl'; import {connect} from 'react-redux'; @@ -47,23 +47,21 @@ PreferenceItem.propTypes = { const PreferenceMenu = ({ itemsMap, + open, onChange, + onRequestOpen, defaultMenuIconSrc, submenuLabel, selectedItemKey, isRtl }) => { - const [isOpen, setIsOpen] = useState(false); const itemKeys = useMemo(() => Object.keys(itemsMap), [itemsMap]); const selectedItem = useMemo(() => itemsMap[selectedItemKey], [itemsMap, selectedItemKey]); - const onClick = useCallback(() => { - setIsOpen(!isOpen); - }, [isOpen]); return ( - +
({ diff --git a/packages/scratch-gui/src/components/menu-bar/settings-menu.jsx b/packages/scratch-gui/src/components/menu-bar/settings-menu.jsx index 9993c484a8a..2728762707b 100644 --- a/packages/scratch-gui/src/components/menu-bar/settings-menu.jsx +++ b/packages/scratch-gui/src/components/menu-bar/settings-menu.jsx @@ -21,6 +21,7 @@ import styles from './settings-menu.css'; import dropdownCaret from './dropdown-caret.svg'; import settingsIcon from './icon--settings.svg'; import themeIcon from '../../lib/assets/icon--theme.svg'; +import {colorModeMenuOpen, themeMenuOpen, openColorModeMenu, openThemeMenu} from '../../reducers/menus.js'; const enabledColorModes = [DEFAULT_MODE, HIGH_CONTRAST_MODE]; @@ -30,8 +31,12 @@ const SettingsMenu = ({ canChangeTheme, hasActiveMembership, isRtl, + isColorModeMenuOpen, + isThemeMenuOpen, activeColorMode, onChangeColorMode, + onRequestOpenColorMode, + onRequestOpenTheme, activeTheme, onChangeTheme, onRequestClose, @@ -83,6 +88,7 @@ const SettingsMenu = ({ // TODO: Consider always showing the theme menu, even if there is a single available theme availableThemesLength > 1 && } {canChangeColorMode && } @@ -121,8 +130,12 @@ SettingsMenu.propTypes = { isRtl: PropTypes.bool, activeColorMode: PropTypes.string, onChangeColorMode: PropTypes.func, + onRequestOpenColorMode: PropTypes.func, + isColorModeMenuOpen: PropTypes.bool, activeTheme: PropTypes.string, onChangeTheme: PropTypes.func, + onRequestOpenTheme: PropTypes.func, + isThemeMenuOpen: PropTypes.bool, onRequestClose: PropTypes.func, onRequestOpen: PropTypes.func, settingsMenuOpen: PropTypes.bool @@ -130,10 +143,18 @@ SettingsMenu.propTypes = { const mapStateToProps = state => ({ activeColorMode: state.scratchGui.settings.colorMode, - activeTheme: state.scratchGui.settings.theme + activeTheme: state.scratchGui.settings.theme, + isColorModeMenuOpen: colorModeMenuOpen(state), + isThemeMenuOpen: themeMenuOpen(state) }); const mapDispatchToProps = (dispatch, ownProps) => ({ + onRequestOpenColorMode: () => { + dispatch(openColorModeMenu()); + }, + onRequestOpenTheme: () => { + dispatch(openThemeMenu()); + }, onChangeColorMode: colorMode => { dispatch(setColorMode(colorMode)); ownProps.onRequestClose(); diff --git a/packages/scratch-gui/src/reducers/menus.js b/packages/scratch-gui/src/reducers/menus.js index f07ab0eab13..8e62120337c 100644 --- a/packages/scratch-gui/src/reducers/menus.js +++ b/packages/scratch-gui/src/reducers/menus.js @@ -145,6 +145,14 @@ const openSettingsMenu = () => openMenu(MENU_SETTINGS); const closeSettingsMenu = () => closeMenu(MENU_SETTINGS); const settingsMenuOpen = state => state.scratchGui.menus[MENU_SETTINGS]; +const openColorModeMenu = () => openMenu(MENU_COLOR_MODE); +const closeColorModeMenu = () => closeMenu(MENU_COLOR_MODE); +const colorModeMenuOpen = state => state.scratchGui.menus[MENU_COLOR_MODE]; + +const openThemeMenu = () => openMenu(MENU_THEME); +const closeThemeMenu = () => closeMenu(MENU_THEME); +const themeMenuOpen = state => state.scratchGui.menus[MENU_THEME]; + export { reducer as default, initialState as menuInitialState, @@ -171,5 +179,11 @@ export { modeMenuOpen, openSettingsMenu, closeSettingsMenu, - settingsMenuOpen + settingsMenuOpen, + openColorModeMenu, + closeColorModeMenu, + colorModeMenuOpen, + openThemeMenu, + closeThemeMenu, + themeMenuOpen }; From a0dd45d200506056318102de2ecccbc635b965d0 Mon Sep 17 00:00:00 2001 From: Kaloyan Manolov Date: Thu, 27 Nov 2025 12:44:01 +0200 Subject: [PATCH 100/521] feat: introduce isFetchingUserData param to GUI --- packages/scratch-gui/src/components/gui/gui.jsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/scratch-gui/src/components/gui/gui.jsx b/packages/scratch-gui/src/components/gui/gui.jsx index 1f90c8d098a..28a3b9d59f1 100644 --- a/packages/scratch-gui/src/components/gui/gui.jsx +++ b/packages/scratch-gui/src/components/gui/gui.jsx @@ -89,6 +89,7 @@ const GUIComponent = props => { enableCommunity, hasActiveMembership, isCreating, + isFetchingUserData, isFullScreen, isPlayerOnly, isRtl, @@ -157,8 +158,7 @@ const GUIComponent = props => { useEffect(() => { if ( - // Avoid making the switch before the user info is fetched. - typeof hasActiveMembership !== 'undefined' && + !isFetchingUserData && !themeMap[theme]?.isAvailable?.({hasActiveMembership}) ) { // If the preferred theme is not available, fall back to default. @@ -483,6 +483,7 @@ GUIComponent.propTypes = { onTutorialSelect: PropTypes.func, enableCommunity: PropTypes.bool, isCreating: PropTypes.bool, + isFetchingUserData: PropTypes.bool, isFullScreen: PropTypes.bool, isPlayerOnly: PropTypes.bool, isRtl: PropTypes.bool, From 9a7b105b0cdc4ebbc6ee16995b5e5c43cea791f3 Mon Sep 17 00:00:00 2001 From: Kaloyan Manolov Date: Wed, 3 Dec 2025 16:06:39 +0200 Subject: [PATCH 101/521] fix: temporarily disable allowjs in tsconfig.json to fix build errors from parsing dist/ folders --- packages/scratch-gui/tsconfig.json | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/scratch-gui/tsconfig.json b/packages/scratch-gui/tsconfig.json index 4e0b284662a..e750f01f2da 100644 --- a/packages/scratch-gui/tsconfig.json +++ b/packages/scratch-gui/tsconfig.json @@ -6,7 +6,6 @@ /* Language and Environment */ "target": "ESNext", "jsx": "react", - "allowJs": true, /* Modules */ "module": "commonjs", From a68c59ac6523ab2fd7ca1ca470b176876686da2c Mon Sep 17 00:00:00 2001 From: Kaloyan Manolov Date: Wed, 3 Dec 2025 16:30:12 +0200 Subject: [PATCH 102/521] fix: reintroduce allowjs option for eslint config --- packages/scratch-gui/eslint.config.mjs | 2 +- packages/scratch-gui/tsconfig.eslint.json | 7 +++++++ packages/scratch-gui/tsconfig.test.json | 1 + 3 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 packages/scratch-gui/tsconfig.eslint.json diff --git a/packages/scratch-gui/eslint.config.mjs b/packages/scratch-gui/eslint.config.mjs index 5fcb20c76a2..bb92d708a24 100644 --- a/packages/scratch-gui/eslint.config.mjs +++ b/packages/scratch-gui/eslint.config.mjs @@ -40,7 +40,7 @@ export default eslintConfigScratch.defineConfig( projectService: false, tsconfigRootDir: import.meta.dirname, project: [ - 'tsconfig.json', + 'tsconfig.eslint.json', 'tsconfig.test.json' ] } diff --git a/packages/scratch-gui/tsconfig.eslint.json b/packages/scratch-gui/tsconfig.eslint.json new file mode 100644 index 00000000000..02d3fa9e9de --- /dev/null +++ b/packages/scratch-gui/tsconfig.eslint.json @@ -0,0 +1,7 @@ +{ + "include": ["src"], + "extends": "./tsconfig.json", + "compilerOptions": { + "allowJs": true, + } +} diff --git a/packages/scratch-gui/tsconfig.test.json b/packages/scratch-gui/tsconfig.test.json index fb68dfd4d55..70f4ee0d812 100644 --- a/packages/scratch-gui/tsconfig.test.json +++ b/packages/scratch-gui/tsconfig.test.json @@ -3,6 +3,7 @@ "extends": "./tsconfig.json", "compilerOptions": { /* Visit https://aka.ms/tsconfig to read more about this file */ + "allowJs": true, /* Modules */ "types": ["jest", "./src/types.d.ts"], From 2c9512c3d1c23bd5892db674313d57de32c025a5 Mon Sep 17 00:00:00 2001 From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com> Date: Fri, 7 Nov 2025 07:05:55 -0800 Subject: [PATCH 103/521] feat: add sensing_online --- packages/scratch-gui/src/lib/make-toolbox-xml.js | 5 +++-- packages/scratch-gui/src/lib/opcode-labels.js | 7 +++++++ packages/scratch-vm/src/blocks/scratch3_sensing.js | 14 ++++++++++++++ 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/packages/scratch-gui/src/lib/make-toolbox-xml.js b/packages/scratch-gui/src/lib/make-toolbox-xml.js index 90346b8b034..ed86d2cc6ee 100644 --- a/packages/scratch-gui/src/lib/make-toolbox-xml.js +++ b/packages/scratch-gui/src/lib/make-toolbox-xml.js @@ -5,7 +5,7 @@ const categorySeparator = ''; const blockSeparator = ''; // At default scale, about 28px - + const motion = function (isInitialSetup, isStage, targetId, colors) { const stageSelected = ScratchBlocks.ScratchMsgs.translate( 'MOTION_STAGE_SELECTED', @@ -513,6 +513,7 @@ const sensing = function (isInitialSetup, isStage, targetId, colors) { ${blockSeparator} + ${categorySeparator} @@ -736,7 +737,7 @@ const myBlocks = function (isInitialSetup, isStage, targetId, colors) { `; }; - + const xmlOpen = ''; const xmlClose = ''; diff --git a/packages/scratch-gui/src/lib/opcode-labels.js b/packages/scratch-gui/src/lib/opcode-labels.js index 22bff608afe..9fd9f2240f6 100644 --- a/packages/scratch-gui/src/lib/opcode-labels.js +++ b/packages/scratch-gui/src/lib/opcode-labels.js @@ -68,6 +68,11 @@ const messages = defineMessages({ description: 'Label for the loudness monitor when shown on the stage', id: 'gui.opcodeLabels.loudness' }, + sensing_online: { + defaultMessage: 'online', + description: 'Label for the online status monitor when shown on the stage', + id: 'gui.opcodeLabels.online' + }, sensing_username: { defaultMessage: 'username', description: 'Label for the username monitor when shown on the stage', @@ -152,6 +157,7 @@ class OpcodeLabels { // Sensing sensing_answer: {category: 'sensing'}, sensing_loudness: {category: 'sensing'}, + sensing_online: {category: 'sensing'}, sensing_username: {category: 'sensing'}, sensing_current: {category: 'sensing'}, sensing_timer: {category: 'sensing'} @@ -208,6 +214,7 @@ class OpcodeLabels { // Sensing this._opcodeMap.sensing_answer.labelFn = () => this._translator(messages.sensing_answer); this._opcodeMap.sensing_loudness.labelFn = () => this._translator(messages.sensing_loudness); + this._opcodeMap.sensing_online.labelFn = () => this._translator(messages.sensing_online); this._opcodeMap.sensing_username.labelFn = () => this._translator(messages.sensing_username); this._opcodeMap.sensing_current.labelFn = params => { switch (params.CURRENTMENU.toLowerCase()) { diff --git a/packages/scratch-vm/src/blocks/scratch3_sensing.js b/packages/scratch-vm/src/blocks/scratch3_sensing.js index 3d1ddbf4dd6..cddf3ce4f5b 100644 --- a/packages/scratch-vm/src/blocks/scratch3_sensing.js +++ b/packages/scratch-vm/src/blocks/scratch3_sensing.js @@ -71,6 +71,7 @@ class Scratch3SensingBlocks { sensing_loud: this.isLoud, sensing_askandwait: this.askAndWait, sensing_answer: this.getAnswer, + sensing_online: this.getOnline, sensing_username: this.getUsername, sensing_userid: () => {} // legacy no-op block }; @@ -84,6 +85,9 @@ class Scratch3SensingBlocks { sensing_loudness: { getId: () => 'loudness' }, + sensing_online: { + getId: () => 'online' + }, sensing_timer: { getId: () => 'timer' }, @@ -328,6 +332,16 @@ class Scratch3SensingBlocks { return 0; } + getOnline (args, util) { + const status = window.navigator.onLine; + if (typeof status === 'boolean') { + return status; + } + // an empty string will evaluate as false in a Boolean context, + // but it allows distinguishing between "false" and "unknown" if needed + return ''; + } + getUsername (args, util) { return util.ioQuery('userData', 'getUsername'); } From c69bbc74c90f2806ad3bf0560510f3eb5d2fdd34 Mon Sep 17 00:00:00 2001 From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com> Date: Thu, 4 Dec 2025 14:44:32 -0800 Subject: [PATCH 104/521] chore(deps): update deps for spork test --- package-lock.json | 3 +++ package.json | 3 +++ 2 files changed, 6 insertions(+) diff --git a/package-lock.json b/package-lock.json index e60d4c88431..f607b557c47 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,6 +15,9 @@ "packages/scratch-vm", "packages/scratch-gui" ], + "dependencies": { + "scratch-blocks": "2.0.0-spork.5" + }, "devDependencies": { "@commitlint/cli": "17.8.1", "@commitlint/config-conventional": "17.8.1", diff --git a/package.json b/package.json index 6351352e334..728cce52587 100644 --- a/package.json +++ b/package.json @@ -40,5 +40,8 @@ "husky": "8.0.3", "npm": "10.9.4", "ts-node": "10.9.2" + }, + "dependencies": { + "scratch-blocks": "2.0.0-spork.5" } } From 0487565792690c35dd0aa209de06d118a191eaf6 Mon Sep 17 00:00:00 2001 From: Aaron Dodson Date: Thu, 14 Nov 2024 11:05:45 -0800 Subject: [PATCH 105/521] fix: Fix test failures. (#10) From 0df2bd9f38ad9144ed12c8eea4fbaedd1626efba Mon Sep 17 00:00:00 2001 From: Kaloyan Manolov Date: Tue, 16 Dec 2025 12:13:31 +0200 Subject: [PATCH 106/521] fix: blocks key update --- packages/scratch-gui/src/components/gui/gui.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/scratch-gui/src/components/gui/gui.jsx b/packages/scratch-gui/src/components/gui/gui.jsx index d16ad02e570..9b5455f9c92 100644 --- a/packages/scratch-gui/src/components/gui/gui.jsx +++ b/packages/scratch-gui/src/components/gui/gui.jsx @@ -399,7 +399,7 @@ const GUIComponent = props => { aria-label="Code Editor Panel" > Date: Tue, 16 Dec 2025 14:38:47 +0200 Subject: [PATCH 107/521] fix: make the avatar wrapper a flexbox --- packages/scratch-gui/src/components/menu-bar/user-avatar.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/scratch-gui/src/components/menu-bar/user-avatar.css b/packages/scratch-gui/src/components/menu-bar/user-avatar.css index 7caef71fae3..bddbf59c01d 100644 --- a/packages/scratch-gui/src/components/menu-bar/user-avatar.css +++ b/packages/scratch-gui/src/components/menu-bar/user-avatar.css @@ -17,10 +17,10 @@ } .avatar-badge-wrapper { - display: inline-block; + display: inline-flex; background: url('./cat-ears.svg') no-repeat top ; background-size: contain; - align-content: end; + align-items: flex-end; width: $menu-bar-button-size; height: calc($menu-bar-button-size * 1.28); From 674d0326147256c8df9aea3af97d1c4aee468482 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 16 Dec 2025 12:48:33 +0000 Subject: [PATCH 108/521] fix(deps): update dependency scratch-paint to v4.1.35 --- package-lock.json | 8 ++++---- packages/scratch-gui/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3a849fb79af..dfc254ff6df 100644 --- a/package-lock.json +++ b/package-lock.json @@ -34632,9 +34632,9 @@ } }, "node_modules/scratch-paint": { - "version": "4.1.34", - "resolved": "https://registry.npmjs.org/scratch-paint/-/scratch-paint-4.1.34.tgz", - "integrity": "sha512-TxIHFB0XAn+QEiRMZ7hxid/a2zzeuMny6AnQ935ms+tf02HpDDiHMsDajox3FOwPsRAJcZDTt+2wsmA/lLgtXw==", + "version": "4.1.35", + "resolved": "https://registry.npmjs.org/scratch-paint/-/scratch-paint-4.1.35.tgz", + "integrity": "sha512-y0GZUlxQVPJMish0rnvr2W1J1FMv0CUxzhnW8fCPg6yNNlayDv3k4WJ2pjMLbAvqdE8y7bWA5KJ3WGHhAKlUIQ==", "license": "AGPL-3.0-only", "dependencies": { "@scratch/paper": "^0.11.20221201200345", @@ -41685,7 +41685,7 @@ "scratch-audio": "2.0.268", "scratch-blocks": "1.3.0", "scratch-l10n": "6.1.42", - "scratch-paint": "4.1.34", + "scratch-paint": "4.1.35", "scratch-render-fonts": "1.0.252", "scratch-storage": "5.0.10", "startaudiocontext": "1.2.1", diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index 66bfa79910b..cc37f70a32b 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -119,7 +119,7 @@ "scratch-audio": "2.0.268", "scratch-blocks": "1.3.0", "scratch-l10n": "6.1.42", - "scratch-paint": "4.1.34", + "scratch-paint": "4.1.35", "scratch-render-fonts": "1.0.252", "scratch-storage": "5.0.10", "startaudiocontext": "1.2.1", From 1b674941dffc5475bd3f4f9b4900d79f7270aec2 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 17 Dec 2025 06:14:12 +0000 Subject: [PATCH 109/521] fix(deps): update dependency scratch-l10n to v6.1.43 --- package-lock.json | 10 +++++----- packages/scratch-gui/package.json | 2 +- packages/scratch-vm/package.json | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index dfc254ff6df..fcb4ce58695 100644 --- a/package-lock.json +++ b/package-lock.json @@ -34591,9 +34591,9 @@ } }, "node_modules/scratch-l10n": { - "version": "6.1.42", - "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-6.1.42.tgz", - "integrity": "sha512-x5FisZYMKFj4v++p3Fx8pTnNOx3pFFwYeafK0iEXYUANzS7gqG/GIIKMRQ208bTw6WpdIxaQoFLaTJ3yB7+/BQ==", + "version": "6.1.43", + "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-6.1.43.tgz", + "integrity": "sha512-Phom1BWv4a+cEZ7I3d5USyt8Wxw7qObY3gCHzC/fgOtel1VMcpM+T/eVriw91VSgd6Biw89CJhBaCfNEhCNDxA==", "license": "AGPL-3.0-only", "dependencies": { "@transifex/api": "7.1.5", @@ -41684,7 +41684,7 @@ "redux-throttle": "0.1.1", "scratch-audio": "2.0.268", "scratch-blocks": "1.3.0", - "scratch-l10n": "6.1.42", + "scratch-l10n": "6.1.43", "scratch-paint": "4.1.35", "scratch-render-fonts": "1.0.252", "scratch-storage": "5.0.10", @@ -42072,7 +42072,7 @@ "jsdoc": "3.6.11", "pngjs": "3.4.0", "scratch-blocks": "1.3.0", - "scratch-l10n": "6.1.42", + "scratch-l10n": "6.1.43", "scratch-render-fonts": "1.0.252", "scratch-semantic-release-config": "4.0.0", "scratch-webpack-configuration": "3.1.0", diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index cc37f70a32b..c5ab73dabf3 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -118,7 +118,7 @@ "redux-throttle": "0.1.1", "scratch-audio": "2.0.268", "scratch-blocks": "1.3.0", - "scratch-l10n": "6.1.42", + "scratch-l10n": "6.1.43", "scratch-paint": "4.1.35", "scratch-render-fonts": "1.0.252", "scratch-storage": "5.0.10", diff --git a/packages/scratch-vm/package.json b/packages/scratch-vm/package.json index 88ee6a64bcb..31f9c714ebb 100644 --- a/packages/scratch-vm/package.json +++ b/packages/scratch-vm/package.json @@ -94,7 +94,7 @@ "jsdoc": "3.6.11", "pngjs": "3.4.0", "scratch-blocks": "1.3.0", - "scratch-l10n": "6.1.42", + "scratch-l10n": "6.1.43", "scratch-render-fonts": "1.0.252", "scratch-semantic-release-config": "4.0.0", "scratch-webpack-configuration": "3.1.0", From 010685efd8fccd91681e00a0e4579f7f627905d1 Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Wed, 17 Dec 2025 13:51:52 +0000 Subject: [PATCH 110/521] chore(release): 12.3.0 [skip ci] --- package-lock.json | 57 ++++++---------------- package.json | 2 +- packages/scratch-gui/package.json | 8 +-- packages/scratch-render/package.json | 6 +-- packages/scratch-svg-renderer/package.json | 2 +- packages/scratch-vm/package.json | 6 +-- packages/task-herder/package.json | 2 +- 7 files changed, 27 insertions(+), 56 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5ebfb9a45e1..88573b46e88 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "scratch-editor", - "version": "12.2.2", + "version": "12.3.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "scratch-editor", - "version": "12.2.2", + "version": "12.3.0", "license": "AGPL-3.0-only", "workspaces": [ "packages/task-herder", @@ -41504,15 +41504,15 @@ }, "packages/scratch-gui": { "name": "@scratch/scratch-gui", - "version": "12.2.2", + "version": "12.3.0", "license": "AGPL-3.0-only", "dependencies": { "@mediapipe/face_detection": "0.4.1646425229", "@microbit/microbit-universal-hex": "0.2.2", "@radix-ui/react-context-menu": "2.2.16", - "@scratch/scratch-render": "12.2.2", - "@scratch/scratch-svg-renderer": "12.2.2", - "@scratch/scratch-vm": "12.2.2", + "@scratch/scratch-render": "12.3.0", + "@scratch/scratch-svg-renderer": "12.3.0", + "@scratch/scratch-vm": "12.3.0", "@tensorflow-models/face-detection": "1.0.3", "@tensorflow/tfjs": "4.22.0", "@testing-library/user-event": "14.6.1", @@ -41636,41 +41636,12 @@ "integrity": "sha512-sf7oGoLuaYAScB4VGr0tzetsYlS8EJH6qnTCfQ/WVEa89hALQ4RQfCKt5xCyPQKPDUbVUAIP1QsxAwfAjlDp7Q==", "extraneous": true }, - "packages/scratch-gui/node_modules/@scratch/scratch-vm/node_modules/scratch-audio": { - "version": "2.0.215", - "resolved": "https://registry.npmjs.org/scratch-audio/-/scratch-audio-2.0.215.tgz", - "integrity": "sha512-1V8Nn+FRlj1+cMrDXC5kz0z0CApTFl/IEPxaLHY8zqctu0n8iK1ZCOZMrTKJA9SCJiEE3D9eExhfIQlBSpRqww==", - "extraneous": true, - "license": "AGPL-3.0-only", - "dependencies": { - "audio-context": "^1.0.1", - "minilog": "^3.0.1", - "startaudiocontext": "^1.2.1" - } - }, - "packages/scratch-gui/node_modules/@scratch/scratch-vm/node_modules/scratch-storage": { - "version": "4.0.214", - "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-4.0.214.tgz", - "integrity": "sha512-ybAfeJ8v4JyTUYR7ui5vxVdSJJWzrte6WuoWA2VWTp2BXWICr+bYRDvDNV/IKVasIKQ4cDDD5ZYKSkKKwiPC/Q==", - "extraneous": true, - "license": "AGPL-3.0-only", - "dependencies": { - "@babel/runtime": "^7.21.0", - "arraybuffer-loader": "^1.0.3", - "base64-js": "^1.3.0", - "buffer": "6.0.3", - "cross-fetch": "^4.1.0", - "fastestsmallesttextencoderdecoder": "^1.0.7", - "js-md5": "^0.7.3", - "minilog": "^3.1.0" - } - }, "packages/scratch-render": { "name": "@scratch/scratch-render", - "version": "12.2.2", + "version": "12.3.0", "license": "AGPL-3.0-only", "dependencies": { - "@scratch/scratch-svg-renderer": "12.2.2", + "@scratch/scratch-svg-renderer": "12.3.0", "grapheme-breaker": "0.3.2", "hull.js": "0.2.10", "ify-loader": "1.1.0", @@ -41683,7 +41654,7 @@ "@babel/core": "7.28.5", "@babel/polyfill": "7.12.1", "@babel/preset-env": "7.28.5", - "@scratch/scratch-vm": "12.2.2", + "@scratch/scratch-vm": "12.3.0", "babel-loader": "9.2.1", "copy-webpack-plugin": "6.4.1", "docdash": "0.4.0", @@ -41838,7 +41809,7 @@ }, "packages/scratch-svg-renderer": { "name": "@scratch/scratch-svg-renderer", - "version": "12.2.2", + "version": "12.3.0", "license": "AGPL-3.0-only", "dependencies": { "base64-js": "1.5.1", @@ -41909,11 +41880,11 @@ }, "packages/scratch-vm": { "name": "@scratch/scratch-vm", - "version": "12.2.2", + "version": "12.3.0", "license": "AGPL-3.0-only", "dependencies": { - "@scratch/scratch-render": "12.2.2", - "@scratch/scratch-svg-renderer": "12.2.2", + "@scratch/scratch-render": "12.3.0", + "@scratch/scratch-svg-renderer": "12.3.0", "@vernier/godirect": "1.8.3", "arraybuffer-loader": "1.0.8", "atob": "2.1.2", @@ -42096,7 +42067,7 @@ }, "packages/task-herder": { "name": "@scratch/task-herder", - "version": "12.2.2", + "version": "12.3.0", "license": "AGPL-3.0-only", "devDependencies": { "@vitest/coverage-v8": "4.0.15", diff --git a/package.json b/package.json index e181be852f2..552c7566a1f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "scratch-editor", - "version": "12.2.2", + "version": "12.3.0", "private": "true", "description": "Scratch editor mono-repository", "author": "Scratch Foundation", diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index 17887190f00..dfd1cbd2997 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -1,6 +1,6 @@ { "name": "@scratch/scratch-gui", - "version": "12.2.2", + "version": "12.3.0", "description": "Graphical User Interface for creating and running Scratch 3.0 projects", "author": "Massachusetts Institute of Technology", "license": "AGPL-3.0-only", @@ -62,9 +62,9 @@ "@mediapipe/face_detection": "0.4.1646425229", "@microbit/microbit-universal-hex": "0.2.2", "@radix-ui/react-context-menu": "2.2.16", - "@scratch/scratch-render": "12.2.2", - "@scratch/scratch-svg-renderer": "12.2.2", - "@scratch/scratch-vm": "12.2.2", + "@scratch/scratch-render": "12.3.0", + "@scratch/scratch-svg-renderer": "12.3.0", + "@scratch/scratch-vm": "12.3.0", "@tensorflow-models/face-detection": "1.0.3", "@tensorflow/tfjs": "4.22.0", "@testing-library/user-event": "14.6.1", diff --git a/packages/scratch-render/package.json b/packages/scratch-render/package.json index eda6011b71d..58fd4fd901c 100644 --- a/packages/scratch-render/package.json +++ b/packages/scratch-render/package.json @@ -1,6 +1,6 @@ { "name": "@scratch/scratch-render", - "version": "12.2.2", + "version": "12.3.0", "description": "WebGL Renderer for Scratch 3.0", "author": "Massachusetts Institute of Technology", "license": "AGPL-3.0-only", @@ -46,7 +46,7 @@ "iOS >= 8" ], "dependencies": { - "@scratch/scratch-svg-renderer": "12.2.2", + "@scratch/scratch-svg-renderer": "12.3.0", "grapheme-breaker": "0.3.2", "hull.js": "0.2.10", "ify-loader": "1.1.0", @@ -62,7 +62,7 @@ "@babel/core": "7.28.5", "@babel/polyfill": "7.12.1", "@babel/preset-env": "7.28.5", - "@scratch/scratch-vm": "12.2.2", + "@scratch/scratch-vm": "12.3.0", "babel-loader": "9.2.1", "copy-webpack-plugin": "6.4.1", "docdash": "0.4.0", diff --git a/packages/scratch-svg-renderer/package.json b/packages/scratch-svg-renderer/package.json index 157b4b0097e..7a8ea8c3567 100644 --- a/packages/scratch-svg-renderer/package.json +++ b/packages/scratch-svg-renderer/package.json @@ -1,6 +1,6 @@ { "name": "@scratch/scratch-svg-renderer", - "version": "12.2.2", + "version": "12.3.0", "description": "SVG renderer for Scratch", "main": "./dist/node/scratch-svg-renderer.js", "browser": "./dist/web/scratch-svg-renderer.js", diff --git a/packages/scratch-vm/package.json b/packages/scratch-vm/package.json index 31f9c714ebb..88ab685f650 100644 --- a/packages/scratch-vm/package.json +++ b/packages/scratch-vm/package.json @@ -1,6 +1,6 @@ { "name": "@scratch/scratch-vm", - "version": "12.2.2", + "version": "12.3.0", "description": "Virtual Machine for Scratch 3.0", "author": "Massachusetts Institute of Technology", "license": "AGPL-3.0-only", @@ -52,8 +52,8 @@ "allow-incomplete-coverage": true }, "dependencies": { - "@scratch/scratch-render": "12.2.2", - "@scratch/scratch-svg-renderer": "12.2.2", + "@scratch/scratch-render": "12.3.0", + "@scratch/scratch-svg-renderer": "12.3.0", "@vernier/godirect": "1.8.3", "arraybuffer-loader": "1.0.8", "atob": "2.1.2", diff --git a/packages/task-herder/package.json b/packages/task-herder/package.json index 320b51fa451..914d93b3c06 100644 --- a/packages/task-herder/package.json +++ b/packages/task-herder/package.json @@ -1,6 +1,6 @@ { "name": "@scratch/task-herder", - "version": "12.2.2", + "version": "12.3.0", "description": "An asynchronous task runner with configurable rate limiting / throttling and concurrency control.", "keywords": [ "rate limit", From 0454f8eaa47435c3fd2d906d3bbc8d8c6c764523 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 17 Dec 2025 13:57:18 +0000 Subject: [PATCH 111/521] fix(deps): update dependency scratch-paint to v4.1.36 --- package-lock.json | 8 ++++---- packages/scratch-gui/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 88573b46e88..6a6c820846b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -34513,9 +34513,9 @@ } }, "node_modules/scratch-paint": { - "version": "4.1.35", - "resolved": "https://registry.npmjs.org/scratch-paint/-/scratch-paint-4.1.35.tgz", - "integrity": "sha512-y0GZUlxQVPJMish0rnvr2W1J1FMv0CUxzhnW8fCPg6yNNlayDv3k4WJ2pjMLbAvqdE8y7bWA5KJ3WGHhAKlUIQ==", + "version": "4.1.36", + "resolved": "https://registry.npmjs.org/scratch-paint/-/scratch-paint-4.1.36.tgz", + "integrity": "sha512-PcW8fJMnmGQeZhJFWXLKTOjqXDKd60HOiGgPM8C2/uZbmYz4xkg2GztWbmIQdhfRpS9avXZbTV1mQaMbhiG19Q==", "license": "AGPL-3.0-only", "dependencies": { "@scratch/paper": "^0.11.20221201200345", @@ -41566,7 +41566,7 @@ "scratch-audio": "2.0.268", "scratch-blocks": "1.3.0", "scratch-l10n": "6.1.43", - "scratch-paint": "4.1.35", + "scratch-paint": "4.1.36", "scratch-render-fonts": "1.0.252", "scratch-storage": "5.0.10", "startaudiocontext": "1.2.1", diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index dfd1cbd2997..79316e1834b 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -118,7 +118,7 @@ "scratch-audio": "2.0.268", "scratch-blocks": "1.3.0", "scratch-l10n": "6.1.43", - "scratch-paint": "4.1.35", + "scratch-paint": "4.1.36", "scratch-render-fonts": "1.0.252", "scratch-storage": "5.0.10", "startaudiocontext": "1.2.1", From fe049087d9f92c8436c6dfec226891833d04a20a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 18 Dec 2025 04:29:54 +0000 Subject: [PATCH 112/521] fix(deps): update dependency scratch-l10n to v6.1.44 --- package-lock.json | 10 +++++----- packages/scratch-gui/package.json | 2 +- packages/scratch-vm/package.json | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6a6c820846b..a094a678e14 100644 --- a/package-lock.json +++ b/package-lock.json @@ -34472,9 +34472,9 @@ } }, "node_modules/scratch-l10n": { - "version": "6.1.43", - "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-6.1.43.tgz", - "integrity": "sha512-Phom1BWv4a+cEZ7I3d5USyt8Wxw7qObY3gCHzC/fgOtel1VMcpM+T/eVriw91VSgd6Biw89CJhBaCfNEhCNDxA==", + "version": "6.1.44", + "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-6.1.44.tgz", + "integrity": "sha512-PFDoh2Y7Sm18tINl8TDJ6/7l/gbcsIyX2sODjsoa76uwKjWB0+6JpZBxUTH1tpcS6um9av6+717nw9vUsR55JQ==", "license": "AGPL-3.0-only", "dependencies": { "@transifex/api": "7.1.5", @@ -41565,7 +41565,7 @@ "redux-throttle": "0.1.1", "scratch-audio": "2.0.268", "scratch-blocks": "1.3.0", - "scratch-l10n": "6.1.43", + "scratch-l10n": "6.1.44", "scratch-paint": "4.1.36", "scratch-render-fonts": "1.0.252", "scratch-storage": "5.0.10", @@ -41925,7 +41925,7 @@ "jsdoc": "3.6.11", "pngjs": "3.4.0", "scratch-blocks": "1.3.0", - "scratch-l10n": "6.1.43", + "scratch-l10n": "6.1.44", "scratch-render-fonts": "1.0.252", "scratch-semantic-release-config": "4.0.0", "scratch-webpack-configuration": "3.1.0", diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index 79316e1834b..94f9ac9be6a 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -117,7 +117,7 @@ "redux-throttle": "0.1.1", "scratch-audio": "2.0.268", "scratch-blocks": "1.3.0", - "scratch-l10n": "6.1.43", + "scratch-l10n": "6.1.44", "scratch-paint": "4.1.36", "scratch-render-fonts": "1.0.252", "scratch-storage": "5.0.10", diff --git a/packages/scratch-vm/package.json b/packages/scratch-vm/package.json index 88ab685f650..d2200a898a0 100644 --- a/packages/scratch-vm/package.json +++ b/packages/scratch-vm/package.json @@ -94,7 +94,7 @@ "jsdoc": "3.6.11", "pngjs": "3.4.0", "scratch-blocks": "1.3.0", - "scratch-l10n": "6.1.43", + "scratch-l10n": "6.1.44", "scratch-render-fonts": "1.0.252", "scratch-semantic-release-config": "4.0.0", "scratch-webpack-configuration": "3.1.0", From 3c982e55fa06dea05d685f1f0d495faf1e418fd1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 18 Dec 2025 13:46:48 +0000 Subject: [PATCH 113/521] fix(deps): update dependency scratch-paint to v4.1.37 --- package-lock.json | 8 ++++---- packages/scratch-gui/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index a094a678e14..c8b8dd91995 100644 --- a/package-lock.json +++ b/package-lock.json @@ -34513,9 +34513,9 @@ } }, "node_modules/scratch-paint": { - "version": "4.1.36", - "resolved": "https://registry.npmjs.org/scratch-paint/-/scratch-paint-4.1.36.tgz", - "integrity": "sha512-PcW8fJMnmGQeZhJFWXLKTOjqXDKd60HOiGgPM8C2/uZbmYz4xkg2GztWbmIQdhfRpS9avXZbTV1mQaMbhiG19Q==", + "version": "4.1.37", + "resolved": "https://registry.npmjs.org/scratch-paint/-/scratch-paint-4.1.37.tgz", + "integrity": "sha512-Pw+boCZqLFts9JnZwq/xa3xVI9l+UvIVwRVAKg+4flEu6WofbQpyRQklvZaC5u5Yhnkz5rQ3lhwr2HT1kZrhNw==", "license": "AGPL-3.0-only", "dependencies": { "@scratch/paper": "^0.11.20221201200345", @@ -41566,7 +41566,7 @@ "scratch-audio": "2.0.268", "scratch-blocks": "1.3.0", "scratch-l10n": "6.1.44", - "scratch-paint": "4.1.36", + "scratch-paint": "4.1.37", "scratch-render-fonts": "1.0.252", "scratch-storage": "5.0.10", "startaudiocontext": "1.2.1", diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index 94f9ac9be6a..3ac22d2faca 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -118,7 +118,7 @@ "scratch-audio": "2.0.268", "scratch-blocks": "1.3.0", "scratch-l10n": "6.1.44", - "scratch-paint": "4.1.36", + "scratch-paint": "4.1.37", "scratch-render-fonts": "1.0.252", "scratch-storage": "5.0.10", "startaudiocontext": "1.2.1", From 0eaa290d33b2a7942e452c6887f52ec8ed34cff4 Mon Sep 17 00:00:00 2001 From: Kaloyan Manolov Date: Thu, 18 Dec 2025 17:27:44 +0200 Subject: [PATCH 114/521] fix: look for block media assets in colorModeMap instead of themeMap --- packages/scratch-gui/src/components/gui/gui.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/scratch-gui/src/components/gui/gui.jsx b/packages/scratch-gui/src/components/gui/gui.jsx index 9b5455f9c92..fadab2bf949 100644 --- a/packages/scratch-gui/src/components/gui/gui.jsx +++ b/packages/scratch-gui/src/components/gui/gui.jsx @@ -404,7 +404,7 @@ const GUIComponent = props => { grow={1} isVisible={blocksTabVisible} options={{ - media: `${basePath}static/${themeMap[theme].blocksMediaFolder}/` + media: `${basePath}static/${colorModeMap[colorMode].blocksMediaFolder}/` }} stageSize={stageSize} theme={theme} From e7565a720ecf766fad3662768387eff3a4be2a66 Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Thu, 18 Dec 2025 15:43:25 +0000 Subject: [PATCH 115/521] chore(release): 12.3.1 [skip ci] --- package-lock.json | 28 +++++++++++----------- package.json | 2 +- packages/scratch-gui/package.json | 8 +++---- packages/scratch-render/package.json | 6 ++--- packages/scratch-svg-renderer/package.json | 2 +- packages/scratch-vm/package.json | 6 ++--- packages/task-herder/package.json | 2 +- 7 files changed, 27 insertions(+), 27 deletions(-) diff --git a/package-lock.json b/package-lock.json index c8b8dd91995..27bcb520630 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "scratch-editor", - "version": "12.3.0", + "version": "12.3.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "scratch-editor", - "version": "12.3.0", + "version": "12.3.1", "license": "AGPL-3.0-only", "workspaces": [ "packages/task-herder", @@ -41504,15 +41504,15 @@ }, "packages/scratch-gui": { "name": "@scratch/scratch-gui", - "version": "12.3.0", + "version": "12.3.1", "license": "AGPL-3.0-only", "dependencies": { "@mediapipe/face_detection": "0.4.1646425229", "@microbit/microbit-universal-hex": "0.2.2", "@radix-ui/react-context-menu": "2.2.16", - "@scratch/scratch-render": "12.3.0", - "@scratch/scratch-svg-renderer": "12.3.0", - "@scratch/scratch-vm": "12.3.0", + "@scratch/scratch-render": "12.3.1", + "@scratch/scratch-svg-renderer": "12.3.1", + "@scratch/scratch-vm": "12.3.1", "@tensorflow-models/face-detection": "1.0.3", "@tensorflow/tfjs": "4.22.0", "@testing-library/user-event": "14.6.1", @@ -41638,10 +41638,10 @@ }, "packages/scratch-render": { "name": "@scratch/scratch-render", - "version": "12.3.0", + "version": "12.3.1", "license": "AGPL-3.0-only", "dependencies": { - "@scratch/scratch-svg-renderer": "12.3.0", + "@scratch/scratch-svg-renderer": "12.3.1", "grapheme-breaker": "0.3.2", "hull.js": "0.2.10", "ify-loader": "1.1.0", @@ -41654,7 +41654,7 @@ "@babel/core": "7.28.5", "@babel/polyfill": "7.12.1", "@babel/preset-env": "7.28.5", - "@scratch/scratch-vm": "12.3.0", + "@scratch/scratch-vm": "12.3.1", "babel-loader": "9.2.1", "copy-webpack-plugin": "6.4.1", "docdash": "0.4.0", @@ -41809,7 +41809,7 @@ }, "packages/scratch-svg-renderer": { "name": "@scratch/scratch-svg-renderer", - "version": "12.3.0", + "version": "12.3.1", "license": "AGPL-3.0-only", "dependencies": { "base64-js": "1.5.1", @@ -41880,11 +41880,11 @@ }, "packages/scratch-vm": { "name": "@scratch/scratch-vm", - "version": "12.3.0", + "version": "12.3.1", "license": "AGPL-3.0-only", "dependencies": { - "@scratch/scratch-render": "12.3.0", - "@scratch/scratch-svg-renderer": "12.3.0", + "@scratch/scratch-render": "12.3.1", + "@scratch/scratch-svg-renderer": "12.3.1", "@vernier/godirect": "1.8.3", "arraybuffer-loader": "1.0.8", "atob": "2.1.2", @@ -42067,7 +42067,7 @@ }, "packages/task-herder": { "name": "@scratch/task-herder", - "version": "12.3.0", + "version": "12.3.1", "license": "AGPL-3.0-only", "devDependencies": { "@vitest/coverage-v8": "4.0.15", diff --git a/package.json b/package.json index 552c7566a1f..36e05199d5a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "scratch-editor", - "version": "12.3.0", + "version": "12.3.1", "private": "true", "description": "Scratch editor mono-repository", "author": "Scratch Foundation", diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index 3ac22d2faca..3259684bf0b 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -1,6 +1,6 @@ { "name": "@scratch/scratch-gui", - "version": "12.3.0", + "version": "12.3.1", "description": "Graphical User Interface for creating and running Scratch 3.0 projects", "author": "Massachusetts Institute of Technology", "license": "AGPL-3.0-only", @@ -62,9 +62,9 @@ "@mediapipe/face_detection": "0.4.1646425229", "@microbit/microbit-universal-hex": "0.2.2", "@radix-ui/react-context-menu": "2.2.16", - "@scratch/scratch-render": "12.3.0", - "@scratch/scratch-svg-renderer": "12.3.0", - "@scratch/scratch-vm": "12.3.0", + "@scratch/scratch-render": "12.3.1", + "@scratch/scratch-svg-renderer": "12.3.1", + "@scratch/scratch-vm": "12.3.1", "@tensorflow-models/face-detection": "1.0.3", "@tensorflow/tfjs": "4.22.0", "@testing-library/user-event": "14.6.1", diff --git a/packages/scratch-render/package.json b/packages/scratch-render/package.json index 58fd4fd901c..9fe2a08a7d5 100644 --- a/packages/scratch-render/package.json +++ b/packages/scratch-render/package.json @@ -1,6 +1,6 @@ { "name": "@scratch/scratch-render", - "version": "12.3.0", + "version": "12.3.1", "description": "WebGL Renderer for Scratch 3.0", "author": "Massachusetts Institute of Technology", "license": "AGPL-3.0-only", @@ -46,7 +46,7 @@ "iOS >= 8" ], "dependencies": { - "@scratch/scratch-svg-renderer": "12.3.0", + "@scratch/scratch-svg-renderer": "12.3.1", "grapheme-breaker": "0.3.2", "hull.js": "0.2.10", "ify-loader": "1.1.0", @@ -62,7 +62,7 @@ "@babel/core": "7.28.5", "@babel/polyfill": "7.12.1", "@babel/preset-env": "7.28.5", - "@scratch/scratch-vm": "12.3.0", + "@scratch/scratch-vm": "12.3.1", "babel-loader": "9.2.1", "copy-webpack-plugin": "6.4.1", "docdash": "0.4.0", diff --git a/packages/scratch-svg-renderer/package.json b/packages/scratch-svg-renderer/package.json index 7a8ea8c3567..f61e8e6e4af 100644 --- a/packages/scratch-svg-renderer/package.json +++ b/packages/scratch-svg-renderer/package.json @@ -1,6 +1,6 @@ { "name": "@scratch/scratch-svg-renderer", - "version": "12.3.0", + "version": "12.3.1", "description": "SVG renderer for Scratch", "main": "./dist/node/scratch-svg-renderer.js", "browser": "./dist/web/scratch-svg-renderer.js", diff --git a/packages/scratch-vm/package.json b/packages/scratch-vm/package.json index d2200a898a0..da914185fef 100644 --- a/packages/scratch-vm/package.json +++ b/packages/scratch-vm/package.json @@ -1,6 +1,6 @@ { "name": "@scratch/scratch-vm", - "version": "12.3.0", + "version": "12.3.1", "description": "Virtual Machine for Scratch 3.0", "author": "Massachusetts Institute of Technology", "license": "AGPL-3.0-only", @@ -52,8 +52,8 @@ "allow-incomplete-coverage": true }, "dependencies": { - "@scratch/scratch-render": "12.3.0", - "@scratch/scratch-svg-renderer": "12.3.0", + "@scratch/scratch-render": "12.3.1", + "@scratch/scratch-svg-renderer": "12.3.1", "@vernier/godirect": "1.8.3", "arraybuffer-loader": "1.0.8", "atob": "2.1.2", diff --git a/packages/task-herder/package.json b/packages/task-herder/package.json index 914d93b3c06..42b705aa243 100644 --- a/packages/task-herder/package.json +++ b/packages/task-herder/package.json @@ -1,6 +1,6 @@ { "name": "@scratch/task-herder", - "version": "12.3.0", + "version": "12.3.1", "description": "An asynchronous task runner with configurable rate limiting / throttling and concurrency control.", "keywords": [ "rate limit", From e0e5e8cd18ee2369f1838090ec921c5c38e8602a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 19 Dec 2025 04:25:38 +0000 Subject: [PATCH 116/521] fix(deps): update dependency scratch-l10n to v6.1.45 --- package-lock.json | 10 +++++----- packages/scratch-gui/package.json | 2 +- packages/scratch-vm/package.json | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 27bcb520630..14633bd11fb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -34472,9 +34472,9 @@ } }, "node_modules/scratch-l10n": { - "version": "6.1.44", - "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-6.1.44.tgz", - "integrity": "sha512-PFDoh2Y7Sm18tINl8TDJ6/7l/gbcsIyX2sODjsoa76uwKjWB0+6JpZBxUTH1tpcS6um9av6+717nw9vUsR55JQ==", + "version": "6.1.45", + "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-6.1.45.tgz", + "integrity": "sha512-cqjD8Im/FBYjE8BxCc7jdQHk5OvpnE9vR6DcDWqu6lYLOeuelGtpMLUzu6TKI38981F8c6RFqX62yCB4gErzlA==", "license": "AGPL-3.0-only", "dependencies": { "@transifex/api": "7.1.5", @@ -41565,7 +41565,7 @@ "redux-throttle": "0.1.1", "scratch-audio": "2.0.268", "scratch-blocks": "1.3.0", - "scratch-l10n": "6.1.44", + "scratch-l10n": "6.1.45", "scratch-paint": "4.1.37", "scratch-render-fonts": "1.0.252", "scratch-storage": "5.0.10", @@ -41925,7 +41925,7 @@ "jsdoc": "3.6.11", "pngjs": "3.4.0", "scratch-blocks": "1.3.0", - "scratch-l10n": "6.1.44", + "scratch-l10n": "6.1.45", "scratch-render-fonts": "1.0.252", "scratch-semantic-release-config": "4.0.0", "scratch-webpack-configuration": "3.1.0", diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index 3259684bf0b..6fea5e23941 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -117,7 +117,7 @@ "redux-throttle": "0.1.1", "scratch-audio": "2.0.268", "scratch-blocks": "1.3.0", - "scratch-l10n": "6.1.44", + "scratch-l10n": "6.1.45", "scratch-paint": "4.1.37", "scratch-render-fonts": "1.0.252", "scratch-storage": "5.0.10", diff --git a/packages/scratch-vm/package.json b/packages/scratch-vm/package.json index da914185fef..00ee2ba7dc9 100644 --- a/packages/scratch-vm/package.json +++ b/packages/scratch-vm/package.json @@ -94,7 +94,7 @@ "jsdoc": "3.6.11", "pngjs": "3.4.0", "scratch-blocks": "1.3.0", - "scratch-l10n": "6.1.44", + "scratch-l10n": "6.1.45", "scratch-render-fonts": "1.0.252", "scratch-semantic-release-config": "4.0.0", "scratch-webpack-configuration": "3.1.0", From 32ac0d00a36ed584798c0adc587b9dc376f4558a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 19 Dec 2025 10:14:57 +0000 Subject: [PATCH 117/521] fix(deps): update dependency scratch-paint to v4.1.38 --- package-lock.json | 8 ++++---- packages/scratch-gui/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 14633bd11fb..ac458f9bdaa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -34513,9 +34513,9 @@ } }, "node_modules/scratch-paint": { - "version": "4.1.37", - "resolved": "https://registry.npmjs.org/scratch-paint/-/scratch-paint-4.1.37.tgz", - "integrity": "sha512-Pw+boCZqLFts9JnZwq/xa3xVI9l+UvIVwRVAKg+4flEu6WofbQpyRQklvZaC5u5Yhnkz5rQ3lhwr2HT1kZrhNw==", + "version": "4.1.38", + "resolved": "https://registry.npmjs.org/scratch-paint/-/scratch-paint-4.1.38.tgz", + "integrity": "sha512-HszlTAxSFF0t2wAauAmyI+gLm4z9EoQU0NFujugifOH/0om3iinCE+4au0HUfODbGxHg41BbDdVKEyzT83gvUw==", "license": "AGPL-3.0-only", "dependencies": { "@scratch/paper": "^0.11.20221201200345", @@ -41566,7 +41566,7 @@ "scratch-audio": "2.0.268", "scratch-blocks": "1.3.0", "scratch-l10n": "6.1.45", - "scratch-paint": "4.1.37", + "scratch-paint": "4.1.38", "scratch-render-fonts": "1.0.252", "scratch-storage": "5.0.10", "startaudiocontext": "1.2.1", diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index 6fea5e23941..b2662c480aa 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -118,7 +118,7 @@ "scratch-audio": "2.0.268", "scratch-blocks": "1.3.0", "scratch-l10n": "6.1.45", - "scratch-paint": "4.1.37", + "scratch-paint": "4.1.38", "scratch-render-fonts": "1.0.252", "scratch-storage": "5.0.10", "startaudiocontext": "1.2.1", From 6bf89479605a33e6751407479da1d25a79bc88c5 Mon Sep 17 00:00:00 2001 From: Ayshe Dzhindzhi Date: Fri, 19 Dec 2025 16:44:34 +0200 Subject: [PATCH 118/521] feat: make the editor layour semantic and use ); }; diff --git a/packages/scratch-gui/src/components/delete-button/delete-button.css b/packages/scratch-gui/src/components/delete-button/delete-button.css index 5f7f422c66d..40b38ac443a 100644 --- a/packages/scratch-gui/src/components/delete-button/delete-button.css +++ b/packages/scratch-gui/src/components/delete-button/delete-button.css @@ -9,6 +9,8 @@ user-select: none; cursor: pointer; transition: all 0.15s ease-out; + border: none; + background: none; } .delete-button-visible { diff --git a/packages/scratch-gui/src/components/delete-button/delete-button.jsx b/packages/scratch-gui/src/components/delete-button/delete-button.jsx index bdd16c7349d..34e1e0c8f57 100644 --- a/packages/scratch-gui/src/components/delete-button/delete-button.jsx +++ b/packages/scratch-gui/src/components/delete-button/delete-button.jsx @@ -6,13 +6,13 @@ import styles from './delete-button.css'; import deleteIcon from './icon--delete.svg'; const DeleteButton = props => ( -
@@ -26,7 +26,7 @@ const DeleteButton = props => ( src={deleteIcon} />
-
+ ); diff --git a/packages/scratch-gui/src/components/extension-button/extension-button.jsx b/packages/scratch-gui/src/components/extension-button/extension-button.jsx index 1c9b935ff85..51d8ab46532 100644 --- a/packages/scratch-gui/src/components/extension-button/extension-button.jsx +++ b/packages/scratch-gui/src/components/extension-button/extension-button.jsx @@ -140,6 +140,7 @@ const ExtensionButton = props => { return ( + {/* TODO: Add focus indicator */} ); }; GreenFlagComponent.propTypes = { diff --git a/packages/scratch-gui/src/components/gui/gui.jsx b/packages/scratch-gui/src/components/gui/gui.jsx index fadab2bf949..20bb8700342 100644 --- a/packages/scratch-gui/src/components/gui/gui.jsx +++ b/packages/scratch-gui/src/components/gui/gui.jsx @@ -318,6 +318,7 @@ const GUIComponent = props => { role="main" aria-label="Editor" className={styles.editorWrapper} + element="main" > { selectedTabClassName={tabClassNames.tabSelected} selectedTabPanelClassName={tabClassNames.tabPanelSelected} onSelect={onActivateTab} + // TODO: Can we render this as a
+ ); IconButton.propTypes = { diff --git a/packages/scratch-gui/src/components/menu-bar/menu-bar.jsx b/packages/scratch-gui/src/components/menu-bar/menu-bar.jsx index 5df827e5aa6..79b865abb47 100644 --- a/packages/scratch-gui/src/components/menu-bar/menu-bar.jsx +++ b/packages/scratch-gui/src/components/menu-bar/menu-bar.jsx @@ -439,6 +439,7 @@ class MenuBar extends React.Component { )} aria-label={this.props.ariaLabel} role={this.props.ariaRole} + element="header" >
diff --git a/packages/scratch-gui/src/components/sound-editor/sound-editor.jsx b/packages/scratch-gui/src/components/sound-editor/sound-editor.jsx index 3da1fb03368..b9676cc1748 100644 --- a/packages/scratch-gui/src/components/sound-editor/sound-editor.jsx +++ b/packages/scratch-gui/src/components/sound-editor/sound-editor.jsx @@ -149,6 +149,7 @@ const SoundEditor = props => {
-
Copy
-
-
+
-
-
+
-
+
-
Delete
-
+
@@ -174,9 +170,8 @@ exports[`Sound Editor Component matches snapshot 1`] = ` />
-
Faster
-
-
+
- -
+
- -
+
- -
+
- -
+
- -
+
- -
+
- -
+
- + `; diff --git a/packages/scratch-gui/test/unit/components/__snapshots__/sprite-selector-item.test.jsx.snap b/packages/scratch-gui/test/unit/components/__snapshots__/sprite-selector-item.test.jsx.snap index 01ae61d08a6..a56415c9360 100644 --- a/packages/scratch-gui/test/unit/components/__snapshots__/sprite-selector-item.test.jsx.snap +++ b/packages/scratch-gui/test/unit/components/__snapshots__/sprite-selector-item.test.jsx.snap @@ -45,10 +45,9 @@ exports[`SpriteSelectorItemComponent matches snapshot when given a number and de 480 x 360 -
-
+ `; @@ -80,10 +79,9 @@ exports[`SpriteSelectorItemComponent matches snapshot when selected 1`] = ` Pony sprite -
-
+ `; diff --git a/packages/scratch-gui/test/unit/components/icon-button.test.jsx b/packages/scratch-gui/test/unit/components/icon-button.test.jsx index 14e5dcb330e..e36c12aad42 100644 --- a/packages/scratch-gui/test/unit/components/icon-button.test.jsx +++ b/packages/scratch-gui/test/unit/components/icon-button.test.jsx @@ -27,7 +27,7 @@ describe('IconButtonComponent', () => { /> ); - const button = container.querySelector('div[role="button"]'); + const button = container.querySelector('button'); fireEvent.click(button); diff --git a/packages/scratch-gui/test/unit/components/menu-bar.test.jsx b/packages/scratch-gui/test/unit/components/menu-bar.test.jsx index 483251cb311..e679b632906 100644 --- a/packages/scratch-gui/test/unit/components/menu-bar.test.jsx +++ b/packages/scratch-gui/test/unit/components/menu-bar.test.jsx @@ -42,14 +42,14 @@ describe('MenuBar Component', () => { test('menu bar with no About handler has no About button', () => { const {container} = renderWithIntl(getComponent()); - const button = container.querySelector('span[role="button"]'); + const button = container.querySelector('button'); expect(button).toBeFalsy(); }); test('menu bar with an About handler has an About button', () => { const onClickAbout = jest.fn(); const {container} = renderWithIntl(getComponent({onClickAbout})); - const button = container.querySelector('span[role="button"]'); + const button = container.querySelector('button'); expect(button).toBeTruthy(); }); @@ -57,7 +57,7 @@ describe('MenuBar Component', () => { test('clicking on About button calls the handler', () => { const onClickAbout = jest.fn(); const {container} = renderWithIntl(getComponent({onClickAbout})); - const button = container.querySelector('span[role="button"]'); + const button = container.querySelector('button'); fireEvent.click(button); expect(onClickAbout).toHaveBeenCalledTimes(1); @@ -66,7 +66,7 @@ describe('MenuBar Component', () => { test('not clicking on About button does not call the handler', () => { const onClickAbout = jest.fn(); const {container} = renderWithIntl(getComponent({onClickAbout})); - const button = container.querySelector('span[role="button"]'); + const button = container.querySelector('button'); expect(onClickAbout).toHaveBeenCalledTimes(0); }); diff --git a/packages/scratch-gui/test/unit/components/sound-editor.test.jsx b/packages/scratch-gui/test/unit/components/sound-editor.test.jsx index 88620f01e1e..1f5bd579ab9 100644 --- a/packages/scratch-gui/test/unit/components/sound-editor.test.jsx +++ b/packages/scratch-gui/test/unit/components/sound-editor.test.jsx @@ -46,7 +46,7 @@ describe('Sound Editor Component', () => { trimStart={0.25} /> ); - const deleteButton = [...container.querySelectorAll('div[role="button"]')] + const deleteButton = [...container.querySelectorAll('button')] .find(el => el.textContent.trim() === 'Delete'); fireEvent.click(deleteButton); @@ -105,7 +105,7 @@ describe('Sound Editor Component', () => { ); - const buttons = [...container.querySelectorAll('div[role="button"]')]; + const buttons = [...container.querySelectorAll('button')]; getButtonByText = text => buttons.find(div => div.textContent.trim() === text); }); diff --git a/packages/scratch-gui/test/unit/components/sprite-selector-item.test.jsx b/packages/scratch-gui/test/unit/components/sprite-selector-item.test.jsx index c12c4a1ec0c..726d268c312 100644 --- a/packages/scratch-gui/test/unit/components/sprite-selector-item.test.jsx +++ b/packages/scratch-gui/test/unit/components/sprite-selector-item.test.jsx @@ -79,7 +79,7 @@ describe('SpriteSelectorItemComponent', () => { test('triggers callback when CloseButton component is clicked', () => { const {container} = renderWithIntl(getComponent()); - const deleteButton = container.querySelector('div[role="button"][aria-label="Delete"]'); + const deleteButton = container.querySelector('button[aria-label="Delete"]'); fireEvent.click(deleteButton); expect(onDeleteButtonClick).toHaveBeenCalled(); }); diff --git a/packages/scratch-gui/test/unit/containers/__snapshots__/sound-editor.test.jsx.snap b/packages/scratch-gui/test/unit/containers/__snapshots__/sound-editor.test.jsx.snap index 2cff279c0f1..63a8290d8b1 100644 --- a/packages/scratch-gui/test/unit/containers/__snapshots__/sound-editor.test.jsx.snap +++ b/packages/scratch-gui/test/unit/containers/__snapshots__/sound-editor.test.jsx.snap @@ -37,9 +37,8 @@ exports[`Sound Editor Container should pass the correct data to the component fr
-
Copy
-
-
+
- -
+
- + -
Delete
- +
@@ -121,9 +117,8 @@ exports[`Sound Editor Container should pass the correct data to the component fr />
-
Faster
-
-
+
- -
+
- -
+
- -
+
- -
+
- -
+
- -
+
- -
+
- + `; From 363d5bd6c1e1051af1019226693c7c4d46dcbb9b Mon Sep 17 00:00:00 2001 From: Ayshe Dzhindzhi Date: Mon, 5 Jan 2026 15:27:09 +0200 Subject: [PATCH 138/521] feat: use semantic lists in the main editor page where applicable --- .../components/action-menu/action-menu.css | 9 ++++ .../components/action-menu/action-menu.jsx | 8 +-- .../src/components/asset-panel/selector.css | 9 ++++ .../src/components/asset-panel/selector.jsx | 5 +- .../components/asset-panel/sortable-asset.jsx | 4 +- .../src/components/backpack/backpack.css | 9 ++++ .../src/components/backpack/backpack.jsx | 53 ++++++++++--------- .../scratch-gui/src/components/menu/menu.css | 8 +++ .../scratch-gui/src/components/menu/menu.jsx | 4 +- .../sprite-selector/sprite-list.jsx | 1 + .../sprite-selector/sprite-selector.css | 4 ++ 11 files changed, 80 insertions(+), 34 deletions(-) diff --git a/packages/scratch-gui/src/components/action-menu/action-menu.css b/packages/scratch-gui/src/components/action-menu/action-menu.css index f7dbc902580..3c9bfa0ddff 100644 --- a/packages/scratch-gui/src/components/action-menu/action-menu.css +++ b/packages/scratch-gui/src/components/action-menu/action-menu.css @@ -93,6 +93,15 @@ button::-moz-focus-inner { display: flex; flex-direction: column; z-index: 10; /* @todo justify */ + + margin: 0; + padding: 0; + list-style-type: none; + line-height: normal; +} + +.more-buttons li { + margin: 0; } .file-input { diff --git a/packages/scratch-gui/src/components/action-menu/action-menu.jsx b/packages/scratch-gui/src/components/action-menu/action-menu.jsx index 60fe7700f03..a09fd906819 100644 --- a/packages/scratch-gui/src/components/action-menu/action-menu.jsx +++ b/packages/scratch-gui/src/components/action-menu/action-menu.jsx @@ -141,14 +141,14 @@ class ActionMenu extends React.Component { arrowColor="var(--tooltip-arrow-color)" />
-
+
    {(moreButtons || []).map(({img, title, onClick: handleClick, fileAccept, fileChange, fileInput, fileMultiple}, keyId) => { const isComingSoon = !handleClick; const hasFileInput = fileInput; const tooltipId = `${this.mainTooltipId}-${title}`; return ( -
    +
  • + ); })} -
+
); diff --git a/packages/scratch-gui/src/components/asset-panel/selector.css b/packages/scratch-gui/src/components/asset-panel/selector.css index 712bdf34280..63df26aeee7 100644 --- a/packages/scratch-gui/src/components/asset-panel/selector.css +++ b/packages/scratch-gui/src/components/asset-panel/selector.css @@ -50,6 +50,15 @@ $fade-out-distance: 100px; overflow-y: scroll; display: flex; flex-direction: column; + + margin: 0; + padding: 0; + list-style-type: none; + line-height: normal; +} + +.list-area li { + margin: 0; } .list-area:after { diff --git a/packages/scratch-gui/src/components/asset-panel/selector.jsx b/packages/scratch-gui/src/components/asset-panel/selector.jsx index fd9a0788991..9d55302e1b8 100644 --- a/packages/scratch-gui/src/components/asset-panel/selector.jsx +++ b/packages/scratch-gui/src/components/asset-panel/selector.jsx @@ -55,7 +55,10 @@ const Selector = props => { componentRef={containerRef} element="aside" > - + {items.map((item, index) => ( {this.props.children} - + ); } } diff --git a/packages/scratch-gui/src/components/backpack/backpack.css b/packages/scratch-gui/src/components/backpack/backpack.css index 98a35a5e868..b1fb085812a 100644 --- a/packages/scratch-gui/src/components/backpack/backpack.css +++ b/packages/scratch-gui/src/components/backpack/backpack.css @@ -47,6 +47,15 @@ flex-direction: row; align-items: center; overflow-x: auto; + + padding: 0; + margin: 0; + list-style-type: none; + line-height: normal; +} + +.backpack-list-inner { + margin: 0; } .drag-over:after { diff --git a/packages/scratch-gui/src/components/backpack/backpack.jsx b/packages/scratch-gui/src/components/backpack/backpack.jsx index da63fb4eeb0..842ad27fad0 100644 --- a/packages/scratch-gui/src/components/backpack/backpack.jsx +++ b/packages/scratch-gui/src/components/backpack/backpack.jsx @@ -115,35 +115,38 @@ const Backpack = ({ ) : ( contents.length > 0 ? ( -
+
    {contents.map(item => ( - +
  • + +
  • ))} {showMore && ( - +
  • + +
  • )} -
+ ) : (
( -
( > {children} -
+ ); Submenu.propTypes = { diff --git a/packages/scratch-gui/src/components/sprite-selector/sprite-list.jsx b/packages/scratch-gui/src/components/sprite-selector/sprite-list.jsx index c496bd73259..9b87565b695 100644 --- a/packages/scratch-gui/src/components/sprite-selector/sprite-list.jsx +++ b/packages/scratch-gui/src/components/sprite-selector/sprite-list.jsx @@ -44,6 +44,7 @@ const SpriteList = function (props) { > {items.map((sprite, index) => { diff --git a/packages/scratch-gui/src/components/sprite-selector/sprite-selector.css b/packages/scratch-gui/src/components/sprite-selector/sprite-selector.css index c871e451759..93a06bc49b5 100644 --- a/packages/scratch-gui/src/components/sprite-selector/sprite-selector.css +++ b/packages/scratch-gui/src/components/sprite-selector/sprite-selector.css @@ -70,6 +70,10 @@ padding-bottom: $space; overflow-x: hidden; + + margin: 0; + list-style-type: none; + line-height: normal; } .add-button { From 9dcf0f763695a2a1e9dfd654942fe84418233129 Mon Sep 17 00:00:00 2001 From: Ayshe Dzhindzhi Date: Mon, 5 Jan 2026 15:27:48 +0200 Subject: [PATCH 139/521] fix: style changes after switching to buttons --- .../scratch-gui/src/components/delete-button/delete-button.css | 1 + packages/scratch-gui/src/components/green-flag/green-flag.css | 1 + packages/scratch-gui/src/components/stop-all/stop-all.css | 1 + 3 files changed, 3 insertions(+) diff --git a/packages/scratch-gui/src/components/delete-button/delete-button.css b/packages/scratch-gui/src/components/delete-button/delete-button.css index 40b38ac443a..f175fc9091e 100644 --- a/packages/scratch-gui/src/components/delete-button/delete-button.css +++ b/packages/scratch-gui/src/components/delete-button/delete-button.css @@ -11,6 +11,7 @@ transition: all 0.15s ease-out; border: none; background: none; + padding: 0; } .delete-button-visible { diff --git a/packages/scratch-gui/src/components/green-flag/green-flag.css b/packages/scratch-gui/src/components/green-flag/green-flag.css index fe3ad6a1785..e95f8bbafa5 100644 --- a/packages/scratch-gui/src/components/green-flag/green-flag.css +++ b/packages/scratch-gui/src/components/green-flag/green-flag.css @@ -4,6 +4,7 @@ border: none; background: none; padding: 0; + line-height: 0; } .green-flag { diff --git a/packages/scratch-gui/src/components/stop-all/stop-all.css b/packages/scratch-gui/src/components/stop-all/stop-all.css index 99268cad922..a333914229f 100644 --- a/packages/scratch-gui/src/components/stop-all/stop-all.css +++ b/packages/scratch-gui/src/components/stop-all/stop-all.css @@ -13,6 +13,7 @@ background: none; border: none; padding: 0; + line-height: 0; } .stop-all:hover { From 04253d923eea2b1f71cfad128de95ad8fa9db2bb Mon Sep 17 00:00:00 2001 From: Ayshe Dzhindzhi Date: Mon, 5 Jan 2026 16:25:55 +0200 Subject: [PATCH 140/521] fix: failing button test --- packages/scratch-gui/test/integration/menu-bar.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/scratch-gui/test/integration/menu-bar.test.js b/packages/scratch-gui/test/integration/menu-bar.test.js index 1927246177a..97747691387 100644 --- a/packages/scratch-gui/test/integration/menu-bar.test.js +++ b/packages/scratch-gui/test/integration/menu-bar.test.js @@ -50,7 +50,7 @@ describe('Menu bar settings', () => { test('Share button should NOT be enabled', async () => { await loadUri(uri); - await findByXpath('//div[span[div[span[text()="Share"]]] and @data-tip="tooltip"]'); + await findByXpath('//div[button[div[span[text()="Share"]]] and @data-tip="tooltip"]'); }); test('Logo should be clickable', async () => { From 269805f14f0ad0024fb1d9e5ba1ef568a672eabf Mon Sep 17 00:00:00 2001 From: Ayshe Dzhindzhi Date: Tue, 6 Jan 2026 15:33:10 +0200 Subject: [PATCH 141/521] fix: address review points --- .../scratch-gui/src/components/delete-button/delete-button.jsx | 1 - packages/scratch-gui/src/components/green-flag/green-flag.jsx | 2 +- packages/scratch-gui/src/components/stop-all/stop-all.jsx | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/scratch-gui/src/components/delete-button/delete-button.jsx b/packages/scratch-gui/src/components/delete-button/delete-button.jsx index 34e1e0c8f57..86c01bc8856 100644 --- a/packages/scratch-gui/src/components/delete-button/delete-button.jsx +++ b/packages/scratch-gui/src/components/delete-button/delete-button.jsx @@ -6,7 +6,6 @@ import styles from './delete-button.css'; import deleteIcon from './icon--delete.svg'; const DeleteButton = props => ( - // TODO: Make the focus visible ); diff --git a/packages/scratch-gui/src/components/stop-all/stop-all.jsx b/packages/scratch-gui/src/components/stop-all/stop-all.jsx index 1c7b7aef684..f15cc151d0b 100644 --- a/packages/scratch-gui/src/components/stop-all/stop-all.jsx +++ b/packages/scratch-gui/src/components/stop-all/stop-all.jsx @@ -17,6 +17,7 @@ const StopAllComponent = function (props) { ); From 2d236eef76d15a3576d79ab9c63755fee3e8ab89 Mon Sep 17 00:00:00 2001 From: Ayshe Dzhindzhi Date: Wed, 7 Jan 2026 13:07:47 +0200 Subject: [PATCH 142/521] fix: remove leftover TODO and make the sprite item have role=button --- .../components/sprite-selector-item/sprite-selector-item.jsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/scratch-gui/src/components/sprite-selector-item/sprite-selector-item.jsx b/packages/scratch-gui/src/components/sprite-selector-item/sprite-selector-item.jsx index 13385e52b23..7f1d91b44ad 100644 --- a/packages/scratch-gui/src/components/sprite-selector-item/sprite-selector-item.jsx +++ b/packages/scratch-gui/src/components/sprite-selector-item/sprite-selector-item.jsx @@ -28,8 +28,9 @@ const SpriteSelectorItem = props => { disabled={props.preventContextMenu} asChild > - {/* Does it make sense for this to be a button */}
Date: Wed, 7 Jan 2026 13:27:38 +0200 Subject: [PATCH 143/521] fix: update snapshots to fix failing test cases --- .../__snapshots__/sprite-selector-item.test.jsx.snap | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/scratch-gui/test/unit/components/__snapshots__/sprite-selector-item.test.jsx.snap b/packages/scratch-gui/test/unit/components/__snapshots__/sprite-selector-item.test.jsx.snap index a56415c9360..f9430c73809 100644 --- a/packages/scratch-gui/test/unit/components/__snapshots__/sprite-selector-item.test.jsx.snap +++ b/packages/scratch-gui/test/unit/components/__snapshots__/sprite-selector-item.test.jsx.snap @@ -4,6 +4,8 @@ exports[`SpriteSelectorItemComponent does not have a close box when not selected
@@ -25,6 +27,8 @@ exports[`SpriteSelectorItemComponent matches snapshot when given a number and de
5 @@ -65,6 +69,8 @@ exports[`SpriteSelectorItemComponent matches snapshot when selected 1`] = `
From f7833255495ffaeb8e475eb2812bd2b1854557ea Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 8 Jan 2026 05:22:08 +0000 Subject: [PATCH 144/521] fix(deps): update dependency scratch-l10n to v6.1.52 --- package-lock.json | 10 +++++----- packages/scratch-gui/package.json | 2 +- packages/scratch-vm/package.json | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index be732c1fe2d..f586e2852fc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -34418,9 +34418,9 @@ } }, "node_modules/scratch-l10n": { - "version": "6.1.51", - "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-6.1.51.tgz", - "integrity": "sha512-UcodLSucFgVS+gjIAGgTGv0p0hlQYkSfRdUazlJ5986OLAj+KCuLMIGmXbN6O1j63h/ryofIBN/5RRtuLln/nw==", + "version": "6.1.52", + "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-6.1.52.tgz", + "integrity": "sha512-SeVyt/e23P3tDFGwOxM4czdXYpDpxQJxSaD9Wsea4IY0BCOgEhSWbAtGtvwqAoNO5JIFiVy/rqs34fKneRlhBg==", "license": "AGPL-3.0-only", "dependencies": { "@transifex/api": "7.1.5", @@ -41060,7 +41060,7 @@ "redux-throttle": "0.1.1", "scratch-audio": "2.0.268", "scratch-blocks": "1.3.0", - "scratch-l10n": "6.1.51", + "scratch-l10n": "6.1.52", "scratch-paint": "4.1.44", "scratch-render-fonts": "1.0.252", "scratch-storage": "5.0.10", @@ -41420,7 +41420,7 @@ "jsdoc": "3.6.11", "pngjs": "3.4.0", "scratch-blocks": "1.3.0", - "scratch-l10n": "6.1.51", + "scratch-l10n": "6.1.52", "scratch-render-fonts": "1.0.252", "scratch-semantic-release-config": "4.0.0", "scratch-webpack-configuration": "3.1.0", diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index f3f75963ae1..9747555432f 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -117,7 +117,7 @@ "redux-throttle": "0.1.1", "scratch-audio": "2.0.268", "scratch-blocks": "1.3.0", - "scratch-l10n": "6.1.51", + "scratch-l10n": "6.1.52", "scratch-paint": "4.1.44", "scratch-render-fonts": "1.0.252", "scratch-storage": "5.0.10", diff --git a/packages/scratch-vm/package.json b/packages/scratch-vm/package.json index 620027ebb6a..27d6339b24a 100644 --- a/packages/scratch-vm/package.json +++ b/packages/scratch-vm/package.json @@ -94,7 +94,7 @@ "jsdoc": "3.6.11", "pngjs": "3.4.0", "scratch-blocks": "1.3.0", - "scratch-l10n": "6.1.51", + "scratch-l10n": "6.1.52", "scratch-render-fonts": "1.0.252", "scratch-semantic-release-config": "4.0.0", "scratch-webpack-configuration": "3.1.0", From 0c7ca66baa2f0d895572949a07825d37672aac7f Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 8 Jan 2026 12:25:17 +0000 Subject: [PATCH 145/521] fix(deps): update dependency scratch-paint to v4.1.45 --- package-lock.json | 8 ++++---- packages/scratch-gui/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index f586e2852fc..1fdd7545b99 100644 --- a/package-lock.json +++ b/package-lock.json @@ -34459,9 +34459,9 @@ } }, "node_modules/scratch-paint": { - "version": "4.1.44", - "resolved": "https://registry.npmjs.org/scratch-paint/-/scratch-paint-4.1.44.tgz", - "integrity": "sha512-pCLdcDngsEhiozw3fcZ/BXp3xBPGyqe3Uy8OOB/I50Lm7BOhRfBVnmsyeIccIY9AQWZJtMDdQTWcUps74ZA/6A==", + "version": "4.1.45", + "resolved": "https://registry.npmjs.org/scratch-paint/-/scratch-paint-4.1.45.tgz", + "integrity": "sha512-XoX2E1316bNV1Pd05nARHwe7JSB8vWCdZ0euncYwpvVBK1XfV3n3qcaOlB8qMr7oFZxkmGU1dKqKbOU/7ZC6Sg==", "license": "AGPL-3.0-only", "dependencies": { "@scratch/paper": "^0.11.20221201200345", @@ -41061,7 +41061,7 @@ "scratch-audio": "2.0.268", "scratch-blocks": "1.3.0", "scratch-l10n": "6.1.52", - "scratch-paint": "4.1.44", + "scratch-paint": "4.1.45", "scratch-render-fonts": "1.0.252", "scratch-storage": "5.0.10", "startaudiocontext": "1.2.1", diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index 9747555432f..7bcfaca234e 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -118,7 +118,7 @@ "scratch-audio": "2.0.268", "scratch-blocks": "1.3.0", "scratch-l10n": "6.1.52", - "scratch-paint": "4.1.44", + "scratch-paint": "4.1.45", "scratch-render-fonts": "1.0.252", "scratch-storage": "5.0.10", "startaudiocontext": "1.2.1", From 93d78989fa57bf9c18c1aca64ad923e48a1ada3b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 9 Jan 2026 05:45:56 +0000 Subject: [PATCH 146/521] fix(deps): update dependency scratch-l10n to v6.1.53 --- package-lock.json | 10 +++++----- packages/scratch-gui/package.json | 2 +- packages/scratch-vm/package.json | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1fdd7545b99..d1fa9b4e1d3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -34418,9 +34418,9 @@ } }, "node_modules/scratch-l10n": { - "version": "6.1.52", - "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-6.1.52.tgz", - "integrity": "sha512-SeVyt/e23P3tDFGwOxM4czdXYpDpxQJxSaD9Wsea4IY0BCOgEhSWbAtGtvwqAoNO5JIFiVy/rqs34fKneRlhBg==", + "version": "6.1.53", + "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-6.1.53.tgz", + "integrity": "sha512-w8RanJEib8OLYPAMvhquqsbn3wBa9/IBOtDL103JmEQrEsYX896dqH7mQ8bKe4K5S4C/gByfZSX++kUF0NT62Q==", "license": "AGPL-3.0-only", "dependencies": { "@transifex/api": "7.1.5", @@ -41060,7 +41060,7 @@ "redux-throttle": "0.1.1", "scratch-audio": "2.0.268", "scratch-blocks": "1.3.0", - "scratch-l10n": "6.1.52", + "scratch-l10n": "6.1.53", "scratch-paint": "4.1.45", "scratch-render-fonts": "1.0.252", "scratch-storage": "5.0.10", @@ -41420,7 +41420,7 @@ "jsdoc": "3.6.11", "pngjs": "3.4.0", "scratch-blocks": "1.3.0", - "scratch-l10n": "6.1.52", + "scratch-l10n": "6.1.53", "scratch-render-fonts": "1.0.252", "scratch-semantic-release-config": "4.0.0", "scratch-webpack-configuration": "3.1.0", diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index 7bcfaca234e..714cd937d2c 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -117,7 +117,7 @@ "redux-throttle": "0.1.1", "scratch-audio": "2.0.268", "scratch-blocks": "1.3.0", - "scratch-l10n": "6.1.52", + "scratch-l10n": "6.1.53", "scratch-paint": "4.1.45", "scratch-render-fonts": "1.0.252", "scratch-storage": "5.0.10", diff --git a/packages/scratch-vm/package.json b/packages/scratch-vm/package.json index 27d6339b24a..d54250b5faa 100644 --- a/packages/scratch-vm/package.json +++ b/packages/scratch-vm/package.json @@ -94,7 +94,7 @@ "jsdoc": "3.6.11", "pngjs": "3.4.0", "scratch-blocks": "1.3.0", - "scratch-l10n": "6.1.52", + "scratch-l10n": "6.1.53", "scratch-render-fonts": "1.0.252", "scratch-semantic-release-config": "4.0.0", "scratch-webpack-configuration": "3.1.0", From 8c13b2babfaf8d209d5ae42162c71eec9200ac4d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 9 Jan 2026 11:47:24 +0000 Subject: [PATCH 147/521] fix(deps): update dependency scratch-paint to v4.1.46 --- package-lock.json | 8 ++++---- packages/scratch-gui/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index d1fa9b4e1d3..6af89765cb4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -34459,9 +34459,9 @@ } }, "node_modules/scratch-paint": { - "version": "4.1.45", - "resolved": "https://registry.npmjs.org/scratch-paint/-/scratch-paint-4.1.45.tgz", - "integrity": "sha512-XoX2E1316bNV1Pd05nARHwe7JSB8vWCdZ0euncYwpvVBK1XfV3n3qcaOlB8qMr7oFZxkmGU1dKqKbOU/7ZC6Sg==", + "version": "4.1.46", + "resolved": "https://registry.npmjs.org/scratch-paint/-/scratch-paint-4.1.46.tgz", + "integrity": "sha512-DXVy9aRCLiJl5CVALP8YF5hYQ+E87SrNMi+y3Exzof1PDftuUr4lbTaGWDAE2VtFhWVnyW0efxyq83PJC6j3iw==", "license": "AGPL-3.0-only", "dependencies": { "@scratch/paper": "^0.11.20221201200345", @@ -41061,7 +41061,7 @@ "scratch-audio": "2.0.268", "scratch-blocks": "1.3.0", "scratch-l10n": "6.1.53", - "scratch-paint": "4.1.45", + "scratch-paint": "4.1.46", "scratch-render-fonts": "1.0.252", "scratch-storage": "5.0.10", "startaudiocontext": "1.2.1", diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index 714cd937d2c..5a13c2aefb1 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -118,7 +118,7 @@ "scratch-audio": "2.0.268", "scratch-blocks": "1.3.0", "scratch-l10n": "6.1.53", - "scratch-paint": "4.1.45", + "scratch-paint": "4.1.46", "scratch-render-fonts": "1.0.252", "scratch-storage": "5.0.10", "startaudiocontext": "1.2.1", From 0a07600249c8405c6b753d38dadf59fc5877dc50 Mon Sep 17 00:00:00 2001 From: Ayshe Dzhindzhi Date: Fri, 9 Jan 2026 13:52:25 +0200 Subject: [PATCH 148/521] fix: move the margins to a wrapper element, instead of duplicating them on both the badge and img --- .../src/components/menu-bar/account-nav.css | 4 ++-- .../src/components/menu-bar/account-nav.jsx | 1 + .../src/components/menu-bar/user-avatar.css | 7 ------- .../src/components/menu-bar/user-avatar.jsx | 10 +++++++++- 4 files changed, 12 insertions(+), 10 deletions(-) diff --git a/packages/scratch-gui/src/components/menu-bar/account-nav.css b/packages/scratch-gui/src/components/menu-bar/account-nav.css index e868d034478..1c460e43c90 100644 --- a/packages/scratch-gui/src/components/menu-bar/account-nav.css +++ b/packages/scratch-gui/src/components/menu-bar/account-nav.css @@ -19,11 +19,11 @@ font-weight: normal; } -[dir="ltr"] .user-info .avatar { +[dir="ltr"] .user-info .avatar-wrapper { margin-right: calc($space * .8125); } -[dir="rtl"] .user-info .avatar { +[dir="rtl"] .user-info .avatar-wrapper { margin-left: calc($space * .8125); } diff --git a/packages/scratch-gui/src/components/menu-bar/account-nav.jsx b/packages/scratch-gui/src/components/menu-bar/account-nav.jsx index eb79d5d4a34..42b5a21b47c 100644 --- a/packages/scratch-gui/src/components/menu-bar/account-nav.jsx +++ b/packages/scratch-gui/src/components/menu-bar/account-nav.jsx @@ -45,6 +45,7 @@ const AccountNavComponent = ({ {avatarUrl ? ( diff --git a/packages/scratch-gui/src/components/menu-bar/user-avatar.css b/packages/scratch-gui/src/components/menu-bar/user-avatar.css index bddbf59c01d..328ca7843eb 100644 --- a/packages/scratch-gui/src/components/menu-bar/user-avatar.css +++ b/packages/scratch-gui/src/components/menu-bar/user-avatar.css @@ -26,10 +26,3 @@ height: calc($menu-bar-button-size * 1.28); } -[dir="ltr"] .avatar-badge-wrapper { - margin-right: calc($space * .8125); -} - -[dir="rtl"] .avatar-badge-wrapper { - margin-left: calc($space * .8125); -} diff --git a/packages/scratch-gui/src/components/menu-bar/user-avatar.jsx b/packages/scratch-gui/src/components/menu-bar/user-avatar.jsx index f6e05510c92..02d5fa0b344 100644 --- a/packages/scratch-gui/src/components/menu-bar/user-avatar.jsx +++ b/packages/scratch-gui/src/components/menu-bar/user-avatar.jsx @@ -6,10 +6,17 @@ import styles from './user-avatar.css'; const UserAvatar = ({ className, + wrapperClassName, imageUrl, showAvatarBadge = false }) => ( -
+
Date: Fri, 9 Jan 2026 15:07:22 +0200 Subject: [PATCH 149/521] feat: support fetching dynamic assets and merging them to asset libraries --- .../src/containers/backdrop-library.jsx | 30 +++++++++++++-- .../src/containers/costume-library.jsx | 29 ++++++++++++-- packages/scratch-gui/src/containers/gui.jsx | 20 ++++++++++ .../src/containers/sound-library.jsx | 22 ++++++++++- .../src/containers/sprite-library.jsx | 27 +++++++++++-- .../scratch-gui/src/lib/assets-prop-types.js | 38 +++++++++++++++++++ .../src/lib/merge-dynamic-assets.js | 28 ++++++++++++++ .../src/reducers/dynamic-assets.js | 38 +++++++++++++++++++ packages/scratch-gui/src/reducers/gui.ts | 3 ++ 9 files changed, 222 insertions(+), 13 deletions(-) create mode 100644 packages/scratch-gui/src/lib/assets-prop-types.js create mode 100644 packages/scratch-gui/src/lib/merge-dynamic-assets.js create mode 100644 packages/scratch-gui/src/reducers/dynamic-assets.js diff --git a/packages/scratch-gui/src/containers/backdrop-library.jsx b/packages/scratch-gui/src/containers/backdrop-library.jsx index 782b51a4d47..399f24af3d9 100644 --- a/packages/scratch-gui/src/containers/backdrop-library.jsx +++ b/packages/scratch-gui/src/containers/backdrop-library.jsx @@ -2,8 +2,11 @@ import bindAll from 'lodash.bindall'; import PropTypes from 'prop-types'; import React from 'react'; import {defineMessages, injectIntl} from 'react-intl'; +import {connect} from 'react-redux'; import intlShape from '../lib/intlShape.js'; +import {costumeShape} from '../lib/assets-prop-types.js'; import VM from '@scratch/scratch-vm'; +import mergeDynamicAssets from '../lib/merge-dynamic-assets.js'; import backdropLibraryContent from '../lib/libraries/backdrops.json'; import backdropTags from '../lib/libraries/backdrop-tags'; @@ -22,8 +25,10 @@ class BackdropLibrary extends React.Component { constructor (props) { super(props); bindAll(this, [ - 'handleItemSelect' + 'handleItemSelect', + 'mergeDynamicAssets' ]); + this.processedBackdrops = {}; } handleItemSelect (item) { const vmBackdrop = { @@ -36,10 +41,22 @@ class BackdropLibrary extends React.Component { // Do not switch to stage, just add the backdrop this.props.vm.addBackdrop(item.md5ext, vmBackdrop); } + mergeDynamicAssets () { + if (this.processedBackdrops.source === this.props.dynamicBackdrops) { + return this.processedBackdrops.data; + } + this.processedBackdrops = mergeDynamicAssets( + backdropLibraryContent, + this.props.dynamicBackdrops + ); + + return this.processedBackdrops.data; + } render () { + const mergedAssets = this.mergeDynamicAssets(); return ( ); } -} +}; + +const mapStateToProps = state => ({ + dynamicBackdrops: state.scratchGui.dynamicAssets.backdrops +}); BackdropLibrary.propTypes = { + dynamicBackdrops: PropTypes.arrayOf(costumeShape), intl: intlShape.isRequired, onRequestClose: PropTypes.func, vm: PropTypes.instanceOf(VM).isRequired }; -export default injectIntl(BackdropLibrary); +export default injectIntl(connect(mapStateToProps)(BackdropLibrary)); diff --git a/packages/scratch-gui/src/containers/costume-library.jsx b/packages/scratch-gui/src/containers/costume-library.jsx index 9d2413c1c4b..14d119d962d 100644 --- a/packages/scratch-gui/src/containers/costume-library.jsx +++ b/packages/scratch-gui/src/containers/costume-library.jsx @@ -2,8 +2,11 @@ import bindAll from 'lodash.bindall'; import PropTypes from 'prop-types'; import React from 'react'; import {defineMessages, injectIntl} from 'react-intl'; +import {connect} from 'react-redux'; import intlShape from '../lib/intlShape.js'; +import {costumeShape} from '../lib/assets-prop-types.js'; import VM from '@scratch/scratch-vm'; +import mergeDynamicAssets from '../lib/merge-dynamic-assets.js'; import costumeLibraryContent from '../lib/libraries/costumes.json'; import spriteTags from '../lib/libraries/sprite-tags'; @@ -22,8 +25,10 @@ class CostumeLibrary extends React.PureComponent { constructor (props) { super(props); bindAll(this, [ - 'handleItemSelected' + 'handleItemSelected', + 'mergeDynamicAssets' ]); + this.processedCostumes = {}; } handleItemSelected (item) { const vmCostume = { @@ -35,10 +40,21 @@ class CostumeLibrary extends React.PureComponent { }; this.props.vm.addCostumeFromLibrary(item.md5ext, vmCostume); } + mergeDynamicAssets () { + if (this.processedCostumes.source === this.props.dynamicCostumes) { + return this.processedCostumes.data; + } + this.processedCostumes = mergeDynamicAssets( + costumeLibraryContent, + this.props.dynamicCostumes + ); + return this.processedCostumes.data; + } render () { + const data = this.mergeDynamicAssets(); return ( ); } -} +}; + +const mapStateToProps = state => ({ + dynamicCostumes: state.scratchGui.dynamicAssets.costumes +}); CostumeLibrary.propTypes = { + dynamicCostumes: PropTypes.arrayOf(costumeShape), intl: intlShape.isRequired, onRequestClose: PropTypes.func, vm: PropTypes.instanceOf(VM).isRequired }; -export default injectIntl(CostumeLibrary); +export default injectIntl(connect(mapStateToProps)(CostumeLibrary)); diff --git a/packages/scratch-gui/src/containers/gui.jsx b/packages/scratch-gui/src/containers/gui.jsx index d84fab6f7f2..d3a0c83dfdd 100644 --- a/packages/scratch-gui/src/containers/gui.jsx +++ b/packages/scratch-gui/src/containers/gui.jsx @@ -28,6 +28,7 @@ import { } from '../reducers/modals'; import {setPlatform} from '../reducers/platform'; +import {setDynamicAssets} from '../reducers/dynamic-assets'; import FontLoaderHOC from '../lib/font-loader-hoc.jsx'; import LocalizationHOC from '../lib/localization-hoc.jsx'; @@ -45,6 +46,11 @@ import {PLATFORM} from '../lib/platform.js'; import GUIComponent from '../components/gui/gui.jsx'; import {GUIStoragePropType} from '../gui-config'; import {AccountMenuOptionsPropTypes} from '../lib/account-menu-options'; +import { + costumeShape, + soundShape, + spriteShape +} from '../lib/assets-prop-types.js'; class GUI extends React.Component { componentDidMount () { @@ -54,8 +60,14 @@ class GUI extends React.Component { if (this.props.platform) { this.props.setPlatform(this.props.platform); } + if (this.props.dynamicAssets) { + this.props.onUpdateDynamicAssets(this.props.dynamicAssets); + } } componentDidUpdate (prevProps) { + if (this.props.dynamicAssets !== prevProps.dynamicAssets) { + this.props.onUpdateDynamicAssets(this.props.dynamicAssets); + } if (this.props.projectId !== prevProps.projectId) { if (this.props.projectId !== null) { this.props.onUpdateProjectId(this.props.projectId); @@ -116,6 +128,12 @@ GUI.propTypes = { assetHost: PropTypes.string, children: PropTypes.node, cloudHost: PropTypes.string, + dynamicAssets: PropTypes.shape({ + backdrops: PropTypes.arrayOf(costumeShape), + costumes: PropTypes.arrayOf(costumeShape), + sounds: PropTypes.arrayOf(soundShape), + sprites: PropTypes.arrayOf(spriteShape) + }), error: PropTypes.oneOfType([PropTypes.object, PropTypes.string]), fetchingProject: PropTypes.bool, intl: intlShape, @@ -129,6 +147,7 @@ GUI.propTypes = { onSeeCommunity: PropTypes.func, onStorageInit: PropTypes.func, onUpdateProjectId: PropTypes.func, + onUpdateDynamicAssets: PropTypes.func, onVmInit: PropTypes.func, platform: PropTypes.oneOf(Object.keys(PLATFORM)), setPlatform: PropTypes.func.isRequired, @@ -191,6 +210,7 @@ const mapStateToProps = (state, ownProps) => { const mapDispatchToProps = dispatch => ({ onExtensionButtonClick: () => dispatch(openExtensionLibrary()), onActivateTab: tab => dispatch(activateTab(tab)), + onUpdateDynamicAssets: dynamicAssets => dispatch(setDynamicAssets(dynamicAssets)), onActivateCostumesTab: () => dispatch(activateTab(COSTUMES_TAB_INDEX)), onActivateSoundsTab: () => dispatch(activateTab(SOUNDS_TAB_INDEX)), setPlatform: platform => dispatch(setPlatform(platform)), diff --git a/packages/scratch-gui/src/containers/sound-library.jsx b/packages/scratch-gui/src/containers/sound-library.jsx index 37fe42c57d0..3da65533046 100644 --- a/packages/scratch-gui/src/containers/sound-library.jsx +++ b/packages/scratch-gui/src/containers/sound-library.jsx @@ -3,6 +3,7 @@ import PropTypes from 'prop-types'; import React from 'react'; import {defineMessages, injectIntl} from 'react-intl'; import intlShape from '../lib/intlShape.js'; +import {soundShape} from '../lib/assets-prop-types.js'; import VM from '@scratch/scratch-vm'; import AudioEngine from 'scratch-audio'; @@ -13,6 +14,7 @@ import soundIconRtl from '../components/library-item/lib-icon--sound-rtl.svg'; import soundLibraryContent from '../lib/libraries/sounds.json'; import soundTags from '../lib/libraries/sound-tags'; +import mergeDynamicAssets from '../lib/merge-dynamic-assets.js'; import {connect} from 'react-redux'; @@ -32,7 +34,8 @@ class SoundLibrary extends React.PureComponent { 'handleItemMouseEnter', 'handleItemMouseLeave', 'onStop', - 'setStopHandler' + 'setStopHandler', + 'mergeDynamicAssets' ]); /** @@ -51,6 +54,7 @@ class SoundLibrary extends React.PureComponent { * function to call when the sound ends */ this.handleStop = null; + this.processedSounds = {}; } componentDidMount () { this.audioEngine = new AudioEngine(); @@ -150,9 +154,21 @@ class SoundLibrary extends React.PureComponent { this.props.onNewSound(); }); } + mergeDynamicAssets () { + if (this.processedSounds.source === this.props.dynamicSounds) { + return this.processedSounds.data; + } + this.processedSounds = mergeDynamicAssets( + soundLibraryContent, + this.props.dynamicSounds + ); + return this.processedSounds.data; + } render () { + const data = this.mergeDynamicAssets(); + // @todo need to use this hack to avoid library using md5 for image - const soundLibraryThumbnailData = soundLibraryContent.map(sound => { + const soundLibraryThumbnailData = data.map(sound => { const { md5ext, ...otherData @@ -182,6 +198,7 @@ class SoundLibrary extends React.PureComponent { } SoundLibrary.propTypes = { + dynamicSounds: PropTypes.arrayOf(soundShape), intl: intlShape.isRequired, isRtl: PropTypes.bool, onNewSound: PropTypes.func.isRequired, @@ -190,6 +207,7 @@ SoundLibrary.propTypes = { }; const mapStateToProps = state => ({ + dynamicSounds: state.scratchGui.dynamicAssets.sounds, isRtl: state.locales.isRtl }); diff --git a/packages/scratch-gui/src/containers/sprite-library.jsx b/packages/scratch-gui/src/containers/sprite-library.jsx index 0804e082c0c..63f794abc47 100644 --- a/packages/scratch-gui/src/containers/sprite-library.jsx +++ b/packages/scratch-gui/src/containers/sprite-library.jsx @@ -2,8 +2,11 @@ import bindAll from 'lodash.bindall'; import PropTypes from 'prop-types'; import React from 'react'; import {injectIntl, defineMessages} from 'react-intl'; +import {connect} from 'react-redux'; import intlShape from '../lib/intlShape.js'; +import {spriteShape} from '../lib/assets-prop-types.js'; import VM from '@scratch/scratch-vm'; +import mergeDynamicAssets from '../lib/merge-dynamic-assets.js'; import spriteLibraryContent from '../lib/libraries/sprites.json'; import randomizeSpritePosition from '../lib/randomize-sprite-position'; @@ -23,8 +26,10 @@ class SpriteLibrary extends React.PureComponent { constructor (props) { super(props); bindAll(this, [ - 'handleItemSelect' + 'handleItemSelect', + 'mergeDynamicAssets' ]); + this.processedSprites = {}; } handleItemSelect (item) { // Randomize position of library sprite @@ -33,10 +38,21 @@ class SpriteLibrary extends React.PureComponent { this.props.onActivateBlocksTab(); }); } + mergeDynamicAssets () { + if (this.processedSprites.source === this.props.dynamicSprites) { + return this.processedSprites.data; + } + this.processedSprites = mergeDynamicAssets( + spriteLibraryContent, + this.props.dynamicSprites + ); + return this.processedSprites.data; + } render () { + const data = this.mergeDynamicAssets(); return ( ({ + dynamicSprites: state.scratchGui.dynamicAssets.sprites +}); + SpriteLibrary.propTypes = { + dynamicSprites: PropTypes.arrayOf(spriteShape), intl: intlShape.isRequired, onActivateBlocksTab: PropTypes.func.isRequired, onRequestClose: PropTypes.func, vm: PropTypes.instanceOf(VM).isRequired }; -export default injectIntl(SpriteLibrary); +export default injectIntl(connect(mapStateToProps)(SpriteLibrary)); diff --git a/packages/scratch-gui/src/lib/assets-prop-types.js b/packages/scratch-gui/src/lib/assets-prop-types.js new file mode 100644 index 00000000000..e491b943e19 --- /dev/null +++ b/packages/scratch-gui/src/lib/assets-prop-types.js @@ -0,0 +1,38 @@ +import PropTypes from 'prop-types'; + +// The backdrops json effectively has the same shape as costumes +const costumeShape = PropTypes.shape({ + assetId: PropTypes.string, + bitmapResolution: PropTypes.number, + dataFormat: PropTypes.string, + md5ext: PropTypes.string, + name: PropTypes.string, + rotationCenterX: PropTypes.number, + rotationCenterY: PropTypes.number, + tags: PropTypes.arrayOf(PropTypes.string) +}); + +const soundShape = PropTypes.shape({ + assetId: PropTypes.string, + dataFormat: PropTypes.string, + format: PropTypes.string, + md5ext: PropTypes.string, + name: PropTypes.string, + rate: PropTypes.number, + sampleCount: PropTypes.number, + tags: PropTypes.arrayOf(PropTypes.string) +}); + +const spriteShape = PropTypes.shape({ + costumes: PropTypes.arrayOf(costumeShape), + isStage: PropTypes.bool, + name: PropTypes.string, + sounds: PropTypes.arrayOf(soundShape), + tags: PropTypes.arrayOf(PropTypes.string) +}); + +export { + costumeShape, + soundShape, + spriteShape +}; diff --git a/packages/scratch-gui/src/lib/merge-dynamic-assets.js b/packages/scratch-gui/src/lib/merge-dynamic-assets.js new file mode 100644 index 00000000000..c256231b12e --- /dev/null +++ b/packages/scratch-gui/src/lib/merge-dynamic-assets.js @@ -0,0 +1,28 @@ +/** + * Merge static and dynamic assets, using name as key, giving precedence to dynamic assets + * @param {Array} staticAssets the static assets bundled with the editor + * @param {Array} dynamicAssets an array of dynamic assets loaded at runtime + * @returns {Object} an object containing `source` and `data` properties, where: + * - `source` - the original dynamicAssets array (or null/undefined) + * - `data` - the merged array of assets + */ +const mergeDynamicAssets = (staticAssets, dynamicAssets) => { + const effectiveDynamicAssets = dynamicAssets || []; + + let data = staticAssets; + if (effectiveDynamicAssets.length > 0) { + const map = new Map(); + staticAssets.forEach(item => map.set(item.name, item)); + effectiveDynamicAssets.forEach(item => map.set(item.name, item)); + data = Array.from(map.values()); + data.sort((a, b) => (a.name || '').localeCompare(b.name || '')); + } + + const processedAssets = {}; + processedAssets.source = dynamicAssets; + processedAssets.data = data; + + return processedAssets; +}; + +export default mergeDynamicAssets; diff --git a/packages/scratch-gui/src/reducers/dynamic-assets.js b/packages/scratch-gui/src/reducers/dynamic-assets.js new file mode 100644 index 00000000000..20a1eb0c90c --- /dev/null +++ b/packages/scratch-gui/src/reducers/dynamic-assets.js @@ -0,0 +1,38 @@ +// Reducer for dynamic assets (sprites, backdrops, costumes, sounds), +// passed down to the editor on runtime. +const SET_DYNAMIC_ASSETS = 'scratch-gui/dynamic-assets/SET_DYNAMIC_ASSETS'; + +const initialState = { + sprites: [], + backdrops: [], + costumes: [], + sounds: [] +}; + +const reducer = function (state, action) { + if (typeof state === 'undefined') state = initialState; + switch (action.type) { + case SET_DYNAMIC_ASSETS: + return { + sprites: action.dynamicAssets.sprites || [], + backdrops: action.dynamicAssets.backdrops || [], + costumes: action.dynamicAssets.costumes || [], + sounds: action.dynamicAssets.sounds || [] + }; + default: + return state; + } +}; + +const setDynamicAssets = function (dynamicAssets) { + return { + type: SET_DYNAMIC_ASSETS, + dynamicAssets + }; +}; + +export { + reducer as default, + initialState as dynamicAssetsInitialState, + setDynamicAssets +}; diff --git a/packages/scratch-gui/src/reducers/gui.ts b/packages/scratch-gui/src/reducers/gui.ts index 516b651ac4f..f7bd0cde687 100644 --- a/packages/scratch-gui/src/reducers/gui.ts +++ b/packages/scratch-gui/src/reducers/gui.ts @@ -6,6 +6,7 @@ import colorPickerReducer, {colorPickerInitialState} from './color-picker'; import connectionModalReducer, {connectionModalInitialState} from './connection-modal'; import customProceduresReducer, {customProceduresInitialState} from './custom-procedures'; import blockDragReducer, {blockDragInitialState} from './block-drag'; +import dynamicAssetsReducer, {dynamicAssetsInitialState} from './dynamic-assets'; import editorTabReducer, {editorTabInitialState} from './editor-tab'; import hoveredTargetReducer, {hoveredTargetInitialState} from './hovered-target'; import menuReducer, {menuInitialState} from './menus'; @@ -45,6 +46,7 @@ const buildInitialState = (config: GUIConfig) => ({ config, connectionModal: connectionModalInitialState, customProcedures: customProceduresInitialState, + dynamicAssets: dynamicAssetsInitialState, editorTab: editorTabInitialState, mode: modeInitialState, hoveredTarget: hoveredTargetInitialState, @@ -153,6 +155,7 @@ const guiReducer = combineReducers({ colorPicker: colorPickerReducer, connectionModal: connectionModalReducer, config: configReducer, + dynamicAssets: dynamicAssetsReducer, customProcedures: customProceduresReducer, editorTab: editorTabReducer, mode: modeReducer, From ac1b2f75ce1ff2532e61c58cb1ee875ae96f334c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 11 Jan 2026 04:40:32 +0000 Subject: [PATCH 150/521] fix(deps): update dependency scratch-l10n to v6.1.54 --- package-lock.json | 10 +++++----- packages/scratch-gui/package.json | 2 +- packages/scratch-vm/package.json | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6af89765cb4..964ce86c057 100644 --- a/package-lock.json +++ b/package-lock.json @@ -34418,9 +34418,9 @@ } }, "node_modules/scratch-l10n": { - "version": "6.1.53", - "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-6.1.53.tgz", - "integrity": "sha512-w8RanJEib8OLYPAMvhquqsbn3wBa9/IBOtDL103JmEQrEsYX896dqH7mQ8bKe4K5S4C/gByfZSX++kUF0NT62Q==", + "version": "6.1.54", + "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-6.1.54.tgz", + "integrity": "sha512-uoYAZ7Rxbl4IcdC2/ADktm8mHvDQ4QMnFIq0XrnE5vUHwyeRVwc/FCuP9zYWqMLLCBrDWLpzce7FiaUNbrrvnw==", "license": "AGPL-3.0-only", "dependencies": { "@transifex/api": "7.1.5", @@ -41060,7 +41060,7 @@ "redux-throttle": "0.1.1", "scratch-audio": "2.0.268", "scratch-blocks": "1.3.0", - "scratch-l10n": "6.1.53", + "scratch-l10n": "6.1.54", "scratch-paint": "4.1.46", "scratch-render-fonts": "1.0.252", "scratch-storage": "5.0.10", @@ -41420,7 +41420,7 @@ "jsdoc": "3.6.11", "pngjs": "3.4.0", "scratch-blocks": "1.3.0", - "scratch-l10n": "6.1.53", + "scratch-l10n": "6.1.54", "scratch-render-fonts": "1.0.252", "scratch-semantic-release-config": "4.0.0", "scratch-webpack-configuration": "3.1.0", diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index 5a13c2aefb1..5ffcb7c2655 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -117,7 +117,7 @@ "redux-throttle": "0.1.1", "scratch-audio": "2.0.268", "scratch-blocks": "1.3.0", - "scratch-l10n": "6.1.53", + "scratch-l10n": "6.1.54", "scratch-paint": "4.1.46", "scratch-render-fonts": "1.0.252", "scratch-storage": "5.0.10", diff --git a/packages/scratch-vm/package.json b/packages/scratch-vm/package.json index d54250b5faa..03528dd845c 100644 --- a/packages/scratch-vm/package.json +++ b/packages/scratch-vm/package.json @@ -94,7 +94,7 @@ "jsdoc": "3.6.11", "pngjs": "3.4.0", "scratch-blocks": "1.3.0", - "scratch-l10n": "6.1.53", + "scratch-l10n": "6.1.54", "scratch-render-fonts": "1.0.252", "scratch-semantic-release-config": "4.0.0", "scratch-webpack-configuration": "3.1.0", From 74bbbc2c3dfa319211f98c9335c3e9fa206d0090 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 11 Jan 2026 12:48:10 +0000 Subject: [PATCH 151/521] fix(deps): update dependency scratch-paint to v4.1.47 --- package-lock.json | 8 ++++---- packages/scratch-gui/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 964ce86c057..001943c7119 100644 --- a/package-lock.json +++ b/package-lock.json @@ -34459,9 +34459,9 @@ } }, "node_modules/scratch-paint": { - "version": "4.1.46", - "resolved": "https://registry.npmjs.org/scratch-paint/-/scratch-paint-4.1.46.tgz", - "integrity": "sha512-DXVy9aRCLiJl5CVALP8YF5hYQ+E87SrNMi+y3Exzof1PDftuUr4lbTaGWDAE2VtFhWVnyW0efxyq83PJC6j3iw==", + "version": "4.1.47", + "resolved": "https://registry.npmjs.org/scratch-paint/-/scratch-paint-4.1.47.tgz", + "integrity": "sha512-zgZF937khXPalnQI8vvUYSAyBH0WJdPb02/d5s5aJ2AAm7ZucFZeNwzSU4CIGHJ/EAQ9Ak51xwSiBltHwLkb6A==", "license": "AGPL-3.0-only", "dependencies": { "@scratch/paper": "^0.11.20221201200345", @@ -41061,7 +41061,7 @@ "scratch-audio": "2.0.268", "scratch-blocks": "1.3.0", "scratch-l10n": "6.1.54", - "scratch-paint": "4.1.46", + "scratch-paint": "4.1.47", "scratch-render-fonts": "1.0.252", "scratch-storage": "5.0.10", "startaudiocontext": "1.2.1", diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index 5ffcb7c2655..65365548c67 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -118,7 +118,7 @@ "scratch-audio": "2.0.268", "scratch-blocks": "1.3.0", "scratch-l10n": "6.1.54", - "scratch-paint": "4.1.46", + "scratch-paint": "4.1.47", "scratch-render-fonts": "1.0.252", "scratch-storage": "5.0.10", "startaudiocontext": "1.2.1", From df46e7cb1caf37dcd9f4351abb84ebf1c58e84e3 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 12 Jan 2026 01:30:34 +0000 Subject: [PATCH 152/521] style(deps): update dependency eslint-config-scratch to v12.0.43 --- package-lock.json | 97 ++++++++++++++++------ packages/scratch-gui/package.json | 2 +- packages/scratch-render/package.json | 2 +- packages/scratch-svg-renderer/package.json | 2 +- packages/scratch-vm/package.json | 2 +- packages/task-herder/package.json | 2 +- 6 files changed, 76 insertions(+), 31 deletions(-) diff --git a/package-lock.json b/package-lock.json index 001943c7119..bf5e5fff4bb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2558,22 +2558,36 @@ } }, "node_modules/@es-joy/jsdoccomment": { - "version": "0.76.0", - "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.76.0.tgz", - "integrity": "sha512-g+RihtzFgGTx2WYCuTHbdOXJeAlGnROws0TeALx9ow/ZmOROOZkVg5wp/B44n0WJgI4SQFP1eWM2iRPlU2Y14w==", + "version": "0.78.0", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.78.0.tgz", + "integrity": "sha512-rQkU5u8hNAq2NVRzHnIUUvR6arbO0b6AOlvpTNS48CkiKSn/xtNfOzBK23JE4SiW89DgvU7GtxLVgV4Vn2HBAw==", "dev": true, "license": "MIT", "dependencies": { "@types/estree": "^1.0.8", - "@typescript-eslint/types": "^8.46.0", + "@typescript-eslint/types": "^8.46.4", "comment-parser": "1.4.1", "esquery": "^1.6.0", - "jsdoc-type-pratt-parser": "~6.10.0" + "jsdoc-type-pratt-parser": "~7.0.0" }, "engines": { "node": ">=20.11.0" } }, + "node_modules/@es-joy/jsdoccomment/node_modules/@typescript-eslint/types": { + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.52.0.tgz", + "integrity": "sha512-LWQV1V4q9V4cT4H5JCIx3481iIFxH1UkVk+ZkGGAV1ZGcjGI9IoFOfg3O6ywz8QqCDEp7Inlg6kovMofsNRaGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "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", @@ -16450,9 +16464,9 @@ } }, "node_modules/eslint-config-scratch": { - "version": "12.0.42", - "resolved": "https://registry.npmjs.org/eslint-config-scratch/-/eslint-config-scratch-12.0.42.tgz", - "integrity": "sha512-NzR9un8YCHSb0W7TOrmcMCDPI8LlDRD+nYTB6cvC4/wFVuyqEiTfQ+P9b4VgJqdEzukDAPz5ildCdF6eBQcQEw==", + "version": "12.0.43", + "resolved": "https://registry.npmjs.org/eslint-config-scratch/-/eslint-config-scratch-12.0.43.tgz", + "integrity": "sha512-IzFk3Q6IGuSkqSeU44pHS6Jzt7JQTjYIILTbieFbZ1/KkPevlkLMyA5MBvP2KZaPqNRZ+12o2lFtitCnf/k3WQ==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -16467,7 +16481,7 @@ "eslint-plugin-formatjs": "5.4.2", "eslint-plugin-html": "8.1.3", "eslint-plugin-import": "2.32.0", - "eslint-plugin-jsdoc": "61.5.0", + "eslint-plugin-jsdoc": "61.7.1", "eslint-plugin-jsx-a11y": "6.10.2", "eslint-plugin-react": "7.37.5", "eslint-plugin-react-hooks": "7.0.1", @@ -16732,20 +16746,20 @@ } }, "node_modules/eslint-plugin-jsdoc": { - "version": "61.5.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-61.5.0.tgz", - "integrity": "sha512-PR81eOGq4S7diVnV9xzFSBE4CDENRQGP0Lckkek8AdHtbj+6Bm0cItwlFnxsLFriJHspiE3mpu8U20eODyToIg==", + "version": "61.7.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-61.7.1.tgz", + "integrity": "sha512-36DpldF95MlTX//n3/naULFVt8d1cV4jmSkx7ZKrE9ikkKHAgMLesuWp1SmwpVwAs5ndIM6abKd6PeOYZUgdWg==", "dev": true, "license": "BSD-3-Clause", "dependencies": { - "@es-joy/jsdoccomment": "~0.76.0", + "@es-joy/jsdoccomment": "~0.78.0", "@es-joy/resolve.exports": "1.2.0", "are-docs-informative": "^0.0.2", "comment-parser": "1.4.1", "debug": "^4.4.3", "escape-string-regexp": "^4.0.0", - "espree": "^10.4.0", - "esquery": "^1.6.0", + "espree": "^11.0.0", + "esquery": "^1.7.0", "html-entities": "^2.6.0", "object-deep-merge": "^2.0.0", "parse-imports-exports": "^0.2.4", @@ -16760,6 +16774,37 @@ "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" } }, + "node_modules/eslint-plugin-jsdoc/node_modules/eslint-visitor-keys": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.0.tgz", + "integrity": "sha512-A0XeIi7CXU7nPlfHS9loMYEKxUaONu/hTEzHTGba9Huu94Cq1hPivf+DE5erJozZOky0LfvXAyrV/tcswpLI0Q==", + "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.0.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-11.0.0.tgz", + "integrity": "sha512-+gMeWRrIh/NsG+3NaLeWHuyeyk70p2tbvZIWBYcqQ4/7Xvars6GYTZNhF1sIeLcc6Wb11He5ffz3hsHyXFrw5A==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/eslint-plugin-jsdoc/node_modules/semver": { "version": "7.7.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", @@ -17034,9 +17079,9 @@ } }, "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "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": { @@ -23887,9 +23932,9 @@ } }, "node_modules/jsdoc-type-pratt-parser": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-6.10.0.tgz", - "integrity": "sha512-+LexoTRyYui5iOhJGn13N9ZazL23nAHGkXsa1p/C8yeq79WRfLBag6ZZ0FQG2aRoc9yfo59JT9EYCQonOkHKkQ==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-7.0.0.tgz", + "integrity": "sha512-c7YbokssPOSHmqTbSAmTtnVgAVa/7lumWNYqomgd5KOMyPrRve2anx6lonfOsXEQacqF9FKVUj7bLg4vRSvdYA==", "dev": true, "license": "MIT", "engines": { @@ -41089,7 +41134,7 @@ "cheerio": "1.1.2", "cross-env": "7.0.3", "eslint": "9.39.2", - "eslint-config-scratch": "12.0.42", + "eslint-config-scratch": "12.0.43", "eslint-import-resolver-webpack": "0.13.10", "eslint-plugin-import": "2.32.0", "eslint-plugin-react": "7.37.5", @@ -41154,7 +41199,7 @@ "copy-webpack-plugin": "6.4.1", "docdash": "0.4.0", "eslint": "9.39.2", - "eslint-config-scratch": "12.0.42", + "eslint-config-scratch": "12.0.43", "gh-pages": "1.2.0", "globals": "16.5.0", "html-webpack-plugin": "5.6.5", @@ -41321,7 +41366,7 @@ "babel-loader": "9.2.1", "copy-webpack-plugin": "6.4.1", "eslint": "9.39.2", - "eslint-config-scratch": "12.0.42", + "eslint-config-scratch": "12.0.43", "globals": "16.5.0", "jsdom": "13.2.0", "mkdirp": "2.1.6", @@ -41410,7 +41455,7 @@ "copy-webpack-plugin": "6.4.1", "docdash": "1.2.0", "eslint": "9.39.2", - "eslint-config-scratch": "12.0.42", + "eslint-config-scratch": "12.0.43", "expose-loader": "1.0.3", "file-loader": "6.2.0", "format-message-cli": "6.2.4", @@ -41567,7 +41612,7 @@ "devDependencies": { "@vitest/coverage-v8": "4.0.16", "eslint": "9.39.2", - "eslint-config-scratch": "12.0.42", + "eslint-config-scratch": "12.0.43", "prettier": "3.7.4", "rimraf": "6.1.2", "typescript": "5.9.3", diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index 65365548c67..53071db954a 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -152,7 +152,7 @@ "cheerio": "1.1.2", "cross-env": "7.0.3", "eslint": "9.39.2", - "eslint-config-scratch": "12.0.42", + "eslint-config-scratch": "12.0.43", "eslint-import-resolver-webpack": "0.13.10", "eslint-plugin-import": "2.32.0", "eslint-plugin-react": "7.37.5", diff --git a/packages/scratch-render/package.json b/packages/scratch-render/package.json index f7629cd1808..4d8e1c80b78 100644 --- a/packages/scratch-render/package.json +++ b/packages/scratch-render/package.json @@ -67,7 +67,7 @@ "copy-webpack-plugin": "6.4.1", "docdash": "0.4.0", "eslint": "9.39.2", - "eslint-config-scratch": "12.0.42", + "eslint-config-scratch": "12.0.43", "gh-pages": "1.2.0", "globals": "16.5.0", "html-webpack-plugin": "5.6.5", diff --git a/packages/scratch-svg-renderer/package.json b/packages/scratch-svg-renderer/package.json index 804597f6be6..3cddf81d7c4 100644 --- a/packages/scratch-svg-renderer/package.json +++ b/packages/scratch-svg-renderer/package.json @@ -53,7 +53,7 @@ "babel-loader": "9.2.1", "copy-webpack-plugin": "6.4.1", "eslint": "9.39.2", - "eslint-config-scratch": "12.0.42", + "eslint-config-scratch": "12.0.43", "globals": "16.5.0", "jsdom": "13.2.0", "mkdirp": "2.1.6", diff --git a/packages/scratch-vm/package.json b/packages/scratch-vm/package.json index 03528dd845c..9ed28a03163 100644 --- a/packages/scratch-vm/package.json +++ b/packages/scratch-vm/package.json @@ -84,7 +84,7 @@ "copy-webpack-plugin": "6.4.1", "docdash": "1.2.0", "eslint": "9.39.2", - "eslint-config-scratch": "12.0.42", + "eslint-config-scratch": "12.0.43", "expose-loader": "1.0.3", "file-loader": "6.2.0", "format-message-cli": "6.2.4", diff --git a/packages/task-herder/package.json b/packages/task-herder/package.json index 6676edabbc5..25019101225 100644 --- a/packages/task-herder/package.json +++ b/packages/task-herder/package.json @@ -39,7 +39,7 @@ "devDependencies": { "@vitest/coverage-v8": "4.0.16", "eslint": "9.39.2", - "eslint-config-scratch": "12.0.42", + "eslint-config-scratch": "12.0.43", "prettier": "3.7.4", "rimraf": "6.1.2", "typescript": "5.9.3", From 03ce25a540982bc10471aae7e6decb1a22b0ea36 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 12 Jan 2026 04:55:25 +0000 Subject: [PATCH 153/521] chore(deps): update dependency vite to v7.3.1 --- package-lock.json | 8 ++++---- packages/task-herder/package.json | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index bf5e5fff4bb..cfff18bddbe 100644 --- a/package-lock.json +++ b/package-lock.json @@ -39759,9 +39759,9 @@ }, "node_modules/vite": { "name": "rolldown-vite", - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/rolldown-vite/-/rolldown-vite-7.3.0.tgz", - "integrity": "sha512-5hI5NCJwKBGtzWtdKB3c2fOEpI77Iaa0z4mSzZPU1cJ/OqrGbFafm90edVCd7T9Snz+Sh09TMAv4EQqyVLzuEg==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/rolldown-vite/-/rolldown-vite-7.3.1.tgz", + "integrity": "sha512-LYzdNAjRHhF2yA4JUQm/QyARyi216N2rpJ0lJZb8E9FU2y5v6Vk+xq/U4XBOxMefpWixT5H3TslmAHm1rqIq2w==", "dev": true, "license": "MIT", "dependencies": { @@ -41617,7 +41617,7 @@ "rimraf": "6.1.2", "typescript": "5.9.3", "unplugin-dts": "1.0.0-beta.6", - "vite": "npm:rolldown-vite@7.3.0", + "vite": "npm:rolldown-vite@7.3.1", "vitest": "4.0.16" } }, diff --git a/packages/task-herder/package.json b/packages/task-herder/package.json index 25019101225..928af12f694 100644 --- a/packages/task-herder/package.json +++ b/packages/task-herder/package.json @@ -44,10 +44,10 @@ "rimraf": "6.1.2", "typescript": "5.9.3", "unplugin-dts": "1.0.0-beta.6", - "vite": "npm:rolldown-vite@7.3.0", + "vite": "npm:rolldown-vite@7.3.1", "vitest": "4.0.16" }, "overrides": { - "vite": "npm:rolldown-vite@7.3.0" + "vite": "npm:rolldown-vite@7.3.1" } } From d39e4c023ca30af7fffcc4defb6545373e886354 Mon Sep 17 00:00:00 2001 From: Eric Rosenbaum Date: Tue, 13 Jan 2026 16:33:44 -0500 Subject: [PATCH 154/521] update amon sprite and costume --- packages/scratch-gui/src/lib/libraries/costumes.json | 4 ++-- packages/scratch-gui/src/lib/libraries/sprites.json | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/scratch-gui/src/lib/libraries/costumes.json b/packages/scratch-gui/src/lib/libraries/costumes.json index 6abccd68ac6..bb664d982a6 100644 --- a/packages/scratch-gui/src/lib/libraries/costumes.json +++ b/packages/scratch-gui/src/lib/libraries/costumes.json @@ -61,10 +61,10 @@ "people", "dance" ], - "assetId": "60f720956ab1840431dcf0616ce98f14", + "assetId": "872afcf45d64e0ee18d26e10a87ba031", "bitmapResolution": 2, "dataFormat": "png", - "md5ext": "60f720956ab1840431dcf0616ce98f14.png", + "md5ext": "872afcf45d64e0ee18d26e10a87ba031.png", "rotationCenterX": 174, "rotationCenterY": 162 }, diff --git a/packages/scratch-gui/src/lib/libraries/sprites.json b/packages/scratch-gui/src/lib/libraries/sprites.json index be4cb21fa8d..eaad204f08f 100644 --- a/packages/scratch-gui/src/lib/libraries/sprites.json +++ b/packages/scratch-gui/src/lib/libraries/sprites.json @@ -69,10 +69,10 @@ "variables": {}, "costumes": [ { - "assetId": "60f720956ab1840431dcf0616ce98f14", + "assetId": "872afcf45d64e0ee18d26e10a87ba031", "name": "amon", "bitmapResolution": 2, - "md5ext": "60f720956ab1840431dcf0616ce98f14.png", + "md5ext": "872afcf45d64e0ee18d26e10a87ba031.png", "dataFormat": "png", "rotationCenterX": 174, "rotationCenterY": 162 From f7c064e4450380749b2f9551db6150caba183f2b Mon Sep 17 00:00:00 2001 From: Ayshe Dzhindzhi Date: Wed, 14 Jan 2026 11:37:57 +0200 Subject: [PATCH 155/521] fix: move margin to the wrapper class for author info as well --- packages/scratch-gui/src/components/menu-bar/author-info.css | 2 +- packages/scratch-gui/src/components/menu-bar/author-info.jsx | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/scratch-gui/src/components/menu-bar/author-info.css b/packages/scratch-gui/src/components/menu-bar/author-info.css index 7bb69308c7a..ee04da0934b 100644 --- a/packages/scratch-gui/src/components/menu-bar/author-info.css +++ b/packages/scratch-gui/src/components/menu-bar/author-info.css @@ -10,7 +10,7 @@ cursor: default; } -.avatar { +.avatar-wrapper { margin-right: .5625rem; } diff --git a/packages/scratch-gui/src/components/menu-bar/author-info.jsx b/packages/scratch-gui/src/components/menu-bar/author-info.jsx index 4c769297bed..c8058db7c8b 100644 --- a/packages/scratch-gui/src/components/menu-bar/author-info.jsx +++ b/packages/scratch-gui/src/components/menu-bar/author-info.jsx @@ -25,6 +25,7 @@ const AuthorInfo = ({ className={styles.avatar} imageUrl={imageUrl} showAvatarBadge={!!avatarBadge} + wrapperClassName={styles.avatarWrapper} />
From a2d051b1f11c7696c638b100acb71f9dc8502f0d Mon Sep 17 00:00:00 2001 From: Ayshe Dzhindzhi Date: Wed, 14 Jan 2026 17:55:43 +0200 Subject: [PATCH 156/521] feat: allow keyboard navigation in library modals --- .../extension-button/extension-button.css | 4 + .../extension-button/extension-button.jsx | 9 +- .../src/components/filter/filter.css | 3 + .../src/components/filter/filter.jsx | 31 +- .../scratch-gui/src/components/gui/gui.jsx | 541 +++++++++--------- .../components/library-item/library-item.jsx | 11 +- .../src/components/library/library.jsx | 9 + .../src/components/tag-button/tag-button.css | 9 + .../src/containers/costume-tab.jsx | 5 + .../src/containers/library-item.jsx | 33 +- .../scratch-gui/src/containers/sound-tab.jsx | 14 +- .../src/containers/stage-selector.jsx | 5 + .../src/containers/target-pane.jsx | 5 + .../src/contexts/modal-focus-context.jsx | 50 ++ .../scratch-gui/src/lib/navigation-keys.js | 10 + 15 files changed, 456 insertions(+), 283 deletions(-) create mode 100644 packages/scratch-gui/src/contexts/modal-focus-context.jsx create mode 100644 packages/scratch-gui/src/lib/navigation-keys.js diff --git a/packages/scratch-gui/src/components/extension-button/extension-button.css b/packages/scratch-gui/src/components/extension-button/extension-button.css index 7c8f5b2d41e..a5d738c67c8 100644 --- a/packages/scratch-gui/src/components/extension-button/extension-button.css +++ b/packages/scratch-gui/src/components/extension-button/extension-button.css @@ -39,6 +39,10 @@ $fade-out-distance: 15px; --radiate-color: 133, 92, 214; /* $looks-secondary */ } +.extension-button:focus-visible { + outline: revert; +} + .extension-button-icon { width: 1.75rem; height: 1.75rem; diff --git a/packages/scratch-gui/src/components/extension-button/extension-button.jsx b/packages/scratch-gui/src/components/extension-button/extension-button.jsx index 51d8ab46532..7b0051fad2d 100644 --- a/packages/scratch-gui/src/components/extension-button/extension-button.jsx +++ b/packages/scratch-gui/src/components/extension-button/extension-button.jsx @@ -1,4 +1,4 @@ -import React, {useEffect, useCallback, useState, useRef} from 'react'; +import React, {useEffect, useCallback, useState, useRef, useContext} from 'react'; import classNames from 'classnames'; // eslint-disable-next-line import/no-unresolved import {driver} from 'driver.js'; @@ -13,6 +13,7 @@ import {getLocalStorageValue, setLocalStorageValue} from '../../lib/local-storag import addExtensionIcon from '../gui/icon--extensions.svg'; import styles from './extension-button.css'; import './extension-button.raw.css'; +import {ModalFocusContext} from '../../contexts/modal-focus-context.jsx'; const messages = defineMessages({ addExtension: { @@ -62,6 +63,8 @@ const ExtensionButton = props => { } = props; const driverRef = useRef(null); + const {captureFocus} = useContext(ModalFocusContext); + // Keep in a state to avoid reads from localStorage on every render. const [shouldShowFaceSensingCallouts, setShouldShowFaceSensingCallouts] = useState(showNewFeatureCallouts && !hasIntroducedFaceSensing(username) && !hasUsedFaceSensing(username)); @@ -135,8 +138,10 @@ const ExtensionButton = props => { setHasIntroducedFaceSensing(username); setShouldShowFaceSensingCallouts(false); } + + captureFocus(); onExtensionButtonClick?.(); - }, [shouldShowFaceSensingCallouts]); + }, [shouldShowFaceSensingCallouts, captureFocus, onExtensionButtonClick, username]); return ( diff --git a/packages/scratch-gui/src/components/filter/filter.css b/packages/scratch-gui/src/components/filter/filter.css index ad8ed36f4db..ef2b053c718 100644 --- a/packages/scratch-gui/src/components/filter/filter.css +++ b/packages/scratch-gui/src/components/filter/filter.css @@ -59,6 +59,9 @@ pointer-events: none; cursor: default; transition: opacity 0.05s linear; + + border: none; + background: none; } [dir="ltr"] .x-icon-wrapper { diff --git a/packages/scratch-gui/src/components/filter/filter.jsx b/packages/scratch-gui/src/components/filter/filter.jsx index ab58e99f712..c8da521bb38 100644 --- a/packages/scratch-gui/src/components/filter/filter.jsx +++ b/packages/scratch-gui/src/components/filter/filter.jsx @@ -1,10 +1,17 @@ import classNames from 'classnames'; import PropTypes from 'prop-types'; -import React from 'react'; +import React, {useCallback, useRef} from 'react'; import filterIcon from './icon--filter.svg'; import xIcon from './icon--x.svg'; import styles from './filter.css'; +import {defineMessage, useIntl} from 'react-intl'; + +const ariaLabel = defineMessage({ + id: 'gui.aria.clearButton', + defaultMessage: 'Clear', + description: 'ARIA label for the clear input button' +}); const FilterComponent = props => { const { @@ -15,6 +22,18 @@ const FilterComponent = props => { filterQuery, inputClassName } = props; + const intl = useIntl(); + const inputRef = useRef(null); + + const handleClear = useCallback(e => { + onClear(e); + + // Return focus to the input after clearing + if (inputRef?.current) { + inputRef.current.focus(); + } + }, [onClear]); + return (
{ src={filterIcon} /> -
0 ? 0 : -1} > -
+
); }; diff --git a/packages/scratch-gui/src/components/gui/gui.jsx b/packages/scratch-gui/src/components/gui/gui.jsx index 757b9b24297..708d8ddb00c 100644 --- a/packages/scratch-gui/src/components/gui/gui.jsx +++ b/packages/scratch-gui/src/components/gui/gui.jsx @@ -46,6 +46,7 @@ import DebugModal from '../debug-modal/debug-modal.jsx'; import {setPlatform} from '../../reducers/platform.js'; import {setTheme} from '../../reducers/settings.js'; import {PLATFORM} from '../../lib/platform.js'; +import {ModalFocusProvider} from '../../contexts/modal-focus-context.jsx'; const ariaMessages = defineMessages({ menuBar: { @@ -271,300 +272,302 @@ const GUIComponent = props => { ) : null} ) : ( - - {telemetryModalVisible ? ( - - ) : null} - {loading ? ( - - ) : null} - {isCreating ? ( - - ) : null} - {isRendererSupported ? null : ( - - )} - {tipsLibraryVisible ? ( - - ) : null} - {cardsVisible ? ( - - ) : null} - {alertsVisible ? ( - - ) : null} - {connectionModalVisible ? ( - - ) : null} - {costumeLibraryVisible ? ( - - ) : null} - {} - {backdropLibraryVisible ? ( - - ) : null} - {!menuBarHidden && } - - - + + {telemetryModalVisible ? ( + + ) : null} + {loading ? ( + + ) : null} + {isCreating ? ( + + ) : null} + {isRendererSupported ? null : ( + + )} + {tipsLibraryVisible ? ( + + ) : null} + {cardsVisible ? ( + + ) : null} + {alertsVisible ? ( + + ) : null} + {connectionModalVisible ? ( + + ) : null} + {costumeLibraryVisible ? ( + + ) : null} + {} + {backdropLibraryVisible ? ( + + ) : null} + {!menuBarHidden && } + + - - - - - - - - - {targetIsStage ? ( + + + + + + {targetIsStage ? ( + + ) : ( + + )} + + + - ) : ( - )} - - + + + + - - - - - - - - + - - - - - - - - {costumesTabVisible ? : null} - - - {soundsTabVisible ? - + + + + + {costumesTabVisible ? : null} - - - {backpackVisible ? ( - - ) : null} - + + + {soundsTabVisible ? + : null} + + + {backpackVisible ? ( + + ) : null} + - - - + + + + - -
+ ); }}); }; diff --git a/packages/scratch-gui/src/components/library-item/library-item.jsx b/packages/scratch-gui/src/components/library-item/library-item.jsx index 93163c8690a..d8cec7953cd 100644 --- a/packages/scratch-gui/src/components/library-item/library-item.jsx +++ b/packages/scratch-gui/src/components/library-item/library-item.jsx @@ -58,7 +58,14 @@ class LibraryItemComponent extends React.PureComponent { this.props.hidden ? styles.hidden : null, this.props.showItemCallout ? styles.radiate : null )} + role="button" + tabIndex={0} onClick={this.props.onClick} + onKeyDown={this.props.onKeyDown} + // onFocus and onBlur are currently unused for extensions, + // but are included for potential future use + onBlur={this.props.onBlur} + onFocus={this.props.onFocus} >
@@ -152,7 +159,7 @@ class LibraryItemComponent extends React.PureComponent { onBlur={this.props.onBlur} onClick={this.props.onClick} onFocus={this.props.onFocus} - onKeyPress={this.props.onKeyPress} + onKeyDown={this.props.onKeyDown} onMouseEnter={this.props.showPlayButton ? null : this.props.onMouseEnter} onMouseLeave={this.props.showPlayButton ? null : this.props.onMouseLeave} > @@ -202,7 +209,7 @@ LibraryItemComponent.propTypes = { onBlur: PropTypes.func.isRequired, onClick: PropTypes.func.isRequired, onFocus: PropTypes.func.isRequired, - onKeyPress: PropTypes.func.isRequired, + onKeyDown: PropTypes.func.isRequired, onMouseEnter: PropTypes.func.isRequired, onMouseLeave: PropTypes.func.isRequired, onPlay: PropTypes.func.isRequired, diff --git a/packages/scratch-gui/src/components/library/library.jsx b/packages/scratch-gui/src/components/library/library.jsx index d20526cd01e..2184ccd9c97 100644 --- a/packages/scratch-gui/src/components/library/library.jsx +++ b/packages/scratch-gui/src/components/library/library.jsx @@ -19,6 +19,7 @@ import {CATEGORIES} from '../../../src/lib/libraries/decks/index.jsx'; import {getLocalStorageValue, setLocalStorageValue} from '../../lib/local-storage.js'; import styles from './library.css'; +import {ModalFocusContext} from '../../contexts/modal-focus-context.jsx'; const localStorageAvailable = 'localStorage' in window && window.localStorage !== null; @@ -218,6 +219,9 @@ class LibraryComponent extends React.Component { this.filteredDataRef.removeEventListener('scroll', this.handleScroll); } + + static contextType = ModalFocusContext; + handleScroll () { if (this.animationFrameId) return; @@ -248,6 +252,7 @@ class LibraryComponent extends React.Component { } handleClose () { this.props.onRequestClose(); + this.context.restoreFocus(); } handleTagClick (tag) { if (this.state.playingItem === null) { @@ -402,6 +407,10 @@ class LibraryComponent extends React.Component {
)); } render () { + // TODO: Should the close button be focused first or last when the modal opens? + // Focusing it first helps users quickly close the modal if opened by mistake. + // It's also at the top left, being the first element that will be read by screen readers. + // However, users can always close the modal with ESC as well. return (
-
+ ) : ( { + const onFirstInteraction = e => { const isExtensionItemVisible = document.getElementById('faceSensing'); if (!isExtensionItemVisible) return; + if (e.type === 'keydown') { + // Prevent focus from jumping to the next element in the tab order after keydown finishes + e.preventDefault(); + } + const tooltip = driver({ allowClose: false, allowInteraction: true, overlayColor: 'transparent', popoverOffset: -2, steps: [{ - element: 'div[id="faceSensing"]', + element: 'button[id="faceSensing"]', popover: { description: this.props.intl.formatMessage(messages.faceSensingModalCallout), side: 'left', @@ -201,9 +206,15 @@ class LibraryComponent extends React.Component { this.driver = tooltip; tooltip.drive(); + + // Make sure to clean up event listeners after first interaction + window.removeEventListener('click', onFirstInteraction); + window.removeEventListener('keydown', onFirstInteraction); }; - window.addEventListener('click', onFirstClick, {once: true}); + window.addEventListener('click', onFirstInteraction, {once: true}); + window.addEventListener('keydown', onFirstInteraction, {once: true}); + this.filteredDataRef.addEventListener('scroll', this.handleScroll); } } @@ -407,10 +418,6 @@ class LibraryComponent extends React.Component {
)); } render () { - // TODO: Should the close button be focused first or last when the modal opens? - // Focusing it first helps users quickly close the modal if opened by mistake. - // It's also at the top left, being the first element that will be read by screen readers. - // However, users can always close the modal with ESC as well. return ( Date: Thu, 15 Jan 2026 15:11:58 +0200 Subject: [PATCH 160/521] fix: audio context not initialized though keyboard navigation --- packages/scratch-gui/src/lib/audio/shared-audio-context.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/scratch-gui/src/lib/audio/shared-audio-context.js b/packages/scratch-gui/src/lib/audio/shared-audio-context.js index 3118a324401..2fe235419a2 100644 --- a/packages/scratch-gui/src/lib/audio/shared-audio-context.js +++ b/packages/scratch-gui/src/lib/audio/shared-audio-context.js @@ -10,6 +10,7 @@ if (!bowser.msie) { const initAudioContext = () => { document.removeEventListener('mousedown', initAudioContext); document.removeEventListener('touchstart', initAudioContext); + document.removeEventListener('keydown', initAudioContext); if (AUDIO_CONTEXT) return; AUDIO_CONTEXT = new (window.AudioContext || @@ -18,6 +19,7 @@ if (!bowser.msie) { }; document.addEventListener('mousedown', initAudioContext); document.addEventListener('touchstart', initAudioContext); + document.addEventListener('keydown', initAudioContext); } /** From 178d4864ca6cea02a4110a4357b8b0b648d5cafd Mon Sep 17 00:00:00 2001 From: Ayshe Dzhindzhi Date: Thu, 15 Jan 2026 15:17:59 +0200 Subject: [PATCH 161/521] fix: clean up the event listeners before doing anything else --- .../src/components/extension-button/extension-button.jsx | 8 ++++---- packages/scratch-gui/src/components/library/library.jsx | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/scratch-gui/src/components/extension-button/extension-button.jsx b/packages/scratch-gui/src/components/extension-button/extension-button.jsx index 448f5ea1258..df8ff4a502f 100644 --- a/packages/scratch-gui/src/components/extension-button/extension-button.jsx +++ b/packages/scratch-gui/src/components/extension-button/extension-button.jsx @@ -74,6 +74,10 @@ const ExtensionButton = props => { if (!shouldShowFaceSensingCallouts) return; const onFirstInteraction = e => { + // Make sure to clean up event listeners after first interaction + window.removeEventListener('click', onFirstInteraction); + window.removeEventListener('keydown', onFirstInteraction); + const isExtensionButtonVisible = document.querySelector('div[class*="extension-button-container"]'); if (!isExtensionButtonVisible) return; @@ -102,10 +106,6 @@ const ExtensionButton = props => { setClicked(true); driverRef.current = tooltip; tooltip.drive(); - - // Make sure to clean up event listeners after first interaction - window.removeEventListener('click', onFirstInteraction); - window.removeEventListener('keydown', onFirstInteraction); }; window.addEventListener('click', onFirstInteraction, {once: true}); diff --git a/packages/scratch-gui/src/components/library/library.jsx b/packages/scratch-gui/src/components/library/library.jsx index 9b6990b0b73..341f7c75228 100644 --- a/packages/scratch-gui/src/components/library/library.jsx +++ b/packages/scratch-gui/src/components/library/library.jsx @@ -179,6 +179,10 @@ class LibraryComponent extends React.Component { // We need to create the driver when the content is loaded for the target element to exist if (!prevState.loaded && this.state.loaded && this.state.shouldShowFaceSensingCallout) { const onFirstInteraction = e => { + // Make sure to clean up event listeners after first interaction + window.removeEventListener('click', onFirstInteraction); + window.removeEventListener('keydown', onFirstInteraction); + const isExtensionItemVisible = document.getElementById('faceSensing'); if (!isExtensionItemVisible) return; @@ -206,10 +210,6 @@ class LibraryComponent extends React.Component { this.driver = tooltip; tooltip.drive(); - - // Make sure to clean up event listeners after first interaction - window.removeEventListener('click', onFirstInteraction); - window.removeEventListener('keydown', onFirstInteraction); }; window.addEventListener('click', onFirstInteraction, {once: true}); From 3971c8cc046dc23e208d01fa3d49305e1f60f2fd Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 15 Jan 2026 14:39:41 +0000 Subject: [PATCH 162/521] chore(deps): update vitest monorepo to v4.0.17 --- package-lock.json | 133 ++++++++++++------------------ packages/task-herder/package.json | 4 +- 2 files changed, 55 insertions(+), 82 deletions(-) diff --git a/package-lock.json b/package-lock.json index cfff18bddbe..c289b02bdc4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10741,18 +10741,17 @@ "license": "BSD-3-Clause" }, "node_modules/@vitest/coverage-v8": { - "version": "4.0.16", - "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-4.0.16.tgz", - "integrity": "sha512-2rNdjEIsPRzsdu6/9Eq0AYAzYdpP6Bx9cje9tL3FE5XzXRQF1fNU9pe/1yE8fCrS0HD+fBtt6gLPh6LI57tX7A==", + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-4.0.17.tgz", + "integrity": "sha512-/6zU2FLGg0jsd+ePZcwHRy3+WpNTBBhDY56P4JTRqUN/Dp6CvOEa9HrikcQ4KfV2b2kAHUFB4dl1SuocWXSFEw==", "dev": true, "license": "MIT", "dependencies": { "@bcoe/v8-coverage": "^1.0.2", - "@vitest/utils": "4.0.16", - "ast-v8-to-istanbul": "^0.3.8", + "@vitest/utils": "4.0.17", + "ast-v8-to-istanbul": "^0.3.10", "istanbul-lib-coverage": "^3.2.2", "istanbul-lib-report": "^3.0.1", - "istanbul-lib-source-maps": "^5.0.6", "istanbul-reports": "^3.2.0", "magicast": "^0.5.1", "obug": "^2.1.1", @@ -10763,8 +10762,8 @@ "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "@vitest/browser": "4.0.16", - "vitest": "4.0.16" + "@vitest/browser": "4.0.17", + "vitest": "4.0.17" }, "peerDependenciesMeta": { "@vitest/browser": { @@ -10782,43 +10781,17 @@ "node": ">=18" } }, - "node_modules/@vitest/coverage-v8/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": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@vitest/coverage-v8/node_modules/istanbul-lib-source-maps": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", - "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.23", - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@vitest/expect": { - "version": "4.0.16", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.16.tgz", - "integrity": "sha512-eshqULT2It7McaJkQGLkPjPjNph+uevROGuIMJdG3V+0BSR2w9u6J9Lwu+E8cK5TETlfou8GRijhafIMhXsimA==", + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", + "integrity": "sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==", "dev": true, "license": "MIT", "dependencies": { "@standard-schema/spec": "^1.0.0", "@types/chai": "^5.2.2", - "@vitest/spy": "4.0.16", - "@vitest/utils": "4.0.16", + "@vitest/spy": "4.0.17", + "@vitest/utils": "4.0.17", "chai": "^6.2.1", "tinyrainbow": "^3.0.3" }, @@ -10827,13 +10800,13 @@ } }, "node_modules/@vitest/mocker": { - "version": "4.0.16", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.16.tgz", - "integrity": "sha512-yb6k4AZxJTB+q9ycAvsoxGn+j/po0UaPgajllBgt1PzoMAAmJGYFdDk0uCcRcxb3BrME34I6u8gHZTQlkqSZpg==", + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.17.tgz", + "integrity": "sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "4.0.16", + "@vitest/spy": "4.0.17", "estree-walker": "^3.0.3", "magic-string": "^0.30.21" }, @@ -10854,9 +10827,9 @@ } }, "node_modules/@vitest/pretty-format": { - "version": "4.0.16", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.16.tgz", - "integrity": "sha512-eNCYNsSty9xJKi/UdVD8Ou16alu7AYiS2fCPRs0b1OdhJiV89buAXQLpTbe+X8V9L6qrs9CqyvU7OaAopJYPsA==", + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", + "integrity": "sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==", "dev": true, "license": "MIT", "dependencies": { @@ -10867,13 +10840,13 @@ } }, "node_modules/@vitest/runner": { - "version": "4.0.16", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.16.tgz", - "integrity": "sha512-VWEDm5Wv9xEo80ctjORcTQRJ539EGPB3Pb9ApvVRAY1U/WkHXmmYISqU5E79uCwcW7xYUV38gwZD+RV755fu3Q==", + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.17.tgz", + "integrity": "sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "4.0.16", + "@vitest/utils": "4.0.17", "pathe": "^2.0.3" }, "funding": { @@ -10881,13 +10854,13 @@ } }, "node_modules/@vitest/snapshot": { - "version": "4.0.16", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.16.tgz", - "integrity": "sha512-sf6NcrYhYBsSYefxnry+DR8n3UV4xWZwWxYbCJUt2YdvtqzSPR7VfGrY0zsv090DAbjFZsi7ZaMi1KnSRyK1XA==", + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.17.tgz", + "integrity": "sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "4.0.16", + "@vitest/pretty-format": "4.0.17", "magic-string": "^0.30.21", "pathe": "^2.0.3" }, @@ -10896,9 +10869,9 @@ } }, "node_modules/@vitest/spy": { - "version": "4.0.16", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.16.tgz", - "integrity": "sha512-4jIOWjKP0ZUaEmJm00E0cOBLU+5WE0BpeNr3XN6TEF05ltro6NJqHWxXD0kA8/Zc8Nh23AT8WQxwNG+WeROupw==", + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.17.tgz", + "integrity": "sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==", "dev": true, "license": "MIT", "funding": { @@ -10906,13 +10879,13 @@ } }, "node_modules/@vitest/utils": { - "version": "4.0.16", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.16.tgz", - "integrity": "sha512-h8z9yYhV3e1LEfaQ3zdypIrnAg/9hguReGZoS7Gl0aBG5xgA410zBqECqmaF/+RkTggRsfnzc1XaAHA6bmUufA==", + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.17.tgz", + "integrity": "sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "4.0.16", + "@vitest/pretty-format": "4.0.17", "tinyrainbow": "^3.0.3" }, "funding": { @@ -11780,9 +11753,9 @@ "license": "MIT" }, "node_modules/ast-v8-to-istanbul": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-0.3.8.tgz", - "integrity": "sha512-szgSZqUxI5T8mLKvS7WTjF9is+MVbOeLADU73IseOcrqhxr/VAvy6wfoVE39KnKzA7JRhjF5eUagNlHwvZPlKQ==", + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-0.3.10.tgz", + "integrity": "sha512-p4K7vMz2ZSk3wN8l5o3y2bJAoZXT3VuJI5OLTATY/01CYWumWvwkUw0SqDBnNq6IiTO3qDa1eSQDibAV8g7XOQ==", "dev": true, "license": "MIT", "dependencies": { @@ -39866,19 +39839,19 @@ } }, "node_modules/vitest": { - "version": "4.0.16", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.16.tgz", - "integrity": "sha512-E4t7DJ9pESL6E3I8nFjPa4xGUd3PmiWDLsDztS2qXSJWfHtbQnwAWylaBvSNY48I3vr8PTqIZlyK8TE3V3CA4Q==", + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", + "integrity": "sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/expect": "4.0.16", - "@vitest/mocker": "4.0.16", - "@vitest/pretty-format": "4.0.16", - "@vitest/runner": "4.0.16", - "@vitest/snapshot": "4.0.16", - "@vitest/spy": "4.0.16", - "@vitest/utils": "4.0.16", + "@vitest/expect": "4.0.17", + "@vitest/mocker": "4.0.17", + "@vitest/pretty-format": "4.0.17", + "@vitest/runner": "4.0.17", + "@vitest/snapshot": "4.0.17", + "@vitest/spy": "4.0.17", + "@vitest/utils": "4.0.17", "es-module-lexer": "^1.7.0", "expect-type": "^1.2.2", "magic-string": "^0.30.21", @@ -39906,10 +39879,10 @@ "@edge-runtime/vm": "*", "@opentelemetry/api": "^1.9.0", "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.0.16", - "@vitest/browser-preview": "4.0.16", - "@vitest/browser-webdriverio": "4.0.16", - "@vitest/ui": "4.0.16", + "@vitest/browser-playwright": "4.0.17", + "@vitest/browser-preview": "4.0.17", + "@vitest/browser-webdriverio": "4.0.17", + "@vitest/ui": "4.0.17", "happy-dom": "*", "jsdom": "*" }, @@ -41610,7 +41583,7 @@ "version": "12.3.1", "license": "AGPL-3.0-only", "devDependencies": { - "@vitest/coverage-v8": "4.0.16", + "@vitest/coverage-v8": "4.0.17", "eslint": "9.39.2", "eslint-config-scratch": "12.0.43", "prettier": "3.7.4", @@ -41618,7 +41591,7 @@ "typescript": "5.9.3", "unplugin-dts": "1.0.0-beta.6", "vite": "npm:rolldown-vite@7.3.1", - "vitest": "4.0.16" + "vitest": "4.0.17" } }, "packages/task-herder/node_modules/glob": { diff --git a/packages/task-herder/package.json b/packages/task-herder/package.json index 928af12f694..bb5c56d4ff8 100644 --- a/packages/task-herder/package.json +++ b/packages/task-herder/package.json @@ -37,7 +37,7 @@ "test": "npm run lint && vitest run --coverage" }, "devDependencies": { - "@vitest/coverage-v8": "4.0.16", + "@vitest/coverage-v8": "4.0.17", "eslint": "9.39.2", "eslint-config-scratch": "12.0.43", "prettier": "3.7.4", @@ -45,7 +45,7 @@ "typescript": "5.9.3", "unplugin-dts": "1.0.0-beta.6", "vite": "npm:rolldown-vite@7.3.1", - "vitest": "4.0.16" + "vitest": "4.0.17" }, "overrides": { "vite": "npm:rolldown-vite@7.3.1" From e0e3c1775dea02653b66cc44b954e677566a65ea Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 15 Jan 2026 17:27:37 +0000 Subject: [PATCH 163/521] chore(deps): update dependency webpack-dev-server to v5.2.3 --- package-lock.json | 362 +++++++++++++++++---- packages/scratch-gui/package.json | 2 +- packages/scratch-render/package.json | 2 +- packages/scratch-svg-renderer/package.json | 2 +- packages/scratch-vm/package.json | 2 +- 5 files changed, 306 insertions(+), 64 deletions(-) diff --git a/package-lock.json b/package-lock.json index c289b02bdc4..b065c6a5cb4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4581,6 +4581,19 @@ "node": ">=4.0" } }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -5198,6 +5211,165 @@ "url": "https://github.com/sponsors/Boshen" } }, + "node_modules/@peculiar/asn1-cms": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-cms/-/asn1-cms-2.6.0.tgz", + "integrity": "sha512-2uZqP+ggSncESeUF/9Su8rWqGclEfEiz1SyU02WX5fUONFfkjzS2Z/F1Li0ofSmf4JqYXIOdCAZqIXAIBAT1OA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.0", + "@peculiar/asn1-x509-attr": "^2.6.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-csr": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-csr/-/asn1-csr-2.6.0.tgz", + "integrity": "sha512-BeWIu5VpTIhfRysfEp73SGbwjjoLL/JWXhJ/9mo4vXnz3tRGm+NGm3KNcRzQ9VMVqwYS2RHlolz21svzRXIHPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-ecc": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-ecc/-/asn1-ecc-2.6.0.tgz", + "integrity": "sha512-FF3LMGq6SfAOwUG2sKpPXblibn6XnEIKa+SryvUl5Pik+WR9rmRA3OCiwz8R3lVXnYnyRkSZsSLdml8H3UiOcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-pfx": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pfx/-/asn1-pfx-2.6.0.tgz", + "integrity": "sha512-rtUvtf+tyKGgokHHmZzeUojRZJYPxoD/jaN1+VAB4kKR7tXrnDCA/RAWXAIhMJJC+7W27IIRGe9djvxKgsldCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-cms": "^2.6.0", + "@peculiar/asn1-pkcs8": "^2.6.0", + "@peculiar/asn1-rsa": "^2.6.0", + "@peculiar/asn1-schema": "^2.6.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-pkcs8": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs8/-/asn1-pkcs8-2.6.0.tgz", + "integrity": "sha512-KyQ4D8G/NrS7Fw3XCJrngxmjwO/3htnA0lL9gDICvEQ+GJ+EPFqldcJQTwPIdvx98Tua+WjkdKHSC0/Km7T+lA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-pkcs9": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs9/-/asn1-pkcs9-2.6.0.tgz", + "integrity": "sha512-b78OQ6OciW0aqZxdzliXGYHASeCvvw5caqidbpQRYW2mBtXIX2WhofNXTEe7NyxTb0P6J62kAAWLwn0HuMF1Fw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-cms": "^2.6.0", + "@peculiar/asn1-pfx": "^2.6.0", + "@peculiar/asn1-pkcs8": "^2.6.0", + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.0", + "@peculiar/asn1-x509-attr": "^2.6.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-rsa": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-rsa/-/asn1-rsa-2.6.0.tgz", + "integrity": "sha512-Nu4C19tsrTsCp9fDrH+sdcOKoVfdfoQQ7S3VqjJU6vedR7tY3RLkQ5oguOIB3zFW33USDUuYZnPEQYySlgha4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-schema": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.6.0.tgz", + "integrity": "sha512-xNLYLBFTBKkCzEZIw842BxytQQATQv+lDTCEMZ8C196iJcJJMBUZxrhSTxLaohMyKK8QlzRNTRkUmanucnDSqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "asn1js": "^3.0.6", + "pvtsutils": "^1.3.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-x509": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509/-/asn1-x509-2.6.0.tgz", + "integrity": "sha512-uzYbPEpoQiBoTq0/+jZtpM6Gq6zADBx+JNFP3yqRgziWBxQ/Dt/HcuvRfm9zJTPdRcBqPNdaRHTVwpyiq6iNMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.6.0", + "asn1js": "^3.0.6", + "pvtsutils": "^1.3.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-x509-attr": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509-attr/-/asn1-x509-attr-2.6.0.tgz", + "integrity": "sha512-MuIAXFX3/dc8gmoZBkwJWxUWOSvG4MMDntXhrOZpJVMkYX+MYc/rUAU2uJOved9iJEoiUx7//3D8oG83a78UJA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/x509": { + "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", + "@peculiar/asn1-csr": "^2.6.0", + "@peculiar/asn1-ecc": "^2.6.0", + "@peculiar/asn1-pkcs9": "^2.6.0", + "@peculiar/asn1-rsa": "^2.6.0", + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.0", + "pvtsutils": "^1.3.6", + "reflect-metadata": "^0.2.2", + "tslib": "^2.8.1", + "tsyringe": "^4.10.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -10216,16 +10388,6 @@ "form-data": "^4.0.4" } }, - "node_modules/@types/node-forge": { - "version": "1.3.14", - "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.14.tgz", - "integrity": "sha512-mhVF2BnD4BO+jtOp7z1CdzaK4mbuK0LLQYAvdOLqHTavxFNq4zA1EmYkpnFjP8HOUzedfQkRnp0E2ulSAYSzAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/node-hid": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/@types/node-hid/-/node-hid-1.3.4.tgz", @@ -11726,6 +11888,21 @@ "safer-buffer": "~2.1.0" } }, + "node_modules/asn1js": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.7.tgz", + "integrity": "sha512-uLvq6KJu04qoQM6gvBfKFjlh6Gl0vOKQuR5cJMDHQkmwfMOQeN3F3SHCv9SNYSL+CRoHvOGFfllDlVz03GQjvQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "pvtsutils": "^1.3.6", + "pvutils": "^1.1.3", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", @@ -12775,6 +12952,16 @@ "node": ">= 0.8" } }, + "node_modules/bytestreamjs": { + "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/c8": { "version": "10.1.3", "resolved": "https://registry.npmjs.org/c8/-/c8-10.1.3.tgz", @@ -17303,40 +17490,40 @@ } }, "node_modules/express": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", - "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", + "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", "dev": true, "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "content-disposition": "0.5.4", + "body-parser": "~1.20.3", + "content-disposition": "~0.5.4", "content-type": "~1.0.4", - "cookie": "0.7.1", - "cookie-signature": "1.0.6", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", "debug": "2.6.9", "depd": "2.0.0", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.3.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", "merge-descriptors": "1.0.3", "methods": "~1.1.2", - "on-finished": "2.4.1", + "on-finished": "~2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.12", + "path-to-regexp": "~0.1.12", "proxy-addr": "~2.0.7", - "qs": "6.13.0", + "qs": "~6.14.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", + "send": "~0.19.0", + "serve-static": "~1.16.2", "setprototypeof": "1.2.0", - "statuses": "2.0.1", + "statuses": "~2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" @@ -17377,13 +17564,13 @@ "license": "MIT" }, "node_modules/express/node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "version": "6.14.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", + "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", "dev": true, "license": "BSD-3-Clause", "dependencies": { - "side-channel": "^1.0.6" + "side-channel": "^1.1.0" }, "engines": { "node": ">=0.6" @@ -27085,16 +27272,6 @@ "webidl-conversions": "^3.0.0" } }, - "node_modules/node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", - "dev": true, - "license": "(BSD-3-Clause OR GPL-2.0)", - "engines": { - "node": ">= 6.13.0" - } - }, "node_modules/node-gyp": { "version": "11.5.0", "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-11.5.0.tgz", @@ -31703,6 +31880,24 @@ "pathe": "^2.0.3" } }, + "node_modules/pkijs": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/pkijs/-/pkijs-3.3.3.tgz", + "integrity": "sha512-+KD8hJtqQMYoTuL1bbGOqxb4z+nZkTAwVdNtWwe8Tc2xNbEmdJYIYoc6Qt0uF55e6YW6KuTHw1DjQ18gMhzepw==", + "dev": true, + "license": "BSD-3-Clause", + "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" + }, + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/playwright-chromium": { "version": "1.57.0", "resolved": "https://registry.npmjs.org/playwright-chromium/-/playwright-chromium-1.57.0.tgz", @@ -32403,6 +32598,26 @@ ], "license": "MIT" }, + "node_modules/pvtsutils": { + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/q": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", @@ -33523,6 +33738,13 @@ "lodash.debounce": "^4.0.0" } }, + "node_modules/reflect-metadata": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", + "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", + "dev": true, + "license": "Apache-2.0" + }, "node_modules/reflect.getprototypeof": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", @@ -34689,17 +34911,17 @@ } }, "node_modules/selfsigned": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", - "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "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": { - "@types/node-forge": "^1.3.0", - "node-forge": "^1" + "@peculiar/x509": "^1.14.2", + "pkijs": "^3.3.3" }, "engines": { - "node": ">=10" + "node": ">=18" } }, "node_modules/semantic-release": { @@ -38581,6 +38803,26 @@ "fsevents": "~2.3.3" } }, + "node_modules/tsyringe": { + "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" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/tsyringe/node_modules/tslib": { + "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": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-4.0.0.tgz", @@ -40211,15 +40453,15 @@ } }, "node_modules/webpack-dev-server": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.2.tgz", - "integrity": "sha512-QcQ72gh8a+7JO63TAx/6XZf/CWhgMzu5m0QirvPfGvptOusAxG12w2+aua1Jkjr7hzaWDnJ2n6JFeexMHI+Zjg==", + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.3.tgz", + "integrity": "sha512-9Gyu2F7+bg4Vv+pjbovuYDhHX+mqdqITykfzdM9UyKqKHlsE5aAjRhR+oOEfXW5vBeu8tarzlJFIZva4ZjAdrQ==", "dev": true, "license": "MIT", "dependencies": { "@types/bonjour": "^3.5.13", "@types/connect-history-api-fallback": "^1.5.4", - "@types/express": "^4.17.21", + "@types/express": "^4.17.25", "@types/express-serve-static-core": "^4.17.21", "@types/serve-index": "^1.9.4", "@types/serve-static": "^1.15.5", @@ -40229,9 +40471,9 @@ "bonjour-service": "^1.2.1", "chokidar": "^3.6.0", "colorette": "^2.0.10", - "compression": "^1.7.4", + "compression": "^1.8.1", "connect-history-api-fallback": "^2.0.0", - "express": "^4.21.2", + "express": "^4.22.1", "graceful-fs": "^4.2.6", "http-proxy-middleware": "^2.0.9", "ipaddr.js": "^2.1.0", @@ -40239,7 +40481,7 @@ "open": "^10.0.3", "p-retry": "^6.2.0", "schema-utils": "^4.2.0", - "selfsigned": "^2.4.1", + "selfsigned": "^5.5.0", "serve-index": "^1.9.1", "sockjs": "^0.3.24", "spdy": "^4.0.2", @@ -40269,9 +40511,9 @@ } }, "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.18.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", - "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", + "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", "dev": true, "license": "MIT", "engines": { @@ -41133,7 +41375,7 @@ "web-audio-test-api": "0.5.2", "webpack": "5.104.1", "webpack-cli": "5.1.4", - "webpack-dev-server": "5.2.2", + "webpack-dev-server": "5.2.3", "yauzl": "3.2.0" }, "peerDependencies": { @@ -41187,7 +41429,7 @@ "terser-webpack-plugin": "5.3.16", "webpack": "5.104.1", "webpack-cli": "5.1.4", - "webpack-dev-server": "5.2.2" + "webpack-dev-server": "5.2.3" }, "peerDependencies": { "scratch-render-fonts": "^1.0.0" @@ -41351,7 +41593,7 @@ "tap": "21.5.0", "webpack": "5.104.1", "webpack-cli": "5.1.4", - "webpack-dev-server": "5.2.2", + "webpack-dev-server": "5.2.3", "xmldom": "0.1.31" }, "peerDependencies": { @@ -41448,7 +41690,7 @@ "tap": "21.5.0", "webpack": "5.104.1", "webpack-cli": "4.10.0", - "webpack-dev-server": "5.2.2" + "webpack-dev-server": "5.2.3" } }, "packages/scratch-vm/node_modules/@webpack-cli/configtest": { diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index 53071db954a..f37ff6e4764 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -178,7 +178,7 @@ "web-audio-test-api": "0.5.2", "webpack": "5.104.1", "webpack-cli": "5.1.4", - "webpack-dev-server": "5.2.2", + "webpack-dev-server": "5.2.3", "yauzl": "3.2.0" }, "jest": { diff --git a/packages/scratch-render/package.json b/packages/scratch-render/package.json index 4d8e1c80b78..43f26885577 100644 --- a/packages/scratch-render/package.json +++ b/packages/scratch-render/package.json @@ -82,6 +82,6 @@ "terser-webpack-plugin": "5.3.16", "webpack": "5.104.1", "webpack-cli": "5.1.4", - "webpack-dev-server": "5.2.2" + "webpack-dev-server": "5.2.3" } } diff --git a/packages/scratch-svg-renderer/package.json b/packages/scratch-svg-renderer/package.json index 3cddf81d7c4..b111e256134 100644 --- a/packages/scratch-svg-renderer/package.json +++ b/packages/scratch-svg-renderer/package.json @@ -65,7 +65,7 @@ "tap": "21.5.0", "webpack": "5.104.1", "webpack-cli": "5.1.4", - "webpack-dev-server": "5.2.2", + "webpack-dev-server": "5.2.3", "xmldom": "0.1.31" }, "browserslist": [ diff --git a/packages/scratch-vm/package.json b/packages/scratch-vm/package.json index 9ed28a03163..e0f8aedbc96 100644 --- a/packages/scratch-vm/package.json +++ b/packages/scratch-vm/package.json @@ -104,6 +104,6 @@ "tap": "21.5.0", "webpack": "5.104.1", "webpack-cli": "4.10.0", - "webpack-dev-server": "5.2.2" + "webpack-dev-server": "5.2.3" } } From 1d3c93da439a4cb107ea2bfa7a177e8ecd2cc4df Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 15 Jan 2026 20:41:16 +0000 Subject: [PATCH 164/521] style(deps): update dependency eslint-config-scratch to v12.0.44 --- package-lock.json | 24 +++++++++++----------- packages/scratch-gui/package.json | 2 +- packages/scratch-render/package.json | 2 +- packages/scratch-svg-renderer/package.json | 2 +- packages/scratch-vm/package.json | 2 +- packages/task-herder/package.json | 2 +- 6 files changed, 17 insertions(+), 17 deletions(-) diff --git a/package-lock.json b/package-lock.json index b065c6a5cb4..22c3323597b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -198,9 +198,9 @@ } }, "node_modules/@babel/eslint-parser": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.28.5.tgz", - "integrity": "sha512-fcdRcWahONYo+JRnJg1/AekOacGvKx12Gu0qXJXFi2WBqQA1i7+O5PaxRB7kxE/Op94dExnCiiar6T09pvdHpA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.28.6.tgz", + "integrity": "sha512-QGmsKi2PBO/MHSQk+AAgA9R6OHQr+VqnniFE0eMWZcVcfBZoA2dKn2hUsl3Csg/Plt9opRUWdY7//VXsrIlEiA==", "dev": true, "license": "MIT", "dependencies": { @@ -16624,13 +16624,13 @@ } }, "node_modules/eslint-config-scratch": { - "version": "12.0.43", - "resolved": "https://registry.npmjs.org/eslint-config-scratch/-/eslint-config-scratch-12.0.43.tgz", - "integrity": "sha512-IzFk3Q6IGuSkqSeU44pHS6Jzt7JQTjYIILTbieFbZ1/KkPevlkLMyA5MBvP2KZaPqNRZ+12o2lFtitCnf/k3WQ==", + "version": "12.0.44", + "resolved": "https://registry.npmjs.org/eslint-config-scratch/-/eslint-config-scratch-12.0.44.tgz", + "integrity": "sha512-vtMGtKVffD7Ydr61OHdDFkR65iqsmASlsNCoNUk/LuVVeRCSzIAmadEzCDof2b+nOp1XnCxPIkNmooHbvwuGlw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { - "@babel/eslint-parser": "7.28.5", + "@babel/eslint-parser": "7.28.6", "@eslint-community/eslint-plugin-eslint-comments": "4.5.0", "@eslint/eslintrc": "3.3.3", "@eslint/js": "9.39.2", @@ -41349,7 +41349,7 @@ "cheerio": "1.1.2", "cross-env": "7.0.3", "eslint": "9.39.2", - "eslint-config-scratch": "12.0.43", + "eslint-config-scratch": "12.0.44", "eslint-import-resolver-webpack": "0.13.10", "eslint-plugin-import": "2.32.0", "eslint-plugin-react": "7.37.5", @@ -41414,7 +41414,7 @@ "copy-webpack-plugin": "6.4.1", "docdash": "0.4.0", "eslint": "9.39.2", - "eslint-config-scratch": "12.0.43", + "eslint-config-scratch": "12.0.44", "gh-pages": "1.2.0", "globals": "16.5.0", "html-webpack-plugin": "5.6.5", @@ -41581,7 +41581,7 @@ "babel-loader": "9.2.1", "copy-webpack-plugin": "6.4.1", "eslint": "9.39.2", - "eslint-config-scratch": "12.0.43", + "eslint-config-scratch": "12.0.44", "globals": "16.5.0", "jsdom": "13.2.0", "mkdirp": "2.1.6", @@ -41670,7 +41670,7 @@ "copy-webpack-plugin": "6.4.1", "docdash": "1.2.0", "eslint": "9.39.2", - "eslint-config-scratch": "12.0.43", + "eslint-config-scratch": "12.0.44", "expose-loader": "1.0.3", "file-loader": "6.2.0", "format-message-cli": "6.2.4", @@ -41827,7 +41827,7 @@ "devDependencies": { "@vitest/coverage-v8": "4.0.17", "eslint": "9.39.2", - "eslint-config-scratch": "12.0.43", + "eslint-config-scratch": "12.0.44", "prettier": "3.7.4", "rimraf": "6.1.2", "typescript": "5.9.3", diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index f37ff6e4764..19d28ee7a69 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -152,7 +152,7 @@ "cheerio": "1.1.2", "cross-env": "7.0.3", "eslint": "9.39.2", - "eslint-config-scratch": "12.0.43", + "eslint-config-scratch": "12.0.44", "eslint-import-resolver-webpack": "0.13.10", "eslint-plugin-import": "2.32.0", "eslint-plugin-react": "7.37.5", diff --git a/packages/scratch-render/package.json b/packages/scratch-render/package.json index 43f26885577..ecbd546fcae 100644 --- a/packages/scratch-render/package.json +++ b/packages/scratch-render/package.json @@ -67,7 +67,7 @@ "copy-webpack-plugin": "6.4.1", "docdash": "0.4.0", "eslint": "9.39.2", - "eslint-config-scratch": "12.0.43", + "eslint-config-scratch": "12.0.44", "gh-pages": "1.2.0", "globals": "16.5.0", "html-webpack-plugin": "5.6.5", diff --git a/packages/scratch-svg-renderer/package.json b/packages/scratch-svg-renderer/package.json index b111e256134..34bc340ae32 100644 --- a/packages/scratch-svg-renderer/package.json +++ b/packages/scratch-svg-renderer/package.json @@ -53,7 +53,7 @@ "babel-loader": "9.2.1", "copy-webpack-plugin": "6.4.1", "eslint": "9.39.2", - "eslint-config-scratch": "12.0.43", + "eslint-config-scratch": "12.0.44", "globals": "16.5.0", "jsdom": "13.2.0", "mkdirp": "2.1.6", diff --git a/packages/scratch-vm/package.json b/packages/scratch-vm/package.json index e0f8aedbc96..41f89b65d81 100644 --- a/packages/scratch-vm/package.json +++ b/packages/scratch-vm/package.json @@ -84,7 +84,7 @@ "copy-webpack-plugin": "6.4.1", "docdash": "1.2.0", "eslint": "9.39.2", - "eslint-config-scratch": "12.0.43", + "eslint-config-scratch": "12.0.44", "expose-loader": "1.0.3", "file-loader": "6.2.0", "format-message-cli": "6.2.4", diff --git a/packages/task-herder/package.json b/packages/task-herder/package.json index bb5c56d4ff8..b9d8ca1b1bb 100644 --- a/packages/task-herder/package.json +++ b/packages/task-herder/package.json @@ -39,7 +39,7 @@ "devDependencies": { "@vitest/coverage-v8": "4.0.17", "eslint": "9.39.2", - "eslint-config-scratch": "12.0.43", + "eslint-config-scratch": "12.0.44", "prettier": "3.7.4", "rimraf": "6.1.2", "typescript": "5.9.3", From 399e3e8cf996847a1853b97c79fb8744c4c050ce Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 16 Jan 2026 01:10:32 +0000 Subject: [PATCH 165/521] chore(deps): update babel monorepo to v7.28.6 --- package-lock.json | 526 ++++++++++----------- packages/scratch-gui/package.json | 6 +- packages/scratch-render/package.json | 4 +- packages/scratch-svg-renderer/package.json | 4 +- packages/scratch-vm/package.json | 4 +- 5 files changed, 272 insertions(+), 272 deletions(-) diff --git a/package-lock.json b/package-lock.json index 22c3323597b..8022c9b2de5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -92,9 +92,9 @@ "license": "ISC" }, "node_modules/@babel/cli": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.28.3.tgz", - "integrity": "sha512-n1RU5vuCX0CsaqaXm9I0KUCNKNQMy5epmzl/xdSSm70bSqhg9GWhgeosypyQLc0bK24+Xpk1WGzZlI9pJtkZdg==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.28.6.tgz", + "integrity": "sha512-6EUNcuBbNkj08Oj4gAZ+BUU8yLCgKzgVX4gaTh09Ya2C8ICM4P+G30g4m3akRxSYAp3A/gnWchrNst7px4/nUQ==", "dev": true, "license": "MIT", "dependencies": { @@ -133,12 +133,12 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.28.6.tgz", + "integrity": "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==", "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" }, @@ -147,9 +147,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", - "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.6.tgz", + "integrity": "sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg==", "dev": true, "license": "MIT", "engines": { @@ -157,21 +157,21 @@ } }, "node_modules/@babel/core": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", - "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.6.tgz", + "integrity": "sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.5", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-module-transforms": "^7.28.3", - "@babel/helpers": "^7.28.4", - "@babel/parser": "^7.28.5", - "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.5", - "@babel/types": "^7.28.5", + "@babel/code-frame": "^7.28.6", + "@babel/generator": "^7.28.6", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", @@ -237,14 +237,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", - "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.6.tgz", + "integrity": "sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.28.5", - "@babel/types": "^7.28.5", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -278,13 +278,13 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", - "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.27.2", + "@babel/compat-data": "^7.28.6", "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", @@ -322,18 +322,18 @@ "license": "ISC" }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.5.tgz", - "integrity": "sha512-q3WC4JfdODypvxArsJQROfupPBq9+lMwjKq7C33GhbFYJsufD0yd/ziwD+hJucLeWsnFPWZjsU2DNFqBPE7jwQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.6.tgz", + "integrity": "sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-member-expression-to-functions": "^7.28.5", "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/helper-replace-supers": "^7.27.1", + "@babel/helper-replace-supers": "^7.28.6", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/traverse": "^7.28.5", + "@babel/traverse": "^7.28.6", "semver": "^6.3.1" }, "engines": { @@ -423,29 +423,29 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", - "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", - "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.28.3" + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -468,9 +468,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", - "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", "dev": true, "license": "MIT", "engines": { @@ -496,15 +496,15 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", - "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.28.6.tgz", + "integrity": "sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-member-expression-to-functions": "^7.28.5", "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -572,27 +572,27 @@ } }, "node_modules/@babel/helpers": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", - "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", + "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.4" + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", - "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.6.tgz", + "integrity": "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.28.5" + "@babel/types": "^7.28.6" }, "bin": { "parser": "bin/babel-parser.js" @@ -669,14 +669,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.3.tgz", - "integrity": "sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.6.tgz", + "integrity": "sha512-a0aBScVTlNaiUe35UtfxAN7A/tehvvG4/ByO6+46VPKTRSlfnAFsgKy0FUh+qAkQrDTmhDkT+IBOKlOoMUxQ0g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.28.3" + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -754,13 +754,13 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz", - "integrity": "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.28.6.tgz", + "integrity": "sha512-pSJUpFHdx9z5nqTSirOCMtYVP2wFgoWhP0p3g8ONK/4IHhLIBd0B9NYqAvIUAhq+OkhO4VM1tENCt0cjlsNShw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -770,13 +770,13 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", - "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz", + "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -987,15 +987,15 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.0.tgz", - "integrity": "sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.6.tgz", + "integrity": "sha512-9knsChgsMzBV5Yh3kkhrZNxH3oCYAfMBkNNaVN4cP2RVlFPe8wYdwwcnOsAbkdDoV9UjFtOXWrWB52M8W4jNeA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-remap-async-to-generator": "^7.27.1", - "@babel/traverse": "^7.28.0" + "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1005,14 +1005,14 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz", - "integrity": "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.28.6.tgz", + "integrity": "sha512-ilTRcmbuXjsMmcZ3HASTe4caH5Tpo93PkTxF9oG2VZsSWsahydmcEHhix9Ik122RcTnZnUzPbmux4wh1swfv7g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-remap-async-to-generator": "^7.27.1" }, "engines": { @@ -1039,13 +1039,13 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.5.tgz", - "integrity": "sha512-45DmULpySVvmq9Pj3X9B+62Xe+DJGov27QravQJU1LLcapR6/10i+gYVAucGGJpHBp5mYxIMK4nDAT/QDLr47g==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.6.tgz", + "integrity": "sha512-tt/7wOtBmwHPNMPu7ax4pdPz6shjFrmHDghvNC+FG9Qvj7D6mJcoRQIF5dy4njmxR941l6rgtvfSB2zX3VlUIw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1055,14 +1055,14 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz", - "integrity": "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.28.6.tgz", + "integrity": "sha512-dY2wS3I2G7D697VHndN91TJr8/AAfXQNt5ynCTI/MpxMsSzHp+52uNivYT5wCPax3whc47DR8Ba7cmlQMg24bw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1072,14 +1072,14 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.3.tgz", - "integrity": "sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.6.tgz", + "integrity": "sha512-rfQ++ghVwTWTqQ7w8qyDxL1XGihjBss4CmTgGRCTAC9RIbhVpyp4fOeZtta0Lbf+dTNIVJer6ych2ibHwkZqsQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.28.3", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1089,18 +1089,18 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.4.tgz", - "integrity": "sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.6.tgz", + "integrity": "sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-compilation-targets": "^7.28.6", "@babel/helper-globals": "^7.28.0", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-replace-supers": "^7.27.1", - "@babel/traverse": "^7.28.4" + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-replace-supers": "^7.28.6", + "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1110,14 +1110,14 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz", - "integrity": "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.28.6.tgz", + "integrity": "sha512-bcc3k0ijhHbc2lEfpFHgx7eYw9KNXqOerKWfzbxEHUGKnS3sz9C4CNL9OiFN1297bDNfUiSO7DaLzbvHQQQ1BQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/template": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/template": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1144,14 +1144,14 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz", - "integrity": "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.28.6.tgz", + "integrity": "sha512-SljjowuNKB7q5Oayv4FoPzeB74g3QgLt8IVJw9ADvWy3QnUb/01aw8I4AVv8wYnPvQz2GDDZ/g3GhcNyDBI4Bg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1177,14 +1177,14 @@ } }, "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz", - "integrity": "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.28.6.tgz", + "integrity": "sha512-5suVoXjC14lUN6ZL9OLKIHCNVWCrqGqlmEp/ixdXjvgnEl/kauLvvMO/Xw9NyMc95Joj1AeLVPVMvibBgSoFlA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1210,14 +1210,14 @@ } }, "node_modules/@babel/plugin-transform-explicit-resource-management": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.0.tgz", - "integrity": "sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.6.tgz", + "integrity": "sha512-Iao5Konzx2b6g7EPqTy40UZbcdXE126tTxVFr/nAIj+WItNxjKSYTEw3RC+A2/ZetmdJsgueL1KhaMCQHkLPIg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/plugin-transform-destructuring": "^7.28.0" + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -1227,13 +1227,13 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.5.tgz", - "integrity": "sha512-D4WIMaFtwa2NizOp+dnoFjRez/ClKiC2BqqImwKd1X28nqBtZEyCYJ2ozQrrzlxAFrcrjxo39S6khe9RNDlGzw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.6.tgz", + "integrity": "sha512-WitabqiGjV/vJ0aPOLSFfNY1u9U3R7W36B03r5I2KoNix+a3sOhJ3pKFB3R5It9/UiK78NiO0KE9P21cMhlPkw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1294,13 +1294,13 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz", - "integrity": "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.28.6.tgz", + "integrity": "sha512-Nr+hEN+0geQkzhbdgQVPoqr47lZbm+5fCUmO70722xJZd0Mvb59+33QLImGj6F+DkK3xgDi1YVysP8whD6FQAw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1326,13 +1326,13 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.5.tgz", - "integrity": "sha512-axUuqnUTBuXyHGcJEVVh9pORaN6wC5bYfE7FGzPiaWa3syib9m7g+/IT/4VgCOe2Upef43PHzeAvcrVek6QuuA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.6.tgz", + "integrity": "sha512-+anKKair6gpi8VsM/95kmomGNMD0eLz1NQ8+Pfw5sAwWH9fGYXT50E55ZpV0pHUHWf6IUTWPM+f/7AAff+wr9A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1375,14 +1375,14 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", - "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.28.6.tgz", + "integrity": "sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1461,13 +1461,13 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz", - "integrity": "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.28.6.tgz", + "integrity": "sha512-3wKbRgmzYbw24mDJXT7N+ADXw8BC/imU9yo9c9X9NKaLF1fW+e5H1U5QjMUBe4Qo4Ox/o++IyUkl1sVCLgevKg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1477,13 +1477,13 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz", - "integrity": "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.28.6.tgz", + "integrity": "sha512-SJR8hPynj8outz+SlStQSwvziMN4+Bq99it4tMIf5/Caq+3iOc0JtKyse8puvyXkk3eFRIA5ID/XfunGgO5i6w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1493,17 +1493,17 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.4.tgz", - "integrity": "sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.6.tgz", + "integrity": "sha512-5rh+JR4JBC4pGkXLAcYdLHZjXudVxWMXbB6u6+E9lRL5TrGVbHt1TjxGbZ8CkmYw9zjkB7jutzOROArsqtncEA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/plugin-transform-destructuring": "^7.28.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5", "@babel/plugin-transform-parameters": "^7.27.7", - "@babel/traverse": "^7.28.4" + "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1530,13 +1530,13 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz", - "integrity": "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.28.6.tgz", + "integrity": "sha512-R8ja/Pyrv0OGAvAXQhSTmWyPJPml+0TMqXlO5w+AsMEiwb2fg3WkOvob7UxFSL3OIttFSGSRFKQsOhJ/X6HQdQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1546,13 +1546,13 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.5.tgz", - "integrity": "sha512-N6fut9IZlPnjPwgiQkXNhb+cT8wQKFlJNqcZkWlcTqkcqx6/kU4ynGmLFoa4LViBSirn05YAwk+sQBbPfxtYzQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.6.tgz", + "integrity": "sha512-A4zobikRGJTsX9uqVFdafzGkqD30t26ck2LmOzAuLL8b2x6k3TIqRiT2xVvA9fNmFeTX484VpsdgmKNA0bS23w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "engines": { @@ -1579,14 +1579,14 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz", - "integrity": "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.28.6.tgz", + "integrity": "sha512-piiuapX9CRv7+0st8lmuUlRSmX6mBcVeNQ1b4AYzJxfCMuBfB0vBXDiGSmm03pKJw1v6cZ8KSeM+oUnM6yAExg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1596,15 +1596,15 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz", - "integrity": "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.28.6.tgz", + "integrity": "sha512-b97jvNSOb5+ehyQmBpmhOCiUC5oVK4PMnpRvO7+ymFBoqYjeDHIU9jnrNUuwHOiL9RpGDoKBpSViarV+BU+eVA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1699,13 +1699,13 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.4.tgz", - "integrity": "sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.6.tgz", + "integrity": "sha512-eZhoEZHYQLL5uc1gS5e9/oTknS0sSSAtd5TkKMUp3J+S/CaUjagc0kOUPsEbDmMeva0nC3WWl4SxVY6+OBuxfw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1715,14 +1715,14 @@ } }, "node_modules/@babel/plugin-transform-regexp-modifiers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz", - "integrity": "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.28.6.tgz", + "integrity": "sha512-QGWAepm9qxpaIs7UM9FvUSnCGlb8Ua1RhyM4/veAxLwt3gMat/LSGrZixyuj4I6+Kn9iwvqCyPTtbdxanYoWYg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1764,13 +1764,13 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz", - "integrity": "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.28.6.tgz", + "integrity": "sha512-9U4QObUC0FtJl05AsUcodau/RWDytrU6uKgkxu09mLR9HLDAtUMoPuuskm5huQsoktmsYpI+bGmq+iapDcriKA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "engines": { @@ -1845,14 +1845,14 @@ } }, "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz", - "integrity": "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.28.6.tgz", + "integrity": "sha512-4Wlbdl/sIZjzi/8St0evF0gEZrgOswVO6aOzqxh1kDZOl9WmLrHq2HtGhnOJZmHZYKP8WZ1MDLCt5DAWwRo57A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1879,14 +1879,14 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz", - "integrity": "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.28.6.tgz", + "integrity": "sha512-/wHc/paTUmsDYN7SZkpWxogTOBNnlx7nBQYfy6JJlCT7G3mVhltk3e++N7zV0XfgGsrqBxd4rJQt9H16I21Y1Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1908,76 +1908,76 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.5.tgz", - "integrity": "sha512-S36mOoi1Sb6Fz98fBfE+UZSpYw5mJm0NUHtIKrOuNcqeFauy1J6dIvXm2KRVKobOSaGq4t/hBXdN4HGU3wL9Wg==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.6.tgz", + "integrity": "sha512-GaTI4nXDrs7l0qaJ6Rg06dtOXTBCG6TMDB44zbqofCIC4PqC7SEvmFFtpxzCDw9W5aJ7RKVshgXTLvLdBFV/qw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.28.5", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-plugin-utils": "^7.27.1", + "@babel/compat-data": "^7.28.6", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-validator-option": "^7.27.1", "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.28.5", "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.3", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.6", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-import-assertions": "^7.27.1", - "@babel/plugin-syntax-import-attributes": "^7.27.1", + "@babel/plugin-syntax-import-assertions": "^7.28.6", + "@babel/plugin-syntax-import-attributes": "^7.28.6", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.27.1", - "@babel/plugin-transform-async-generator-functions": "^7.28.0", - "@babel/plugin-transform-async-to-generator": "^7.27.1", + "@babel/plugin-transform-async-generator-functions": "^7.28.6", + "@babel/plugin-transform-async-to-generator": "^7.28.6", "@babel/plugin-transform-block-scoped-functions": "^7.27.1", - "@babel/plugin-transform-block-scoping": "^7.28.5", - "@babel/plugin-transform-class-properties": "^7.27.1", - "@babel/plugin-transform-class-static-block": "^7.28.3", - "@babel/plugin-transform-classes": "^7.28.4", - "@babel/plugin-transform-computed-properties": "^7.27.1", + "@babel/plugin-transform-block-scoping": "^7.28.6", + "@babel/plugin-transform-class-properties": "^7.28.6", + "@babel/plugin-transform-class-static-block": "^7.28.6", + "@babel/plugin-transform-classes": "^7.28.6", + "@babel/plugin-transform-computed-properties": "^7.28.6", "@babel/plugin-transform-destructuring": "^7.28.5", - "@babel/plugin-transform-dotall-regex": "^7.27.1", + "@babel/plugin-transform-dotall-regex": "^7.28.6", "@babel/plugin-transform-duplicate-keys": "^7.27.1", - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.28.6", "@babel/plugin-transform-dynamic-import": "^7.27.1", - "@babel/plugin-transform-explicit-resource-management": "^7.28.0", - "@babel/plugin-transform-exponentiation-operator": "^7.28.5", + "@babel/plugin-transform-explicit-resource-management": "^7.28.6", + "@babel/plugin-transform-exponentiation-operator": "^7.28.6", "@babel/plugin-transform-export-namespace-from": "^7.27.1", "@babel/plugin-transform-for-of": "^7.27.1", "@babel/plugin-transform-function-name": "^7.27.1", - "@babel/plugin-transform-json-strings": "^7.27.1", + "@babel/plugin-transform-json-strings": "^7.28.6", "@babel/plugin-transform-literals": "^7.27.1", - "@babel/plugin-transform-logical-assignment-operators": "^7.28.5", + "@babel/plugin-transform-logical-assignment-operators": "^7.28.6", "@babel/plugin-transform-member-expression-literals": "^7.27.1", "@babel/plugin-transform-modules-amd": "^7.27.1", - "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.28.6", "@babel/plugin-transform-modules-systemjs": "^7.28.5", "@babel/plugin-transform-modules-umd": "^7.27.1", "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", "@babel/plugin-transform-new-target": "^7.27.1", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", - "@babel/plugin-transform-numeric-separator": "^7.27.1", - "@babel/plugin-transform-object-rest-spread": "^7.28.4", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.28.6", + "@babel/plugin-transform-numeric-separator": "^7.28.6", + "@babel/plugin-transform-object-rest-spread": "^7.28.6", "@babel/plugin-transform-object-super": "^7.27.1", - "@babel/plugin-transform-optional-catch-binding": "^7.27.1", - "@babel/plugin-transform-optional-chaining": "^7.28.5", + "@babel/plugin-transform-optional-catch-binding": "^7.28.6", + "@babel/plugin-transform-optional-chaining": "^7.28.6", "@babel/plugin-transform-parameters": "^7.27.7", - "@babel/plugin-transform-private-methods": "^7.27.1", - "@babel/plugin-transform-private-property-in-object": "^7.27.1", + "@babel/plugin-transform-private-methods": "^7.28.6", + "@babel/plugin-transform-private-property-in-object": "^7.28.6", "@babel/plugin-transform-property-literals": "^7.27.1", - "@babel/plugin-transform-regenerator": "^7.28.4", - "@babel/plugin-transform-regexp-modifiers": "^7.27.1", + "@babel/plugin-transform-regenerator": "^7.28.6", + "@babel/plugin-transform-regexp-modifiers": "^7.28.6", "@babel/plugin-transform-reserved-words": "^7.27.1", "@babel/plugin-transform-shorthand-properties": "^7.27.1", - "@babel/plugin-transform-spread": "^7.27.1", + "@babel/plugin-transform-spread": "^7.28.6", "@babel/plugin-transform-sticky-regex": "^7.27.1", "@babel/plugin-transform-template-literals": "^7.27.1", "@babel/plugin-transform-typeof-symbol": "^7.27.1", "@babel/plugin-transform-unicode-escapes": "^7.27.1", - "@babel/plugin-transform-unicode-property-regex": "^7.27.1", + "@babel/plugin-transform-unicode-property-regex": "^7.28.6", "@babel/plugin-transform-unicode-regex": "^7.27.1", - "@babel/plugin-transform-unicode-sets-regex": "^7.27.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.28.6", "@babel/preset-modules": "0.1.6-no-external-plugins", "babel-plugin-polyfill-corejs2": "^0.4.14", "babel-plugin-polyfill-corejs3": "^0.13.0", @@ -2048,33 +2048,33 @@ } }, "node_modules/@babel/template": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", - "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/parser": "^7.27.2", - "@babel/types": "^7.27.1" + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", - "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.6.tgz", + "integrity": "sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.5", + "@babel/code-frame": "^7.28.6", + "@babel/generator": "^7.28.6", "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.5", - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.5", + "@babel/parser": "^7.28.6", + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6", "debug": "^4.3.1" }, "engines": { @@ -2082,9 +2082,9 @@ } }, "node_modules/@babel/types": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", - "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.6.tgz", + "integrity": "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==", "dev": true, "license": "MIT", "dependencies": { @@ -41333,9 +41333,9 @@ "xhr": "2.6.0" }, "devDependencies": { - "@babel/cli": "7.28.3", - "@babel/core": "7.28.5", - "@babel/preset-env": "7.28.5", + "@babel/cli": "7.28.6", + "@babel/core": "7.28.6", + "@babel/preset-env": "7.28.6", "@babel/preset-react": "7.28.5", "@testing-library/jest-dom": "5.17.0", "@testing-library/react": "14.3.1", @@ -41406,9 +41406,9 @@ "twgl.js": "4.24.0" }, "devDependencies": { - "@babel/core": "7.28.5", + "@babel/core": "7.28.6", "@babel/polyfill": "7.12.1", - "@babel/preset-env": "7.28.5", + "@babel/preset-env": "7.28.6", "@scratch/scratch-vm": "12.3.1", "babel-loader": "9.2.1", "copy-webpack-plugin": "6.4.1", @@ -41576,8 +41576,8 @@ "tslog": "4.10.2" }, "devDependencies": { - "@babel/core": "7.28.5", - "@babel/preset-env": "7.28.5", + "@babel/core": "7.28.6", + "@babel/preset-env": "7.28.6", "babel-loader": "9.2.1", "copy-webpack-plugin": "6.4.1", "eslint": "9.39.2", @@ -41662,8 +41662,8 @@ "web-worker": "1.3.0" }, "devDependencies": { - "@babel/core": "7.28.5", - "@babel/preset-env": "7.28.5", + "@babel/core": "7.28.6", + "@babel/preset-env": "7.28.6", "adm-zip": "0.4.11", "babel-loader": "9.2.1", "callsite": "1.0.0", diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index 19d28ee7a69..1c227b614bd 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -136,9 +136,9 @@ "redux": "^4.0.0" }, "devDependencies": { - "@babel/cli": "7.28.3", - "@babel/core": "7.28.5", - "@babel/preset-env": "7.28.5", + "@babel/cli": "7.28.6", + "@babel/core": "7.28.6", + "@babel/preset-env": "7.28.6", "@babel/preset-react": "7.28.5", "@testing-library/jest-dom": "5.17.0", "@testing-library/react": "14.3.1", diff --git a/packages/scratch-render/package.json b/packages/scratch-render/package.json index ecbd546fcae..5637925a408 100644 --- a/packages/scratch-render/package.json +++ b/packages/scratch-render/package.json @@ -59,9 +59,9 @@ "scratch-render-fonts": "^1.0.0" }, "devDependencies": { - "@babel/core": "7.28.5", + "@babel/core": "7.28.6", "@babel/polyfill": "7.12.1", - "@babel/preset-env": "7.28.5", + "@babel/preset-env": "7.28.6", "@scratch/scratch-vm": "12.3.1", "babel-loader": "9.2.1", "copy-webpack-plugin": "6.4.1", diff --git a/packages/scratch-svg-renderer/package.json b/packages/scratch-svg-renderer/package.json index 34bc340ae32..0cad30d87d1 100644 --- a/packages/scratch-svg-renderer/package.json +++ b/packages/scratch-svg-renderer/package.json @@ -48,8 +48,8 @@ "tslog": "4.10.2" }, "devDependencies": { - "@babel/core": "7.28.5", - "@babel/preset-env": "7.28.5", + "@babel/core": "7.28.6", + "@babel/preset-env": "7.28.6", "babel-loader": "9.2.1", "copy-webpack-plugin": "6.4.1", "eslint": "9.39.2", diff --git a/packages/scratch-vm/package.json b/packages/scratch-vm/package.json index 41f89b65d81..2bbe23be8be 100644 --- a/packages/scratch-vm/package.json +++ b/packages/scratch-vm/package.json @@ -76,8 +76,8 @@ "web-worker": "1.3.0" }, "devDependencies": { - "@babel/core": "7.28.5", - "@babel/preset-env": "7.28.5", + "@babel/core": "7.28.6", + "@babel/preset-env": "7.28.6", "adm-zip": "0.4.11", "babel-loader": "9.2.1", "callsite": "1.0.0", From 2d8a0fb057093d6ac0ba38ecf4824d9a3c552b6e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 16 Jan 2026 05:01:17 +0000 Subject: [PATCH 166/521] fix(deps): update dependency scratch-l10n to v6.1.55 --- package-lock.json | 10 +++++----- packages/scratch-gui/package.json | 2 +- packages/scratch-vm/package.json | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8022c9b2de5..2485cc14a82 100644 --- a/package-lock.json +++ b/package-lock.json @@ -34658,9 +34658,9 @@ } }, "node_modules/scratch-l10n": { - "version": "6.1.54", - "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-6.1.54.tgz", - "integrity": "sha512-uoYAZ7Rxbl4IcdC2/ADktm8mHvDQ4QMnFIq0XrnE5vUHwyeRVwc/FCuP9zYWqMLLCBrDWLpzce7FiaUNbrrvnw==", + "version": "6.1.55", + "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-6.1.55.tgz", + "integrity": "sha512-QpoGIALiHEtbbHEwbeLdV/hHe4eAQpiHWKyO5Zo0zhoMWtCbNPqjAmkmBW7mqtJtT97pekmnHmn+bcCb2oImRA==", "license": "AGPL-3.0-only", "dependencies": { "@transifex/api": "7.1.5", @@ -41320,7 +41320,7 @@ "redux-throttle": "0.1.1", "scratch-audio": "2.0.268", "scratch-blocks": "1.3.0", - "scratch-l10n": "6.1.54", + "scratch-l10n": "6.1.55", "scratch-paint": "4.1.47", "scratch-render-fonts": "1.0.252", "scratch-storage": "5.0.10", @@ -41680,7 +41680,7 @@ "jsdoc": "3.6.11", "pngjs": "3.4.0", "scratch-blocks": "1.3.0", - "scratch-l10n": "6.1.54", + "scratch-l10n": "6.1.55", "scratch-render-fonts": "1.0.252", "scratch-semantic-release-config": "4.0.0", "scratch-webpack-configuration": "3.1.0", diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index 1c227b614bd..04ee9b46293 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -117,7 +117,7 @@ "redux-throttle": "0.1.1", "scratch-audio": "2.0.268", "scratch-blocks": "1.3.0", - "scratch-l10n": "6.1.54", + "scratch-l10n": "6.1.55", "scratch-paint": "4.1.47", "scratch-render-fonts": "1.0.252", "scratch-storage": "5.0.10", diff --git a/packages/scratch-vm/package.json b/packages/scratch-vm/package.json index 2bbe23be8be..8cad2a82cab 100644 --- a/packages/scratch-vm/package.json +++ b/packages/scratch-vm/package.json @@ -94,7 +94,7 @@ "jsdoc": "3.6.11", "pngjs": "3.4.0", "scratch-blocks": "1.3.0", - "scratch-l10n": "6.1.54", + "scratch-l10n": "6.1.55", "scratch-render-fonts": "1.0.252", "scratch-semantic-release-config": "4.0.0", "scratch-webpack-configuration": "3.1.0", From 5dc78cca2ebde55d2f12f76b5d89e3487fb31f49 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 16 Jan 2026 09:02:47 +0000 Subject: [PATCH 167/521] fix(deps): update dependency scratch-paint to v4.1.48 --- package-lock.json | 8 ++++---- packages/scratch-gui/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2485cc14a82..d1ff736f0c4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -34699,9 +34699,9 @@ } }, "node_modules/scratch-paint": { - "version": "4.1.47", - "resolved": "https://registry.npmjs.org/scratch-paint/-/scratch-paint-4.1.47.tgz", - "integrity": "sha512-zgZF937khXPalnQI8vvUYSAyBH0WJdPb02/d5s5aJ2AAm7ZucFZeNwzSU4CIGHJ/EAQ9Ak51xwSiBltHwLkb6A==", + "version": "4.1.48", + "resolved": "https://registry.npmjs.org/scratch-paint/-/scratch-paint-4.1.48.tgz", + "integrity": "sha512-c5qPB5O41nmLFicvmCQLupxqrRt9CMGtZGkBVFOfzsFhSoL+K19iKZGbOB2a2SgsWPenQVg5YlMwclFWQMjw+g==", "license": "AGPL-3.0-only", "dependencies": { "@scratch/paper": "^0.11.20221201200345", @@ -41321,7 +41321,7 @@ "scratch-audio": "2.0.268", "scratch-blocks": "1.3.0", "scratch-l10n": "6.1.55", - "scratch-paint": "4.1.47", + "scratch-paint": "4.1.48", "scratch-render-fonts": "1.0.252", "scratch-storage": "5.0.10", "startaudiocontext": "1.2.1", diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index 04ee9b46293..c70af045051 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -118,7 +118,7 @@ "scratch-audio": "2.0.268", "scratch-blocks": "1.3.0", "scratch-l10n": "6.1.55", - "scratch-paint": "4.1.47", + "scratch-paint": "4.1.48", "scratch-render-fonts": "1.0.252", "scratch-storage": "5.0.10", "startaudiocontext": "1.2.1", From f7e83ec7c5a8f07104c2c1ae2790003738e484ac Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 17 Jan 2026 04:53:22 +0000 Subject: [PATCH 168/521] fix(deps): update dependency scratch-l10n to v6.1.56 --- package-lock.json | 10 +++++----- packages/scratch-gui/package.json | 2 +- packages/scratch-vm/package.json | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index d1ff736f0c4..3af5a9f8572 100644 --- a/package-lock.json +++ b/package-lock.json @@ -34658,9 +34658,9 @@ } }, "node_modules/scratch-l10n": { - "version": "6.1.55", - "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-6.1.55.tgz", - "integrity": "sha512-QpoGIALiHEtbbHEwbeLdV/hHe4eAQpiHWKyO5Zo0zhoMWtCbNPqjAmkmBW7mqtJtT97pekmnHmn+bcCb2oImRA==", + "version": "6.1.56", + "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-6.1.56.tgz", + "integrity": "sha512-hgvPRYySmtSACHmmre8EMxTbhxp9WRAU1V2LwmFWZ7Nl0uiqtI4Bys89+qFkWR/90A2zoaaeZqs2KX035/HrdA==", "license": "AGPL-3.0-only", "dependencies": { "@transifex/api": "7.1.5", @@ -41320,7 +41320,7 @@ "redux-throttle": "0.1.1", "scratch-audio": "2.0.268", "scratch-blocks": "1.3.0", - "scratch-l10n": "6.1.55", + "scratch-l10n": "6.1.56", "scratch-paint": "4.1.48", "scratch-render-fonts": "1.0.252", "scratch-storage": "5.0.10", @@ -41680,7 +41680,7 @@ "jsdoc": "3.6.11", "pngjs": "3.4.0", "scratch-blocks": "1.3.0", - "scratch-l10n": "6.1.55", + "scratch-l10n": "6.1.56", "scratch-render-fonts": "1.0.252", "scratch-semantic-release-config": "4.0.0", "scratch-webpack-configuration": "3.1.0", diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index c70af045051..9ee1cafc851 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -117,7 +117,7 @@ "redux-throttle": "0.1.1", "scratch-audio": "2.0.268", "scratch-blocks": "1.3.0", - "scratch-l10n": "6.1.55", + "scratch-l10n": "6.1.56", "scratch-paint": "4.1.48", "scratch-render-fonts": "1.0.252", "scratch-storage": "5.0.10", diff --git a/packages/scratch-vm/package.json b/packages/scratch-vm/package.json index 8cad2a82cab..4af9f7796ab 100644 --- a/packages/scratch-vm/package.json +++ b/packages/scratch-vm/package.json @@ -94,7 +94,7 @@ "jsdoc": "3.6.11", "pngjs": "3.4.0", "scratch-blocks": "1.3.0", - "scratch-l10n": "6.1.55", + "scratch-l10n": "6.1.56", "scratch-render-fonts": "1.0.252", "scratch-semantic-release-config": "4.0.0", "scratch-webpack-configuration": "3.1.0", From 0e2ae9214a191f811167ed7284e61741fb5192e0 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 17 Jan 2026 12:42:35 +0000 Subject: [PATCH 169/521] fix(deps): update dependency scratch-paint to v4.1.49 --- package-lock.json | 8 ++++---- packages/scratch-gui/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3af5a9f8572..665d2f2e254 100644 --- a/package-lock.json +++ b/package-lock.json @@ -34699,9 +34699,9 @@ } }, "node_modules/scratch-paint": { - "version": "4.1.48", - "resolved": "https://registry.npmjs.org/scratch-paint/-/scratch-paint-4.1.48.tgz", - "integrity": "sha512-c5qPB5O41nmLFicvmCQLupxqrRt9CMGtZGkBVFOfzsFhSoL+K19iKZGbOB2a2SgsWPenQVg5YlMwclFWQMjw+g==", + "version": "4.1.49", + "resolved": "https://registry.npmjs.org/scratch-paint/-/scratch-paint-4.1.49.tgz", + "integrity": "sha512-PuQBR8nmL21usfTLtcvFdo8S6CnvXjUnSFJBddQQyAHdGIQbbhWHE/5TvwEEPuypaxQKqeIOQJMjv+/+hDlCfA==", "license": "AGPL-3.0-only", "dependencies": { "@scratch/paper": "^0.11.20221201200345", @@ -41321,7 +41321,7 @@ "scratch-audio": "2.0.268", "scratch-blocks": "1.3.0", "scratch-l10n": "6.1.56", - "scratch-paint": "4.1.48", + "scratch-paint": "4.1.49", "scratch-render-fonts": "1.0.252", "scratch-storage": "5.0.10", "startaudiocontext": "1.2.1", diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index 9ee1cafc851..a97b9659f21 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -118,7 +118,7 @@ "scratch-audio": "2.0.268", "scratch-blocks": "1.3.0", "scratch-l10n": "6.1.56", - "scratch-paint": "4.1.48", + "scratch-paint": "4.1.49", "scratch-render-fonts": "1.0.252", "scratch-storage": "5.0.10", "startaudiocontext": "1.2.1", From 3041349d4ae6e6d93c129c5ebb3074862cbd297e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 17 Jan 2026 16:31:08 +0000 Subject: [PATCH 170/521] style(deps): update dependency eslint-config-scratch to v12.0.45 --- package-lock.json | 36 ++++++++++++++-------- packages/scratch-gui/package.json | 2 +- packages/scratch-render/package.json | 2 +- packages/scratch-svg-renderer/package.json | 2 +- packages/scratch-vm/package.json | 2 +- packages/task-herder/package.json | 2 +- 6 files changed, 28 insertions(+), 18 deletions(-) diff --git a/package-lock.json b/package-lock.json index 665d2f2e254..d20c666c1c5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3015,14 +3015,14 @@ } }, "node_modules/@eslint-community/eslint-plugin-eslint-comments": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-4.5.0.tgz", - "integrity": "sha512-MAhuTKlr4y/CE3WYX26raZjy+I/kS2PLKSzvfmDCGrBLTFHOYwqROZdr4XwPgXwX3K9rjzMr4pSmUWGnzsUyMg==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-4.6.0.tgz", + "integrity": "sha512-2EX2bBQq1ez++xz2o9tEeEQkyvfieWgUFMH4rtJJri2q0Azvhja3hZGXsjPXs31R4fQkZDtWzNDDK2zQn5UE5g==", "dev": true, "license": "MIT", "dependencies": { "escape-string-regexp": "^4.0.0", - "ignore": "^5.2.4" + "ignore": "^7.0.5" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3034,6 +3034,16 @@ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0" } }, + "node_modules/@eslint-community/eslint-plugin-eslint-comments/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.9.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", @@ -16624,14 +16634,14 @@ } }, "node_modules/eslint-config-scratch": { - "version": "12.0.44", - "resolved": "https://registry.npmjs.org/eslint-config-scratch/-/eslint-config-scratch-12.0.44.tgz", - "integrity": "sha512-vtMGtKVffD7Ydr61OHdDFkR65iqsmASlsNCoNUk/LuVVeRCSzIAmadEzCDof2b+nOp1XnCxPIkNmooHbvwuGlw==", + "version": "12.0.45", + "resolved": "https://registry.npmjs.org/eslint-config-scratch/-/eslint-config-scratch-12.0.45.tgz", + "integrity": "sha512-axXjoeaT4/yg43JonNwLQTjQjLsW7AXKJKRGsaUHr1Ygh4CDQKwq4b+OR2+4g0cZtzPi99/e17H6kN4wLkSrOg==", "dev": true, "license": "BSD-3-Clause", "dependencies": { "@babel/eslint-parser": "7.28.6", - "@eslint-community/eslint-plugin-eslint-comments": "4.5.0", + "@eslint-community/eslint-plugin-eslint-comments": "4.6.0", "@eslint/eslintrc": "3.3.3", "@eslint/js": "9.39.2", "@eslint/markdown": "7.5.1", @@ -41349,7 +41359,7 @@ "cheerio": "1.1.2", "cross-env": "7.0.3", "eslint": "9.39.2", - "eslint-config-scratch": "12.0.44", + "eslint-config-scratch": "12.0.45", "eslint-import-resolver-webpack": "0.13.10", "eslint-plugin-import": "2.32.0", "eslint-plugin-react": "7.37.5", @@ -41414,7 +41424,7 @@ "copy-webpack-plugin": "6.4.1", "docdash": "0.4.0", "eslint": "9.39.2", - "eslint-config-scratch": "12.0.44", + "eslint-config-scratch": "12.0.45", "gh-pages": "1.2.0", "globals": "16.5.0", "html-webpack-plugin": "5.6.5", @@ -41581,7 +41591,7 @@ "babel-loader": "9.2.1", "copy-webpack-plugin": "6.4.1", "eslint": "9.39.2", - "eslint-config-scratch": "12.0.44", + "eslint-config-scratch": "12.0.45", "globals": "16.5.0", "jsdom": "13.2.0", "mkdirp": "2.1.6", @@ -41670,7 +41680,7 @@ "copy-webpack-plugin": "6.4.1", "docdash": "1.2.0", "eslint": "9.39.2", - "eslint-config-scratch": "12.0.44", + "eslint-config-scratch": "12.0.45", "expose-loader": "1.0.3", "file-loader": "6.2.0", "format-message-cli": "6.2.4", @@ -41827,7 +41837,7 @@ "devDependencies": { "@vitest/coverage-v8": "4.0.17", "eslint": "9.39.2", - "eslint-config-scratch": "12.0.44", + "eslint-config-scratch": "12.0.45", "prettier": "3.7.4", "rimraf": "6.1.2", "typescript": "5.9.3", diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index a97b9659f21..a8e5b8d44a5 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -152,7 +152,7 @@ "cheerio": "1.1.2", "cross-env": "7.0.3", "eslint": "9.39.2", - "eslint-config-scratch": "12.0.44", + "eslint-config-scratch": "12.0.45", "eslint-import-resolver-webpack": "0.13.10", "eslint-plugin-import": "2.32.0", "eslint-plugin-react": "7.37.5", diff --git a/packages/scratch-render/package.json b/packages/scratch-render/package.json index 5637925a408..a78df2e0810 100644 --- a/packages/scratch-render/package.json +++ b/packages/scratch-render/package.json @@ -67,7 +67,7 @@ "copy-webpack-plugin": "6.4.1", "docdash": "0.4.0", "eslint": "9.39.2", - "eslint-config-scratch": "12.0.44", + "eslint-config-scratch": "12.0.45", "gh-pages": "1.2.0", "globals": "16.5.0", "html-webpack-plugin": "5.6.5", diff --git a/packages/scratch-svg-renderer/package.json b/packages/scratch-svg-renderer/package.json index 0cad30d87d1..7a496383f05 100644 --- a/packages/scratch-svg-renderer/package.json +++ b/packages/scratch-svg-renderer/package.json @@ -53,7 +53,7 @@ "babel-loader": "9.2.1", "copy-webpack-plugin": "6.4.1", "eslint": "9.39.2", - "eslint-config-scratch": "12.0.44", + "eslint-config-scratch": "12.0.45", "globals": "16.5.0", "jsdom": "13.2.0", "mkdirp": "2.1.6", diff --git a/packages/scratch-vm/package.json b/packages/scratch-vm/package.json index 4af9f7796ab..8b459d9d1cf 100644 --- a/packages/scratch-vm/package.json +++ b/packages/scratch-vm/package.json @@ -84,7 +84,7 @@ "copy-webpack-plugin": "6.4.1", "docdash": "1.2.0", "eslint": "9.39.2", - "eslint-config-scratch": "12.0.44", + "eslint-config-scratch": "12.0.45", "expose-loader": "1.0.3", "file-loader": "6.2.0", "format-message-cli": "6.2.4", diff --git a/packages/task-herder/package.json b/packages/task-herder/package.json index b9d8ca1b1bb..71b59be742b 100644 --- a/packages/task-herder/package.json +++ b/packages/task-herder/package.json @@ -39,7 +39,7 @@ "devDependencies": { "@vitest/coverage-v8": "4.0.17", "eslint": "9.39.2", - "eslint-config-scratch": "12.0.44", + "eslint-config-scratch": "12.0.45", "prettier": "3.7.4", "rimraf": "6.1.2", "typescript": "5.9.3", From 84cda8b426dd82b3d569c413ba8f2df421a6367c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 18 Jan 2026 02:09:42 +0000 Subject: [PATCH 171/521] chore(deps): update dependency prettier to v3.8.0 --- package-lock.json | 24 ++++++++++++++++++++---- packages/task-herder/package.json | 2 +- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index d20c666c1c5..1f323a1b55a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16663,6 +16663,22 @@ "eslint": "^9.23.0" } }, + "node_modules/eslint-config-scratch/node_modules/prettier": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.7.4.tgz", + "integrity": "sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, "node_modules/eslint-import-resolver-node": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", @@ -32292,9 +32308,9 @@ } }, "node_modules/prettier": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.7.4.tgz", - "integrity": "sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.0.tgz", + "integrity": "sha512-yEPsovQfpxYfgWNhCfECjG5AQaO+K3dp6XERmOepyPDVqcJm+bjyCVO3pmU+nAPe0N5dDvekfGezt/EIiRe1TA==", "dev": true, "license": "MIT", "bin": { @@ -41838,7 +41854,7 @@ "@vitest/coverage-v8": "4.0.17", "eslint": "9.39.2", "eslint-config-scratch": "12.0.45", - "prettier": "3.7.4", + "prettier": "3.8.0", "rimraf": "6.1.2", "typescript": "5.9.3", "unplugin-dts": "1.0.0-beta.6", diff --git a/packages/task-herder/package.json b/packages/task-herder/package.json index 71b59be742b..b677f5cc230 100644 --- a/packages/task-herder/package.json +++ b/packages/task-herder/package.json @@ -40,7 +40,7 @@ "@vitest/coverage-v8": "4.0.17", "eslint": "9.39.2", "eslint-config-scratch": "12.0.45", - "prettier": "3.7.4", + "prettier": "3.8.0", "rimraf": "6.1.2", "typescript": "5.9.3", "unplugin-dts": "1.0.0-beta.6", From 5fd6e89f24a4d737ba40dd6d803055340e782d03 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 18 Jan 2026 04:58:35 +0000 Subject: [PATCH 172/521] fix(deps): update dependency scratch-l10n to v6.1.57 --- package-lock.json | 10 +++++----- packages/scratch-gui/package.json | 2 +- packages/scratch-vm/package.json | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1f323a1b55a..d1a01b542ab 100644 --- a/package-lock.json +++ b/package-lock.json @@ -34684,9 +34684,9 @@ } }, "node_modules/scratch-l10n": { - "version": "6.1.56", - "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-6.1.56.tgz", - "integrity": "sha512-hgvPRYySmtSACHmmre8EMxTbhxp9WRAU1V2LwmFWZ7Nl0uiqtI4Bys89+qFkWR/90A2zoaaeZqs2KX035/HrdA==", + "version": "6.1.57", + "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-6.1.57.tgz", + "integrity": "sha512-6W0rXMyuMt3IyCqRBtQIRL5fKH3o2WNxXbhgJHPr8IqKMmxLFqLwtc1erbckuAeRoMWXDkAVcQBtx6uXXuCnCg==", "license": "AGPL-3.0-only", "dependencies": { "@transifex/api": "7.1.5", @@ -41346,7 +41346,7 @@ "redux-throttle": "0.1.1", "scratch-audio": "2.0.268", "scratch-blocks": "1.3.0", - "scratch-l10n": "6.1.56", + "scratch-l10n": "6.1.57", "scratch-paint": "4.1.49", "scratch-render-fonts": "1.0.252", "scratch-storage": "5.0.10", @@ -41706,7 +41706,7 @@ "jsdoc": "3.6.11", "pngjs": "3.4.0", "scratch-blocks": "1.3.0", - "scratch-l10n": "6.1.56", + "scratch-l10n": "6.1.57", "scratch-render-fonts": "1.0.252", "scratch-semantic-release-config": "4.0.0", "scratch-webpack-configuration": "3.1.0", diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index a8e5b8d44a5..c7b4c8e4950 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -117,7 +117,7 @@ "redux-throttle": "0.1.1", "scratch-audio": "2.0.268", "scratch-blocks": "1.3.0", - "scratch-l10n": "6.1.56", + "scratch-l10n": "6.1.57", "scratch-paint": "4.1.49", "scratch-render-fonts": "1.0.252", "scratch-storage": "5.0.10", diff --git a/packages/scratch-vm/package.json b/packages/scratch-vm/package.json index 8b459d9d1cf..6a2be5095d1 100644 --- a/packages/scratch-vm/package.json +++ b/packages/scratch-vm/package.json @@ -94,7 +94,7 @@ "jsdoc": "3.6.11", "pngjs": "3.4.0", "scratch-blocks": "1.3.0", - "scratch-l10n": "6.1.56", + "scratch-l10n": "6.1.57", "scratch-render-fonts": "1.0.252", "scratch-semantic-release-config": "4.0.0", "scratch-webpack-configuration": "3.1.0", From cd55527225ad883786752262f86a17dfb40e9600 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 18 Jan 2026 10:34:17 +0000 Subject: [PATCH 173/521] style(deps): update dependency eslint-config-scratch to v12.0.46 --- package-lock.json | 34 ++++++---------------- packages/scratch-gui/package.json | 2 +- packages/scratch-render/package.json | 2 +- packages/scratch-svg-renderer/package.json | 2 +- packages/scratch-vm/package.json | 2 +- packages/task-herder/package.json | 2 +- 6 files changed, 14 insertions(+), 30 deletions(-) diff --git a/package-lock.json b/package-lock.json index d1a01b542ab..eb044a30933 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16634,9 +16634,9 @@ } }, "node_modules/eslint-config-scratch": { - "version": "12.0.45", - "resolved": "https://registry.npmjs.org/eslint-config-scratch/-/eslint-config-scratch-12.0.45.tgz", - "integrity": "sha512-axXjoeaT4/yg43JonNwLQTjQjLsW7AXKJKRGsaUHr1Ygh4CDQKwq4b+OR2+4g0cZtzPi99/e17H6kN4wLkSrOg==", + "version": "12.0.46", + "resolved": "https://registry.npmjs.org/eslint-config-scratch/-/eslint-config-scratch-12.0.46.tgz", + "integrity": "sha512-L1WEsYsAgRY4SlqCfHVlKThczTlRmMke4uikQxd9TEkorCUKnXSi9lw4guSbjsugCwZWP+GcHu37SXLa4TrmWw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -16656,29 +16656,13 @@ "eslint-plugin-react": "7.37.5", "eslint-plugin-react-hooks": "7.0.1", "globals": "16.5.0", - "prettier": "3.7.4", + "prettier": "3.8.0", "typescript-eslint": "8.46.3" }, "peerDependencies": { "eslint": "^9.23.0" } }, - "node_modules/eslint-config-scratch/node_modules/prettier": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.7.4.tgz", - "integrity": "sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==", - "dev": true, - "license": "MIT", - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, "node_modules/eslint-import-resolver-node": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", @@ -41375,7 +41359,7 @@ "cheerio": "1.1.2", "cross-env": "7.0.3", "eslint": "9.39.2", - "eslint-config-scratch": "12.0.45", + "eslint-config-scratch": "12.0.46", "eslint-import-resolver-webpack": "0.13.10", "eslint-plugin-import": "2.32.0", "eslint-plugin-react": "7.37.5", @@ -41440,7 +41424,7 @@ "copy-webpack-plugin": "6.4.1", "docdash": "0.4.0", "eslint": "9.39.2", - "eslint-config-scratch": "12.0.45", + "eslint-config-scratch": "12.0.46", "gh-pages": "1.2.0", "globals": "16.5.0", "html-webpack-plugin": "5.6.5", @@ -41607,7 +41591,7 @@ "babel-loader": "9.2.1", "copy-webpack-plugin": "6.4.1", "eslint": "9.39.2", - "eslint-config-scratch": "12.0.45", + "eslint-config-scratch": "12.0.46", "globals": "16.5.0", "jsdom": "13.2.0", "mkdirp": "2.1.6", @@ -41696,7 +41680,7 @@ "copy-webpack-plugin": "6.4.1", "docdash": "1.2.0", "eslint": "9.39.2", - "eslint-config-scratch": "12.0.45", + "eslint-config-scratch": "12.0.46", "expose-loader": "1.0.3", "file-loader": "6.2.0", "format-message-cli": "6.2.4", @@ -41853,7 +41837,7 @@ "devDependencies": { "@vitest/coverage-v8": "4.0.17", "eslint": "9.39.2", - "eslint-config-scratch": "12.0.45", + "eslint-config-scratch": "12.0.46", "prettier": "3.8.0", "rimraf": "6.1.2", "typescript": "5.9.3", diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index c7b4c8e4950..67b3c4c054b 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -152,7 +152,7 @@ "cheerio": "1.1.2", "cross-env": "7.0.3", "eslint": "9.39.2", - "eslint-config-scratch": "12.0.45", + "eslint-config-scratch": "12.0.46", "eslint-import-resolver-webpack": "0.13.10", "eslint-plugin-import": "2.32.0", "eslint-plugin-react": "7.37.5", diff --git a/packages/scratch-render/package.json b/packages/scratch-render/package.json index a78df2e0810..89f184c64fe 100644 --- a/packages/scratch-render/package.json +++ b/packages/scratch-render/package.json @@ -67,7 +67,7 @@ "copy-webpack-plugin": "6.4.1", "docdash": "0.4.0", "eslint": "9.39.2", - "eslint-config-scratch": "12.0.45", + "eslint-config-scratch": "12.0.46", "gh-pages": "1.2.0", "globals": "16.5.0", "html-webpack-plugin": "5.6.5", diff --git a/packages/scratch-svg-renderer/package.json b/packages/scratch-svg-renderer/package.json index 7a496383f05..2a117cc001a 100644 --- a/packages/scratch-svg-renderer/package.json +++ b/packages/scratch-svg-renderer/package.json @@ -53,7 +53,7 @@ "babel-loader": "9.2.1", "copy-webpack-plugin": "6.4.1", "eslint": "9.39.2", - "eslint-config-scratch": "12.0.45", + "eslint-config-scratch": "12.0.46", "globals": "16.5.0", "jsdom": "13.2.0", "mkdirp": "2.1.6", diff --git a/packages/scratch-vm/package.json b/packages/scratch-vm/package.json index 6a2be5095d1..e8954e2bcba 100644 --- a/packages/scratch-vm/package.json +++ b/packages/scratch-vm/package.json @@ -84,7 +84,7 @@ "copy-webpack-plugin": "6.4.1", "docdash": "1.2.0", "eslint": "9.39.2", - "eslint-config-scratch": "12.0.45", + "eslint-config-scratch": "12.0.46", "expose-loader": "1.0.3", "file-loader": "6.2.0", "format-message-cli": "6.2.4", diff --git a/packages/task-herder/package.json b/packages/task-herder/package.json index b677f5cc230..70d206cfad2 100644 --- a/packages/task-herder/package.json +++ b/packages/task-herder/package.json @@ -39,7 +39,7 @@ "devDependencies": { "@vitest/coverage-v8": "4.0.17", "eslint": "9.39.2", - "eslint-config-scratch": "12.0.45", + "eslint-config-scratch": "12.0.46", "prettier": "3.8.0", "rimraf": "6.1.2", "typescript": "5.9.3", From c5789dfb3e11c461477dd081069b046ce17607c1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 18 Jan 2026 13:13:28 +0000 Subject: [PATCH 174/521] fix(deps): update dependency scratch-paint to v4.1.50 --- package-lock.json | 8 ++++---- packages/scratch-gui/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index eb044a30933..17c1aa6aa73 100644 --- a/package-lock.json +++ b/package-lock.json @@ -34709,9 +34709,9 @@ } }, "node_modules/scratch-paint": { - "version": "4.1.49", - "resolved": "https://registry.npmjs.org/scratch-paint/-/scratch-paint-4.1.49.tgz", - "integrity": "sha512-PuQBR8nmL21usfTLtcvFdo8S6CnvXjUnSFJBddQQyAHdGIQbbhWHE/5TvwEEPuypaxQKqeIOQJMjv+/+hDlCfA==", + "version": "4.1.50", + "resolved": "https://registry.npmjs.org/scratch-paint/-/scratch-paint-4.1.50.tgz", + "integrity": "sha512-K9kYFxGWYI2VF8+ACrUih6iEu8C3T++JHo8YhDqw84VfoN/h3W/Z+fGk8/kyrCUuutOr3u6VZY/w4CbjDBGCAw==", "license": "AGPL-3.0-only", "dependencies": { "@scratch/paper": "^0.11.20221201200345", @@ -41331,7 +41331,7 @@ "scratch-audio": "2.0.268", "scratch-blocks": "1.3.0", "scratch-l10n": "6.1.57", - "scratch-paint": "4.1.49", + "scratch-paint": "4.1.50", "scratch-render-fonts": "1.0.252", "scratch-storage": "5.0.10", "startaudiocontext": "1.2.1", diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index 67b3c4c054b..1e97c699fd5 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -118,7 +118,7 @@ "scratch-audio": "2.0.268", "scratch-blocks": "1.3.0", "scratch-l10n": "6.1.57", - "scratch-paint": "4.1.49", + "scratch-paint": "4.1.50", "scratch-render-fonts": "1.0.252", "scratch-storage": "5.0.10", "startaudiocontext": "1.2.1", From fb2742ed4ea851e8f86990d0595b7303d879346f Mon Sep 17 00:00:00 2001 From: Ayshe Dzhindzhi Date: Mon, 19 Jan 2026 12:59:25 +0200 Subject: [PATCH 175/521] fix: do not allow changing variables outside of the editor --- packages/scratch-gui/src/components/monitor/monitor.jsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/scratch-gui/src/components/monitor/monitor.jsx b/packages/scratch-gui/src/components/monitor/monitor.jsx index df2f3374832..edcb0bc049f 100644 --- a/packages/scratch-gui/src/components/monitor/monitor.jsx +++ b/packages/scratch-gui/src/components/monitor/monitor.jsx @@ -59,7 +59,10 @@ const MonitorComponent = props => ( props.onNextMode } > - + {React.createElement(modes[props.mode], { categoryColor: getCategoryColor( props.colorMode, From a91c22e65cb30e664e2e82d9c619a1ed65357c69 Mon Sep 17 00:00:00 2001 From: Ayshe Dzhindzhi Date: Mon, 19 Jan 2026 13:16:15 +0200 Subject: [PATCH 176/521] fix: update snapshots --- .../unit/components/__snapshots__/monitor-list.test.jsx.snap | 2 ++ .../test/unit/components/__snapshots__/monitor.test.jsx.snap | 2 ++ 2 files changed, 4 insertions(+) diff --git a/packages/scratch-gui/test/unit/components/__snapshots__/monitor-list.test.jsx.snap b/packages/scratch-gui/test/unit/components/__snapshots__/monitor-list.test.jsx.snap index eda95185a26..b089e694866 100644 --- a/packages/scratch-gui/test/unit/components/__snapshots__/monitor-list.test.jsx.snap +++ b/packages/scratch-gui/test/unit/components/__snapshots__/monitor-list.test.jsx.snap @@ -14,6 +14,7 @@ exports[`MonitorListComponent it renders the correct step size for discrete slid >
@@ -54,6 +55,7 @@ exports[`MonitorListComponent it renders the correct step size for non-discrete >
diff --git a/packages/scratch-gui/test/unit/components/__snapshots__/monitor.test.jsx.snap b/packages/scratch-gui/test/unit/components/__snapshots__/monitor.test.jsx.snap index e6770d0f102..996996b6283 100644 --- a/packages/scratch-gui/test/unit/components/__snapshots__/monitor.test.jsx.snap +++ b/packages/scratch-gui/test/unit/components/__snapshots__/monitor.test.jsx.snap @@ -7,6 +7,7 @@ exports[`Monitor Component it selects the correct colors based on dark mode 1`] >
@@ -30,6 +31,7 @@ exports[`Monitor Component it selects the correct colors based on default color >
From 9d9c68c19bf8c781a96b2180f8ff728e6e515ba6 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 19 Jan 2026 21:01:04 +0000 Subject: [PATCH 177/521] chore(deps): update dependency html-webpack-plugin to v5.6.6 --- package-lock.json | 10 +++++----- packages/scratch-gui/package.json | 2 +- packages/scratch-render/package.json | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 17c1aa6aa73..69e54bbddd5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20300,9 +20300,9 @@ } }, "node_modules/html-webpack-plugin": { - "version": "5.6.5", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.5.tgz", - "integrity": "sha512-4xynFbKNNk+WlzXeQQ+6YYsH2g7mpfPszQZUi3ovKlj+pDmngQ7vRXjrrmGROabmKwyQkcgcX5hqfOwHbFmK5g==", + "version": "5.6.6", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.6.tgz", + "integrity": "sha512-bLjW01UTrvoWTJQL5LsMRo1SypHW80FTm12OJRSnr3v6YHNhfe+1r0MYUZJMACxnCHURVnBWRwAsWs2yPU9Ezw==", "dev": true, "license": "MIT", "dependencies": { @@ -41365,7 +41365,7 @@ "eslint-plugin-react": "7.37.5", "file-loader": "6.2.0", "gh-pages": "3.2.3", - "html-webpack-plugin": "5.6.5", + "html-webpack-plugin": "5.6.6", "jest": "29.7.0", "jest-environment-jsdom": "29.7.0", "jest-junit": "7.0.0", @@ -41427,7 +41427,7 @@ "eslint-config-scratch": "12.0.46", "gh-pages": "1.2.0", "globals": "16.5.0", - "html-webpack-plugin": "5.6.5", + "html-webpack-plugin": "5.6.6", "jsdoc": "3.6.11", "playwright-chromium": "1.57.0", "scratch-render-fonts": "1.0.252", diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index 1e97c699fd5..51e963126bb 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -158,7 +158,7 @@ "eslint-plugin-react": "7.37.5", "file-loader": "6.2.0", "gh-pages": "3.2.3", - "html-webpack-plugin": "5.6.5", + "html-webpack-plugin": "5.6.6", "jest": "29.7.0", "jest-environment-jsdom": "29.7.0", "jest-junit": "7.0.0", diff --git a/packages/scratch-render/package.json b/packages/scratch-render/package.json index 89f184c64fe..8e0035e9a8b 100644 --- a/packages/scratch-render/package.json +++ b/packages/scratch-render/package.json @@ -70,7 +70,7 @@ "eslint-config-scratch": "12.0.46", "gh-pages": "1.2.0", "globals": "16.5.0", - "html-webpack-plugin": "5.6.5", + "html-webpack-plugin": "5.6.6", "jsdoc": "3.6.11", "playwright-chromium": "1.57.0", "scratch-render-fonts": "1.0.252", From 7969eabf8379ff5ef0c8b60e9d22c9127070a4f0 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 20 Jan 2026 05:13:42 +0000 Subject: [PATCH 178/521] fix(deps): pin dependency react-redux to 8.1.3 (#400) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 2 +- packages/scratch-gui/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 69e54bbddd5..454e1bd5b02 100644 --- a/package-lock.json +++ b/package-lock.json @@ -41320,7 +41320,7 @@ "react-intl": "6.8.9", "react-modal": "3.16.3", "react-popover": "0.5.10", - "react-redux": "^8.0.0", + "react-redux": "8.1.3", "react-responsive": "9.0.2", "react-style-proptype": "3.2.2", "react-tabs": "5.2.0", diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index 51e963126bb..e384eebdf3d 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -107,7 +107,7 @@ "react-intl": "6.8.9", "react-modal": "3.16.3", "react-popover": "0.5.10", - "react-redux": "^8.0.0", + "react-redux": "8.1.3", "react-responsive": "9.0.2", "react-style-proptype": "3.2.2", "react-tabs": "5.2.0", From c9abee3deddd89d96e9109154cb0260458f337cb Mon Sep 17 00:00:00 2001 From: Nico Hauser Date: Wed, 21 Jan 2026 09:56:00 +0100 Subject: [PATCH 179/521] fix: type narrowing for this.projectHost --- packages/scratch-gui/src/lib/legacy-storage.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/scratch-gui/src/lib/legacy-storage.ts b/packages/scratch-gui/src/lib/legacy-storage.ts index 961b6c26210..33cb8ece0ce 100644 --- a/packages/scratch-gui/src/lib/legacy-storage.ts +++ b/packages/scratch-gui/src/lib/legacy-storage.ts @@ -69,11 +69,13 @@ export class LegacyStorage implements GUIStorage { vmState: string, params: { originalId: string; isCopy: boolean; isRemix: boolean; title: string; } ): Promise<{ id: string | number; }> { - if (!this.projectHost) { + const host = this.projectHost; + + if (!host) { return Promise.reject(new Error('Project host not set')); } // Haven't inlined the code here so that we can keep Git history on the implementation, just in case - return saveProjectToServer(this.projectHost, projectId, vmState, params); + return saveProjectToServer(host, projectId, vmState, params); } private cacheDefaultProject (storage: ScratchStorage) { From 0688000eb09931ac09db0ef7b0c10b5cad987cb9 Mon Sep 17 00:00:00 2001 From: Nico Hauser Date: Wed, 21 Jan 2026 09:56:02 +0100 Subject: [PATCH 180/521] chore: simplify imports --- packages/scratch-gui/src/index-standalone.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/scratch-gui/src/index-standalone.tsx b/packages/scratch-gui/src/index-standalone.tsx index 39cfdd45981..2bf3d94f87a 100644 --- a/packages/scratch-gui/src/index-standalone.tsx +++ b/packages/scratch-gui/src/index-standalone.tsx @@ -6,8 +6,8 @@ import {EditorState} from './lib/editor-state'; import {ReactComponentLike} from 'prop-types'; import {compose} from 'redux'; -export {EditorState, EditorStateParams} from './lib/editor-state'; -export {AccountMenuOptions} from './lib/account-menu-options'; +export {EditorState, type EditorStateParams} from './lib/editor-state'; +export {type AccountMenuOptions} from './lib/account-menu-options'; export {setAppElement} from 'react-modal'; From af50f4dc4994a39ef8b89023d9cfb5e7f0476cf8 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 21 Jan 2026 21:31:36 +0000 Subject: [PATCH 181/521] fix(deps): update dependency scratch-semantic-release-config to v4.0.1 --- package-lock.json | 19093 +++++++++++++++++-- packages/scratch-gui/package.json | 2 +- packages/scratch-render/package.json | 2 +- packages/scratch-svg-renderer/package.json | 2 +- packages/scratch-vm/package.json | 2 +- 5 files changed, 16997 insertions(+), 2104 deletions(-) diff --git a/package-lock.json b/package-lock.json index 454e1bd5b02..32850c45727 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,6 +25,58 @@ "ts-node": "10.9.2" } }, + "node_modules/@actions/core": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@actions/core/-/core-2.0.2.tgz", + "integrity": "sha512-Ast1V7yHbGAhplAsuVlnb/5J8Mtr/Zl6byPPL+Qjq3lmfIgWF1ak1iYfF/079cRERiuTALTXkSuEUdZeDCfGtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@actions/exec": "^2.0.0", + "@actions/http-client": "^3.0.1" + } + }, + "node_modules/@actions/exec": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@actions/exec/-/exec-2.0.0.tgz", + "integrity": "sha512-k8ngrX2voJ/RIN6r9xB82NVqKpnMRtxDoiO+g3olkIUpQNqjArXrCQceduQZCQj3P3xm32pChRLqRrtXTlqhIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@actions/io": "^2.0.0" + } + }, + "node_modules/@actions/http-client": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-3.0.1.tgz", + "integrity": "sha512-SbGS8c/vySbNO3kjFgSW77n83C4MQx/Yoe+b1hAdpuvfHxnkHzDq2pWljUpAA56Si1Gae/7zjeZsV0CYjmLo/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "tunnel": "^0.0.6", + "undici": "^5.28.5" + } + }, + "node_modules/@actions/http-client/node_modules/undici": { + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.29.0.tgz", + "integrity": "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fastify/busboy": "^2.0.0" + }, + "engines": { + "node": ">=14.0" + } + }, + "node_modules/@actions/io": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@actions/io/-/io-2.0.0.tgz", + "integrity": "sha512-Jv33IN09XLO+0HS79aaODsvIRyduiF7NY/F6LYeK5oeUmrsz7aFdRphQjFoESF4jS7lMauDOttKALcpapVDIAg==", + "dev": true, + "license": "MIT" + }, "node_modules/@adobe/css-tools": { "version": "4.4.4", "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.4.tgz", @@ -3249,6 +3301,16 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@fastify/busboy": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", + "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, "node_modules/@floating-ui/core": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.3.tgz", @@ -5035,153 +5097,149 @@ } }, "node_modules/@octokit/auth-token": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.4.tgz", - "integrity": "sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-6.0.0.tgz", + "integrity": "sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w==", "dev": true, "license": "MIT", "engines": { - "node": ">= 14" + "node": ">= 20" } }, "node_modules/@octokit/core": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.2.4.tgz", - "integrity": "sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-7.0.6.tgz", + "integrity": "sha512-DhGl4xMVFGVIyMwswXeyzdL4uXD5OGILGX5N8Y+f6W7LhC1Ze2poSNrkF/fedpVDHEEZ+PHFW0vL14I+mm8K3Q==", "dev": true, "license": "MIT", "dependencies": { - "@octokit/auth-token": "^3.0.0", - "@octokit/graphql": "^5.0.0", - "@octokit/request": "^6.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^9.0.0", - "before-after-hook": "^2.2.0", - "universal-user-agent": "^6.0.0" + "@octokit/auth-token": "^6.0.0", + "@octokit/graphql": "^9.0.3", + "@octokit/request": "^10.0.6", + "@octokit/request-error": "^7.0.2", + "@octokit/types": "^16.0.0", + "before-after-hook": "^4.0.0", + "universal-user-agent": "^7.0.0" }, "engines": { - "node": ">= 14" + "node": ">= 20" } }, "node_modules/@octokit/endpoint": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.6.tgz", - "integrity": "sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg==", + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-11.0.2.tgz", + "integrity": "sha512-4zCpzP1fWc7QlqunZ5bSEjxc6yLAlRTnDwKtgXfcI/FxxGoqedDG8V2+xJ60bV2kODqcGB+nATdtap/XYq2NZQ==", "dev": true, "license": "MIT", "dependencies": { - "@octokit/types": "^9.0.0", - "is-plain-object": "^5.0.0", - "universal-user-agent": "^6.0.0" + "@octokit/types": "^16.0.0", + "universal-user-agent": "^7.0.2" }, "engines": { - "node": ">= 14" + "node": ">= 20" } }, "node_modules/@octokit/graphql": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.6.tgz", - "integrity": "sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-9.0.3.tgz", + "integrity": "sha512-grAEuupr/C1rALFnXTv6ZQhFuL1D8G5y8CN04RgrO4FIPMrtm+mcZzFG7dcBm+nq+1ppNixu+Jd78aeJOYxlGA==", "dev": true, "license": "MIT", "dependencies": { - "@octokit/request": "^6.0.0", - "@octokit/types": "^9.0.0", - "universal-user-agent": "^6.0.0" + "@octokit/request": "^10.0.6", + "@octokit/types": "^16.0.0", + "universal-user-agent": "^7.0.0" }, "engines": { - "node": ">= 14" + "node": ">= 20" } }, "node_modules/@octokit/openapi-types": { - "version": "18.1.1", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.1.1.tgz", - "integrity": "sha512-VRaeH8nCDtF5aXWnjPuEMIYf1itK/s3JYyJcWFJT8X9pSNnBtriDf7wlEWsGuhPLl4QIH4xM8fqTXDwJ3Mu6sw==", + "version": "27.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-27.0.0.tgz", + "integrity": "sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA==", "dev": true, "license": "MIT" }, "node_modules/@octokit/plugin-paginate-rest": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-6.1.2.tgz", - "integrity": "sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ==", + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-14.0.0.tgz", + "integrity": "sha512-fNVRE7ufJiAA3XUrha2omTA39M6IXIc6GIZLvlbsm8QOQCYvpq/LkMNGyFlB1d8hTDzsAXa3OKtybdMAYsV/fw==", "dev": true, "license": "MIT", "dependencies": { - "@octokit/tsconfig": "^1.0.2", - "@octokit/types": "^9.2.3" + "@octokit/types": "^16.0.0" }, "engines": { - "node": ">= 14" + "node": ">= 20" }, "peerDependencies": { - "@octokit/core": ">=4" + "@octokit/core": ">=6" } }, "node_modules/@octokit/plugin-retry": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-4.1.6.tgz", - "integrity": "sha512-obkYzIgEC75r8+9Pnfiiqy3y/x1bc3QLE5B7qvv9wi9Kj0R5tGQFC6QMBg1154WQ9lAVypuQDGyp3hNpp15gQQ==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-8.0.3.tgz", + "integrity": "sha512-vKGx1i3MC0za53IzYBSBXcrhmd+daQDzuZfYDd52X5S0M2otf3kVZTVP8bLA3EkU0lTvd1WEC2OlNNa4G+dohA==", "dev": true, "license": "MIT", "dependencies": { - "@octokit/types": "^9.0.0", + "@octokit/request-error": "^7.0.2", + "@octokit/types": "^16.0.0", "bottleneck": "^2.15.3" }, "engines": { - "node": ">= 14" + "node": ">= 20" }, "peerDependencies": { - "@octokit/core": ">=3" + "@octokit/core": ">=7" } }, "node_modules/@octokit/plugin-throttling": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-5.2.3.tgz", - "integrity": "sha512-C9CFg9mrf6cugneKiaI841iG8DOv6P5XXkjmiNNut+swePxQ7RWEdAZRp5rJoE1hjsIqiYcKa/ZkOQ+ujPI39Q==", + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-11.0.3.tgz", + "integrity": "sha512-34eE0RkFCKycLl2D2kq7W+LovheM/ex3AwZCYN8udpi6bxsyjZidb2McXs69hZhLmJlDqTSP8cH+jSRpiaijBg==", "dev": true, "license": "MIT", "dependencies": { - "@octokit/types": "^9.0.0", + "@octokit/types": "^16.0.0", "bottleneck": "^2.15.3" }, "engines": { - "node": ">= 14" + "node": ">= 20" }, "peerDependencies": { - "@octokit/core": "^4.0.0" + "@octokit/core": "^7.0.0" } }, "node_modules/@octokit/request": { - "version": "6.2.8", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.8.tgz", - "integrity": "sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw==", + "version": "10.0.7", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-10.0.7.tgz", + "integrity": "sha512-v93h0i1yu4idj8qFPZwjehoJx4j3Ntn+JhXsdJrG9pYaX6j/XRz2RmasMUHtNgQD39nrv/VwTWSqK0RNXR8upA==", "dev": true, "license": "MIT", "dependencies": { - "@octokit/endpoint": "^7.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^9.0.0", - "is-plain-object": "^5.0.0", - "node-fetch": "^2.6.7", - "universal-user-agent": "^6.0.0" + "@octokit/endpoint": "^11.0.2", + "@octokit/request-error": "^7.0.2", + "@octokit/types": "^16.0.0", + "fast-content-type-parse": "^3.0.0", + "universal-user-agent": "^7.0.2" }, "engines": { - "node": ">= 14" + "node": ">= 20" } }, "node_modules/@octokit/request-error": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.3.tgz", - "integrity": "sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-7.1.0.tgz", + "integrity": "sha512-KMQIfq5sOPpkQYajXHwnhjCC0slzCNScLHs9JafXc4RAJI+9f+jNDlBNaIMTvazOPLgb4BnlhGJOTbnN0wIjPw==", "dev": true, "license": "MIT", "dependencies": { - "@octokit/types": "^9.0.0", - "deprecation": "^2.0.0", - "once": "^1.4.0" + "@octokit/types": "^16.0.0" }, "engines": { - "node": ">= 14" + "node": ">= 20" } }, "node_modules/@octokit/tsconfig": { @@ -5192,13 +5250,13 @@ "license": "MIT" }, "node_modules/@octokit/types": { - "version": "9.3.2", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz", - "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==", + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-16.0.0.tgz", + "integrity": "sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg==", "dev": true, "license": "MIT", "dependencies": { - "@octokit/openapi-types": "^18.0.0" + "@octokit/openapi-types": "^27.0.0" } }, "node_modules/@oxc-project/runtime": { @@ -5422,9 +5480,9 @@ "license": "ISC" }, "node_modules/@pnpm/npm-conf": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.3.1.tgz", - "integrity": "sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-3.0.2.tgz", + "integrity": "sha512-h104Kh26rR8tm+a3Qkc5S4VLYint3FE48as7+/5oCEcKR2idC/pF1G6AhIXKI+eHPJa/3J9i5z0Al47IeGHPkA==", "dev": true, "license": "MIT", "dependencies": { @@ -6275,61 +6333,76 @@ "resolved": "packages/task-herder", "link": true }, + "node_modules/@sec-ant/readable-stream": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", + "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==", + "dev": true, + "license": "MIT" + }, "node_modules/@semantic-release/commit-analyzer": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/@semantic-release/commit-analyzer/-/commit-analyzer-9.0.2.tgz", - "integrity": "sha512-E+dr6L+xIHZkX4zNMe6Rnwg4YQrWNXK+rNsvwOPpdFppvZO1olE2fIgWhv89TkQErygevbjsZFSIxp+u6w2e5g==", + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/@semantic-release/commit-analyzer/-/commit-analyzer-13.0.1.tgz", + "integrity": "sha512-wdnBPHKkr9HhNhXOhZD5a2LNl91+hs8CC2vsAVYxtZH3y0dV3wKn+uZSN61rdJQZ8EGxzWB3inWocBHV9+u/CQ==", "dev": true, "license": "MIT", "dependencies": { - "conventional-changelog-angular": "^5.0.0", - "conventional-commits-filter": "^2.0.0", - "conventional-commits-parser": "^3.2.3", + "conventional-changelog-angular": "^8.0.0", + "conventional-changelog-writer": "^8.0.0", + "conventional-commits-filter": "^5.0.0", + "conventional-commits-parser": "^6.0.0", "debug": "^4.0.0", - "import-from": "^4.0.0", - "lodash": "^4.17.4", + "import-from-esm": "^2.0.0", + "lodash-es": "^4.17.21", "micromatch": "^4.0.2" }, "engines": { - "node": ">=14.17" + "node": ">=20.8.1" }, "peerDependencies": { - "semantic-release": ">=18.0.0-beta.1" + "semantic-release": ">=20.1.0" } }, "node_modules/@semantic-release/commit-analyzer/node_modules/conventional-changelog-angular": { - "version": "5.0.13", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz", - "integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-8.1.0.tgz", + "integrity": "sha512-GGf2Nipn1RUCAktxuVauVr1e3r8QrLP/B0lEUsFktmGqc3ddbQkhoJZHJctVU829U1c6mTSWftrVOCHaL85Q3w==", "dev": true, "license": "ISC", "dependencies": { - "compare-func": "^2.0.0", - "q": "^1.5.1" + "compare-func": "^2.0.0" }, "engines": { - "node": ">=10" + "node": ">=18" } }, "node_modules/@semantic-release/commit-analyzer/node_modules/conventional-commits-parser": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz", - "integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-6.2.1.tgz", + "integrity": "sha512-20pyHgnO40rvfI0NGF/xiEoFMkXDtkF8FwHvk5BokoFoCuTQRI8vrNCNFWUOfuolKJMm1tPCHc8GgYEtr1XRNA==", "dev": true, "license": "MIT", "dependencies": { - "is-text-path": "^1.0.1", - "JSONStream": "^1.0.4", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^3.0.0", - "through2": "^4.0.0" + "meow": "^13.0.0" }, "bin": { - "conventional-commits-parser": "cli.js" + "conventional-commits-parser": "dist/cli/index.js" }, "engines": { - "node": ">=10" + "node": ">=18" + } + }, + "node_modules/@semantic-release/commit-analyzer/node_modules/meow": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", + "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@semantic-release/error": { @@ -6366,86 +6439,361 @@ } }, "node_modules/@semantic-release/github": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-8.1.0.tgz", - "integrity": "sha512-erR9E5rpdsz0dW1I7785JtndQuMWN/iDcemcptf67tBNOmBUN0b2YNOgcjYUnBpgRpZ5ozfBHrK7Bz+2ets/Dg==", + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-12.0.2.tgz", + "integrity": "sha512-qyqLS+aSGH1SfXIooBKjs7mvrv0deg8v+jemegfJg1kq6ji+GJV8CO08VJDEsvjp3O8XJmTTIAjjZbMzagzsdw==", "dev": true, "license": "MIT", "dependencies": { - "@octokit/core": "^4.2.1", - "@octokit/plugin-paginate-rest": "^6.1.2", - "@octokit/plugin-retry": "^4.1.3", - "@octokit/plugin-throttling": "^5.2.3", - "@semantic-release/error": "^3.0.0", - "aggregate-error": "^3.0.0", - "debug": "^4.0.0", - "dir-glob": "^3.0.0", - "fs-extra": "^11.0.0", - "globby": "^11.0.0", + "@octokit/core": "^7.0.0", + "@octokit/plugin-paginate-rest": "^14.0.0", + "@octokit/plugin-retry": "^8.0.0", + "@octokit/plugin-throttling": "^11.0.0", + "@semantic-release/error": "^4.0.0", + "aggregate-error": "^5.0.0", + "debug": "^4.3.4", + "dir-glob": "^3.0.1", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.0", - "issue-parser": "^6.0.0", - "lodash": "^4.17.4", - "mime": "^3.0.0", - "p-filter": "^2.0.0", - "url-join": "^4.0.0" + "issue-parser": "^7.0.0", + "lodash-es": "^4.17.21", + "mime": "^4.0.0", + "p-filter": "^4.0.0", + "tinyglobby": "^0.2.14", + "undici": "^7.0.0", + "url-join": "^5.0.0" }, "engines": { - "node": ">=14.17" + "node": "^22.14.0 || >= 24.10.0" }, "peerDependencies": { - "semantic-release": ">=18.0.0-beta.1" + "semantic-release": ">=24.1.0" + } + }, + "node_modules/@semantic-release/github/node_modules/@semantic-release/error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-4.0.0.tgz", + "integrity": "sha512-mgdxrHTLOjOddRVYIYDo0fR3/v61GNN1YGkfbrjuIKg/uMgCd+Qzo3UAXJ+woLQQpos4pl5Esuw5A7AoNlzjUQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@semantic-release/github/node_modules/aggregate-error": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-5.0.0.tgz", + "integrity": "sha512-gOsf2YwSlleG6IjRYG2A7k0HmBMEo6qVNk9Bp/EaLgAJT5ngH6PXbqa4ItvnEwCm/velL5jAnQgsHsWnjhGmvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "clean-stack": "^5.2.0", + "indent-string": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@semantic-release/github/node_modules/clean-stack": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-5.3.0.tgz", + "integrity": "sha512-9ngPTOhYGQqNVSfeJkYXHmF7AGWp4/nN5D/QqNQs3Dvxd1Kk/WpjHfNujKHYUQ/5CoGyOyFNoWSPk5afzP0QVg==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "5.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@semantic-release/github/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@semantic-release/github/node_modules/indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@semantic-release/npm": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-9.0.2.tgz", - "integrity": "sha512-zgsynF6McdzxPnFet+a4iO9HpAlARXOM5adz7VGVCvj0ne8wtL2ZOQoDV2wZPDmdEotDIbVeJjafhelZjs9j6g==", + "version": "13.1.3", + "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-13.1.3.tgz", + "integrity": "sha512-q7zreY8n9V0FIP1Cbu63D+lXtRAVAIWb30MH5U3TdrfXt6r2MIrWCY0whAImN53qNvSGp0Zt07U95K+Qp9GpEg==", "dev": true, "license": "MIT", "dependencies": { - "@semantic-release/error": "^3.0.0", - "aggregate-error": "^3.0.0", - "execa": "^5.0.0", + "@actions/core": "^2.0.0", + "@semantic-release/error": "^4.0.0", + "aggregate-error": "^5.0.0", + "env-ci": "^11.2.0", + "execa": "^9.0.0", "fs-extra": "^11.0.0", - "lodash": "^4.17.15", + "lodash-es": "^4.17.21", "nerf-dart": "^1.0.0", - "normalize-url": "^6.0.0", - "npm": "^8.3.0", + "normalize-url": "^8.0.0", + "npm": "^11.6.2", "rc": "^1.2.8", - "read-pkg": "^5.0.0", + "read-pkg": "^10.0.0", "registry-auth-token": "^5.0.0", "semver": "^7.1.2", - "tempy": "^1.0.0" + "tempy": "^3.0.0" }, "engines": { - "node": ">=16 || ^14.17" + "node": "^22.14.0 || >= 24.10.0" }, "peerDependencies": { - "semantic-release": ">=19.0.0" + "semantic-release": ">=20.1.0" + } + }, + "node_modules/@semantic-release/npm/node_modules/@semantic-release/error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-4.0.0.tgz", + "integrity": "sha512-mgdxrHTLOjOddRVYIYDo0fR3/v61GNN1YGkfbrjuIKg/uMgCd+Qzo3UAXJ+woLQQpos4pl5Esuw5A7AoNlzjUQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@semantic-release/npm/node_modules/aggregate-error": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-5.0.0.tgz", + "integrity": "sha512-gOsf2YwSlleG6IjRYG2A7k0HmBMEo6qVNk9Bp/EaLgAJT5ngH6PXbqa4ItvnEwCm/velL5jAnQgsHsWnjhGmvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "clean-stack": "^5.2.0", + "indent-string": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@semantic-release/npm/node_modules/clean-stack": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-5.3.0.tgz", + "integrity": "sha512-9ngPTOhYGQqNVSfeJkYXHmF7AGWp4/nN5D/QqNQs3Dvxd1Kk/WpjHfNujKHYUQ/5CoGyOyFNoWSPk5afzP0QVg==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "5.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@semantic-release/npm/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@semantic-release/npm/node_modules/execa": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-9.6.1.tgz", + "integrity": "sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/merge-streams": "^4.0.0", + "cross-spawn": "^7.0.6", + "figures": "^6.1.0", + "get-stream": "^9.0.0", + "human-signals": "^8.0.1", + "is-plain-obj": "^4.1.0", + "is-stream": "^4.0.1", + "npm-run-path": "^6.0.0", + "pretty-ms": "^9.2.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^4.0.0", + "yoctocolors": "^2.1.1" + }, + "engines": { + "node": "^18.19.0 || >=20.5.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/@semantic-release/npm/node_modules/figures": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz", + "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-unicode-supported": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@semantic-release/npm/node_modules/get-stream": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", + "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sec-ant/readable-stream": "^0.4.1", + "is-stream": "^4.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@semantic-release/npm/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==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^11.1.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@semantic-release/npm/node_modules/human-signals": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-8.0.1.tgz", + "integrity": "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@semantic-release/npm/node_modules/indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@semantic-release/npm/node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@semantic-release/npm/node_modules/is-stream": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", + "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@semantic-release/npm/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/@semantic-release/npm/node_modules/normalize-package-data": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-8.0.0.tgz", + "integrity": "sha512-RWk+PI433eESQ7ounYxIp67CYuVsS1uYSonX3kA6ps/3LWfjVQa/ptEg6Y3T6uAMq1mWpX9PQ+qx+QaHpsc7gQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^9.0.0", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@semantic-release/npm/node_modules/npm": { - "version": "8.19.4", - "resolved": "https://registry.npmjs.org/npm/-/npm-8.19.4.tgz", - "integrity": "sha512-3HANl8i9DKnUA89P4KEgVNN28EjSeDCmvEqbzOAuxCFDzdBZzjUl99zgnGpOUumvW5lvJo2HKcjrsc+tfyv1Hw==", + "version": "11.7.0", + "resolved": "https://registry.npmjs.org/npm/-/npm-11.7.0.tgz", + "integrity": "sha512-wiCZpv/41bIobCoJ31NStIWKfAxxYyD1iYnWCtiyns8s5v3+l8y0HCP/sScuH6B5+GhIfda4HQKiqeGZwJWhFw==", "bundleDependencies": [ "@isaacs/string-locale-compare", "@npmcli/arborist", - "@npmcli/ci-detect", "@npmcli/config", "@npmcli/fs", "@npmcli/map-workspaces", + "@npmcli/metavuln-calculator", "@npmcli/package-json", + "@npmcli/promise-spawn", + "@npmcli/redact", "@npmcli/run-script", + "@sigstore/tuf", "abbrev", "archy", "cacache", "chalk", - "chownr", + "ci-info", "cli-columns", - "cli-table3", - "columnify", "fastest-levenshtein", "fs-minipass", "glob", @@ -6459,7 +6807,6 @@ "libnpmdiff", "libnpmexec", "libnpmfund", - "libnpmhook", "libnpmorg", "libnpmpack", "libnpmpublish", @@ -6470,8 +6817,6 @@ "minimatch", "minipass", "minipass-pipeline", - "mkdirp", - "mkdirp-infer-owner", "ms", "node-gyp", "nopt", @@ -6482,133 +6827,157 @@ "npm-profile", "npm-registry-fetch", "npm-user-validate", - "npmlog", - "opener", "p-map", "pacote", "parse-conflict-json", "proc-log", "qrcode-terminal", "read", - "read-package-json", - "read-package-json-fast", - "readdir-scoped-modules", - "rimraf", "semver", + "spdx-expression-parse", "ssri", + "supports-color", "tar", "text-table", "tiny-relative-date", "treeverse", "validate-npm-package-name", - "which", - "write-file-atomic" + "which" ], "dev": true, "license": "Artistic-2.0", "workspaces": [ "docs", "smoke-tests", + "mock-globals", + "mock-registry", "workspaces/*" ], "dependencies": { "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/arborist": "^5.6.3", - "@npmcli/ci-detect": "^2.0.0", - "@npmcli/config": "^4.2.1", - "@npmcli/fs": "^2.1.0", - "@npmcli/map-workspaces": "^2.0.3", - "@npmcli/package-json": "^2.0.0", - "@npmcli/run-script": "^4.2.1", - "abbrev": "~1.1.1", + "@npmcli/arborist": "^9.1.9", + "@npmcli/config": "^10.4.5", + "@npmcli/fs": "^5.0.0", + "@npmcli/map-workspaces": "^5.0.3", + "@npmcli/metavuln-calculator": "^9.0.3", + "@npmcli/package-json": "^7.0.4", + "@npmcli/promise-spawn": "^9.0.1", + "@npmcli/redact": "^4.0.0", + "@npmcli/run-script": "^10.0.3", + "@sigstore/tuf": "^4.0.0", + "abbrev": "^4.0.0", "archy": "~1.0.0", - "cacache": "^16.1.3", - "chalk": "^4.1.2", - "chownr": "^2.0.0", + "cacache": "^20.0.3", + "chalk": "^5.6.2", + "ci-info": "^4.3.1", "cli-columns": "^4.0.0", - "cli-table3": "^0.6.2", - "columnify": "^1.6.0", - "fastest-levenshtein": "^1.0.12", - "fs-minipass": "^2.1.0", - "glob": "^8.0.1", - "graceful-fs": "^4.2.10", - "hosted-git-info": "^5.2.1", - "ini": "^3.0.1", - "init-package-json": "^3.0.2", - "is-cidr": "^4.0.2", - "json-parse-even-better-errors": "^2.3.1", - "libnpmaccess": "^6.0.4", - "libnpmdiff": "^4.0.5", - "libnpmexec": "^4.0.14", - "libnpmfund": "^3.0.5", - "libnpmhook": "^8.0.4", - "libnpmorg": "^4.0.4", - "libnpmpack": "^4.1.3", - "libnpmpublish": "^6.0.5", - "libnpmsearch": "^5.0.4", - "libnpmteam": "^4.0.4", - "libnpmversion": "^3.0.7", - "make-fetch-happen": "^10.2.0", - "minimatch": "^5.1.0", - "minipass": "^3.1.6", + "fastest-levenshtein": "^1.0.16", + "fs-minipass": "^3.0.3", + "glob": "^13.0.0", + "graceful-fs": "^4.2.11", + "hosted-git-info": "^9.0.2", + "ini": "^6.0.0", + "init-package-json": "^8.2.4", + "is-cidr": "^6.0.1", + "json-parse-even-better-errors": "^5.0.0", + "libnpmaccess": "^10.0.3", + "libnpmdiff": "^8.0.12", + "libnpmexec": "^10.1.11", + "libnpmfund": "^7.0.12", + "libnpmorg": "^8.0.1", + "libnpmpack": "^9.0.12", + "libnpmpublish": "^11.1.3", + "libnpmsearch": "^9.0.1", + "libnpmteam": "^8.0.2", + "libnpmversion": "^8.0.3", + "make-fetch-happen": "^15.0.3", + "minimatch": "^10.1.1", + "minipass": "^7.1.1", "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", - "mkdirp-infer-owner": "^2.0.0", "ms": "^2.1.2", - "node-gyp": "^9.1.0", - "nopt": "^6.0.0", - "npm-audit-report": "^3.0.0", - "npm-install-checks": "^5.0.0", - "npm-package-arg": "^9.1.0", - "npm-pick-manifest": "^7.0.2", - "npm-profile": "^6.2.0", - "npm-registry-fetch": "^13.3.1", - "npm-user-validate": "^1.0.1", - "npmlog": "^6.0.2", - "opener": "^1.5.2", - "p-map": "^4.0.0", - "pacote": "^13.6.2", - "parse-conflict-json": "^2.0.2", - "proc-log": "^2.0.1", + "node-gyp": "^12.1.0", + "nopt": "^9.0.0", + "npm-audit-report": "^7.0.0", + "npm-install-checks": "^8.0.0", + "npm-package-arg": "^13.0.2", + "npm-pick-manifest": "^11.0.3", + "npm-profile": "^12.0.1", + "npm-registry-fetch": "^19.1.1", + "npm-user-validate": "^4.0.0", + "p-map": "^7.0.4", + "pacote": "^21.0.4", + "parse-conflict-json": "^5.0.1", + "proc-log": "^6.1.0", "qrcode-terminal": "^0.12.0", - "read": "~1.0.7", - "read-package-json": "^5.0.2", - "read-package-json-fast": "^2.0.3", - "readdir-scoped-modules": "^1.1.0", - "rimraf": "^3.0.2", - "semver": "^7.3.7", - "ssri": "^9.0.1", - "tar": "^6.1.11", + "read": "^5.0.1", + "semver": "^7.7.3", + "spdx-expression-parse": "^4.0.0", + "ssri": "^13.0.0", + "supports-color": "^10.2.2", + "tar": "^7.5.2", "text-table": "~0.2.0", - "tiny-relative-date": "^1.3.0", - "treeverse": "^2.0.0", - "validate-npm-package-name": "^4.0.0", - "which": "^2.0.2", - "write-file-atomic": "^4.0.1" + "tiny-relative-date": "^2.0.2", + "treeverse": "^3.0.0", + "validate-npm-package-name": "^7.0.0", + "which": "^6.0.0" }, "bin": { "npm": "bin/npm-cli.js", "npx": "bin/npx-cli.js" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/@colors/colors": { - "version": "1.5.0", + "node_modules/@semantic-release/npm/node_modules/npm-run-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz", + "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0", + "unicorn-magic": "^0.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@semantic-release/npm/node_modules/npm/node_modules/@isaacs/balanced-match": { + "version": "4.0.1", "dev": true, "inBundle": true, "license": "MIT", - "optional": true, "engines": { - "node": ">=0.1.90" + "node": "20 || >=22" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/@gar/promisify": { - "version": "1.1.3", + "node_modules/@semantic-release/npm/node_modules/npm/node_modules/@isaacs/brace-expansion": { + "version": "5.0.0", "dev": true, "inBundle": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "@isaacs/balanced-match": "^4.0.1" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@semantic-release/npm/node_modules/npm/node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/@isaacs/string-locale-compare": { "version": "1.1.0", @@ -6616,372 +6985,407 @@ "inBundle": true, "license": "ISC" }, + "node_modules/@semantic-release/npm/node_modules/npm/node_modules/@npmcli/agent": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "agent-base": "^7.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.1", + "lru-cache": "^11.2.1", + "socks-proxy-agent": "^8.0.3" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/@npmcli/arborist": { - "version": "5.6.3", + "version": "9.1.9", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/installed-package-contents": "^1.0.7", - "@npmcli/map-workspaces": "^2.0.3", - "@npmcli/metavuln-calculator": "^3.0.1", - "@npmcli/move-file": "^2.0.0", - "@npmcli/name-from-folder": "^1.0.1", - "@npmcli/node-gyp": "^2.0.0", - "@npmcli/package-json": "^2.0.0", - "@npmcli/query": "^1.2.0", - "@npmcli/run-script": "^4.1.3", - "bin-links": "^3.0.3", - "cacache": "^16.1.3", + "@npmcli/fs": "^5.0.0", + "@npmcli/installed-package-contents": "^4.0.0", + "@npmcli/map-workspaces": "^5.0.0", + "@npmcli/metavuln-calculator": "^9.0.2", + "@npmcli/name-from-folder": "^4.0.0", + "@npmcli/node-gyp": "^5.0.0", + "@npmcli/package-json": "^7.0.0", + "@npmcli/query": "^5.0.0", + "@npmcli/redact": "^4.0.0", + "@npmcli/run-script": "^10.0.0", + "bin-links": "^6.0.0", + "cacache": "^20.0.1", "common-ancestor-path": "^1.0.1", - "hosted-git-info": "^5.2.1", - "json-parse-even-better-errors": "^2.3.1", + "hosted-git-info": "^9.0.0", "json-stringify-nice": "^1.1.4", - "minimatch": "^5.1.0", - "mkdirp": "^1.0.4", - "mkdirp-infer-owner": "^2.0.0", - "nopt": "^6.0.0", - "npm-install-checks": "^5.0.0", - "npm-package-arg": "^9.0.0", - "npm-pick-manifest": "^7.0.2", - "npm-registry-fetch": "^13.0.0", - "npmlog": "^6.0.2", - "pacote": "^13.6.1", - "parse-conflict-json": "^2.0.1", - "proc-log": "^2.0.0", + "lru-cache": "^11.2.1", + "minimatch": "^10.0.3", + "nopt": "^9.0.0", + "npm-install-checks": "^8.0.0", + "npm-package-arg": "^13.0.0", + "npm-pick-manifest": "^11.0.1", + "npm-registry-fetch": "^19.0.0", + "pacote": "^21.0.2", + "parse-conflict-json": "^5.0.1", + "proc-log": "^6.0.0", + "proggy": "^4.0.0", "promise-all-reject-late": "^1.0.0", - "promise-call-limit": "^1.0.1", - "read-package-json-fast": "^2.0.2", - "readdir-scoped-modules": "^1.1.0", - "rimraf": "^3.0.2", + "promise-call-limit": "^3.0.1", "semver": "^7.3.7", - "ssri": "^9.0.0", - "treeverse": "^2.0.0", - "walk-up-path": "^1.0.0" + "ssri": "^13.0.0", + "treeverse": "^3.0.0", + "walk-up-path": "^4.0.0" }, "bin": { "arborist": "bin/index.js" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/@npmcli/ci-detect": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/@npmcli/config": { - "version": "4.2.2", + "version": "10.4.5", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/map-workspaces": "^2.0.2", - "ini": "^3.0.0", - "mkdirp-infer-owner": "^2.0.0", - "nopt": "^6.0.0", - "proc-log": "^2.0.0", - "read-package-json-fast": "^2.0.3", + "@npmcli/map-workspaces": "^5.0.0", + "@npmcli/package-json": "^7.0.0", + "ci-info": "^4.0.0", + "ini": "^6.0.0", + "nopt": "^9.0.0", + "proc-log": "^6.0.0", "semver": "^7.3.5", - "walk-up-path": "^1.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/@npmcli/disparity-colors": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "ansi-styles": "^4.3.0" + "walk-up-path": "^4.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/@npmcli/fs": { - "version": "2.1.2", + "version": "5.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@gar/promisify": "^1.1.3", "semver": "^7.3.5" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/@npmcli/git": { - "version": "3.0.2", + "version": "7.0.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/promise-spawn": "^3.0.0", - "lru-cache": "^7.4.4", - "mkdirp": "^1.0.4", - "npm-pick-manifest": "^7.0.0", - "proc-log": "^2.0.0", - "promise-inflight": "^1.0.1", + "@npmcli/promise-spawn": "^9.0.0", + "ini": "^6.0.0", + "lru-cache": "^11.2.1", + "npm-pick-manifest": "^11.0.1", + "proc-log": "^6.0.0", "promise-retry": "^2.0.1", "semver": "^7.3.5", - "which": "^2.0.2" + "which": "^6.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/@npmcli/installed-package-contents": { - "version": "1.0.7", + "version": "4.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "npm-bundled": "^1.1.1", - "npm-normalize-package-bin": "^1.0.1" + "npm-bundled": "^5.0.0", + "npm-normalize-package-bin": "^5.0.0" }, "bin": { - "installed-package-contents": "index.js" + "installed-package-contents": "bin/index.js" }, "engines": { - "node": ">= 10" - } - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/@npmcli/installed-package-contents/node_modules/npm-bundled": { - "version": "1.1.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-normalize-package-bin": "^1.0.1" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/@npmcli/map-workspaces": { - "version": "2.0.4", + "version": "5.0.3", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/name-from-folder": "^1.0.1", - "glob": "^8.0.1", - "minimatch": "^5.0.1", - "read-package-json-fast": "^2.0.3" + "@npmcli/name-from-folder": "^4.0.0", + "@npmcli/package-json": "^7.0.0", + "glob": "^13.0.0", + "minimatch": "^10.0.3" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/@npmcli/metavuln-calculator": { - "version": "3.1.1", + "version": "9.0.3", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "cacache": "^16.0.0", - "json-parse-even-better-errors": "^2.3.1", - "pacote": "^13.0.3", + "cacache": "^20.0.0", + "json-parse-even-better-errors": "^5.0.0", + "pacote": "^21.0.0", + "proc-log": "^6.0.0", "semver": "^7.3.5" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/@npmcli/move-file": { - "version": "2.0.1", + "node_modules/@semantic-release/npm/node_modules/npm/node_modules/@npmcli/name-from-folder": { + "version": "4.0.0", "dev": true, "inBundle": true, - "license": "MIT", - "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, + "license": "ISC", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/@npmcli/name-from-folder": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "ISC" - }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/@npmcli/node-gyp": { - "version": "2.0.0", + "version": "5.0.0", "dev": true, "inBundle": true, "license": "ISC", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/@npmcli/package-json": { - "version": "2.0.0", + "version": "7.0.4", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "json-parse-even-better-errors": "^2.3.1" + "@npmcli/git": "^7.0.0", + "glob": "^13.0.0", + "hosted-git-info": "^9.0.0", + "json-parse-even-better-errors": "^5.0.0", + "proc-log": "^6.0.0", + "semver": "^7.5.3", + "validate-npm-package-license": "^3.0.4" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/@npmcli/promise-spawn": { - "version": "3.0.0", + "version": "9.0.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "infer-owner": "^1.0.4" + "which": "^6.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/@npmcli/query": { - "version": "1.2.0", + "version": "5.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "npm-package-arg": "^9.1.0", - "postcss-selector-parser": "^6.0.10", - "semver": "^7.3.7" + "postcss-selector-parser": "^7.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@semantic-release/npm/node_modules/npm/node_modules/@npmcli/redact": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/@npmcli/run-script": { - "version": "4.2.1", + "version": "10.0.3", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/node-gyp": "^2.0.0", - "@npmcli/promise-spawn": "^3.0.0", - "node-gyp": "^9.0.0", - "read-package-json-fast": "^2.0.3", - "which": "^2.0.2" + "@npmcli/node-gyp": "^5.0.0", + "@npmcli/package-json": "^7.0.0", + "@npmcli/promise-spawn": "^9.0.0", + "node-gyp": "^12.1.0", + "proc-log": "^6.0.0", + "which": "^6.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/@tootallnate/once": { - "version": "2.0.0", + "node_modules/@semantic-release/npm/node_modules/npm/node_modules/@sigstore/bundle": { + "version": "4.0.0", "dev": true, "inBundle": true, - "license": "MIT", + "license": "Apache-2.0", + "dependencies": { + "@sigstore/protobuf-specs": "^0.5.0" + }, "engines": { - "node": ">= 10" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/abbrev": { - "version": "1.1.1", + "node_modules/@semantic-release/npm/node_modules/npm/node_modules/@sigstore/core": { + "version": "3.0.0", "dev": true, "inBundle": true, - "license": "ISC" + "license": "Apache-2.0", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/agent-base": { - "version": "6.0.2", + "node_modules/@semantic-release/npm/node_modules/npm/node_modules/@sigstore/protobuf-specs": { + "version": "0.5.0", "dev": true, "inBundle": true, - "license": "MIT", + "license": "Apache-2.0", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@semantic-release/npm/node_modules/npm/node_modules/@sigstore/sign": { + "version": "4.0.1", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", "dependencies": { - "debug": "4" + "@sigstore/bundle": "^4.0.0", + "@sigstore/core": "^3.0.0", + "@sigstore/protobuf-specs": "^0.5.0", + "make-fetch-happen": "^15.0.2", + "proc-log": "^5.0.0", + "promise-retry": "^2.0.1" }, "engines": { - "node": ">= 6.0.0" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/agentkeepalive": { - "version": "4.2.1", + "node_modules/@semantic-release/npm/node_modules/npm/node_modules/@sigstore/sign/node_modules/proc-log": { + "version": "5.0.0", "dev": true, "inBundle": true, - "license": "MIT", + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@semantic-release/npm/node_modules/npm/node_modules/@sigstore/tuf": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", "dependencies": { - "debug": "^4.1.0", - "depd": "^1.1.2", - "humanize-ms": "^1.2.1" + "@sigstore/protobuf-specs": "^0.5.0", + "tuf-js": "^4.0.0" }, "engines": { - "node": ">= 8.0.0" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/aggregate-error": { - "version": "3.1.0", + "node_modules/@semantic-release/npm/node_modules/npm/node_modules/@sigstore/verify": { + "version": "3.0.0", "dev": true, "inBundle": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" + "@sigstore/bundle": "^4.0.0", + "@sigstore/core": "^3.0.0", + "@sigstore/protobuf-specs": "^0.5.0" }, "engines": { - "node": ">=8" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/ansi-regex": { - "version": "5.0.1", + "node_modules/@semantic-release/npm/node_modules/npm/node_modules/@tufjs/canonical-json": { + "version": "2.0.0", "dev": true, "inBundle": true, "license": "MIT", "engines": { - "node": ">=8" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/ansi-styles": { - "version": "4.3.0", + "node_modules/@semantic-release/npm/node_modules/npm/node_modules/@tufjs/models": { + "version": "4.0.0", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "@tufjs/canonical-json": "2.0.0", + "minimatch": "^9.0.5" }, "engines": { - "node": ">=8" + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@semantic-release/npm/node_modules/npm/node_modules/@tufjs/models/node_modules/minimatch": { + "version": "9.0.5", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/aproba": { - "version": "2.0.0", + "node_modules/@semantic-release/npm/node_modules/npm/node_modules/abbrev": { + "version": "4.0.0", "dev": true, "inBundle": true, - "license": "ISC" + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/archy": { - "version": "1.0.0", + "node_modules/@semantic-release/npm/node_modules/npm/node_modules/agent-base": { + "version": "7.1.4", "dev": true, "inBundle": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">= 14" + } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/are-we-there-yet": { - "version": "3.0.1", + "node_modules/@semantic-release/npm/node_modules/npm/node_modules/ansi-regex": { + "version": "5.0.1", "dev": true, "inBundle": true, - "license": "ISC", - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, + "license": "MIT", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=8" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/asap": { - "version": "2.0.6", + "node_modules/@semantic-release/npm/node_modules/npm/node_modules/aproba": { + "version": "2.1.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/@semantic-release/npm/node_modules/npm/node_modules/archy": { + "version": "1.0.0", "dev": true, "inBundle": true, "license": "MIT" @@ -6993,42 +7397,35 @@ "license": "MIT" }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/bin-links": { - "version": "3.0.3", + "version": "6.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "cmd-shim": "^5.0.0", - "mkdirp-infer-owner": "^2.0.0", - "npm-normalize-package-bin": "^2.0.0", - "read-cmd-shim": "^3.0.0", - "rimraf": "^3.0.0", - "write-file-atomic": "^4.0.0" + "cmd-shim": "^8.0.0", + "npm-normalize-package-bin": "^5.0.0", + "proc-log": "^6.0.0", + "read-cmd-shim": "^6.0.0", + "write-file-atomic": "^7.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/bin-links/node_modules/npm-normalize-package-bin": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/binary-extensions": { - "version": "2.2.0", + "version": "3.1.0", "dev": true, "inBundle": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=18.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/brace-expansion": { - "version": "2.0.1", + "version": "2.0.2", "dev": true, "inBundle": true, "license": "MIT", @@ -7036,88 +7433,74 @@ "balanced-match": "^1.0.0" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/builtins": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "semver": "^7.0.0" - } - }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/cacache": { - "version": "16.1.3", + "version": "20.0.3", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/fs": "^2.1.0", - "@npmcli/move-file": "^2.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "glob": "^8.0.1", - "infer-owner": "^1.0.4", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", + "@npmcli/fs": "^5.0.0", + "fs-minipass": "^3.0.0", + "glob": "^13.0.0", + "lru-cache": "^11.1.0", + "minipass": "^7.0.3", + "minipass-collect": "^2.0.1", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11", - "unique-filename": "^2.0.0" + "p-map": "^7.0.2", + "ssri": "^13.0.0", + "unique-filename": "^5.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/chalk": { - "version": "4.1.2", + "version": "5.6.2", "dev": true, "inBundle": true, "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, "engines": { - "node": ">=10" + "node": "^12.17.0 || ^14.13 || >=16.0.0" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/chownr": { - "version": "2.0.0", + "version": "3.0.0", "dev": true, "inBundle": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "engines": { - "node": ">=10" + "node": ">=18" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/cidr-regex": { - "version": "3.1.1", + "node_modules/@semantic-release/npm/node_modules/npm/node_modules/ci-info": { + "version": "4.3.1", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "ip-regex": "^4.1.0" - }, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/clean-stack": { - "version": "2.2.0", + "node_modules/@semantic-release/npm/node_modules/npm/node_modules/cidr-regex": { + "version": "5.0.1", "dev": true, "inBundle": true, - "license": "MIT", + "license": "BSD-2-Clause", + "dependencies": { + "ip-regex": "5.0.0" + }, "engines": { - "node": ">=6" + "node": ">=20" } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/cli-columns": { @@ -7133,80 +7516,13 @@ "node": ">= 10" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/cli-table3": { - "version": "0.6.2", + "node_modules/@semantic-release/npm/node_modules/npm/node_modules/cmd-shim": { + "version": "8.0.0", "dev": true, "inBundle": true, - "license": "MIT", - "dependencies": { - "string-width": "^4.2.0" - }, + "license": "ISC", "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "@colors/colors": "1.5.0" - } - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/clone": { - "version": "1.0.4", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/cmd-shim": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "mkdirp-infer-owner": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/color-convert": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/color-name": { - "version": "1.1.4", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/color-support": { - "version": "1.1.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "bin": { - "color-support": "bin.js" - } - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/columnify": { - "version": "1.6.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "strip-ansi": "^6.0.1", - "wcwidth": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/common-ancestor-path": { @@ -7215,18 +7531,6 @@ "inBundle": true, "license": "ISC" }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/concat-map": { - "version": "0.0.1", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/console-control-strings": { - "version": "1.1.0", - "dev": true, - "inBundle": true, - "license": "ISC" - }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/cssesc": { "version": "3.0.0", "dev": true, @@ -7240,12 +7544,12 @@ } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/debug": { - "version": "4.3.4", + "version": "4.4.3", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -7256,57 +7560,8 @@ } } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/debug/node_modules/ms": { - "version": "2.1.2", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/debuglog": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/defaults": { - "version": "1.0.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "clone": "^1.0.2" - } - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/delegates": { - "version": "1.0.0", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/depd": { - "version": "1.1.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/dezalgo": { - "version": "1.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "asap": "^2.0.0", - "wrappy": "1" - } - }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/diff": { - "version": "5.1.0", + "version": "8.0.2", "dev": true, "inBundle": true, "license": "BSD-3-Clause", @@ -7345,159 +7600,98 @@ "inBundle": true, "license": "MIT" }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/fastest-levenshtein": { - "version": "1.0.12", + "node_modules/@semantic-release/npm/node_modules/npm/node_modules/exponential-backoff": { + "version": "3.1.3", "dev": true, "inBundle": true, - "license": "MIT" + "license": "Apache-2.0" }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/fs-minipass": { - "version": "2.1.0", + "node_modules/@semantic-release/npm/node_modules/npm/node_modules/fastest-levenshtein": { + "version": "1.0.16", "dev": true, "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, + "license": "MIT", "engines": { - "node": ">= 8" + "node": ">= 4.9.1" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/fs.realpath": { - "version": "1.0.0", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/function-bind": { - "version": "1.1.1", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/gauge": { - "version": "4.0.4", + "node_modules/@semantic-release/npm/node_modules/npm/node_modules/fs-minipass": { + "version": "3.0.3", "dev": true, "inBundle": 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" + "minipass": "^7.0.3" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/glob": { - "version": "8.0.3", + "version": "13.0.0", "dev": true, "inBundle": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" + "minimatch": "^10.1.1", + "minipass": "^7.1.2", + "path-scurry": "^2.0.0" }, "engines": { - "node": ">=12" + "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/graceful-fs": { - "version": "4.2.10", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/has": { - "version": "1.0.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/has-unicode": { - "version": "2.0.1", + "version": "4.2.11", "dev": true, "inBundle": true, "license": "ISC" }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/hosted-git-info": { - "version": "5.2.1", + "version": "9.0.2", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "lru-cache": "^7.5.1" + "lru-cache": "^11.1.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/http-cache-semantics": { - "version": "4.1.1", + "version": "4.2.0", "dev": true, "inBundle": true, "license": "BSD-2-Clause" }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/http-proxy-agent": { - "version": "5.0.0", + "version": "7.0.2", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" + "agent-base": "^7.1.0", + "debug": "^4.3.4" }, "engines": { - "node": ">= 6" + "node": ">= 14" } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/https-proxy-agent": { - "version": "5.0.1", + "version": "7.0.6", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { - "agent-base": "6", + "agent-base": "^7.1.2", "debug": "4" }, "engines": { - "node": ">= 6" - } - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/humanize-ms": { - "version": "1.2.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "ms": "^2.0.0" + "node": ">= 14" } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/iconv-lite": { @@ -7514,15 +7708,15 @@ } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/ignore-walk": { - "version": "5.0.1", + "version": "8.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "minimatch": "^5.0.1" + "minimatch": "^10.0.3" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/imurmurhash": { @@ -7534,101 +7728,64 @@ "node": ">=0.8.19" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/indent-string": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/infer-owner": { - "version": "1.0.4", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/inflight": { - "version": "1.0.6", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/inherits": { - "version": "2.0.4", - "dev": true, - "inBundle": true, - "license": "ISC" - }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/ini": { - "version": "3.0.1", + "version": "6.0.0", "dev": true, "inBundle": true, "license": "ISC", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/init-package-json": { - "version": "3.0.2", + "version": "8.2.4", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "npm-package-arg": "^9.0.1", - "promzard": "^0.3.0", - "read": "^1.0.7", - "read-package-json": "^5.0.0", - "semver": "^7.3.5", + "@npmcli/package-json": "^7.0.0", + "npm-package-arg": "^13.0.0", + "promzard": "^3.0.1", + "read": "^5.0.1", + "semver": "^7.7.2", "validate-npm-package-license": "^3.0.4", - "validate-npm-package-name": "^4.0.0" + "validate-npm-package-name": "^7.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/ip": { - "version": "2.0.0", + "node_modules/@semantic-release/npm/node_modules/npm/node_modules/ip-address": { + "version": "10.0.1", "dev": true, "inBundle": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">= 12" + } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/ip-regex": { - "version": "4.3.0", + "version": "5.0.0", "dev": true, "inBundle": true, "license": "MIT", "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/is-cidr": { - "version": "4.0.2", + "version": "6.0.1", "dev": true, "inBundle": true, "license": "BSD-2-Clause", "dependencies": { - "cidr-regex": "^3.1.1" + "cidr-regex": "5.0.1" }, "engines": { - "node": ">=10" - } - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/is-core-module": { - "version": "2.10.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=20" } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/is-fullwidth-code-point": { @@ -7640,23 +7797,23 @@ "node": ">=8" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/is-lambda": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "MIT" - }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/isexe": { - "version": "2.0.0", + "version": "3.1.1", "dev": true, "inBundle": true, - "license": "ISC" + "license": "ISC", + "engines": { + "node": ">=16" + } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/json-parse-even-better-errors": { - "version": "2.3.1", + "version": "5.0.0", "dev": true, "inBundle": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/json-stringify-nice": { "version": "1.1.4", @@ -7677,269 +7834,251 @@ "license": "MIT" }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/just-diff": { - "version": "5.1.1", + "version": "6.0.2", "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/just-diff-apply": { - "version": "5.4.1", + "version": "5.5.0", "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/libnpmaccess": { - "version": "6.0.4", + "version": "10.0.3", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "aproba": "^2.0.0", - "minipass": "^3.1.1", - "npm-package-arg": "^9.0.1", - "npm-registry-fetch": "^13.0.0" + "npm-package-arg": "^13.0.0", + "npm-registry-fetch": "^19.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/libnpmdiff": { - "version": "4.0.5", + "version": "8.0.12", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/disparity-colors": "^2.0.0", - "@npmcli/installed-package-contents": "^1.0.7", - "binary-extensions": "^2.2.0", - "diff": "^5.1.0", - "minimatch": "^5.0.1", - "npm-package-arg": "^9.0.1", - "pacote": "^13.6.1", - "tar": "^6.1.0" + "@npmcli/arborist": "^9.1.9", + "@npmcli/installed-package-contents": "^4.0.0", + "binary-extensions": "^3.0.0", + "diff": "^8.0.2", + "minimatch": "^10.0.3", + "npm-package-arg": "^13.0.0", + "pacote": "^21.0.2", + "tar": "^7.5.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/libnpmexec": { - "version": "4.0.14", + "version": "10.1.11", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/arborist": "^5.6.3", - "@npmcli/ci-detect": "^2.0.0", - "@npmcli/fs": "^2.1.1", - "@npmcli/run-script": "^4.2.0", - "chalk": "^4.1.0", - "mkdirp-infer-owner": "^2.0.0", - "npm-package-arg": "^9.0.1", - "npmlog": "^6.0.2", - "pacote": "^13.6.1", - "proc-log": "^2.0.0", - "read": "^1.0.7", - "read-package-json-fast": "^2.0.2", + "@npmcli/arborist": "^9.1.9", + "@npmcli/package-json": "^7.0.0", + "@npmcli/run-script": "^10.0.0", + "ci-info": "^4.0.0", + "npm-package-arg": "^13.0.0", + "pacote": "^21.0.2", + "proc-log": "^6.0.0", + "promise-retry": "^2.0.1", + "read": "^5.0.1", "semver": "^7.3.7", - "walk-up-path": "^1.0.0" + "signal-exit": "^4.1.0", + "walk-up-path": "^4.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/libnpmfund": { - "version": "3.0.5", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/arborist": "^5.6.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/libnpmhook": { - "version": "8.0.4", + "version": "7.0.12", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^13.0.0" + "@npmcli/arborist": "^9.1.9" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/libnpmorg": { - "version": "4.0.4", + "version": "8.0.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "aproba": "^2.0.0", - "npm-registry-fetch": "^13.0.0" + "npm-registry-fetch": "^19.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/libnpmpack": { - "version": "4.1.3", + "version": "9.0.12", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/run-script": "^4.1.3", - "npm-package-arg": "^9.0.1", - "pacote": "^13.6.1" + "@npmcli/arborist": "^9.1.9", + "@npmcli/run-script": "^10.0.0", + "npm-package-arg": "^13.0.0", + "pacote": "^21.0.2" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/libnpmpublish": { - "version": "6.0.5", + "version": "11.1.3", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "normalize-package-data": "^4.0.0", - "npm-package-arg": "^9.0.1", - "npm-registry-fetch": "^13.0.0", + "@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": "^6.0.0", "semver": "^7.3.7", - "ssri": "^9.0.0" + "sigstore": "^4.0.0", + "ssri": "^13.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/libnpmsearch": { - "version": "5.0.4", + "version": "9.0.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "npm-registry-fetch": "^13.0.0" + "npm-registry-fetch": "^19.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/libnpmteam": { - "version": "4.0.4", + "version": "8.0.2", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "aproba": "^2.0.0", - "npm-registry-fetch": "^13.0.0" + "npm-registry-fetch": "^19.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/libnpmversion": { - "version": "3.0.7", + "version": "8.0.3", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/git": "^3.0.0", - "@npmcli/run-script": "^4.1.3", - "json-parse-even-better-errors": "^2.3.1", - "proc-log": "^2.0.0", + "@npmcli/git": "^7.0.0", + "@npmcli/run-script": "^10.0.0", + "json-parse-even-better-errors": "^5.0.0", + "proc-log": "^6.0.0", "semver": "^7.3.7" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/lru-cache": { - "version": "7.13.2", + "version": "11.2.2", "dev": true, "inBundle": true, "license": "ISC", "engines": { - "node": ">=12" + "node": "20 || >=22" } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/make-fetch-happen": { - "version": "10.2.1", + "version": "15.0.3", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^16.1.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^2.0.3", + "@npmcli/agent": "^4.0.0", + "cacache": "^20.0.1", + "http-cache-semantics": "^4.1.1", + "minipass": "^7.0.2", + "minipass-fetch": "^5.0.0", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", + "negotiator": "^1.0.0", + "proc-log": "^6.0.0", "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^9.0.0" + "ssri": "^13.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/minimatch": { - "version": "5.1.0", + "version": "10.1.1", "dev": true, "inBundle": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^2.0.1" + "@isaacs/brace-expansion": "^5.0.0" }, "engines": { - "node": ">=10" + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/minipass": { - "version": "3.3.4", + "version": "7.1.2", "dev": true, "inBundle": true, "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, "engines": { - "node": ">=8" + "node": ">=16 || 14 >=14.17" } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/minipass-collect": { - "version": "1.0.2", + "version": "2.0.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "minipass": "^3.0.0" + "minipass": "^7.0.3" }, "engines": { - "node": ">= 8" + "node": ">=16 || 14 >=14.17" } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/minipass-fetch": { - "version": "2.1.1", + "version": "5.0.0", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { - "minipass": "^3.1.6", + "minipass": "^7.0.3", "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" + "minizlib": "^3.0.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^20.17.0 || >=22.9.0" }, "optionalDependencies": { "encoding": "^0.1.13" @@ -7957,14 +8096,16 @@ "node": ">= 8" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/minipass-json-stream": { - "version": "1.0.1", + "node_modules/@semantic-release/npm/node_modules/npm/node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", "dev": true, "inBundle": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/minipass-pipeline": { @@ -7979,55 +8120,52 @@ "node": ">=8" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/minipass-sized": { - "version": "1.0.3", + "node_modules/@semantic-release/npm/node_modules/npm/node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "minipass": "^3.0.0" + "yallist": "^4.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/minizlib": { - "version": "2.1.2", + "node_modules/@semantic-release/npm/node_modules/npm/node_modules/minipass-sized": { + "version": "1.0.3", "dev": true, "inBundle": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" + "minipass": "^3.0.0" }, "engines": { - "node": ">= 8" + "node": ">=8" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/mkdirp": { - "version": "1.0.4", + "node_modules/@semantic-release/npm/node_modules/npm/node_modules/minipass-sized/node_modules/minipass": { + "version": "3.3.6", "dev": true, "inBundle": true, - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/mkdirp-infer-owner": { - "version": "2.0.0", + "node_modules/@semantic-release/npm/node_modules/npm/node_modules/minizlib": { + "version": "3.1.0", "dev": true, "inBundle": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "chownr": "^2.0.0", - "infer-owner": "^1.0.4", - "mkdirp": "^1.0.3" + "minipass": "^7.1.2" }, "engines": { - "node": ">=10" + "node": ">= 18" } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/ms": { @@ -8037,13 +8175,16 @@ "license": "MIT" }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/mute-stream": { - "version": "0.0.8", + "version": "3.0.0", "dev": true, "inBundle": true, - "license": "ISC" + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/negotiator": { - "version": "0.6.3", + "version": "1.0.0", "dev": true, "inBundle": true, "license": "MIT", @@ -8052,151 +8193,67 @@ } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/node-gyp": { - "version": "9.1.0", + "version": "12.1.0", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "env-paths": "^2.2.0", - "glob": "^7.1.4", + "exponential-backoff": "^3.1.1", "graceful-fs": "^4.2.6", - "make-fetch-happen": "^10.0.3", - "nopt": "^5.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", + "make-fetch-happen": "^15.0.0", + "nopt": "^9.0.0", + "proc-log": "^6.0.0", "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" + "tar": "^7.5.2", + "tinyglobby": "^0.2.12", + "which": "^6.0.0" }, "bin": { "node-gyp": "bin/node-gyp.js" }, "engines": { - "node": "^12.22 || ^14.13 || >=16" - } - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/node-gyp/node_modules/brace-expansion": { - "version": "1.1.11", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/node-gyp/node_modules/glob": { - "version": "7.2.3", - "dev": true, - "inBundle": 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/@semantic-release/npm/node_modules/npm/node_modules/node-gyp/node_modules/minimatch": { - "version": "3.1.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/node-gyp/node_modules/nopt": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": ">=6" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/nopt": { - "version": "6.0.0", + "version": "9.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "abbrev": "^1.0.0" + "abbrev": "^4.0.0" }, "bin": { "nopt": "bin/nopt.js" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/normalize-package-data": { - "version": "4.0.1", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^5.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/npm-audit-report": { - "version": "3.0.0", + "version": "7.0.0", "dev": true, "inBundle": true, "license": "ISC", - "dependencies": { - "chalk": "^4.0.0" - }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/npm-bundled": { - "version": "2.0.1", + "version": "5.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "npm-normalize-package-bin": "^2.0.0" + "npm-normalize-package-bin": "^5.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/npm-bundled/node_modules/npm-normalize-package-bin": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/npm-install-checks": { - "version": "5.0.0", + "version": "8.0.0", "dev": true, "inBundle": true, "license": "BSD-2-Clause", @@ -8204,226 +8261,177 @@ "semver": "^7.1.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/npm-normalize-package-bin": { - "version": "1.0.1", + "version": "5.0.0", "dev": true, "inBundle": true, - "license": "ISC" + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/npm-package-arg": { - "version": "9.1.0", + "version": "13.0.2", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "hosted-git-info": "^5.0.0", - "proc-log": "^2.0.1", + "hosted-git-info": "^9.0.0", + "proc-log": "^6.0.0", "semver": "^7.3.5", - "validate-npm-package-name": "^4.0.0" + "validate-npm-package-name": "^7.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/npm-packlist": { - "version": "5.1.3", + "version": "10.0.3", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "glob": "^8.0.1", - "ignore-walk": "^5.0.1", - "npm-bundled": "^2.0.0", - "npm-normalize-package-bin": "^2.0.0" - }, - "bin": { - "npm-packlist": "bin/index.js" + "ignore-walk": "^8.0.0", + "proc-log": "^6.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/npm-packlist/node_modules/npm-normalize-package-bin": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/npm-pick-manifest": { - "version": "7.0.2", + "version": "11.0.3", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "npm-install-checks": "^5.0.0", - "npm-normalize-package-bin": "^2.0.0", - "npm-package-arg": "^9.0.0", + "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": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/npm-pick-manifest/node_modules/npm-normalize-package-bin": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/npm-profile": { - "version": "6.2.1", + "version": "12.0.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "npm-registry-fetch": "^13.0.1", - "proc-log": "^2.0.0" + "npm-registry-fetch": "^19.0.0", + "proc-log": "^6.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/npm-registry-fetch": { - "version": "13.3.1", + "version": "19.1.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "make-fetch-happen": "^10.0.6", - "minipass": "^3.1.6", - "minipass-fetch": "^2.0.3", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.1.2", - "npm-package-arg": "^9.0.1", - "proc-log": "^2.0.0" + "@npmcli/redact": "^4.0.0", + "jsonparse": "^1.3.1", + "make-fetch-happen": "^15.0.0", + "minipass": "^7.0.2", + "minipass-fetch": "^5.0.0", + "minizlib": "^3.0.1", + "npm-package-arg": "^13.0.0", + "proc-log": "^6.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/npm-user-validate": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause" - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/npmlog": { - "version": "6.0.2", + "version": "4.0.0", "dev": true, "inBundle": 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" - }, + "license": "BSD-2-Clause", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/once": { - "version": "1.4.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/opener": { - "version": "1.5.2", - "dev": true, - "inBundle": true, - "license": "(WTFPL OR MIT)", - "bin": { - "opener": "bin/opener-bin.js" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/p-map": { - "version": "4.0.0", + "version": "7.0.4", "dev": true, "inBundle": true, "license": "MIT", - "dependencies": { - "aggregate-error": "^3.0.0" - }, "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/pacote": { - "version": "13.6.2", + "version": "21.0.4", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/git": "^3.0.0", - "@npmcli/installed-package-contents": "^1.0.7", - "@npmcli/promise-spawn": "^3.0.0", - "@npmcli/run-script": "^4.1.0", - "cacache": "^16.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "infer-owner": "^1.0.4", - "minipass": "^3.1.6", - "mkdirp": "^1.0.4", - "npm-package-arg": "^9.0.0", - "npm-packlist": "^5.1.0", - "npm-pick-manifest": "^7.0.0", - "npm-registry-fetch": "^13.0.1", - "proc-log": "^2.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", "promise-retry": "^2.0.1", - "read-package-json": "^5.0.0", - "read-package-json-fast": "^2.0.3", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11" + "sigstore": "^4.0.0", + "ssri": "^13.0.0", + "tar": "^7.4.3" }, "bin": { - "pacote": "lib/bin.js" + "pacote": "bin/index.js" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/parse-conflict-json": { - "version": "2.0.2", + "version": "5.0.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "json-parse-even-better-errors": "^2.3.1", - "just-diff": "^5.0.1", + "json-parse-even-better-errors": "^5.0.0", + "just-diff": "^6.0.0", "just-diff-apply": "^5.2.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/path-is-absolute": { - "version": "1.0.1", + "node_modules/@semantic-release/npm/node_modules/npm/node_modules/path-scurry": { + "version": "2.0.0", "dev": true, "inBundle": true, - "license": "MIT", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, "engines": { - "node": ">=0.10.0" + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/postcss-selector-parser": { - "version": "6.0.10", + "version": "7.1.0", "dev": true, "inBundle": true, "license": "MIT", @@ -8436,12 +8444,21 @@ } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/proc-log": { - "version": "2.0.1", + "version": "6.1.0", "dev": true, "inBundle": true, "license": "ISC", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@semantic-release/npm/node_modules/npm/node_modules/proggy": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/promise-all-reject-late": { @@ -8454,7 +8471,7 @@ } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/promise-call-limit": { - "version": "1.0.1", + "version": "3.0.2", "dev": true, "inBundle": true, "license": "ISC", @@ -8462,12 +8479,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/promise-inflight": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "ISC" - }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/promise-retry": { "version": "2.0.1", "dev": true, @@ -8482,12 +8493,15 @@ } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/promzard": { - "version": "0.3.0", + "version": "3.0.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "read": "1" + "read": "^5.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/qrcode-terminal": { @@ -8499,402 +8513,332 @@ } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/read": { - "version": "1.0.7", + "version": "5.0.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "mute-stream": "~0.0.4" + "mute-stream": "^3.0.0" }, "engines": { - "node": ">=0.8" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/read-cmd-shim": { - "version": "3.0.0", + "version": "6.0.0", "dev": true, "inBundle": true, "license": "ISC", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/read-package-json": { - "version": "5.0.2", + "node_modules/@semantic-release/npm/node_modules/npm/node_modules/retry": { + "version": "0.12.0", "dev": true, "inBundle": true, - "license": "ISC", - "dependencies": { - "glob": "^8.0.1", - "json-parse-even-better-errors": "^2.3.1", - "normalize-package-data": "^4.0.0", - "npm-normalize-package-bin": "^2.0.0" - }, + "license": "MIT", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">= 4" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/read-package-json-fast": { - "version": "2.0.3", + "node_modules/@semantic-release/npm/node_modules/npm/node_modules/safer-buffer": { + "version": "2.1.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true + }, + "node_modules/@semantic-release/npm/node_modules/npm/node_modules/semver": { + "version": "7.7.3", "dev": true, "inBundle": true, "license": "ISC", - "dependencies": { - "json-parse-even-better-errors": "^2.3.0", - "npm-normalize-package-bin": "^1.0.1" + "bin": { + "semver": "bin/semver.js" }, "engines": { "node": ">=10" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/read-package-json/node_modules/npm-normalize-package-bin": { - "version": "2.0.0", + "node_modules/@semantic-release/npm/node_modules/npm/node_modules/signal-exit": { + "version": "4.1.0", "dev": true, "inBundle": true, "license": "ISC", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/readable-stream": { - "version": "3.6.0", + "node_modules/@semantic-release/npm/node_modules/npm/node_modules/sigstore": { + "version": "4.0.0", "dev": true, "inBundle": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "@sigstore/bundle": "^4.0.0", + "@sigstore/core": "^3.0.0", + "@sigstore/protobuf-specs": "^0.5.0", + "@sigstore/sign": "^4.0.0", + "@sigstore/tuf": "^4.0.0", + "@sigstore/verify": "^3.0.0" }, "engines": { - "node": ">= 6" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/readdir-scoped-modules": { - "version": "1.1.0", + "node_modules/@semantic-release/npm/node_modules/npm/node_modules/smart-buffer": { + "version": "4.2.0", "dev": true, "inBundle": true, - "license": "ISC", - "dependencies": { - "debuglog": "^1.0.1", - "dezalgo": "^1.0.0", - "graceful-fs": "^4.1.2", - "once": "^1.3.0" + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/retry": { - "version": "0.12.0", + "node_modules/@semantic-release/npm/node_modules/npm/node_modules/socks": { + "version": "2.8.7", "dev": true, "inBundle": true, "license": "MIT", + "dependencies": { + "ip-address": "^10.0.1", + "smart-buffer": "^4.2.0" + }, "engines": { - "node": ">= 4" + "node": ">= 10.0.0", + "npm": ">= 3.0.0" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/rimraf": { - "version": "3.0.2", + "node_modules/@semantic-release/npm/node_modules/npm/node_modules/socks-proxy-agent": { + "version": "8.0.5", "dev": true, "inBundle": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "socks": "^2.8.3" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "engines": { + "node": ">= 14" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/rimraf/node_modules/brace-expansion": { - "version": "1.1.11", + "node_modules/@semantic-release/npm/node_modules/npm/node_modules/spdx-correct": { + "version": "3.2.0", "dev": true, "inBundle": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", + "node_modules/@semantic-release/npm/node_modules/npm/node_modules/spdx-correct/node_modules/spdx-expression-parse": { + "version": "3.0.1", "dev": true, "inBundle": true, - "license": "ISC", + "license": "MIT", "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" + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/rimraf/node_modules/minimatch": { - "version": "3.1.2", + "node_modules/@semantic-release/npm/node_modules/npm/node_modules/spdx-exceptions": { + "version": "2.5.0", "dev": true, "inBundle": true, - "license": "ISC", + "license": "CC-BY-3.0" + }, + "node_modules/@semantic-release/npm/node_modules/npm/node_modules/spdx-expression-parse": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/safe-buffer": { - "version": "5.2.1", + "node_modules/@semantic-release/npm/node_modules/npm/node_modules/spdx-license-ids": { + "version": "3.0.22", "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" - } - ], "inBundle": true, - "license": "MIT" - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/safer-buffer": { - "version": "2.1.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true + "license": "CC0-1.0" }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/semver": { - "version": "7.3.7", + "node_modules/@semantic-release/npm/node_modules/npm/node_modules/ssri": { + "version": "13.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "minipass": "^7.0.3" }, "engines": { - "node": ">=10" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", + "node_modules/@semantic-release/npm/node_modules/npm/node_modules/string-width": { + "version": "4.2.3", "dev": true, "inBundle": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "yallist": "^4.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=10" - } - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/set-blocking": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/signal-exit": { - "version": "3.0.7", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/smart-buffer": { - "version": "4.2.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" + "node": ">=8" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/socks": { - "version": "2.7.0", + "node_modules/@semantic-release/npm/node_modules/npm/node_modules/strip-ansi": { + "version": "6.0.1", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { - "ip": "^2.0.0", - "smart-buffer": "^4.2.0" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">= 10.13.0", - "npm": ">= 3.0.0" + "node": ">=8" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/socks-proxy-agent": { - "version": "7.0.0", + "node_modules/@semantic-release/npm/node_modules/npm/node_modules/supports-color": { + "version": "10.2.2", "dev": true, "inBundle": true, "license": "MIT", - "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" - }, "engines": { - "node": ">= 10" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/spdx-correct": { - "version": "3.1.1", + "node_modules/@semantic-release/npm/node_modules/npm/node_modules/tar": { + "version": "7.5.2", "dev": true, "inBundle": true, - "license": "Apache-2.0", + "license": "BlueOak-1.0.0", "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.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": ">=18" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/spdx-exceptions": { - "version": "2.3.0", - "dev": true, - "inBundle": true, - "license": "CC-BY-3.0" - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/spdx-expression-parse": { - "version": "3.0.1", + "node_modules/@semantic-release/npm/node_modules/npm/node_modules/tar/node_modules/yallist": { + "version": "5.0.0", "dev": true, "inBundle": true, - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/spdx-license-ids": { - "version": "3.0.11", - "dev": true, - "inBundle": true, - "license": "CC0-1.0" - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/ssri": { - "version": "9.0.1", + "node_modules/@semantic-release/npm/node_modules/npm/node_modules/text-table": { + "version": "0.2.0", "dev": true, "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.1.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } + "license": "MIT" }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/string_decoder": { - "version": "1.3.0", + "node_modules/@semantic-release/npm/node_modules/npm/node_modules/tiny-relative-date": { + "version": "2.0.2", "dev": true, "inBundle": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } + "license": "MIT" }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/string-width": { - "version": "4.2.3", + "node_modules/@semantic-release/npm/node_modules/npm/node_modules/tinyglobby": { + "version": "0.2.15", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "fdir": "^6.5.0", + "picomatch": "^4.0.3" }, "engines": { - "node": ">=8" + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/strip-ansi": { - "version": "6.0.1", + "node_modules/@semantic-release/npm/node_modules/npm/node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", "dev": true, "inBundle": true, "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, "engines": { - "node": ">=8" + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/supports-color": { - "version": "7.2.0", + "node_modules/@semantic-release/npm/node_modules/npm/node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.3", "dev": true, "inBundle": true, "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/tar": { - "version": "6.1.11", + "node_modules/@semantic-release/npm/node_modules/npm/node_modules/treeverse": { + "version": "3.0.0", "dev": true, "inBundle": true, "license": "ISC", - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, "engines": { - "node": ">= 10" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/text-table": { - "version": "0.2.0", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/tiny-relative-date": { - "version": "1.3.0", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/treeverse": { - "version": "2.0.0", + "node_modules/@semantic-release/npm/node_modules/npm/node_modules/tuf-js": { + "version": "4.0.0", "dev": true, "inBundle": true, - "license": "ISC", + "license": "MIT", + "dependencies": { + "@tufjs/models": "4.0.0", + "debug": "^4.4.1", + "make-fetch-happen": "^15.0.0" + }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/unique-filename": { - "version": "2.0.1", + "version": "5.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "unique-slug": "^3.0.0" + "unique-slug": "^6.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/unique-slug": { - "version": "3.0.0", + "version": "6.0.0", "dev": true, "inBundle": true, "license": "ISC", @@ -8902,7 +8846,7 @@ "imurmurhash": "^0.1.4" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/util-deprecate": { @@ -8921,140 +8865,252 @@ "spdx-expression-parse": "^3.0.0" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/validate-npm-package-name": { - "version": "4.0.0", + "node_modules/@semantic-release/npm/node_modules/npm/node_modules/validate-npm-package-license/node_modules/spdx-expression-parse": { + "version": "3.0.1", "dev": true, "inBundle": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "builtins": "^5.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/walk-up-path": { - "version": "1.0.0", + "node_modules/@semantic-release/npm/node_modules/npm/node_modules/validate-npm-package-name": { + "version": "7.0.0", "dev": true, "inBundle": true, - "license": "ISC" + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/wcwidth": { - "version": "1.0.1", + "node_modules/@semantic-release/npm/node_modules/npm/node_modules/walk-up-path": { + "version": "4.0.0", "dev": true, "inBundle": true, - "license": "MIT", - "dependencies": { - "defaults": "^1.0.3" + "license": "ISC", + "engines": { + "node": "20 || >=22" } }, "node_modules/@semantic-release/npm/node_modules/npm/node_modules/which": { - "version": "2.0.2", + "version": "6.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "isexe": "^2.0.0" + "isexe": "^3.1.1" }, "bin": { - "node-which": "bin/node-which" + "node-which": "bin/which.js" }, "engines": { - "node": ">= 8" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/wide-align": { - "version": "1.1.5", + "node_modules/@semantic-release/npm/node_modules/npm/node_modules/write-file-atomic": { + "version": "7.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/wrappy": { - "version": "1.0.2", + "node_modules/@semantic-release/npm/node_modules/npm/node_modules/yallist": { + "version": "4.0.0", "dev": true, "inBundle": true, "license": "ISC" }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/write-file-atomic": { - "version": "4.0.2", + "node_modules/@semantic-release/npm/node_modules/parse-json": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.3.0.tgz", + "integrity": "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==", "dev": true, - "inBundle": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" + "@babel/code-frame": "^7.26.2", + "index-to-position": "^1.1.0", + "type-fest": "^4.39.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/yallist": { + "node_modules/@semantic-release/npm/node_modules/parse-json/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@semantic-release/npm/node_modules/path-key": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", "dev": true, - "inBundle": true, - "license": "ISC" + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@semantic-release/npm/node_modules/read-pkg": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-10.0.0.tgz", + "integrity": "sha512-A70UlgfNdKI5NSvTTfHzLQj7NJRpJ4mT5tGafkllJ4wh71oYuGm/pzphHcmW4s35iox56KSK721AihodoXSc/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/normalize-package-data": "^2.4.4", + "normalize-package-data": "^8.0.0", + "parse-json": "^8.3.0", + "type-fest": "^5.2.0", + "unicorn-magic": "^0.3.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@semantic-release/npm/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": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@semantic-release/npm/node_modules/strip-final-newline": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-4.0.0.tgz", + "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@semantic-release/npm/node_modules/type-fest": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.4.1.tgz", + "integrity": "sha512-xygQcmneDyzsEuKZrFbRMne5HDqMs++aFzefrJTgEIKjQ3rekM+RPfFCVq2Gp1VIDqddoYeppCj4Pcb+RZW0GQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "dependencies": { + "tagged-tag": "^1.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/@semantic-release/release-notes-generator": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/@semantic-release/release-notes-generator/-/release-notes-generator-10.0.3.tgz", - "integrity": "sha512-k4x4VhIKneOWoBGHkx0qZogNjCldLPRiAjnIpMnlUh6PtaWXp/T+C9U7/TaNDDtgDa5HMbHl4WlREdxHio6/3w==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@semantic-release/release-notes-generator/-/release-notes-generator-14.1.0.tgz", + "integrity": "sha512-CcyDRk7xq+ON/20YNR+1I/jP7BYKICr1uKd1HHpROSnnTdGqOTburi4jcRiTYz0cpfhxSloQO3cGhnoot7IEkA==", "dev": true, "license": "MIT", "dependencies": { - "conventional-changelog-angular": "^5.0.0", - "conventional-changelog-writer": "^5.0.0", - "conventional-commits-filter": "^2.0.0", - "conventional-commits-parser": "^3.2.3", + "conventional-changelog-angular": "^8.0.0", + "conventional-changelog-writer": "^8.0.0", + "conventional-commits-filter": "^5.0.0", + "conventional-commits-parser": "^6.0.0", "debug": "^4.0.0", - "get-stream": "^6.0.0", - "import-from": "^4.0.0", - "into-stream": "^6.0.0", - "lodash": "^4.17.4", - "read-pkg-up": "^7.0.0" + "get-stream": "^7.0.0", + "import-from-esm": "^2.0.0", + "into-stream": "^7.0.0", + "lodash-es": "^4.17.21", + "read-package-up": "^11.0.0" }, "engines": { - "node": ">=14.17" + "node": ">=20.8.1" }, "peerDependencies": { - "semantic-release": ">=18.0.0-beta.1" + "semantic-release": ">=20.1.0" } }, "node_modules/@semantic-release/release-notes-generator/node_modules/conventional-changelog-angular": { - "version": "5.0.13", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz", - "integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-8.1.0.tgz", + "integrity": "sha512-GGf2Nipn1RUCAktxuVauVr1e3r8QrLP/B0lEUsFktmGqc3ddbQkhoJZHJctVU829U1c6mTSWftrVOCHaL85Q3w==", "dev": true, "license": "ISC", "dependencies": { - "compare-func": "^2.0.0", - "q": "^1.5.1" + "compare-func": "^2.0.0" }, "engines": { - "node": ">=10" + "node": ">=18" } }, "node_modules/@semantic-release/release-notes-generator/node_modules/conventional-commits-parser": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz", - "integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-6.2.1.tgz", + "integrity": "sha512-20pyHgnO40rvfI0NGF/xiEoFMkXDtkF8FwHvk5BokoFoCuTQRI8vrNCNFWUOfuolKJMm1tPCHc8GgYEtr1XRNA==", "dev": true, "license": "MIT", "dependencies": { - "is-text-path": "^1.0.1", - "JSONStream": "^1.0.4", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^3.0.0", - "through2": "^4.0.0" + "meow": "^13.0.0" }, "bin": { - "conventional-commits-parser": "cli.js" + "conventional-commits-parser": "dist/cli/index.js" }, "engines": { - "node": ">=10" + "node": ">=18" + } + }, + "node_modules/@semantic-release/release-notes-generator/node_modules/get-stream": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-7.0.1.tgz", + "integrity": "sha512-3M8C1EOFN6r8AMUhwUAACIoXZJEOufDU5+0gFFN5uNs6XYOralD2Pqkl7m046va6x77FwposWXbAhPPIOus7mQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@semantic-release/release-notes-generator/node_modules/meow": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", + "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@sigstore/bundle": { @@ -9380,6 +9436,19 @@ "node": ">=4" } }, + "node_modules/@sindresorhus/merge-streams": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", + "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@sinonjs/commons": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", @@ -11577,6 +11646,14 @@ "dev": true, "license": "MIT" }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", @@ -12519,9 +12596,9 @@ } }, "node_modules/before-after-hook": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", - "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-4.0.0.tgz", + "integrity": "sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ==", "dev": true, "license": "Apache-2.0" }, @@ -13700,6 +13777,89 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/cli-highlight": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.11.tgz", + "integrity": "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "chalk": "^4.0.0", + "highlight.js": "^10.7.1", + "mz": "^2.4.0", + "parse5": "^5.1.1", + "parse5-htmlparser2-tree-adapter": "^6.0.0", + "yargs": "^16.0.0" + }, + "bin": { + "highlight": "bin/highlight" + }, + "engines": { + "node": ">=8.0.0", + "npm": ">=5.0.0" + } + }, + "node_modules/cli-highlight/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", + "peer": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/cli-highlight/node_modules/parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/cli-highlight/node_modules/parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "parse5": "^6.0.1" + } + }, + "node_modules/cli-highlight/node_modules/parse5-htmlparser2-tree-adapter/node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/cli-highlight/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/cli-table3": { "version": "0.6.5", "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", @@ -14227,51 +14387,45 @@ } }, "node_modules/conventional-changelog-writer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-5.0.1.tgz", - "integrity": "sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-8.2.0.tgz", + "integrity": "sha512-Y2aW4596l9AEvFJRwFGJGiQjt2sBYTjPD18DdvxX9Vpz0Z7HQ+g1Z+6iYDAm1vR3QOJrDBkRHixHK/+FhkR6Pw==", "dev": true, "license": "MIT", "dependencies": { - "conventional-commits-filter": "^2.0.7", - "dateformat": "^3.0.0", + "conventional-commits-filter": "^5.0.0", "handlebars": "^4.7.7", - "json-stringify-safe": "^5.0.1", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "semver": "^6.0.0", - "split": "^1.0.0", - "through2": "^4.0.0" + "meow": "^13.0.0", + "semver": "^7.5.2" }, "bin": { - "conventional-changelog-writer": "cli.js" + "conventional-changelog-writer": "dist/cli/index.js" }, "engines": { - "node": ">=10" + "node": ">=18" } }, - "node_modules/conventional-changelog-writer/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/conventional-changelog-writer/node_modules/meow": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", + "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==", "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/conventional-commits-filter": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz", - "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-5.0.0.tgz", + "integrity": "sha512-tQMagCOC59EVgNZcC5zl7XqO30Wki9i9J3acbUvkaosCT6JX3EeFwJD7Qqp4MCikRnzS18WXV3BLIQ66ytu6+Q==", "dev": true, "license": "MIT", - "dependencies": { - "lodash.ismatch": "^4.4.0", - "modify-values": "^1.0.0" - }, "engines": { - "node": ">=10" + "node": ">=18" } }, "node_modules/conventional-commits-parser": { @@ -14293,6 +14447,20 @@ "node": ">=14" } }, + "node_modules/convert-hrtime": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/convert-hrtime/-/convert-hrtime-5.0.0.tgz", + "integrity": "sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", @@ -14721,13 +14889,32 @@ } }, "node_modules/crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", + "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", "dev": true, "license": "MIT", + "dependencies": { + "type-fest": "^1.0.1" + }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/crypto-random-string/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/css-loader": { @@ -16036,6 +16223,14 @@ "node": ">=10.0.0" } }, + "node_modules/emojilib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz", + "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/emojis-list": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", @@ -16116,18 +16311,161 @@ } }, "node_modules/env-ci": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/env-ci/-/env-ci-5.5.0.tgz", - "integrity": "sha512-o0JdWIbOLP+WJKIUt36hz1ImQQFuN92nhsfTkHHap+J8CiI8WgGpH/a9jEGHh4/TU5BUUGjlnKXNoDb57+ne+A==", + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/env-ci/-/env-ci-11.2.0.tgz", + "integrity": "sha512-D5kWfzkmaOQDioPmiviWAVtKmpPT4/iJmMVQxWxMPJTFyTkdc5JQUfc5iXEeWxcOdsYTKSAiA/Age4NUOqKsRA==", "dev": true, "license": "MIT", "dependencies": { - "execa": "^5.0.0", - "fromentries": "^1.3.2", - "java-properties": "^1.0.0" + "execa": "^8.0.0", + "java-properties": "^1.0.2" }, "engines": { - "node": ">=10.17" + "node": "^18.17 || >=20.6.1" + } + }, + "node_modules/env-ci/node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/env-ci/node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/env-ci/node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/env-ci/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/env-ci/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/env-ci/node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/env-ci/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/env-ci/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/env-ci/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": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/env-ci/node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/env-paths": { @@ -17702,6 +18040,23 @@ "node": ">=0.4.0" } }, + "node_modules/fast-content-type-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-3.0.0.tgz", + "integrity": "sha512-ZvLdcY8P+N8mGQJahJV5G4U88CSvT1rP8ApL6uETe88MBXrBHAkZlSEySdUlyztF7ccb+Znos3TFqaepHxdhBg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -18115,17 +18470,32 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/find-up-simple": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.1.tgz", + "integrity": "sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/find-versions": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-4.0.0.tgz", - "integrity": "sha512-wgpWy002tA+wgmO27buH/9KzyEOQnKsG/R0yrcjPT9BOFm0zRBVQbZ95nRGXWMywS8YR5knRbpohio0bcJABxQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-6.0.0.tgz", + "integrity": "sha512-2kCCtc+JvcZ86IGAz3Z2Y0A1baIz9fL31pH/0S1IqZr9Iwnjq8izfPtrCyQKO6TLMPELLsQMre7VDqeIKCsHkA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "semver-regex": "^3.1.2" + "semver-regex": "^4.0.5", + "super-regex": "^1.0.0" }, "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -19112,6 +19482,20 @@ "dev": true, "license": "ISC" }, + "node_modules/function-timeout": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/function-timeout/-/function-timeout-1.0.2.tgz", + "integrity": "sha512-939eZS4gJ3htTHAldmyyuzlrD58P03fHG49v2JfFXbV6OhvZKRC9j2yAtdHw/zrp2zXHuv05zMIy40F0ge7spA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/function.prototype.name": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", @@ -20119,6 +20503,17 @@ "hermes-estree": "0.25.1" } }, + "node_modules/highlight.js": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "engines": { + "node": "*" + } + }, "node_modules/hoist-non-react-statics": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", @@ -20135,13 +20530,17 @@ "license": "MIT" }, "node_modules/hook-std": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hook-std/-/hook-std-2.0.0.tgz", - "integrity": "sha512-zZ6T5WcuBMIUVh49iPQS9t977t7C0l7OtHrpeMb5uk48JdflRX0NSFvCekfYNmGQETnLq9W/isMyHl69kxGi8g==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hook-std/-/hook-std-4.0.0.tgz", + "integrity": "sha512-IHI4bEVOt3vRUDJ+bFA9VUJlo7SzvFARPNLw75pqSmAOP2HmTWfFJtPvLBrDrlgjEYXY9zs7SFdHPQaJShkSCQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { - "node": ">=8" + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/hosted-git-info": { @@ -20797,6 +21196,20 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/import-from-esm": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-from-esm/-/import-from-esm-2.0.0.tgz", + "integrity": "sha512-YVt14UZCgsX1vZQ3gKjkWVdBdHQ6eu3MPU1TBgL1H5orXe2+jWD006WCPPtOuwlQm10NuzOW5WawiF1Q9veW8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4", + "import-meta-resolve": "^4.0.0" + }, + "engines": { + "node": ">=18.20" + } + }, "node_modules/import-local": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", @@ -20886,6 +21299,17 @@ "node": ">=8" } }, + "node_modules/import-meta-resolve": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz", + "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -20917,6 +21341,19 @@ "node": ">=8" } }, + "node_modules/index-to-position": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/index-to-position/-/index-to-position-1.2.0.tgz", + "integrity": "sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/infer-owner": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", @@ -21312,9 +21749,9 @@ } }, "node_modules/into-stream": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-6.0.0.tgz", - "integrity": "sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-7.0.0.tgz", + "integrity": "sha512-2dYz766i9HprMBasCMvHMuazJ7u4WzhJwo5kb3iPSiW/iRYV6uPari3zHoqZlnuaR7V1bEiNMxikhp37rdBXbw==", "dev": true, "license": "MIT", "dependencies": { @@ -21322,7 +21759,7 @@ "p-is-promise": "^3.0.0" }, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -21937,6 +22374,19 @@ "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", "license": "MIT" }, + "node_modules/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-weakmap": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", @@ -22219,9 +22669,9 @@ "license": "MIT" }, "node_modules/issue-parser": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-6.0.0.tgz", - "integrity": "sha512-zKa/Dxq2lGsBIXQ7CUZWTHfvxPC2ej0KfO7fIPqLlHB9J2hJ7rGhZ5rilhuufylr4RXYPzJUeFjKxz305OsNlA==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-7.0.1.tgz", + "integrity": "sha512-3YZcUUR2Wt1WsapF+S/WiA2WmlW0cWAoPccMqne7AxEBhCdFeTPjfv/Axb8V2gyCgY3nRw+ksZ3xSUX+R47iAg==", "dev": true, "license": "MIT", "dependencies": { @@ -22232,7 +22682,7 @@ "lodash.uniqby": "^4.7.0" }, "engines": { - "node": ">=10.13" + "node": "^18.17 || >=20.6.1" } }, "node_modules/istanbul-lib-coverage": { @@ -24979,6 +25429,13 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "license": "MIT" }, + "node_modules/lodash-es": { + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.23.tgz", + "integrity": "sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==", + "dev": true, + "license": "MIT" + }, "node_modules/lodash._getnative": { "version": "3.9.1", "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", @@ -25232,6 +25689,78 @@ "source-map-js": "^1.2.1" } }, + "node_modules/make-asynchronous": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/make-asynchronous/-/make-asynchronous-1.0.1.tgz", + "integrity": "sha512-T9BPOmEOhp6SmV25SwLVcHK4E6JyG/coH3C6F1NjNXSziv/fd4GmsqMk8YR6qpPOswfaOCApSNkZv6fxoaYFcQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "p-event": "^6.0.0", + "type-fest": "^4.6.0", + "web-worker": "1.2.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-asynchronous/node_modules/p-event": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-6.0.1.tgz", + "integrity": "sha512-Q6Bekk5wpzW5qIyUP4gdMEujObYstZl6DMMOSenwBvV0BlE5LkDwkjs5yHbZmdCEq2o4RJx4tE1vwxFVf2FG1w==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "p-timeout": "^6.1.2" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-asynchronous/node_modules/p-timeout": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.4.tgz", + "integrity": "sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-asynchronous/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "peer": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-asynchronous/node_modules/web-worker": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.2.0.tgz", + "integrity": "sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==", + "dev": true, + "license": "Apache-2.0", + "peer": true + }, "node_modules/make-dir": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", @@ -25637,45 +26166,66 @@ } }, "node_modules/marked-terminal": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-5.2.0.tgz", - "integrity": "sha512-Piv6yNwAQXGFjZSaiNljyNFw7jKDdGrw70FSbtxEyldLsyeuV5ZHm/1wW++kWbrOF1VPnUgYOhB2oLL0ZpnekA==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-7.3.0.tgz", + "integrity": "sha512-t4rBvPsHc57uE/2nJOLmMbZCQ4tgAccAED3ngXQqW6g+TxA488JzJ+FK3lQkzBQOI1mRV/r/Kq+1ZlJ4D0owQw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "ansi-escapes": "^6.2.0", - "cardinal": "^2.1.1", - "chalk": "^5.2.0", - "cli-table3": "^0.6.3", - "node-emoji": "^1.11.0", - "supports-hyperlinks": "^2.3.0" + "ansi-escapes": "^7.0.0", + "ansi-regex": "^6.1.0", + "chalk": "^5.4.1", + "cli-highlight": "^2.1.11", + "cli-table3": "^0.6.5", + "node-emoji": "^2.2.0", + "supports-hyperlinks": "^3.1.0" }, "engines": { - "node": ">=14.13.1 || >=16.0.0" + "node": ">=16.0.0" }, "peerDependencies": { - "marked": "^1.0.0 || ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0" + "marked": ">=1 <16" } }, "node_modules/marked-terminal/node_modules/ansi-escapes": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.1.tgz", - "integrity": "sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.2.0.tgz", + "integrity": "sha512-g6LhBsl+GBPRWGWsBtutpzBYuIIdBkLEvad5C/va/74Db018+5TZiyA26cZJAr3Rft5lprVqOIPxf5Vid6tqAw==", "dev": true, "license": "MIT", + "peer": true, + "dependencies": { + "environment": "^1.0.0" + }, "engines": { - "node": ">=14.16" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/marked-terminal/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, "node_modules/marked-terminal/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", + "peer": true, "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, @@ -26702,16 +27252,19 @@ } }, "node_modules/mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-4.1.0.tgz", + "integrity": "sha512-X5ju04+cAzsojXKes0B/S4tcYtFAJ6tTMuSPBEn9CPGlrWr8Fiw7qYeLT0XyH80HSoAoqWCaz+MWKh22P7G1cw==", "dev": true, + "funding": [ + "https://github.com/sponsors/broofa" + ], "license": "MIT", "bin": { - "mime": "cli.js" + "mime": "bin/cli.js" }, "engines": { - "node": ">=10.0.0" + "node": ">=16" } }, "node_modules/mime-db": { @@ -27164,6 +27717,19 @@ "dev": true, "license": "ISC" }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, "node_modules/nanoid": { "version": "3.3.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", @@ -27231,13 +27797,34 @@ } }, "node_modules/node-emoji": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", - "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.2.0.tgz", + "integrity": "sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "lodash": "^4.17.21" + "@sindresorhus/is": "^4.6.0", + "char-regex": "^1.0.2", + "emojilib": "^2.4.0", + "skin-tone": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/node-emoji/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", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" } }, "node_modules/node-fetch": { @@ -27451,13 +28038,13 @@ } }, "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==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.1.1.tgz", + "integrity": "sha512-JYc0DPlpGWB40kH5g07gGTrYuMqV653k3uBKY6uITPWds3M0ov3GaWGp9lbE3Bzngx8+XkfzgvASb9vk9JDFXQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=10" + "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -30861,13 +31448,14 @@ } }, "node_modules/p-each-series": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", - "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-3.0.0.tgz", + "integrity": "sha512-lastgtAdoH9YaLyDa5i5z64q+kzOcQHsQ5SsZJD3q0VEyI8mq872S3geuNbRUQLVAE9siMfgKrpj7MloKFHruw==", "dev": true, "license": "MIT", + "peer": true, "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -30886,26 +31474,32 @@ } }, "node_modules/p-filter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz", - "integrity": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-4.1.0.tgz", + "integrity": "sha512-37/tPdZ3oJwHaS3gNJdenCDB3Tz26i9sjhnguBtvN0vYlRIiDNnvTWkuh+0hETV9rLPdJ3rlL3yVOYPIAnM8rw==", "dev": true, "license": "MIT", "dependencies": { - "p-map": "^2.0.0" + "p-map": "^7.0.1" }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-filter/node_modules/p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.4.tgz", + "integrity": "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=6" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-finally": { @@ -31427,6 +32021,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/parse-ms": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-4.0.0.tgz", + "integrity": "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/parse-statements": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/parse-statements/-/parse-statements-1.0.11.tgz", @@ -32344,6 +32951,22 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/pretty-ms": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.3.0.tgz", + "integrity": "sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parse-ms": "^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/prismjs": { "version": "1.30.0", "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", @@ -33503,6 +34126,123 @@ "semver": "bin/semver" } }, + "node_modules/read-package-up": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/read-package-up/-/read-package-up-11.0.0.tgz", + "integrity": "sha512-MbgfoNPANMdb4oRBNg5eqLbB2t2r+o5Ua1pNt8BqGp4I0FJZhuVSOj3PaBPni4azWuSzEdNn2evevzVmEk1ohQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up-simple": "^1.0.0", + "read-pkg": "^9.0.0", + "type-fest": "^4.6.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-package-up/node_modules/hosted-git-info": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", + "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/read-package-up/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-up/node_modules/normalize-package-data": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz", + "integrity": "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^7.0.0", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/read-package-up/node_modules/parse-json": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.3.0.tgz", + "integrity": "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "index-to-position": "^1.1.0", + "type-fest": "^4.39.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-package-up/node_modules/read-pkg": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-9.0.1.tgz", + "integrity": "sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/normalize-package-data": "^2.4.3", + "normalize-package-data": "^6.0.0", + "parse-json": "^8.0.0", + "type-fest": "^4.6.0", + "unicorn-magic": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-package-up/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-package-up/node_modules/unicorn-magic": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", + "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/read-pkg": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", @@ -33854,13 +34594,13 @@ } }, "node_modules/registry-auth-token": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.1.0.tgz", - "integrity": "sha512-GdekYuwLXLxMuFTwAPg5UKGLW/UXzQrZvH/Zj791BQif5T05T0RsaLfHc9q3ZOKi7n+BoprPD9mJ0O0k4xzUlw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.1.1.tgz", + "integrity": "sha512-P7B4+jq8DeD2nMsAcdfaqHbssgHtZ7Z5+++a5ask90fvmJ8p5je4mOa+wzu+DB4vQ5tdJV/xywY+UnVFeQLV5Q==", "dev": true, "license": "MIT", "dependencies": { - "@pnpm/npm-conf": "^2.1.0" + "@pnpm/npm-conf": "^3.0.2" }, "engines": { "node": ">=14" @@ -34793,17 +35533,17 @@ } }, "node_modules/scratch-semantic-release-config": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/scratch-semantic-release-config/-/scratch-semantic-release-config-4.0.0.tgz", - "integrity": "sha512-iHIAziAEgV1uCx3kuyj8vJ5DzmHUGeVbuQCYO+XV5jQshewriuP9Usqcm81v7H33GQYPmCgucbVeiaBQaQM+6A==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/scratch-semantic-release-config/-/scratch-semantic-release-config-4.0.1.tgz", + "integrity": "sha512-GnYr/0ThoFdE4w4vYV2J9NQlAXqC7kxfQUqzmtoeJeAP6H1wTDFZ6cB318Xzbkprl+efUMyFM/mMb8NoDvR6PQ==", "dev": true, "license": "BSD-3-Clause", "dependencies": { - "@semantic-release/commit-analyzer": "^9.0.2", + "@semantic-release/commit-analyzer": "^13.0.0", "@semantic-release/git": "^10.0.1", - "@semantic-release/github": "^8.0.4", - "@semantic-release/npm": "^9.0.1", - "@semantic-release/release-notes-generator": "^10.0.3" + "@semantic-release/github": "^12.0.0", + "@semantic-release/npm": "^13.0.0", + "@semantic-release/release-notes-generator": "^14.0.0" }, "peerDependencies": { "semantic-release": ">=19.0.2" @@ -34935,379 +35675,828 @@ } }, "node_modules/semantic-release": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-19.0.5.tgz", - "integrity": "sha512-NMPKdfpXTnPn49FDogMBi36SiBfXkSOJqCkk0E4iWOY1tusvvgBwqUmxTX1kmlT6kIYed9YwNKD1sfPpqa5yaA==", + "version": "24.2.9", + "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-24.2.9.tgz", + "integrity": "sha512-phCkJ6pjDi9ANdhuF5ElS10GGdAKY6R1Pvt9lT3SFhOwM4T7QZE7MLpBDbNruUx/Q3gFD92/UOFringGipRqZA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "@semantic-release/commit-analyzer": "^9.0.2", - "@semantic-release/error": "^3.0.0", - "@semantic-release/github": "^8.0.0", - "@semantic-release/npm": "^9.0.0", - "@semantic-release/release-notes-generator": "^10.0.0", - "aggregate-error": "^3.0.0", - "cosmiconfig": "^7.0.0", + "@semantic-release/commit-analyzer": "^13.0.0-beta.1", + "@semantic-release/error": "^4.0.0", + "@semantic-release/github": "^11.0.0", + "@semantic-release/npm": "^12.0.2", + "@semantic-release/release-notes-generator": "^14.0.0-beta.1", + "aggregate-error": "^5.0.0", + "cosmiconfig": "^9.0.0", "debug": "^4.0.0", - "env-ci": "^5.0.0", - "execa": "^5.0.0", - "figures": "^3.0.0", - "find-versions": "^4.0.0", + "env-ci": "^11.0.0", + "execa": "^9.0.0", + "figures": "^6.0.0", + "find-versions": "^6.0.0", "get-stream": "^6.0.0", "git-log-parser": "^1.2.0", - "hook-std": "^2.0.0", - "hosted-git-info": "^4.0.0", - "lodash": "^4.17.21", - "marked": "^4.0.10", - "marked-terminal": "^5.0.0", + "hook-std": "^4.0.0", + "hosted-git-info": "^8.0.0", + "import-from-esm": "^2.0.0", + "lodash-es": "^4.17.21", + "marked": "^15.0.0", + "marked-terminal": "^7.3.0", "micromatch": "^4.0.2", - "p-each-series": "^2.1.0", - "p-reduce": "^2.0.0", - "read-pkg-up": "^7.0.0", + "p-each-series": "^3.0.0", + "p-reduce": "^3.0.0", + "read-package-up": "^11.0.0", "resolve-from": "^5.0.0", "semver": "^7.3.2", - "semver-diff": "^3.1.1", + "semver-diff": "^5.0.0", "signale": "^1.2.1", - "yargs": "^16.2.0" + "yargs": "^17.5.1" }, "bin": { "semantic-release": "bin/semantic-release.js" }, "engines": { - "node": ">=16 || ^14.17" + "node": ">=20.8.1" } }, - "node_modules/semantic-release/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==", + "node_modules/semantic-release/node_modules/@octokit/openapi-types": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-26.0.0.tgz", + "integrity": "sha512-7AtcfKtpo77j7Ts73b4OWhOZHTKo/gGY8bB3bNBQz4H+GRSWqx2yvj8TXRsbdTE0eRmYmXOEY66jM7mJ7LzfsA==", "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } + "license": "MIT", + "peer": true }, - "node_modules/semantic-release/node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "node_modules/semantic-release/node_modules/@octokit/plugin-paginate-rest": { + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-13.2.1.tgz", + "integrity": "sha512-Tj4PkZyIL6eBMYcG/76QGsedF0+dWVeLhYprTmuFVVxzDW7PQh23tM0TP0z+1MvSkxB29YFZwnUX+cXfTiSdyw==", "dev": true, "license": "MIT", + "peer": true, "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" + "@octokit/types": "^15.0.1" }, "engines": { - "node": ">=10" + "node": ">= 20" + }, + "peerDependencies": { + "@octokit/core": ">=6" } }, - "node_modules/semantic-release/node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "node_modules/semantic-release/node_modules/@octokit/types": { + "version": "15.0.2", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-15.0.2.tgz", + "integrity": "sha512-rR+5VRjhYSer7sC51krfCctQhVTmjyUMAaShfPB8mscVa8tSoLyon3coxQmXu0ahJoLVWl8dSGD/3OGZlFV44Q==", "dev": true, - "license": "ISC", - "engines": { - "node": ">= 6" + "license": "MIT", + "peer": true, + "dependencies": { + "@octokit/openapi-types": "^26.0.0" } }, - "node_modules/semantic-release/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "node_modules/semantic-release/node_modules/@semantic-release/error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-4.0.0.tgz", + "integrity": "sha512-mgdxrHTLOjOddRVYIYDo0fR3/v61GNN1YGkfbrjuIKg/uMgCd+Qzo3UAXJ+woLQQpos4pl5Esuw5A7AoNlzjUQ==", "dev": true, "license": "MIT", - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, + "peer": true, "engines": { - "node": ">=10" + "node": ">=18" } }, - "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "license": "ISC", + "node_modules/semantic-release/node_modules/@semantic-release/github": { + "version": "11.0.6", + "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-11.0.6.tgz", + "integrity": "sha512-ctDzdSMrT3H+pwKBPdyCPty6Y47X8dSrjd3aPZ5KKIKKWTwZBE9De8GtsH3TyAlw3Uyo2stegMx6rJMXKpJwJA==", + "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "@octokit/core": "^7.0.0", + "@octokit/plugin-paginate-rest": "^13.0.0", + "@octokit/plugin-retry": "^8.0.0", + "@octokit/plugin-throttling": "^11.0.0", + "@semantic-release/error": "^4.0.0", + "aggregate-error": "^5.0.0", + "debug": "^4.3.4", + "dir-glob": "^3.0.1", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", + "issue-parser": "^7.0.0", + "lodash-es": "^4.17.21", + "mime": "^4.0.0", + "p-filter": "^4.0.0", + "tinyglobby": "^0.2.14", + "url-join": "^5.0.0" }, "engines": { - "node": ">=10" + "node": ">=20.8.1" + }, + "peerDependencies": { + "semantic-release": ">=24.1.0" } }, - "node_modules/semver-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", - "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "node_modules/semantic-release/node_modules/@semantic-release/npm": { + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-12.0.2.tgz", + "integrity": "sha512-+M9/Lb35IgnlUO6OSJ40Ie+hUsZLuph2fqXC/qrKn0fMvUU/jiCjpoL6zEm69vzcmaZJ8yNKtMBEKHWN49WBbQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "semver": "^6.3.0" + "@semantic-release/error": "^4.0.0", + "aggregate-error": "^5.0.0", + "execa": "^9.0.0", + "fs-extra": "^11.0.0", + "lodash-es": "^4.17.21", + "nerf-dart": "^1.0.0", + "normalize-url": "^8.0.0", + "npm": "^10.9.3", + "rc": "^1.2.8", + "read-pkg": "^9.0.0", + "registry-auth-token": "^5.0.0", + "semver": "^7.1.2", + "tempy": "^3.0.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/semver-diff/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": "ISC", - "bin": { - "semver": "bin/semver.js" + "node": ">=20.8.1" + }, + "peerDependencies": { + "semantic-release": ">=20.1.0" } }, - "node_modules/semver-regex": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-3.1.4.tgz", - "integrity": "sha512-6IiqeZNgq01qGf0TId0t3NvKzSvUsjcpdEO3AQNeIjR6A2+ckTnQlDpl4qu1bjRv0RzN3FP9hzFmws3lKqRWkA==", + "node_modules/semantic-release/node_modules/aggregate-error": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-5.0.0.tgz", + "integrity": "sha512-gOsf2YwSlleG6IjRYG2A7k0HmBMEo6qVNk9Bp/EaLgAJT5ngH6PXbqa4ItvnEwCm/velL5jAnQgsHsWnjhGmvw==", "dev": true, "license": "MIT", + "peer": true, + "dependencies": { + "clean-stack": "^5.2.0", + "indent-string": "^5.0.0" + }, "engines": { - "node": ">=8" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/send": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "node_modules/semantic-release/node_modules/clean-stack": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-5.3.0.tgz", + "integrity": "sha512-9ngPTOhYGQqNVSfeJkYXHmF7AGWp4/nN5D/QqNQs3Dvxd1Kk/WpjHfNujKHYUQ/5CoGyOyFNoWSPk5afzP0QVg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" + "escape-string-regexp": "5.0.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/semantic-release/node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "ms": "2.0.0" + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/send/node_modules/debug/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/send/node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "node_modules/semantic-release/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "dev": true, "license": "MIT", + "peer": true, "engines": { - "node": ">= 0.8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/send/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/semantic-release/node_modules/execa": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-9.6.1.tgz", + "integrity": "sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==", "dev": true, "license": "MIT", - "bin": { - "mime": "cli.js" + "peer": true, + "dependencies": { + "@sindresorhus/merge-streams": "^4.0.0", + "cross-spawn": "^7.0.6", + "figures": "^6.1.0", + "get-stream": "^9.0.0", + "human-signals": "^8.0.1", + "is-plain-obj": "^4.1.0", + "is-stream": "^4.0.1", + "npm-run-path": "^6.0.0", + "pretty-ms": "^9.2.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^4.0.0", + "yoctocolors": "^2.1.1" }, "engines": { - "node": ">=4" + "node": "^18.19.0 || >=20.5.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/serialize-javascript": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", - "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", - "license": "BSD-3-Clause", + "node_modules/semantic-release/node_modules/execa/node_modules/get-stream": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", + "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", + "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "randombytes": "^2.1.0" + "@sec-ant/readable-stream": "^0.4.1", + "is-stream": "^4.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "node_modules/semantic-release/node_modules/figures": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz", + "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "accepts": "~1.3.4", - "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" + "is-unicode-supported": "^2.0.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "node_modules/semantic-release/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": "MIT", + "license": "ISC", + "peer": true, "dependencies": { - "ms": "2.0.0" + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/serve-index/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "node_modules/semantic-release/node_modules/human-signals": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-8.0.1.tgz", + "integrity": "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", + "peer": true, "engines": { - "node": ">= 0.6" + "node": ">=18.18.0" } }, - "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==", + "node_modules/semantic-release/node_modules/indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", "dev": true, "license": "MIT", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - }, + "peer": true, "engines": { - "node": ">= 0.6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "node_modules/semantic-release/node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", "dev": true, - "license": "ISC" + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "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==", + "node_modules/semantic-release/node_modules/is-stream": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", + "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "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==", + "node_modules/semantic-release/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" + "license": "ISC", + "peer": true }, - "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==", + "node_modules/semantic-release/node_modules/marked": { + "version": "15.0.12", + "resolved": "https://registry.npmjs.org/marked/-/marked-15.0.12.tgz", + "integrity": "sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA==", "dev": true, "license": "MIT", + "peer": true, + "bin": { + "marked": "bin/marked.js" + }, "engines": { - "node": ">= 0.6" + "node": ">= 18" } }, - "node_modules/serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "node_modules/semantic-release/node_modules/normalize-package-data": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz", + "integrity": "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", + "peer": true, "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" + "hosted-git-info": "^7.0.0", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" }, "engines": { - "node": ">= 0.8.0" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "license": "MIT", + "node_modules/semantic-release/node_modules/normalize-package-data/node_modules/hosted-git-info": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", + "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", + "dev": true, + "license": "ISC", + "peer": true, "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" + "lru-cache": "^10.0.1" }, "engines": { - "node": ">= 0.4" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "node_modules/semantic-release/node_modules/npm-run-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz", + "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" + "path-key": "^4.0.0", + "unicorn-magic": "^0.3.0" }, "engines": { - "node": ">= 0.4" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/set-proto": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", - "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "node_modules/semantic-release/node_modules/p-reduce": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-3.0.0.tgz", + "integrity": "sha512-xsrIUgI0Kn6iyDYm9StOpOeK29XM1aboGji26+QEortiFST1hGZaUQOLhtEbqHErPpGW/aSz6allwK2qcptp0Q==", "dev": true, "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0" - }, + "peer": true, "engines": { - "node": ">= 0.4" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semantic-release/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semantic-release/node_modules/read-pkg": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-9.0.1.tgz", + "integrity": "sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.3", + "normalize-package-data": "^6.0.0", + "parse-json": "^8.0.0", + "type-fest": "^4.6.0", + "unicorn-magic": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semantic-release/node_modules/read-pkg/node_modules/parse-json": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.3.0.tgz", + "integrity": "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.26.2", + "index-to-position": "^1.1.0", + "type-fest": "^4.39.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semantic-release/node_modules/read-pkg/node_modules/unicorn-magic": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", + "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semantic-release/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": "ISC", + "peer": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/semantic-release/node_modules/strip-final-newline": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-4.0.0.tgz", + "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semantic-release/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "peer": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-5.0.0.tgz", + "integrity": "sha512-0HbGtOm+S7T6NGQ/pxJSJipJvc4DK3FcRVMRkhsIwJDJ4Jcz5DQC1cPPzB5GhzyHjwttW878HaWQq46CkL3cqg==", + "deprecated": "Deprecated as the semver package now supports this built-in.", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semver-regex": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-4.0.5.tgz", + "integrity": "sha512-hunMQrEy1T6Jr2uEVjrAIqjwWcQTgOAcIM52C8MY1EZSD3DDNft04XzvYKPqjED65bNVVko0YI38nYeEHCX3yw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/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" + } + }, + "node_modules/send/node_modules/debug/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/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/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", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/serialize-javascript": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.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==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.4", + "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" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "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" + } + }, + "node_modules/serve-index/node_modules/depd": { + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/setimmediate": { @@ -35659,6 +36848,20 @@ "dev": true, "license": "MIT" }, + "node_modules/skin-tone": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz", + "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "unicode-emoji-modifier-base": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/slash": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", @@ -36626,6 +37829,25 @@ "webpack": "^5.27.0" } }, + "node_modules/super-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/super-regex/-/super-regex-1.1.0.tgz", + "integrity": "sha512-WHkws2ZflZe41zj6AolvvmaTrWds/VuyeYr9iPVv/oQeaIoVxMKaushfFWpOGDT+GuBrM/sVqF8KUCYQlSSTdQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "function-timeout": "^1.0.1", + "make-asynchronous": "^1.0.1", + "time-span": "^5.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -36639,17 +37861,21 @@ } }, "node_modules/supports-hyperlinks": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.2.0.tgz", + "integrity": "sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" }, "engines": { - "node": ">=8" + "node": ">=14.18" + }, + "funding": { + "url": "https://github.com/chalk/supports-hyperlinks?sponsor=1" } }, "node_modules/supports-preserve-symlinks-flag": { @@ -36925,6 +38151,19 @@ "integrity": "sha512-y3JaeRSplks6NYQuCOj3ZFMO3j60rTwbuKCvZxsAraGYH2epusatvZ0baZYA01WsGqJBq/Dl6vOrMUJqyMj8kA==", "dev": true }, + "node_modules/tagged-tag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz", + "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/tap": { "version": "21.5.0", "resolved": "https://registry.npmjs.org/tap/-/tap-21.5.0.tgz", @@ -37830,43 +39069,55 @@ } }, "node_modules/temp-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", - "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-3.0.0.tgz", + "integrity": "sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=14.16" } }, "node_modules/tempy": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-1.0.1.tgz", - "integrity": "sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-3.1.1.tgz", + "integrity": "sha512-ozXJ+Z2YduKpJuuM07LNcIxpX+r8W4J84HrgqB/ay4skWfa5MhjsVn6e2fw+bRDa8cYO5jRJWnEMWL1HqCc2sQ==", "dev": true, "license": "MIT", "dependencies": { - "del": "^6.0.0", - "is-stream": "^2.0.0", - "temp-dir": "^2.0.0", - "type-fest": "^0.16.0", - "unique-string": "^2.0.0" + "is-stream": "^3.0.0", + "temp-dir": "^3.0.0", + "type-fest": "^2.12.2", + "unique-string": "^3.0.0" }, "engines": { - "node": ">=10" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tempy/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/tempy/node_modules/type-fest": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", - "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=10" + "node": ">=12.20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -38027,6 +39278,31 @@ "dev": true, "license": "MIT" }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/thingies": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/thingies/-/thingies-2.5.0.tgz", @@ -38067,6 +39343,23 @@ "dev": true, "license": "MIT" }, + "node_modules/time-span": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/time-span/-/time-span-5.1.0.tgz", + "integrity": "sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "convert-hrtime": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/timed-out": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", @@ -39062,6 +40355,16 @@ "node": "^18.17.0 || >=20.5.0" } }, + "node_modules/tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6.11 <=0.7.0 || >=0.7.3" + } + }, "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -39371,6 +40674,17 @@ "node": ">=4" } }, + "node_modules/unicode-emoji-modifier-base": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz", + "integrity": "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=4" + } + }, "node_modules/unicode-emoji-utils": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/unicode-emoji-utils/-/unicode-emoji-utils-1.3.1.tgz", @@ -39431,6 +40745,19 @@ "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==", "license": "MIT" }, + "node_modules/unicorn-magic": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/unique-filename": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", @@ -39450,16 +40777,19 @@ } }, "node_modules/unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", + "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", "dev": true, "license": "MIT", "dependencies": { - "crypto-random-string": "^2.0.0" + "crypto-random-string": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/unist-util-is": { @@ -39522,9 +40852,9 @@ } }, "node_modules/universal-user-agent": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", - "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.3.tgz", + "integrity": "sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A==", "dev": true, "license": "ISC" }, @@ -39671,11 +41001,14 @@ } }, "node_modules/url-join": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", - "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-5.0.0.tgz", + "integrity": "sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } }, "node_modules/url-loader": { "version": "4.1.1", @@ -41226,6 +42559,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/yoctocolors": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.2.tgz", + "integrity": "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/yoga-layout": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/yoga-layout/-/yoga-layout-3.2.1.tgz", @@ -41374,7 +42720,7 @@ "react-test-renderer": "18.3.1", "redux-mock-store": "1.5.5", "rimraf": "2.7.1", - "scratch-semantic-release-config": "4.0.0", + "scratch-semantic-release-config": "4.0.1", "scratch-webpack-configuration": "3.1.0", "selenium-webdriver": "3.6.0", "semantic-release": "19.0.5", @@ -41395,378 +42741,13733 @@ "redux": "^4.0.0" } }, - "packages/scratch-gui/node_modules/@scratch/scratch-render/node_modules/raw-loader": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-0.5.1.tgz", - "integrity": "sha512-sf7oGoLuaYAScB4VGr0tzetsYlS8EJH6qnTCfQ/WVEa89hALQ4RQfCKt5xCyPQKPDUbVUAIP1QsxAwfAjlDp7Q==", - "extraneous": true + "packages/scratch-gui/node_modules/@octokit/auth-token": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.4.tgz", + "integrity": "sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } }, - "packages/scratch-render": { - "name": "@scratch/scratch-render", - "version": "12.3.1", - "license": "AGPL-3.0-only", + "packages/scratch-gui/node_modules/@octokit/core": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.2.4.tgz", + "integrity": "sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ==", + "dev": true, + "license": "MIT", "dependencies": { - "@scratch/scratch-svg-renderer": "12.3.1", - "grapheme-breaker": "0.3.2", - "hull.js": "0.2.10", - "ify-loader": "1.1.0", - "linebreak": "0.3.0", - "raw-loader": "0.5.1", - "tslog": "4.10.2", - "twgl.js": "4.24.0" - }, - "devDependencies": { - "@babel/core": "7.28.6", - "@babel/polyfill": "7.12.1", - "@babel/preset-env": "7.28.6", - "@scratch/scratch-vm": "12.3.1", - "babel-loader": "9.2.1", - "copy-webpack-plugin": "6.4.1", - "docdash": "0.4.0", - "eslint": "9.39.2", - "eslint-config-scratch": "12.0.46", - "gh-pages": "1.2.0", - "globals": "16.5.0", - "html-webpack-plugin": "5.6.6", - "jsdoc": "3.6.11", - "playwright-chromium": "1.57.0", - "scratch-render-fonts": "1.0.252", - "scratch-semantic-release-config": "4.0.0", - "scratch-storage": "5.0.10", - "scratch-webpack-configuration": "3.1.0", - "semantic-release": "19.0.5", - "tap": "21.5.0", - "terser-webpack-plugin": "5.3.16", - "webpack": "5.104.1", - "webpack-cli": "5.1.4", - "webpack-dev-server": "5.2.3" + "@octokit/auth-token": "^3.0.0", + "@octokit/graphql": "^5.0.0", + "@octokit/request": "^6.0.0", + "@octokit/request-error": "^3.0.0", + "@octokit/types": "^9.0.0", + "before-after-hook": "^2.2.0", + "universal-user-agent": "^6.0.0" }, - "peerDependencies": { - "scratch-render-fonts": "^1.0.0" + "engines": { + "node": ">= 14" } }, - "packages/scratch-render/node_modules/array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", + "packages/scratch-gui/node_modules/@octokit/endpoint": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.6.tgz", + "integrity": "sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg==", "dev": true, "license": "MIT", "dependencies": { - "array-uniq": "^1.0.1" + "@octokit/types": "^9.0.0", + "is-plain-object": "^5.0.0", + "universal-user-agent": "^6.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">= 14" } }, - "packages/scratch-render/node_modules/async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", - "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", + "packages/scratch-gui/node_modules/@octokit/graphql": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.6.tgz", + "integrity": "sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw==", "dev": true, "license": "MIT", "dependencies": { - "lodash": "^4.17.10" + "@octokit/request": "^6.0.0", + "@octokit/types": "^9.0.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 14" } }, - "packages/scratch-render/node_modules/commander": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", - "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", + "packages/scratch-gui/node_modules/@octokit/openapi-types": { + "version": "18.1.1", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.1.1.tgz", + "integrity": "sha512-VRaeH8nCDtF5aXWnjPuEMIYf1itK/s3JYyJcWFJT8X9pSNnBtriDf7wlEWsGuhPLl4QIH4xM8fqTXDwJ3Mu6sw==", "dev": true, "license": "MIT" }, - "packages/scratch-render/node_modules/fs-extra": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz", - "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==", + "packages/scratch-gui/node_modules/@octokit/plugin-paginate-rest": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-6.1.2.tgz", + "integrity": "sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ==", "dev": true, "license": "MIT", "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "@octokit/tsconfig": "^1.0.2", + "@octokit/types": "^9.2.3" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "@octokit/core": ">=4" } }, - "packages/scratch-render/node_modules/gh-pages": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gh-pages/-/gh-pages-1.2.0.tgz", - "integrity": "sha512-cGLYAvxtlQ1iTwAS4g7FreZPXoE/g62Fsxln2mmR19mgs4zZI+XJ+wVVUhBFCF/0+Nmvbq+abyTWue1m1BSnmg==", + "packages/scratch-gui/node_modules/@octokit/plugin-retry": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-4.1.6.tgz", + "integrity": "sha512-obkYzIgEC75r8+9Pnfiiqy3y/x1bc3QLE5B7qvv9wi9Kj0R5tGQFC6QMBg1154WQ9lAVypuQDGyp3hNpp15gQQ==", "dev": true, "license": "MIT", "dependencies": { - "async": "2.6.1", - "commander": "2.15.1", - "filenamify-url": "^1.0.0", - "fs-extra": "^5.0.0", - "globby": "^6.1.0", - "graceful-fs": "4.1.11", - "rimraf": "^2.6.2" - }, - "bin": { - "gh-pages": "bin/gh-pages.js", - "gh-pages-clean": "bin/gh-pages-clean.js" + "@octokit/types": "^9.0.0", + "bottleneck": "^2.15.3" }, "engines": { - "node": ">=4" + "node": ">= 14" + }, + "peerDependencies": { + "@octokit/core": ">=3" } }, - "packages/scratch-render/node_modules/globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==", + "packages/scratch-gui/node_modules/@octokit/plugin-throttling": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-5.2.3.tgz", + "integrity": "sha512-C9CFg9mrf6cugneKiaI841iG8DOv6P5XXkjmiNNut+swePxQ7RWEdAZRp5rJoE1hjsIqiYcKa/ZkOQ+ujPI39Q==", "dev": true, "license": "MIT", "dependencies": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" + "@octokit/types": "^9.0.0", + "bottleneck": "^2.15.3" }, "engines": { - "node": ">=0.10.0" + "node": ">= 14" + }, + "peerDependencies": { + "@octokit/core": "^4.0.0" } }, - "packages/scratch-render/node_modules/graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha512-9x6DLUuW+ROFdMTII9ec9t/FK8va6kYcC8/LggumssLM8kNv7IdFl3VrNUqgir2tJuBVxBga1QBoRziZacO5Zg==", + "packages/scratch-gui/node_modules/@octokit/request": { + "version": "6.2.8", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.8.tgz", + "integrity": "sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw==", "dev": true, - "license": "ISC", + "license": "MIT", + "dependencies": { + "@octokit/endpoint": "^7.0.0", + "@octokit/request-error": "^3.0.0", + "@octokit/types": "^9.0.0", + "is-plain-object": "^5.0.0", + "node-fetch": "^2.6.7", + "universal-user-agent": "^6.0.0" + }, "engines": { - "node": ">=0.4.0" + "node": ">= 14" } }, - "packages/scratch-render/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "packages/scratch-gui/node_modules/@octokit/request-error": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.3.tgz", + "integrity": "sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==", "dev": true, "license": "MIT", - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "dependencies": { + "@octokit/types": "^9.0.0", + "deprecation": "^2.0.0", + "once": "^1.4.0" + }, + "engines": { + "node": ">= 14" } }, - "packages/scratch-render/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "packages/scratch-gui/node_modules/@octokit/types": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz", + "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==", "dev": true, "license": "MIT", - "engines": { - "node": ">=0.10.0" + "dependencies": { + "@octokit/openapi-types": "^18.0.0" } }, - "packages/scratch-render/node_modules/raw-loader": { + "packages/scratch-gui/node_modules/@scratch/scratch-render/node_modules/raw-loader": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-0.5.1.tgz", - "integrity": "sha512-sf7oGoLuaYAScB4VGr0tzetsYlS8EJH6qnTCfQ/WVEa89hALQ4RQfCKt5xCyPQKPDUbVUAIP1QsxAwfAjlDp7Q==" + "integrity": "sha512-sf7oGoLuaYAScB4VGr0tzetsYlS8EJH6qnTCfQ/WVEa89hALQ4RQfCKt5xCyPQKPDUbVUAIP1QsxAwfAjlDp7Q==", + "extraneous": true }, - "packages/scratch-render/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "packages/scratch-gui/node_modules/@semantic-release/commit-analyzer": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/@semantic-release/commit-analyzer/-/commit-analyzer-9.0.2.tgz", + "integrity": "sha512-E+dr6L+xIHZkX4zNMe6Rnwg4YQrWNXK+rNsvwOPpdFppvZO1olE2fIgWhv89TkQErygevbjsZFSIxp+u6w2e5g==", "dev": true, "license": "MIT", + "dependencies": { + "conventional-changelog-angular": "^5.0.0", + "conventional-commits-filter": "^2.0.0", + "conventional-commits-parser": "^3.2.3", + "debug": "^4.0.0", + "import-from": "^4.0.0", + "lodash": "^4.17.4", + "micromatch": "^4.0.2" + }, "engines": { - "node": ">= 4.0.0" + "node": ">=14.17" + }, + "peerDependencies": { + "semantic-release": ">=18.0.0-beta.1" } }, - "packages/scratch-svg-renderer": { - "name": "@scratch/scratch-svg-renderer", - "version": "12.3.1", - "license": "AGPL-3.0-only", + "packages/scratch-gui/node_modules/@semantic-release/github": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-8.1.0.tgz", + "integrity": "sha512-erR9E5rpdsz0dW1I7785JtndQuMWN/iDcemcptf67tBNOmBUN0b2YNOgcjYUnBpgRpZ5ozfBHrK7Bz+2ets/Dg==", + "dev": true, + "license": "MIT", "dependencies": { - "base64-js": "1.5.1", - "base64-loader": "1.0.0", - "css-tree": "1.1.3", - "fastestsmallesttextencoderdecoder": "1.0.22", - "isomorphic-dompurify": "2.26.0", - "transformation-matrix": "1.15.3", - "tslog": "4.10.2" + "@octokit/core": "^4.2.1", + "@octokit/plugin-paginate-rest": "^6.1.2", + "@octokit/plugin-retry": "^4.1.3", + "@octokit/plugin-throttling": "^5.2.3", + "@semantic-release/error": "^3.0.0", + "aggregate-error": "^3.0.0", + "debug": "^4.0.0", + "dir-glob": "^3.0.0", + "fs-extra": "^11.0.0", + "globby": "^11.0.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", + "issue-parser": "^6.0.0", + "lodash": "^4.17.4", + "mime": "^3.0.0", + "p-filter": "^2.0.0", + "url-join": "^4.0.0" }, - "devDependencies": { - "@babel/core": "7.28.6", - "@babel/preset-env": "7.28.6", - "babel-loader": "9.2.1", - "copy-webpack-plugin": "6.4.1", - "eslint": "9.39.2", - "eslint-config-scratch": "12.0.46", - "globals": "16.5.0", - "jsdom": "13.2.0", - "mkdirp": "2.1.6", - "rimraf": "3.0.2", - "scratch-render-fonts": "1.0.252", - "scratch-semantic-release-config": "4.0.0", - "scratch-webpack-configuration": "3.1.0", - "semantic-release": "19.0.5", - "tap": "21.5.0", - "webpack": "5.104.1", - "webpack-cli": "5.1.4", - "webpack-dev-server": "5.2.3", - "xmldom": "0.1.31" + "engines": { + "node": ">=14.17" }, "peerDependencies": { - "scratch-render-fonts": "^1.0.0" + "semantic-release": ">=18.0.0-beta.1" } }, - "packages/scratch-svg-renderer/node_modules/mkdirp": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-2.1.6.tgz", - "integrity": "sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A==", + "packages/scratch-gui/node_modules/@semantic-release/npm": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-9.0.2.tgz", + "integrity": "sha512-zgsynF6McdzxPnFet+a4iO9HpAlARXOM5adz7VGVCvj0ne8wtL2ZOQoDV2wZPDmdEotDIbVeJjafhelZjs9j6g==", "dev": true, "license": "MIT", - "bin": { - "mkdirp": "dist/cjs/src/bin.js" + "dependencies": { + "@semantic-release/error": "^3.0.0", + "aggregate-error": "^3.0.0", + "execa": "^5.0.0", + "fs-extra": "^11.0.0", + "lodash": "^4.17.15", + "nerf-dart": "^1.0.0", + "normalize-url": "^6.0.0", + "npm": "^8.3.0", + "rc": "^1.2.8", + "read-pkg": "^5.0.0", + "registry-auth-token": "^5.0.0", + "semver": "^7.1.2", + "tempy": "^1.0.0" }, "engines": { - "node": ">=10" + "node": ">=16 || ^14.17" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "peerDependencies": { + "semantic-release": ">=19.0.0" } }, - "packages/scratch-svg-renderer/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", + "packages/scratch-gui/node_modules/@semantic-release/release-notes-generator": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/@semantic-release/release-notes-generator/-/release-notes-generator-10.0.3.tgz", + "integrity": "sha512-k4x4VhIKneOWoBGHkx0qZogNjCldLPRiAjnIpMnlUh6PtaWXp/T+C9U7/TaNDDtgDa5HMbHl4WlREdxHio6/3w==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "glob": "^7.1.3" + "conventional-changelog-angular": "^5.0.0", + "conventional-changelog-writer": "^5.0.0", + "conventional-commits-filter": "^2.0.0", + "conventional-commits-parser": "^3.2.3", + "debug": "^4.0.0", + "get-stream": "^6.0.0", + "import-from": "^4.0.0", + "into-stream": "^6.0.0", + "lodash": "^4.17.4", + "read-pkg-up": "^7.0.0" }, - "bin": { - "rimraf": "bin.js" + "engines": { + "node": ">=14.17" + }, + "peerDependencies": { + "semantic-release": ">=18.0.0-beta.1" + } + }, + "packages/scratch-gui/node_modules/ansi-escapes": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.1.tgz", + "integrity": "sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "packages/scratch-vm": { - "name": "@scratch/scratch-vm", - "version": "12.3.1", - "license": "AGPL-3.0-only", + "packages/scratch-gui/node_modules/before-after-hook": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", + "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", + "dev": true, + "license": "Apache-2.0" + }, + "packages/scratch-gui/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" + } + }, + "packages/scratch-gui/node_modules/conventional-changelog-angular": { + "version": "5.0.13", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz", + "integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==", + "dev": true, + "license": "ISC", + "dependencies": { + "compare-func": "^2.0.0", + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "packages/scratch-gui/node_modules/conventional-changelog-writer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-5.0.1.tgz", + "integrity": "sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "conventional-commits-filter": "^2.0.7", + "dateformat": "^3.0.0", + "handlebars": "^4.7.7", + "json-stringify-safe": "^5.0.1", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "semver": "^6.0.0", + "split": "^1.0.0", + "through2": "^4.0.0" + }, + "bin": { + "conventional-changelog-writer": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "packages/scratch-gui/node_modules/conventional-changelog-writer/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": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "packages/scratch-gui/node_modules/conventional-commits-filter": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz", + "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash.ismatch": "^4.4.0", + "modify-values": "^1.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "packages/scratch-gui/node_modules/conventional-commits-parser": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz", + "integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-text-path": "^1.0.1", + "JSONStream": "^1.0.4", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0" + }, + "bin": { + "conventional-commits-parser": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "packages/scratch-gui/node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "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" + }, + "engines": { + "node": ">=10" + } + }, + "packages/scratch-gui/node_modules/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "packages/scratch-gui/node_modules/env-ci": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/env-ci/-/env-ci-5.5.0.tgz", + "integrity": "sha512-o0JdWIbOLP+WJKIUt36hz1ImQQFuN92nhsfTkHHap+J8CiI8WgGpH/a9jEGHh4/TU5BUUGjlnKXNoDb57+ne+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^5.0.0", + "fromentries": "^1.3.2", + "java-properties": "^1.0.0" + }, + "engines": { + "node": ">=10.17" + } + }, + "packages/scratch-gui/node_modules/find-versions": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-4.0.0.tgz", + "integrity": "sha512-wgpWy002tA+wgmO27buH/9KzyEOQnKsG/R0yrcjPT9BOFm0zRBVQbZ95nRGXWMywS8YR5knRbpohio0bcJABxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver-regex": "^3.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/scratch-gui/node_modules/hook-std": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hook-std/-/hook-std-2.0.0.tgz", + "integrity": "sha512-zZ6T5WcuBMIUVh49iPQS9t977t7C0l7OtHrpeMb5uk48JdflRX0NSFvCekfYNmGQETnLq9W/isMyHl69kxGi8g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "packages/scratch-gui/node_modules/into-stream": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-6.0.0.tgz", + "integrity": "sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "from2": "^2.3.0", + "p-is-promise": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/scratch-gui/node_modules/issue-parser": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-6.0.0.tgz", + "integrity": "sha512-zKa/Dxq2lGsBIXQ7CUZWTHfvxPC2ej0KfO7fIPqLlHB9J2hJ7rGhZ5rilhuufylr4RXYPzJUeFjKxz305OsNlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash.capitalize": "^4.2.1", + "lodash.escaperegexp": "^4.1.2", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.uniqby": "^4.7.0" + }, + "engines": { + "node": ">=10.13" + } + }, + "packages/scratch-gui/node_modules/marked-terminal": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-5.2.0.tgz", + "integrity": "sha512-Piv6yNwAQXGFjZSaiNljyNFw7jKDdGrw70FSbtxEyldLsyeuV5ZHm/1wW++kWbrOF1VPnUgYOhB2oLL0ZpnekA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^6.2.0", + "cardinal": "^2.1.1", + "chalk": "^5.2.0", + "cli-table3": "^0.6.3", + "node-emoji": "^1.11.0", + "supports-hyperlinks": "^2.3.0" + }, + "engines": { + "node": ">=14.13.1 || >=16.0.0" + }, + "peerDependencies": { + "marked": "^1.0.0 || ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0" + } + }, + "packages/scratch-gui/node_modules/marked-terminal/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" + } + }, + "packages/scratch-gui/node_modules/mime": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "packages/scratch-gui/node_modules/node-emoji": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", + "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4.17.21" + } + }, + "packages/scratch-gui/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" + } + }, + "packages/scratch-gui/node_modules/npm": { + "version": "8.19.4", + "resolved": "https://registry.npmjs.org/npm/-/npm-8.19.4.tgz", + "integrity": "sha512-3HANl8i9DKnUA89P4KEgVNN28EjSeDCmvEqbzOAuxCFDzdBZzjUl99zgnGpOUumvW5lvJo2HKcjrsc+tfyv1Hw==", + "bundleDependencies": [ + "@isaacs/string-locale-compare", + "@npmcli/arborist", + "@npmcli/ci-detect", + "@npmcli/config", + "@npmcli/fs", + "@npmcli/map-workspaces", + "@npmcli/package-json", + "@npmcli/run-script", + "abbrev", + "archy", + "cacache", + "chalk", + "chownr", + "cli-columns", + "cli-table3", + "columnify", + "fastest-levenshtein", + "fs-minipass", + "glob", + "graceful-fs", + "hosted-git-info", + "ini", + "init-package-json", + "is-cidr", + "json-parse-even-better-errors", + "libnpmaccess", + "libnpmdiff", + "libnpmexec", + "libnpmfund", + "libnpmhook", + "libnpmorg", + "libnpmpack", + "libnpmpublish", + "libnpmsearch", + "libnpmteam", + "libnpmversion", + "make-fetch-happen", + "minimatch", + "minipass", + "minipass-pipeline", + "mkdirp", + "mkdirp-infer-owner", + "ms", + "node-gyp", + "nopt", + "npm-audit-report", + "npm-install-checks", + "npm-package-arg", + "npm-pick-manifest", + "npm-profile", + "npm-registry-fetch", + "npm-user-validate", + "npmlog", + "opener", + "p-map", + "pacote", + "parse-conflict-json", + "proc-log", + "qrcode-terminal", + "read", + "read-package-json", + "read-package-json-fast", + "readdir-scoped-modules", + "rimraf", + "semver", + "ssri", + "tar", + "text-table", + "tiny-relative-date", + "treeverse", + "validate-npm-package-name", + "which", + "write-file-atomic" + ], + "dev": true, + "license": "Artistic-2.0", + "workspaces": [ + "docs", + "smoke-tests", + "workspaces/*" + ], + "dependencies": { + "@isaacs/string-locale-compare": "^1.1.0", + "@npmcli/arborist": "^5.6.3", + "@npmcli/ci-detect": "^2.0.0", + "@npmcli/config": "^4.2.1", + "@npmcli/fs": "^2.1.0", + "@npmcli/map-workspaces": "^2.0.3", + "@npmcli/package-json": "^2.0.0", + "@npmcli/run-script": "^4.2.1", + "abbrev": "~1.1.1", + "archy": "~1.0.0", + "cacache": "^16.1.3", + "chalk": "^4.1.2", + "chownr": "^2.0.0", + "cli-columns": "^4.0.0", + "cli-table3": "^0.6.2", + "columnify": "^1.6.0", + "fastest-levenshtein": "^1.0.12", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "graceful-fs": "^4.2.10", + "hosted-git-info": "^5.2.1", + "ini": "^3.0.1", + "init-package-json": "^3.0.2", + "is-cidr": "^4.0.2", + "json-parse-even-better-errors": "^2.3.1", + "libnpmaccess": "^6.0.4", + "libnpmdiff": "^4.0.5", + "libnpmexec": "^4.0.14", + "libnpmfund": "^3.0.5", + "libnpmhook": "^8.0.4", + "libnpmorg": "^4.0.4", + "libnpmpack": "^4.1.3", + "libnpmpublish": "^6.0.5", + "libnpmsearch": "^5.0.4", + "libnpmteam": "^4.0.4", + "libnpmversion": "^3.0.7", + "make-fetch-happen": "^10.2.0", + "minimatch": "^5.1.0", + "minipass": "^3.1.6", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "mkdirp-infer-owner": "^2.0.0", + "ms": "^2.1.2", + "node-gyp": "^9.1.0", + "nopt": "^6.0.0", + "npm-audit-report": "^3.0.0", + "npm-install-checks": "^5.0.0", + "npm-package-arg": "^9.1.0", + "npm-pick-manifest": "^7.0.2", + "npm-profile": "^6.2.0", + "npm-registry-fetch": "^13.3.1", + "npm-user-validate": "^1.0.1", + "npmlog": "^6.0.2", + "opener": "^1.5.2", + "p-map": "^4.0.0", + "pacote": "^13.6.2", + "parse-conflict-json": "^2.0.2", + "proc-log": "^2.0.1", + "qrcode-terminal": "^0.12.0", + "read": "~1.0.7", + "read-package-json": "^5.0.2", + "read-package-json-fast": "^2.0.3", + "readdir-scoped-modules": "^1.1.0", + "rimraf": "^3.0.2", + "semver": "^7.3.7", + "ssri": "^9.0.1", + "tar": "^6.1.11", + "text-table": "~0.2.0", + "tiny-relative-date": "^1.3.0", + "treeverse": "^2.0.0", + "validate-npm-package-name": "^4.0.0", + "which": "^2.0.2", + "write-file-atomic": "^4.0.1" + }, + "bin": { + "npm": "bin/npm-cli.js", + "npx": "bin/npx-cli.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/@colors/colors": { + "version": "1.5.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/@gar/promisify": { + "version": "1.1.3", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-gui/node_modules/npm/node_modules/@isaacs/string-locale-compare": { + "version": "1.1.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-gui/node_modules/npm/node_modules/@npmcli/arborist": { + "version": "5.6.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@isaacs/string-locale-compare": "^1.1.0", + "@npmcli/installed-package-contents": "^1.0.7", + "@npmcli/map-workspaces": "^2.0.3", + "@npmcli/metavuln-calculator": "^3.0.1", + "@npmcli/move-file": "^2.0.0", + "@npmcli/name-from-folder": "^1.0.1", + "@npmcli/node-gyp": "^2.0.0", + "@npmcli/package-json": "^2.0.0", + "@npmcli/query": "^1.2.0", + "@npmcli/run-script": "^4.1.3", + "bin-links": "^3.0.3", + "cacache": "^16.1.3", + "common-ancestor-path": "^1.0.1", + "hosted-git-info": "^5.2.1", + "json-parse-even-better-errors": "^2.3.1", + "json-stringify-nice": "^1.1.4", + "minimatch": "^5.1.0", + "mkdirp": "^1.0.4", + "mkdirp-infer-owner": "^2.0.0", + "nopt": "^6.0.0", + "npm-install-checks": "^5.0.0", + "npm-package-arg": "^9.0.0", + "npm-pick-manifest": "^7.0.2", + "npm-registry-fetch": "^13.0.0", + "npmlog": "^6.0.2", + "pacote": "^13.6.1", + "parse-conflict-json": "^2.0.1", + "proc-log": "^2.0.0", + "promise-all-reject-late": "^1.0.0", + "promise-call-limit": "^1.0.1", + "read-package-json-fast": "^2.0.2", + "readdir-scoped-modules": "^1.1.0", + "rimraf": "^3.0.2", + "semver": "^7.3.7", + "ssri": "^9.0.0", + "treeverse": "^2.0.0", + "walk-up-path": "^1.0.0" + }, + "bin": { + "arborist": "bin/index.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/@npmcli/ci-detect": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/@npmcli/config": { + "version": "4.2.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/map-workspaces": "^2.0.2", + "ini": "^3.0.0", + "mkdirp-infer-owner": "^2.0.0", + "nopt": "^6.0.0", + "proc-log": "^2.0.0", + "read-package-json-fast": "^2.0.3", + "semver": "^7.3.5", + "walk-up-path": "^1.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/@npmcli/disparity-colors": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "ansi-styles": "^4.3.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/@npmcli/fs": { + "version": "2.1.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/@npmcli/git": { + "version": "3.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/promise-spawn": "^3.0.0", + "lru-cache": "^7.4.4", + "mkdirp": "^1.0.4", + "npm-pick-manifest": "^7.0.0", + "proc-log": "^2.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^2.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/@npmcli/installed-package-contents": { + "version": "1.0.7", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-bundled": "^1.1.1", + "npm-normalize-package-bin": "^1.0.1" + }, + "bin": { + "installed-package-contents": "index.js" + }, + "engines": { + "node": ">= 10" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/@npmcli/installed-package-contents/node_modules/npm-bundled": { + "version": "1.1.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/@npmcli/map-workspaces": { + "version": "2.0.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/name-from-folder": "^1.0.1", + "glob": "^8.0.1", + "minimatch": "^5.0.1", + "read-package-json-fast": "^2.0.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/@npmcli/metavuln-calculator": { + "version": "3.1.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "cacache": "^16.0.0", + "json-parse-even-better-errors": "^2.3.1", + "pacote": "^13.0.3", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/@npmcli/move-file": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/@npmcli/name-from-folder": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-gui/node_modules/npm/node_modules/@npmcli/node-gyp": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/@npmcli/package-json": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "json-parse-even-better-errors": "^2.3.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/@npmcli/promise-spawn": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "infer-owner": "^1.0.4" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/@npmcli/query": { + "version": "1.2.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-package-arg": "^9.1.0", + "postcss-selector-parser": "^6.0.10", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/@npmcli/run-script": { + "version": "4.2.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/node-gyp": "^2.0.0", + "@npmcli/promise-spawn": "^3.0.0", + "node-gyp": "^9.0.0", + "read-package-json-fast": "^2.0.3", + "which": "^2.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/@tootallnate/once": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/abbrev": { + "version": "1.1.1", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-gui/node_modules/npm/node_modules/agent-base": { + "version": "6.0.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/agentkeepalive": { + "version": "4.2.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "depd": "^1.1.2", + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/aggregate-error": { + "version": "3.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/ansi-regex": { + "version": "5.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/aproba": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-gui/node_modules/npm/node_modules/archy": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-gui/node_modules/npm/node_modules/are-we-there-yet": { + "version": "3.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/asap": { + "version": "2.0.6", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-gui/node_modules/npm/node_modules/balanced-match": { + "version": "1.0.2", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-gui/node_modules/npm/node_modules/bin-links": { + "version": "3.0.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "cmd-shim": "^5.0.0", + "mkdirp-infer-owner": "^2.0.0", + "npm-normalize-package-bin": "^2.0.0", + "read-cmd-shim": "^3.0.0", + "rimraf": "^3.0.0", + "write-file-atomic": "^4.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/bin-links/node_modules/npm-normalize-package-bin": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/binary-extensions": { + "version": "2.2.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/brace-expansion": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/builtins": { + "version": "5.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "semver": "^7.0.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/cacache": { + "version": "16.1.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "inBundle": 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" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/chownr": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/cidr-regex": { + "version": "3.1.1", + "dev": true, + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "ip-regex": "^4.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/clean-stack": { + "version": "2.2.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/cli-columns": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/cli-table3": { + "version": "0.6.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/clone": { + "version": "1.0.4", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/cmd-shim": { + "version": "5.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "mkdirp-infer-owner": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-gui/node_modules/npm/node_modules/color-support": { + "version": "1.1.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "bin": { + "color-support": "bin.js" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/columnify": { + "version": "1.6.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "strip-ansi": "^6.0.1", + "wcwidth": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/common-ancestor-path": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-gui/node_modules/npm/node_modules/concat-map": { + "version": "0.0.1", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-gui/node_modules/npm/node_modules/console-control-strings": { + "version": "1.1.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-gui/node_modules/npm/node_modules/cssesc": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/debug": { + "version": "4.3.4", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/debug/node_modules/ms": { + "version": "2.1.2", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-gui/node_modules/npm/node_modules/debuglog": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/defaults": { + "version": "1.0.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "clone": "^1.0.2" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/delegates": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-gui/node_modules/npm/node_modules/depd": { + "version": "1.1.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/dezalgo": { + "version": "1.0.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/diff": { + "version": "5.1.0", + "dev": true, + "inBundle": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-gui/node_modules/npm/node_modules/encoding": { + "version": "0.1.13", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/env-paths": { + "version": "2.2.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/err-code": { + "version": "2.0.3", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-gui/node_modules/npm/node_modules/fastest-levenshtein": { + "version": "1.0.12", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-gui/node_modules/npm/node_modules/fs-minipass": { + "version": "2.1.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/fs.realpath": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-gui/node_modules/npm/node_modules/function-bind": { + "version": "1.1.1", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-gui/node_modules/npm/node_modules/gauge": { + "version": "4.0.4", + "dev": true, + "inBundle": 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": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/glob": { + "version": "8.0.3", + "dev": true, + "inBundle": 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" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/graceful-fs": { + "version": "4.2.10", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-gui/node_modules/npm/node_modules/has": { + "version": "1.0.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/has-unicode": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-gui/node_modules/npm/node_modules/hosted-git-info": { + "version": "5.2.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^7.5.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/http-cache-semantics": { + "version": "4.1.1", + "dev": true, + "inBundle": true, + "license": "BSD-2-Clause" + }, + "packages/scratch-gui/node_modules/npm/node_modules/http-proxy-agent": { + "version": "5.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/https-proxy-agent": { + "version": "5.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/humanize-ms": { + "version": "1.2.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ms": "^2.0.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/iconv-lite": { + "version": "0.6.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/ignore-walk": { + "version": "5.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minimatch": "^5.0.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/imurmurhash": { + "version": "0.1.4", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/indent-string": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/infer-owner": { + "version": "1.0.4", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-gui/node_modules/npm/node_modules/inflight": { + "version": "1.0.6", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/inherits": { + "version": "2.0.4", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-gui/node_modules/npm/node_modules/ini": { + "version": "3.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/init-package-json": { + "version": "3.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-package-arg": "^9.0.1", + "promzard": "^0.3.0", + "read": "^1.0.7", + "read-package-json": "^5.0.0", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4", + "validate-npm-package-name": "^4.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/ip": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-gui/node_modules/npm/node_modules/ip-regex": { + "version": "4.3.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/is-cidr": { + "version": "4.0.2", + "dev": true, + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "cidr-regex": "^3.1.1" + }, + "engines": { + "node": ">=10" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/is-core-module": { + "version": "2.10.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/is-lambda": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-gui/node_modules/npm/node_modules/isexe": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-gui/node_modules/npm/node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-gui/node_modules/npm/node_modules/json-stringify-nice": { + "version": "1.1.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/jsonparse": { + "version": "1.3.1", + "dev": true, + "engines": [ + "node >= 0.2.0" + ], + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-gui/node_modules/npm/node_modules/just-diff": { + "version": "5.1.1", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-gui/node_modules/npm/node_modules/just-diff-apply": { + "version": "5.4.1", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-gui/node_modules/npm/node_modules/libnpmaccess": { + "version": "6.0.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^2.0.0", + "minipass": "^3.1.1", + "npm-package-arg": "^9.0.1", + "npm-registry-fetch": "^13.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/libnpmdiff": { + "version": "4.0.5", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/disparity-colors": "^2.0.0", + "@npmcli/installed-package-contents": "^1.0.7", + "binary-extensions": "^2.2.0", + "diff": "^5.1.0", + "minimatch": "^5.0.1", + "npm-package-arg": "^9.0.1", + "pacote": "^13.6.1", + "tar": "^6.1.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/libnpmexec": { + "version": "4.0.14", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/arborist": "^5.6.3", + "@npmcli/ci-detect": "^2.0.0", + "@npmcli/fs": "^2.1.1", + "@npmcli/run-script": "^4.2.0", + "chalk": "^4.1.0", + "mkdirp-infer-owner": "^2.0.0", + "npm-package-arg": "^9.0.1", + "npmlog": "^6.0.2", + "pacote": "^13.6.1", + "proc-log": "^2.0.0", + "read": "^1.0.7", + "read-package-json-fast": "^2.0.2", + "semver": "^7.3.7", + "walk-up-path": "^1.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/libnpmfund": { + "version": "3.0.5", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/arborist": "^5.6.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/libnpmhook": { + "version": "8.0.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^2.0.0", + "npm-registry-fetch": "^13.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/libnpmorg": { + "version": "4.0.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^2.0.0", + "npm-registry-fetch": "^13.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/libnpmpack": { + "version": "4.1.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/run-script": "^4.1.3", + "npm-package-arg": "^9.0.1", + "pacote": "^13.6.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/libnpmpublish": { + "version": "6.0.5", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "normalize-package-data": "^4.0.0", + "npm-package-arg": "^9.0.1", + "npm-registry-fetch": "^13.0.0", + "semver": "^7.3.7", + "ssri": "^9.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/libnpmsearch": { + "version": "5.0.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-registry-fetch": "^13.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/libnpmteam": { + "version": "4.0.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^2.0.0", + "npm-registry-fetch": "^13.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/libnpmversion": { + "version": "3.0.7", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^3.0.0", + "@npmcli/run-script": "^4.1.3", + "json-parse-even-better-errors": "^2.3.1", + "proc-log": "^2.0.0", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/lru-cache": { + "version": "7.13.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/make-fetch-happen": { + "version": "10.2.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^16.1.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^2.0.3", + "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": "^9.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/minimatch": { + "version": "5.1.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/minipass": { + "version": "3.3.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/minipass-collect": { + "version": "1.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/minipass-fetch": { + "version": "2.1.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/minipass-flush": { + "version": "1.0.5", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/minipass-json-stream": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "jsonparse": "^1.3.1", + "minipass": "^3.0.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/minipass-pipeline": { + "version": "1.2.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/minipass-sized": { + "version": "1.0.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/minizlib": { + "version": "2.1.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/mkdirp": { + "version": "1.0.4", + "dev": true, + "inBundle": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/mkdirp-infer-owner": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "infer-owner": "^1.0.4", + "mkdirp": "^1.0.3" + }, + "engines": { + "node": ">=10" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/ms": { + "version": "2.1.3", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-gui/node_modules/npm/node_modules/mute-stream": { + "version": "0.0.8", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-gui/node_modules/npm/node_modules/negotiator": { + "version": "0.6.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/node-gyp": { + "version": "9.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^10.0.3", + "nopt": "^5.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.22 || ^14.13 || >=16" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/node-gyp/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/node-gyp/node_modules/glob": { + "version": "7.2.3", + "dev": true, + "inBundle": 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" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/node-gyp/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/node-gyp/node_modules/nopt": { + "version": "5.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/nopt": { + "version": "6.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "abbrev": "^1.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/normalize-package-data": { + "version": "4.0.1", + "dev": true, + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^5.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/npm-audit-report": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "chalk": "^4.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/npm-bundled": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-normalize-package-bin": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/npm-bundled/node_modules/npm-normalize-package-bin": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/npm-install-checks": { + "version": "5.0.0", + "dev": true, + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "semver": "^7.1.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/npm-normalize-package-bin": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-gui/node_modules/npm/node_modules/npm-package-arg": { + "version": "9.1.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "hosted-git-info": "^5.0.0", + "proc-log": "^2.0.1", + "semver": "^7.3.5", + "validate-npm-package-name": "^4.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/npm-packlist": { + "version": "5.1.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "glob": "^8.0.1", + "ignore-walk": "^5.0.1", + "npm-bundled": "^2.0.0", + "npm-normalize-package-bin": "^2.0.0" + }, + "bin": { + "npm-packlist": "bin/index.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/npm-packlist/node_modules/npm-normalize-package-bin": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/npm-pick-manifest": { + "version": "7.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-install-checks": "^5.0.0", + "npm-normalize-package-bin": "^2.0.0", + "npm-package-arg": "^9.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/npm-pick-manifest/node_modules/npm-normalize-package-bin": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/npm-profile": { + "version": "6.2.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-registry-fetch": "^13.0.1", + "proc-log": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/npm-registry-fetch": { + "version": "13.3.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "make-fetch-happen": "^10.0.6", + "minipass": "^3.1.6", + "minipass-fetch": "^2.0.3", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.1.2", + "npm-package-arg": "^9.0.1", + "proc-log": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/npm-user-validate": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "BSD-2-Clause" + }, + "packages/scratch-gui/node_modules/npm/node_modules/npmlog": { + "version": "6.0.2", + "dev": true, + "inBundle": 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" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/once": { + "version": "1.4.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/opener": { + "version": "1.5.2", + "dev": true, + "inBundle": true, + "license": "(WTFPL OR MIT)", + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/p-map": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/pacote": { + "version": "13.6.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^3.0.0", + "@npmcli/installed-package-contents": "^1.0.7", + "@npmcli/promise-spawn": "^3.0.0", + "@npmcli/run-script": "^4.1.0", + "cacache": "^16.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "infer-owner": "^1.0.4", + "minipass": "^3.1.6", + "mkdirp": "^1.0.4", + "npm-package-arg": "^9.0.0", + "npm-packlist": "^5.1.0", + "npm-pick-manifest": "^7.0.0", + "npm-registry-fetch": "^13.0.1", + "proc-log": "^2.0.0", + "promise-retry": "^2.0.1", + "read-package-json": "^5.0.0", + "read-package-json-fast": "^2.0.3", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11" + }, + "bin": { + "pacote": "lib/bin.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/parse-conflict-json": { + "version": "2.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "json-parse-even-better-errors": "^2.3.1", + "just-diff": "^5.0.1", + "just-diff-apply": "^5.2.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/path-is-absolute": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/postcss-selector-parser": { + "version": "6.0.10", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/proc-log": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/promise-all-reject-late": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/promise-call-limit": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/promise-inflight": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-gui/node_modules/npm/node_modules/promise-retry": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/promzard": { + "version": "0.3.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "read": "1" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/qrcode-terminal": { + "version": "0.12.0", + "dev": true, + "inBundle": true, + "bin": { + "qrcode-terminal": "bin/qrcode-terminal.js" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/read": { + "version": "1.0.7", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "mute-stream": "~0.0.4" + }, + "engines": { + "node": ">=0.8" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/read-cmd-shim": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/read-package-json": { + "version": "5.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "glob": "^8.0.1", + "json-parse-even-better-errors": "^2.3.1", + "normalize-package-data": "^4.0.0", + "npm-normalize-package-bin": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/read-package-json-fast": { + "version": "2.0.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "json-parse-even-better-errors": "^2.3.0", + "npm-normalize-package-bin": "^1.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/read-package-json/node_modules/npm-normalize-package-bin": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/readable-stream": { + "version": "3.6.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/readdir-scoped-modules": { + "version": "1.1.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "graceful-fs": "^4.1.2", + "once": "^1.3.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/retry": { + "version": "0.12.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/rimraf": { + "version": "3.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/rimraf/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "dev": true, + "inBundle": 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" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/rimraf/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/safe-buffer": { + "version": "5.2.1", + "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" + } + ], + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-gui/node_modules/npm/node_modules/safer-buffer": { + "version": "2.1.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true + }, + "packages/scratch-gui/node_modules/npm/node_modules/semver": { + "version": "7.3.7", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/set-blocking": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-gui/node_modules/npm/node_modules/signal-exit": { + "version": "3.0.7", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-gui/node_modules/npm/node_modules/smart-buffer": { + "version": "4.2.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/socks": { + "version": "2.7.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/socks-proxy-agent": { + "version": "7.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + }, + "engines": { + "node": ">= 10" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/spdx-correct": { + "version": "3.1.1", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/spdx-exceptions": { + "version": "2.3.0", + "dev": true, + "inBundle": true, + "license": "CC-BY-3.0" + }, + "packages/scratch-gui/node_modules/npm/node_modules/spdx-expression-parse": { + "version": "3.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/spdx-license-ids": { + "version": "3.0.11", + "dev": true, + "inBundle": true, + "license": "CC0-1.0" + }, + "packages/scratch-gui/node_modules/npm/node_modules/ssri": { + "version": "9.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/string_decoder": { + "version": "1.3.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/strip-ansi": { + "version": "6.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/tar": { + "version": "6.1.11", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/text-table": { + "version": "0.2.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-gui/node_modules/npm/node_modules/tiny-relative-date": { + "version": "1.3.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-gui/node_modules/npm/node_modules/treeverse": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/unique-filename": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "unique-slug": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/unique-slug": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/util-deprecate": { + "version": "1.0.2", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-gui/node_modules/npm/node_modules/validate-npm-package-license": { + "version": "3.0.4", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/validate-npm-package-name": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "builtins": "^5.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/walk-up-path": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-gui/node_modules/npm/node_modules/wcwidth": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/which": { + "version": "2.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/wide-align": { + "version": "1.1.5", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/wrappy": { + "version": "1.0.2", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-gui/node_modules/npm/node_modules/write-file-atomic": { + "version": "4.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-gui/node_modules/npm/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-gui/node_modules/p-each-series": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", + "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/scratch-gui/node_modules/p-filter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz", + "integrity": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-map": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "packages/scratch-gui/node_modules/p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "packages/scratch-gui/node_modules/semantic-release": { + "version": "19.0.5", + "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-19.0.5.tgz", + "integrity": "sha512-NMPKdfpXTnPn49FDogMBi36SiBfXkSOJqCkk0E4iWOY1tusvvgBwqUmxTX1kmlT6kIYed9YwNKD1sfPpqa5yaA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@semantic-release/commit-analyzer": "^9.0.2", + "@semantic-release/error": "^3.0.0", + "@semantic-release/github": "^8.0.0", + "@semantic-release/npm": "^9.0.0", + "@semantic-release/release-notes-generator": "^10.0.0", + "aggregate-error": "^3.0.0", + "cosmiconfig": "^7.0.0", + "debug": "^4.0.0", + "env-ci": "^5.0.0", + "execa": "^5.0.0", + "figures": "^3.0.0", + "find-versions": "^4.0.0", + "get-stream": "^6.0.0", + "git-log-parser": "^1.2.0", + "hook-std": "^2.0.0", + "hosted-git-info": "^4.0.0", + "lodash": "^4.17.21", + "marked": "^4.0.10", + "marked-terminal": "^5.0.0", + "micromatch": "^4.0.2", + "p-each-series": "^2.1.0", + "p-reduce": "^2.0.0", + "read-pkg-up": "^7.0.0", + "resolve-from": "^5.0.0", + "semver": "^7.3.2", + "semver-diff": "^3.1.1", + "signale": "^1.2.1", + "yargs": "^16.2.0" + }, + "bin": { + "semantic-release": "bin/semantic-release.js" + }, + "engines": { + "node": ">=16 || ^14.17" + } + }, + "packages/scratch-gui/node_modules/semver-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "packages/scratch-gui/node_modules/semver-diff/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": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "packages/scratch-gui/node_modules/semver-regex": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-3.1.4.tgz", + "integrity": "sha512-6IiqeZNgq01qGf0TId0t3NvKzSvUsjcpdEO3AQNeIjR6A2+ckTnQlDpl4qu1bjRv0RzN3FP9hzFmws3lKqRWkA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/scratch-gui/node_modules/supports-hyperlinks": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "packages/scratch-gui/node_modules/temp-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "packages/scratch-gui/node_modules/tempy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-1.0.1.tgz", + "integrity": "sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "del": "^6.0.0", + "is-stream": "^2.0.0", + "temp-dir": "^2.0.0", + "type-fest": "^0.16.0", + "unique-string": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/scratch-gui/node_modules/type-fest": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", + "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/scratch-gui/node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "packages/scratch-gui/node_modules/universal-user-agent": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", + "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==", + "dev": true, + "license": "ISC" + }, + "packages/scratch-gui/node_modules/url-join": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", + "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", + "dev": true, + "license": "MIT" + }, + "packages/scratch-gui/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "packages/scratch-gui/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "packages/scratch-render": { + "name": "@scratch/scratch-render", + "version": "12.3.1", + "license": "AGPL-3.0-only", + "dependencies": { + "@scratch/scratch-svg-renderer": "12.3.1", + "grapheme-breaker": "0.3.2", + "hull.js": "0.2.10", + "ify-loader": "1.1.0", + "linebreak": "0.3.0", + "raw-loader": "0.5.1", + "tslog": "4.10.2", + "twgl.js": "4.24.0" + }, + "devDependencies": { + "@babel/core": "7.28.6", + "@babel/polyfill": "7.12.1", + "@babel/preset-env": "7.28.6", + "@scratch/scratch-vm": "12.3.1", + "babel-loader": "9.2.1", + "copy-webpack-plugin": "6.4.1", + "docdash": "0.4.0", + "eslint": "9.39.2", + "eslint-config-scratch": "12.0.46", + "gh-pages": "1.2.0", + "globals": "16.5.0", + "html-webpack-plugin": "5.6.6", + "jsdoc": "3.6.11", + "playwright-chromium": "1.57.0", + "scratch-render-fonts": "1.0.252", + "scratch-semantic-release-config": "4.0.1", + "scratch-storage": "5.0.10", + "scratch-webpack-configuration": "3.1.0", + "semantic-release": "19.0.5", + "tap": "21.5.0", + "terser-webpack-plugin": "5.3.16", + "webpack": "5.104.1", + "webpack-cli": "5.1.4", + "webpack-dev-server": "5.2.3" + }, + "peerDependencies": { + "scratch-render-fonts": "^1.0.0" + } + }, + "packages/scratch-render/node_modules/@octokit/auth-token": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.4.tgz", + "integrity": "sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "packages/scratch-render/node_modules/@octokit/core": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.2.4.tgz", + "integrity": "sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/auth-token": "^3.0.0", + "@octokit/graphql": "^5.0.0", + "@octokit/request": "^6.0.0", + "@octokit/request-error": "^3.0.0", + "@octokit/types": "^9.0.0", + "before-after-hook": "^2.2.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "packages/scratch-render/node_modules/@octokit/endpoint": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.6.tgz", + "integrity": "sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/types": "^9.0.0", + "is-plain-object": "^5.0.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "packages/scratch-render/node_modules/@octokit/graphql": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.6.tgz", + "integrity": "sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/request": "^6.0.0", + "@octokit/types": "^9.0.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "packages/scratch-render/node_modules/@octokit/openapi-types": { + "version": "18.1.1", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.1.1.tgz", + "integrity": "sha512-VRaeH8nCDtF5aXWnjPuEMIYf1itK/s3JYyJcWFJT8X9pSNnBtriDf7wlEWsGuhPLl4QIH4xM8fqTXDwJ3Mu6sw==", + "dev": true, + "license": "MIT" + }, + "packages/scratch-render/node_modules/@octokit/plugin-paginate-rest": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-6.1.2.tgz", + "integrity": "sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/tsconfig": "^1.0.2", + "@octokit/types": "^9.2.3" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "@octokit/core": ">=4" + } + }, + "packages/scratch-render/node_modules/@octokit/plugin-retry": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-4.1.6.tgz", + "integrity": "sha512-obkYzIgEC75r8+9Pnfiiqy3y/x1bc3QLE5B7qvv9wi9Kj0R5tGQFC6QMBg1154WQ9lAVypuQDGyp3hNpp15gQQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/types": "^9.0.0", + "bottleneck": "^2.15.3" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "@octokit/core": ">=3" + } + }, + "packages/scratch-render/node_modules/@octokit/plugin-throttling": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-5.2.3.tgz", + "integrity": "sha512-C9CFg9mrf6cugneKiaI841iG8DOv6P5XXkjmiNNut+swePxQ7RWEdAZRp5rJoE1hjsIqiYcKa/ZkOQ+ujPI39Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/types": "^9.0.0", + "bottleneck": "^2.15.3" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "@octokit/core": "^4.0.0" + } + }, + "packages/scratch-render/node_modules/@octokit/request": { + "version": "6.2.8", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.8.tgz", + "integrity": "sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/endpoint": "^7.0.0", + "@octokit/request-error": "^3.0.0", + "@octokit/types": "^9.0.0", + "is-plain-object": "^5.0.0", + "node-fetch": "^2.6.7", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "packages/scratch-render/node_modules/@octokit/request-error": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.3.tgz", + "integrity": "sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/types": "^9.0.0", + "deprecation": "^2.0.0", + "once": "^1.4.0" + }, + "engines": { + "node": ">= 14" + } + }, + "packages/scratch-render/node_modules/@octokit/types": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz", + "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^18.0.0" + } + }, + "packages/scratch-render/node_modules/@semantic-release/commit-analyzer": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/@semantic-release/commit-analyzer/-/commit-analyzer-9.0.2.tgz", + "integrity": "sha512-E+dr6L+xIHZkX4zNMe6Rnwg4YQrWNXK+rNsvwOPpdFppvZO1olE2fIgWhv89TkQErygevbjsZFSIxp+u6w2e5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "conventional-changelog-angular": "^5.0.0", + "conventional-commits-filter": "^2.0.0", + "conventional-commits-parser": "^3.2.3", + "debug": "^4.0.0", + "import-from": "^4.0.0", + "lodash": "^4.17.4", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=14.17" + }, + "peerDependencies": { + "semantic-release": ">=18.0.0-beta.1" + } + }, + "packages/scratch-render/node_modules/@semantic-release/github": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-8.1.0.tgz", + "integrity": "sha512-erR9E5rpdsz0dW1I7785JtndQuMWN/iDcemcptf67tBNOmBUN0b2YNOgcjYUnBpgRpZ5ozfBHrK7Bz+2ets/Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/core": "^4.2.1", + "@octokit/plugin-paginate-rest": "^6.1.2", + "@octokit/plugin-retry": "^4.1.3", + "@octokit/plugin-throttling": "^5.2.3", + "@semantic-release/error": "^3.0.0", + "aggregate-error": "^3.0.0", + "debug": "^4.0.0", + "dir-glob": "^3.0.0", + "fs-extra": "^11.0.0", + "globby": "^11.0.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", + "issue-parser": "^6.0.0", + "lodash": "^4.17.4", + "mime": "^3.0.0", + "p-filter": "^2.0.0", + "url-join": "^4.0.0" + }, + "engines": { + "node": ">=14.17" + }, + "peerDependencies": { + "semantic-release": ">=18.0.0-beta.1" + } + }, + "packages/scratch-render/node_modules/@semantic-release/github/node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "packages/scratch-render/node_modules/@semantic-release/github/node_modules/fs-extra": { + "version": "11.3.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.3.tgz", + "integrity": "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "packages/scratch-render/node_modules/@semantic-release/github/node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/scratch-render/node_modules/@semantic-release/github/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==", + "dev": true, + "license": "ISC" + }, + "packages/scratch-render/node_modules/@semantic-release/github/node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "packages/scratch-render/node_modules/@semantic-release/github/node_modules/universalify": { + "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" + } + }, + "packages/scratch-render/node_modules/@semantic-release/npm": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-9.0.2.tgz", + "integrity": "sha512-zgsynF6McdzxPnFet+a4iO9HpAlARXOM5adz7VGVCvj0ne8wtL2ZOQoDV2wZPDmdEotDIbVeJjafhelZjs9j6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@semantic-release/error": "^3.0.0", + "aggregate-error": "^3.0.0", + "execa": "^5.0.0", + "fs-extra": "^11.0.0", + "lodash": "^4.17.15", + "nerf-dart": "^1.0.0", + "normalize-url": "^6.0.0", + "npm": "^8.3.0", + "rc": "^1.2.8", + "read-pkg": "^5.0.0", + "registry-auth-token": "^5.0.0", + "semver": "^7.1.2", + "tempy": "^1.0.0" + }, + "engines": { + "node": ">=16 || ^14.17" + }, + "peerDependencies": { + "semantic-release": ">=19.0.0" + } + }, + "packages/scratch-render/node_modules/@semantic-release/npm/node_modules/fs-extra": { + "version": "11.3.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.3.tgz", + "integrity": "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "packages/scratch-render/node_modules/@semantic-release/npm/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==", + "dev": true, + "license": "ISC" + }, + "packages/scratch-render/node_modules/@semantic-release/npm/node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "packages/scratch-render/node_modules/@semantic-release/npm/node_modules/universalify": { + "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" + } + }, + "packages/scratch-render/node_modules/@semantic-release/release-notes-generator": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/@semantic-release/release-notes-generator/-/release-notes-generator-10.0.3.tgz", + "integrity": "sha512-k4x4VhIKneOWoBGHkx0qZogNjCldLPRiAjnIpMnlUh6PtaWXp/T+C9U7/TaNDDtgDa5HMbHl4WlREdxHio6/3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "conventional-changelog-angular": "^5.0.0", + "conventional-changelog-writer": "^5.0.0", + "conventional-commits-filter": "^2.0.0", + "conventional-commits-parser": "^3.2.3", + "debug": "^4.0.0", + "get-stream": "^6.0.0", + "import-from": "^4.0.0", + "into-stream": "^6.0.0", + "lodash": "^4.17.4", + "read-pkg-up": "^7.0.0" + }, + "engines": { + "node": ">=14.17" + }, + "peerDependencies": { + "semantic-release": ">=18.0.0-beta.1" + } + }, + "packages/scratch-render/node_modules/ansi-escapes": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.1.tgz", + "integrity": "sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/scratch-render/node_modules/array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-uniq": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "packages/scratch-render/node_modules/async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", + "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4.17.10" + } + }, + "packages/scratch-render/node_modules/before-after-hook": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", + "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", + "dev": true, + "license": "Apache-2.0" + }, + "packages/scratch-render/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" + } + }, + "packages/scratch-render/node_modules/commander": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", + "dev": true, + "license": "MIT" + }, + "packages/scratch-render/node_modules/conventional-changelog-angular": { + "version": "5.0.13", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz", + "integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==", + "dev": true, + "license": "ISC", + "dependencies": { + "compare-func": "^2.0.0", + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "packages/scratch-render/node_modules/conventional-changelog-writer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-5.0.1.tgz", + "integrity": "sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "conventional-commits-filter": "^2.0.7", + "dateformat": "^3.0.0", + "handlebars": "^4.7.7", + "json-stringify-safe": "^5.0.1", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "semver": "^6.0.0", + "split": "^1.0.0", + "through2": "^4.0.0" + }, + "bin": { + "conventional-changelog-writer": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "packages/scratch-render/node_modules/conventional-changelog-writer/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": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "packages/scratch-render/node_modules/conventional-commits-filter": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz", + "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash.ismatch": "^4.4.0", + "modify-values": "^1.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "packages/scratch-render/node_modules/conventional-commits-parser": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz", + "integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-text-path": "^1.0.1", + "JSONStream": "^1.0.4", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0" + }, + "bin": { + "conventional-commits-parser": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "packages/scratch-render/node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "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" + }, + "engines": { + "node": ">=10" + } + }, + "packages/scratch-render/node_modules/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "packages/scratch-render/node_modules/env-ci": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/env-ci/-/env-ci-5.5.0.tgz", + "integrity": "sha512-o0JdWIbOLP+WJKIUt36hz1ImQQFuN92nhsfTkHHap+J8CiI8WgGpH/a9jEGHh4/TU5BUUGjlnKXNoDb57+ne+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^5.0.0", + "fromentries": "^1.3.2", + "java-properties": "^1.0.0" + }, + "engines": { + "node": ">=10.17" + } + }, + "packages/scratch-render/node_modules/find-versions": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-4.0.0.tgz", + "integrity": "sha512-wgpWy002tA+wgmO27buH/9KzyEOQnKsG/R0yrcjPT9BOFm0zRBVQbZ95nRGXWMywS8YR5knRbpohio0bcJABxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver-regex": "^3.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/scratch-render/node_modules/fs-extra": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz", + "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "packages/scratch-render/node_modules/gh-pages": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gh-pages/-/gh-pages-1.2.0.tgz", + "integrity": "sha512-cGLYAvxtlQ1iTwAS4g7FreZPXoE/g62Fsxln2mmR19mgs4zZI+XJ+wVVUhBFCF/0+Nmvbq+abyTWue1m1BSnmg==", + "dev": true, + "license": "MIT", + "dependencies": { + "async": "2.6.1", + "commander": "2.15.1", + "filenamify-url": "^1.0.0", + "fs-extra": "^5.0.0", + "globby": "^6.1.0", + "graceful-fs": "4.1.11", + "rimraf": "^2.6.2" + }, + "bin": { + "gh-pages": "bin/gh-pages.js", + "gh-pages-clean": "bin/gh-pages-clean.js" + }, + "engines": { + "node": ">=4" + } + }, + "packages/scratch-render/node_modules/globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "packages/scratch-render/node_modules/graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha512-9x6DLUuW+ROFdMTII9ec9t/FK8va6kYcC8/LggumssLM8kNv7IdFl3VrNUqgir2tJuBVxBga1QBoRziZacO5Zg==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=0.4.0" + } + }, + "packages/scratch-render/node_modules/hook-std": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hook-std/-/hook-std-2.0.0.tgz", + "integrity": "sha512-zZ6T5WcuBMIUVh49iPQS9t977t7C0l7OtHrpeMb5uk48JdflRX0NSFvCekfYNmGQETnLq9W/isMyHl69kxGi8g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "packages/scratch-render/node_modules/into-stream": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-6.0.0.tgz", + "integrity": "sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "from2": "^2.3.0", + "p-is-promise": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/scratch-render/node_modules/issue-parser": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-6.0.0.tgz", + "integrity": "sha512-zKa/Dxq2lGsBIXQ7CUZWTHfvxPC2ej0KfO7fIPqLlHB9J2hJ7rGhZ5rilhuufylr4RXYPzJUeFjKxz305OsNlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash.capitalize": "^4.2.1", + "lodash.escaperegexp": "^4.1.2", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.uniqby": "^4.7.0" + }, + "engines": { + "node": ">=10.13" + } + }, + "packages/scratch-render/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "packages/scratch-render/node_modules/marked-terminal": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-5.2.0.tgz", + "integrity": "sha512-Piv6yNwAQXGFjZSaiNljyNFw7jKDdGrw70FSbtxEyldLsyeuV5ZHm/1wW++kWbrOF1VPnUgYOhB2oLL0ZpnekA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^6.2.0", + "cardinal": "^2.1.1", + "chalk": "^5.2.0", + "cli-table3": "^0.6.3", + "node-emoji": "^1.11.0", + "supports-hyperlinks": "^2.3.0" + }, + "engines": { + "node": ">=14.13.1 || >=16.0.0" + }, + "peerDependencies": { + "marked": "^1.0.0 || ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0" + } + }, + "packages/scratch-render/node_modules/marked-terminal/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" + } + }, + "packages/scratch-render/node_modules/mime": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "packages/scratch-render/node_modules/node-emoji": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", + "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4.17.21" + } + }, + "packages/scratch-render/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" + } + }, + "packages/scratch-render/node_modules/npm": { + "version": "8.19.4", + "resolved": "https://registry.npmjs.org/npm/-/npm-8.19.4.tgz", + "integrity": "sha512-3HANl8i9DKnUA89P4KEgVNN28EjSeDCmvEqbzOAuxCFDzdBZzjUl99zgnGpOUumvW5lvJo2HKcjrsc+tfyv1Hw==", + "bundleDependencies": [ + "@isaacs/string-locale-compare", + "@npmcli/arborist", + "@npmcli/ci-detect", + "@npmcli/config", + "@npmcli/fs", + "@npmcli/map-workspaces", + "@npmcli/package-json", + "@npmcli/run-script", + "abbrev", + "archy", + "cacache", + "chalk", + "chownr", + "cli-columns", + "cli-table3", + "columnify", + "fastest-levenshtein", + "fs-minipass", + "glob", + "graceful-fs", + "hosted-git-info", + "ini", + "init-package-json", + "is-cidr", + "json-parse-even-better-errors", + "libnpmaccess", + "libnpmdiff", + "libnpmexec", + "libnpmfund", + "libnpmhook", + "libnpmorg", + "libnpmpack", + "libnpmpublish", + "libnpmsearch", + "libnpmteam", + "libnpmversion", + "make-fetch-happen", + "minimatch", + "minipass", + "minipass-pipeline", + "mkdirp", + "mkdirp-infer-owner", + "ms", + "node-gyp", + "nopt", + "npm-audit-report", + "npm-install-checks", + "npm-package-arg", + "npm-pick-manifest", + "npm-profile", + "npm-registry-fetch", + "npm-user-validate", + "npmlog", + "opener", + "p-map", + "pacote", + "parse-conflict-json", + "proc-log", + "qrcode-terminal", + "read", + "read-package-json", + "read-package-json-fast", + "readdir-scoped-modules", + "rimraf", + "semver", + "ssri", + "tar", + "text-table", + "tiny-relative-date", + "treeverse", + "validate-npm-package-name", + "which", + "write-file-atomic" + ], + "dev": true, + "license": "Artistic-2.0", + "workspaces": [ + "docs", + "smoke-tests", + "workspaces/*" + ], + "dependencies": { + "@isaacs/string-locale-compare": "^1.1.0", + "@npmcli/arborist": "^5.6.3", + "@npmcli/ci-detect": "^2.0.0", + "@npmcli/config": "^4.2.1", + "@npmcli/fs": "^2.1.0", + "@npmcli/map-workspaces": "^2.0.3", + "@npmcli/package-json": "^2.0.0", + "@npmcli/run-script": "^4.2.1", + "abbrev": "~1.1.1", + "archy": "~1.0.0", + "cacache": "^16.1.3", + "chalk": "^4.1.2", + "chownr": "^2.0.0", + "cli-columns": "^4.0.0", + "cli-table3": "^0.6.2", + "columnify": "^1.6.0", + "fastest-levenshtein": "^1.0.12", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "graceful-fs": "^4.2.10", + "hosted-git-info": "^5.2.1", + "ini": "^3.0.1", + "init-package-json": "^3.0.2", + "is-cidr": "^4.0.2", + "json-parse-even-better-errors": "^2.3.1", + "libnpmaccess": "^6.0.4", + "libnpmdiff": "^4.0.5", + "libnpmexec": "^4.0.14", + "libnpmfund": "^3.0.5", + "libnpmhook": "^8.0.4", + "libnpmorg": "^4.0.4", + "libnpmpack": "^4.1.3", + "libnpmpublish": "^6.0.5", + "libnpmsearch": "^5.0.4", + "libnpmteam": "^4.0.4", + "libnpmversion": "^3.0.7", + "make-fetch-happen": "^10.2.0", + "minimatch": "^5.1.0", + "minipass": "^3.1.6", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "mkdirp-infer-owner": "^2.0.0", + "ms": "^2.1.2", + "node-gyp": "^9.1.0", + "nopt": "^6.0.0", + "npm-audit-report": "^3.0.0", + "npm-install-checks": "^5.0.0", + "npm-package-arg": "^9.1.0", + "npm-pick-manifest": "^7.0.2", + "npm-profile": "^6.2.0", + "npm-registry-fetch": "^13.3.1", + "npm-user-validate": "^1.0.1", + "npmlog": "^6.0.2", + "opener": "^1.5.2", + "p-map": "^4.0.0", + "pacote": "^13.6.2", + "parse-conflict-json": "^2.0.2", + "proc-log": "^2.0.1", + "qrcode-terminal": "^0.12.0", + "read": "~1.0.7", + "read-package-json": "^5.0.2", + "read-package-json-fast": "^2.0.3", + "readdir-scoped-modules": "^1.1.0", + "rimraf": "^3.0.2", + "semver": "^7.3.7", + "ssri": "^9.0.1", + "tar": "^6.1.11", + "text-table": "~0.2.0", + "tiny-relative-date": "^1.3.0", + "treeverse": "^2.0.0", + "validate-npm-package-name": "^4.0.0", + "which": "^2.0.2", + "write-file-atomic": "^4.0.1" + }, + "bin": { + "npm": "bin/npm-cli.js", + "npx": "bin/npx-cli.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/@colors/colors": { + "version": "1.5.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/@gar/promisify": { + "version": "1.1.3", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-render/node_modules/npm/node_modules/@isaacs/string-locale-compare": { + "version": "1.1.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-render/node_modules/npm/node_modules/@npmcli/arborist": { + "version": "5.6.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@isaacs/string-locale-compare": "^1.1.0", + "@npmcli/installed-package-contents": "^1.0.7", + "@npmcli/map-workspaces": "^2.0.3", + "@npmcli/metavuln-calculator": "^3.0.1", + "@npmcli/move-file": "^2.0.0", + "@npmcli/name-from-folder": "^1.0.1", + "@npmcli/node-gyp": "^2.0.0", + "@npmcli/package-json": "^2.0.0", + "@npmcli/query": "^1.2.0", + "@npmcli/run-script": "^4.1.3", + "bin-links": "^3.0.3", + "cacache": "^16.1.3", + "common-ancestor-path": "^1.0.1", + "hosted-git-info": "^5.2.1", + "json-parse-even-better-errors": "^2.3.1", + "json-stringify-nice": "^1.1.4", + "minimatch": "^5.1.0", + "mkdirp": "^1.0.4", + "mkdirp-infer-owner": "^2.0.0", + "nopt": "^6.0.0", + "npm-install-checks": "^5.0.0", + "npm-package-arg": "^9.0.0", + "npm-pick-manifest": "^7.0.2", + "npm-registry-fetch": "^13.0.0", + "npmlog": "^6.0.2", + "pacote": "^13.6.1", + "parse-conflict-json": "^2.0.1", + "proc-log": "^2.0.0", + "promise-all-reject-late": "^1.0.0", + "promise-call-limit": "^1.0.1", + "read-package-json-fast": "^2.0.2", + "readdir-scoped-modules": "^1.1.0", + "rimraf": "^3.0.2", + "semver": "^7.3.7", + "ssri": "^9.0.0", + "treeverse": "^2.0.0", + "walk-up-path": "^1.0.0" + }, + "bin": { + "arborist": "bin/index.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/@npmcli/ci-detect": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/@npmcli/config": { + "version": "4.2.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/map-workspaces": "^2.0.2", + "ini": "^3.0.0", + "mkdirp-infer-owner": "^2.0.0", + "nopt": "^6.0.0", + "proc-log": "^2.0.0", + "read-package-json-fast": "^2.0.3", + "semver": "^7.3.5", + "walk-up-path": "^1.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/@npmcli/disparity-colors": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "ansi-styles": "^4.3.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/@npmcli/fs": { + "version": "2.1.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/@npmcli/git": { + "version": "3.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/promise-spawn": "^3.0.0", + "lru-cache": "^7.4.4", + "mkdirp": "^1.0.4", + "npm-pick-manifest": "^7.0.0", + "proc-log": "^2.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^2.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/@npmcli/installed-package-contents": { + "version": "1.0.7", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-bundled": "^1.1.1", + "npm-normalize-package-bin": "^1.0.1" + }, + "bin": { + "installed-package-contents": "index.js" + }, + "engines": { + "node": ">= 10" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/@npmcli/installed-package-contents/node_modules/npm-bundled": { + "version": "1.1.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/@npmcli/map-workspaces": { + "version": "2.0.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/name-from-folder": "^1.0.1", + "glob": "^8.0.1", + "minimatch": "^5.0.1", + "read-package-json-fast": "^2.0.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/@npmcli/metavuln-calculator": { + "version": "3.1.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "cacache": "^16.0.0", + "json-parse-even-better-errors": "^2.3.1", + "pacote": "^13.0.3", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/@npmcli/move-file": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/@npmcli/name-from-folder": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-render/node_modules/npm/node_modules/@npmcli/node-gyp": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/@npmcli/package-json": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "json-parse-even-better-errors": "^2.3.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/@npmcli/promise-spawn": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "infer-owner": "^1.0.4" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/@npmcli/query": { + "version": "1.2.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-package-arg": "^9.1.0", + "postcss-selector-parser": "^6.0.10", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/@npmcli/run-script": { + "version": "4.2.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/node-gyp": "^2.0.0", + "@npmcli/promise-spawn": "^3.0.0", + "node-gyp": "^9.0.0", + "read-package-json-fast": "^2.0.3", + "which": "^2.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/@tootallnate/once": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/abbrev": { + "version": "1.1.1", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-render/node_modules/npm/node_modules/agent-base": { + "version": "6.0.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/agentkeepalive": { + "version": "4.2.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "depd": "^1.1.2", + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/aggregate-error": { + "version": "3.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/ansi-regex": { + "version": "5.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/aproba": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-render/node_modules/npm/node_modules/archy": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-render/node_modules/npm/node_modules/are-we-there-yet": { + "version": "3.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/asap": { + "version": "2.0.6", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-render/node_modules/npm/node_modules/balanced-match": { + "version": "1.0.2", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-render/node_modules/npm/node_modules/bin-links": { + "version": "3.0.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "cmd-shim": "^5.0.0", + "mkdirp-infer-owner": "^2.0.0", + "npm-normalize-package-bin": "^2.0.0", + "read-cmd-shim": "^3.0.0", + "rimraf": "^3.0.0", + "write-file-atomic": "^4.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/bin-links/node_modules/npm-normalize-package-bin": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/binary-extensions": { + "version": "2.2.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/brace-expansion": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/builtins": { + "version": "5.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "semver": "^7.0.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/cacache": { + "version": "16.1.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "inBundle": 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" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/chownr": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/cidr-regex": { + "version": "3.1.1", + "dev": true, + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "ip-regex": "^4.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/clean-stack": { + "version": "2.2.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/cli-columns": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/cli-table3": { + "version": "0.6.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/clone": { + "version": "1.0.4", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/cmd-shim": { + "version": "5.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "mkdirp-infer-owner": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-render/node_modules/npm/node_modules/color-support": { + "version": "1.1.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "bin": { + "color-support": "bin.js" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/columnify": { + "version": "1.6.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "strip-ansi": "^6.0.1", + "wcwidth": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/common-ancestor-path": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-render/node_modules/npm/node_modules/concat-map": { + "version": "0.0.1", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-render/node_modules/npm/node_modules/console-control-strings": { + "version": "1.1.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-render/node_modules/npm/node_modules/cssesc": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/debug": { + "version": "4.3.4", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "packages/scratch-render/node_modules/npm/node_modules/debug/node_modules/ms": { + "version": "2.1.2", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-render/node_modules/npm/node_modules/debuglog": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/defaults": { + "version": "1.0.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "clone": "^1.0.2" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/delegates": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-render/node_modules/npm/node_modules/depd": { + "version": "1.1.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/dezalgo": { + "version": "1.0.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/diff": { + "version": "5.1.0", + "dev": true, + "inBundle": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-render/node_modules/npm/node_modules/encoding": { + "version": "0.1.13", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/env-paths": { + "version": "2.2.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/err-code": { + "version": "2.0.3", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-render/node_modules/npm/node_modules/fastest-levenshtein": { + "version": "1.0.12", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-render/node_modules/npm/node_modules/fs-minipass": { + "version": "2.1.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/fs.realpath": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-render/node_modules/npm/node_modules/function-bind": { + "version": "1.1.1", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-render/node_modules/npm/node_modules/gauge": { + "version": "4.0.4", + "dev": true, + "inBundle": 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": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/glob": { + "version": "8.0.3", + "dev": true, + "inBundle": 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" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/graceful-fs": { + "version": "4.2.10", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-render/node_modules/npm/node_modules/has": { + "version": "1.0.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/has-unicode": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-render/node_modules/npm/node_modules/hosted-git-info": { + "version": "5.2.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^7.5.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/http-cache-semantics": { + "version": "4.1.1", + "dev": true, + "inBundle": true, + "license": "BSD-2-Clause" + }, + "packages/scratch-render/node_modules/npm/node_modules/http-proxy-agent": { + "version": "5.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/https-proxy-agent": { + "version": "5.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/humanize-ms": { + "version": "1.2.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ms": "^2.0.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/iconv-lite": { + "version": "0.6.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/ignore-walk": { + "version": "5.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minimatch": "^5.0.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/imurmurhash": { + "version": "0.1.4", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/indent-string": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/infer-owner": { + "version": "1.0.4", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-render/node_modules/npm/node_modules/inflight": { + "version": "1.0.6", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/inherits": { + "version": "2.0.4", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-render/node_modules/npm/node_modules/ini": { + "version": "3.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/init-package-json": { + "version": "3.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-package-arg": "^9.0.1", + "promzard": "^0.3.0", + "read": "^1.0.7", + "read-package-json": "^5.0.0", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4", + "validate-npm-package-name": "^4.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/ip": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-render/node_modules/npm/node_modules/ip-regex": { + "version": "4.3.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/is-cidr": { + "version": "4.0.2", + "dev": true, + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "cidr-regex": "^3.1.1" + }, + "engines": { + "node": ">=10" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/is-core-module": { + "version": "2.10.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/is-lambda": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-render/node_modules/npm/node_modules/isexe": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-render/node_modules/npm/node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-render/node_modules/npm/node_modules/json-stringify-nice": { + "version": "1.1.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/jsonparse": { + "version": "1.3.1", + "dev": true, + "engines": [ + "node >= 0.2.0" + ], + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-render/node_modules/npm/node_modules/just-diff": { + "version": "5.1.1", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-render/node_modules/npm/node_modules/just-diff-apply": { + "version": "5.4.1", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-render/node_modules/npm/node_modules/libnpmaccess": { + "version": "6.0.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^2.0.0", + "minipass": "^3.1.1", + "npm-package-arg": "^9.0.1", + "npm-registry-fetch": "^13.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/libnpmdiff": { + "version": "4.0.5", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/disparity-colors": "^2.0.0", + "@npmcli/installed-package-contents": "^1.0.7", + "binary-extensions": "^2.2.0", + "diff": "^5.1.0", + "minimatch": "^5.0.1", + "npm-package-arg": "^9.0.1", + "pacote": "^13.6.1", + "tar": "^6.1.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/libnpmexec": { + "version": "4.0.14", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/arborist": "^5.6.3", + "@npmcli/ci-detect": "^2.0.0", + "@npmcli/fs": "^2.1.1", + "@npmcli/run-script": "^4.2.0", + "chalk": "^4.1.0", + "mkdirp-infer-owner": "^2.0.0", + "npm-package-arg": "^9.0.1", + "npmlog": "^6.0.2", + "pacote": "^13.6.1", + "proc-log": "^2.0.0", + "read": "^1.0.7", + "read-package-json-fast": "^2.0.2", + "semver": "^7.3.7", + "walk-up-path": "^1.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/libnpmfund": { + "version": "3.0.5", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/arborist": "^5.6.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/libnpmhook": { + "version": "8.0.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^2.0.0", + "npm-registry-fetch": "^13.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/libnpmorg": { + "version": "4.0.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^2.0.0", + "npm-registry-fetch": "^13.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/libnpmpack": { + "version": "4.1.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/run-script": "^4.1.3", + "npm-package-arg": "^9.0.1", + "pacote": "^13.6.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/libnpmpublish": { + "version": "6.0.5", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "normalize-package-data": "^4.0.0", + "npm-package-arg": "^9.0.1", + "npm-registry-fetch": "^13.0.0", + "semver": "^7.3.7", + "ssri": "^9.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/libnpmsearch": { + "version": "5.0.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-registry-fetch": "^13.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/libnpmteam": { + "version": "4.0.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^2.0.0", + "npm-registry-fetch": "^13.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/libnpmversion": { + "version": "3.0.7", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^3.0.0", + "@npmcli/run-script": "^4.1.3", + "json-parse-even-better-errors": "^2.3.1", + "proc-log": "^2.0.0", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/lru-cache": { + "version": "7.13.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/make-fetch-happen": { + "version": "10.2.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^16.1.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^2.0.3", + "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": "^9.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/minimatch": { + "version": "5.1.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/minipass": { + "version": "3.3.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/minipass-collect": { + "version": "1.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/minipass-fetch": { + "version": "2.1.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/minipass-flush": { + "version": "1.0.5", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/minipass-json-stream": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "jsonparse": "^1.3.1", + "minipass": "^3.0.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/minipass-pipeline": { + "version": "1.2.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/minipass-sized": { + "version": "1.0.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/minizlib": { + "version": "2.1.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/mkdirp": { + "version": "1.0.4", + "dev": true, + "inBundle": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/mkdirp-infer-owner": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "infer-owner": "^1.0.4", + "mkdirp": "^1.0.3" + }, + "engines": { + "node": ">=10" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/ms": { + "version": "2.1.3", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-render/node_modules/npm/node_modules/mute-stream": { + "version": "0.0.8", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-render/node_modules/npm/node_modules/negotiator": { + "version": "0.6.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/node-gyp": { + "version": "9.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^10.0.3", + "nopt": "^5.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.22 || ^14.13 || >=16" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/node-gyp/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/node-gyp/node_modules/glob": { + "version": "7.2.3", + "dev": true, + "inBundle": 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" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/node-gyp/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/node-gyp/node_modules/nopt": { + "version": "5.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/nopt": { + "version": "6.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "abbrev": "^1.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/normalize-package-data": { + "version": "4.0.1", + "dev": true, + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^5.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/npm-audit-report": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "chalk": "^4.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/npm-bundled": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-normalize-package-bin": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/npm-bundled/node_modules/npm-normalize-package-bin": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/npm-install-checks": { + "version": "5.0.0", + "dev": true, + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "semver": "^7.1.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/npm-normalize-package-bin": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-render/node_modules/npm/node_modules/npm-package-arg": { + "version": "9.1.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "hosted-git-info": "^5.0.0", + "proc-log": "^2.0.1", + "semver": "^7.3.5", + "validate-npm-package-name": "^4.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/npm-packlist": { + "version": "5.1.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "glob": "^8.0.1", + "ignore-walk": "^5.0.1", + "npm-bundled": "^2.0.0", + "npm-normalize-package-bin": "^2.0.0" + }, + "bin": { + "npm-packlist": "bin/index.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/npm-packlist/node_modules/npm-normalize-package-bin": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/npm-pick-manifest": { + "version": "7.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-install-checks": "^5.0.0", + "npm-normalize-package-bin": "^2.0.0", + "npm-package-arg": "^9.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/npm-pick-manifest/node_modules/npm-normalize-package-bin": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/npm-profile": { + "version": "6.2.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-registry-fetch": "^13.0.1", + "proc-log": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/npm-registry-fetch": { + "version": "13.3.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "make-fetch-happen": "^10.0.6", + "minipass": "^3.1.6", + "minipass-fetch": "^2.0.3", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.1.2", + "npm-package-arg": "^9.0.1", + "proc-log": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/npm-user-validate": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "BSD-2-Clause" + }, + "packages/scratch-render/node_modules/npm/node_modules/npmlog": { + "version": "6.0.2", + "dev": true, + "inBundle": 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" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/once": { + "version": "1.4.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/opener": { + "version": "1.5.2", + "dev": true, + "inBundle": true, + "license": "(WTFPL OR MIT)", + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/p-map": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/pacote": { + "version": "13.6.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^3.0.0", + "@npmcli/installed-package-contents": "^1.0.7", + "@npmcli/promise-spawn": "^3.0.0", + "@npmcli/run-script": "^4.1.0", + "cacache": "^16.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "infer-owner": "^1.0.4", + "minipass": "^3.1.6", + "mkdirp": "^1.0.4", + "npm-package-arg": "^9.0.0", + "npm-packlist": "^5.1.0", + "npm-pick-manifest": "^7.0.0", + "npm-registry-fetch": "^13.0.1", + "proc-log": "^2.0.0", + "promise-retry": "^2.0.1", + "read-package-json": "^5.0.0", + "read-package-json-fast": "^2.0.3", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11" + }, + "bin": { + "pacote": "lib/bin.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/parse-conflict-json": { + "version": "2.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "json-parse-even-better-errors": "^2.3.1", + "just-diff": "^5.0.1", + "just-diff-apply": "^5.2.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/path-is-absolute": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/postcss-selector-parser": { + "version": "6.0.10", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/proc-log": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/promise-all-reject-late": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/promise-call-limit": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/promise-inflight": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-render/node_modules/npm/node_modules/promise-retry": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/promzard": { + "version": "0.3.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "read": "1" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/qrcode-terminal": { + "version": "0.12.0", + "dev": true, + "inBundle": true, + "bin": { + "qrcode-terminal": "bin/qrcode-terminal.js" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/read": { + "version": "1.0.7", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "mute-stream": "~0.0.4" + }, + "engines": { + "node": ">=0.8" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/read-cmd-shim": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/read-package-json": { + "version": "5.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "glob": "^8.0.1", + "json-parse-even-better-errors": "^2.3.1", + "normalize-package-data": "^4.0.0", + "npm-normalize-package-bin": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/read-package-json-fast": { + "version": "2.0.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "json-parse-even-better-errors": "^2.3.0", + "npm-normalize-package-bin": "^1.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/read-package-json/node_modules/npm-normalize-package-bin": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/readable-stream": { + "version": "3.6.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/readdir-scoped-modules": { + "version": "1.1.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "graceful-fs": "^4.1.2", + "once": "^1.3.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/retry": { + "version": "0.12.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/rimraf": { + "version": "3.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/rimraf/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "dev": true, + "inBundle": 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" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/rimraf/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/safe-buffer": { + "version": "5.2.1", + "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" + } + ], + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-render/node_modules/npm/node_modules/safer-buffer": { + "version": "2.1.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true + }, + "packages/scratch-render/node_modules/npm/node_modules/semver": { + "version": "7.3.7", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/set-blocking": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-render/node_modules/npm/node_modules/signal-exit": { + "version": "3.0.7", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-render/node_modules/npm/node_modules/smart-buffer": { + "version": "4.2.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/socks": { + "version": "2.7.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/socks-proxy-agent": { + "version": "7.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + }, + "engines": { + "node": ">= 10" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/spdx-correct": { + "version": "3.1.1", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/spdx-exceptions": { + "version": "2.3.0", + "dev": true, + "inBundle": true, + "license": "CC-BY-3.0" + }, + "packages/scratch-render/node_modules/npm/node_modules/spdx-expression-parse": { + "version": "3.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/spdx-license-ids": { + "version": "3.0.11", + "dev": true, + "inBundle": true, + "license": "CC0-1.0" + }, + "packages/scratch-render/node_modules/npm/node_modules/ssri": { + "version": "9.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/string_decoder": { + "version": "1.3.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/strip-ansi": { + "version": "6.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/tar": { + "version": "6.1.11", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/text-table": { + "version": "0.2.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-render/node_modules/npm/node_modules/tiny-relative-date": { + "version": "1.3.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-render/node_modules/npm/node_modules/treeverse": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/unique-filename": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "unique-slug": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/unique-slug": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/util-deprecate": { + "version": "1.0.2", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-render/node_modules/npm/node_modules/validate-npm-package-license": { + "version": "3.0.4", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/validate-npm-package-name": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "builtins": "^5.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/walk-up-path": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-render/node_modules/npm/node_modules/wcwidth": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/which": { + "version": "2.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/wide-align": { + "version": "1.1.5", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/wrappy": { + "version": "1.0.2", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-render/node_modules/npm/node_modules/write-file-atomic": { + "version": "4.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-render/node_modules/npm/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-render/node_modules/p-each-series": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", + "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/scratch-render/node_modules/p-filter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz", + "integrity": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-map": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "packages/scratch-render/node_modules/p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "packages/scratch-render/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "packages/scratch-render/node_modules/raw-loader": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-0.5.1.tgz", + "integrity": "sha512-sf7oGoLuaYAScB4VGr0tzetsYlS8EJH6qnTCfQ/WVEa89hALQ4RQfCKt5xCyPQKPDUbVUAIP1QsxAwfAjlDp7Q==" + }, + "packages/scratch-render/node_modules/semantic-release": { + "version": "19.0.5", + "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-19.0.5.tgz", + "integrity": "sha512-NMPKdfpXTnPn49FDogMBi36SiBfXkSOJqCkk0E4iWOY1tusvvgBwqUmxTX1kmlT6kIYed9YwNKD1sfPpqa5yaA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@semantic-release/commit-analyzer": "^9.0.2", + "@semantic-release/error": "^3.0.0", + "@semantic-release/github": "^8.0.0", + "@semantic-release/npm": "^9.0.0", + "@semantic-release/release-notes-generator": "^10.0.0", + "aggregate-error": "^3.0.0", + "cosmiconfig": "^7.0.0", + "debug": "^4.0.0", + "env-ci": "^5.0.0", + "execa": "^5.0.0", + "figures": "^3.0.0", + "find-versions": "^4.0.0", + "get-stream": "^6.0.0", + "git-log-parser": "^1.2.0", + "hook-std": "^2.0.0", + "hosted-git-info": "^4.0.0", + "lodash": "^4.17.21", + "marked": "^4.0.10", + "marked-terminal": "^5.0.0", + "micromatch": "^4.0.2", + "p-each-series": "^2.1.0", + "p-reduce": "^2.0.0", + "read-pkg-up": "^7.0.0", + "resolve-from": "^5.0.0", + "semver": "^7.3.2", + "semver-diff": "^3.1.1", + "signale": "^1.2.1", + "yargs": "^16.2.0" + }, + "bin": { + "semantic-release": "bin/semantic-release.js" + }, + "engines": { + "node": ">=16 || ^14.17" + } + }, + "packages/scratch-render/node_modules/semver-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "packages/scratch-render/node_modules/semver-diff/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": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "packages/scratch-render/node_modules/semver-regex": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-3.1.4.tgz", + "integrity": "sha512-6IiqeZNgq01qGf0TId0t3NvKzSvUsjcpdEO3AQNeIjR6A2+ckTnQlDpl4qu1bjRv0RzN3FP9hzFmws3lKqRWkA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/scratch-render/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "packages/scratch-render/node_modules/supports-hyperlinks": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "packages/scratch-render/node_modules/temp-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "packages/scratch-render/node_modules/tempy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-1.0.1.tgz", + "integrity": "sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "del": "^6.0.0", + "is-stream": "^2.0.0", + "temp-dir": "^2.0.0", + "type-fest": "^0.16.0", + "unique-string": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/scratch-render/node_modules/type-fest": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", + "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/scratch-render/node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "packages/scratch-render/node_modules/universal-user-agent": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", + "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==", + "dev": true, + "license": "ISC" + }, + "packages/scratch-render/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "packages/scratch-render/node_modules/url-join": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", + "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", + "dev": true, + "license": "MIT" + }, + "packages/scratch-render/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "packages/scratch-render/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "packages/scratch-svg-renderer": { + "name": "@scratch/scratch-svg-renderer", + "version": "12.3.1", + "license": "AGPL-3.0-only", + "dependencies": { + "base64-js": "1.5.1", + "base64-loader": "1.0.0", + "css-tree": "1.1.3", + "fastestsmallesttextencoderdecoder": "1.0.22", + "isomorphic-dompurify": "2.26.0", + "transformation-matrix": "1.15.3", + "tslog": "4.10.2" + }, + "devDependencies": { + "@babel/core": "7.28.6", + "@babel/preset-env": "7.28.6", + "babel-loader": "9.2.1", + "copy-webpack-plugin": "6.4.1", + "eslint": "9.39.2", + "eslint-config-scratch": "12.0.46", + "globals": "16.5.0", + "jsdom": "13.2.0", + "mkdirp": "2.1.6", + "rimraf": "3.0.2", + "scratch-render-fonts": "1.0.252", + "scratch-semantic-release-config": "4.0.1", + "scratch-webpack-configuration": "3.1.0", + "semantic-release": "19.0.5", + "tap": "21.5.0", + "webpack": "5.104.1", + "webpack-cli": "5.1.4", + "webpack-dev-server": "5.2.3", + "xmldom": "0.1.31" + }, + "peerDependencies": { + "scratch-render-fonts": "^1.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/@octokit/auth-token": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.4.tgz", + "integrity": "sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "packages/scratch-svg-renderer/node_modules/@octokit/core": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.2.4.tgz", + "integrity": "sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/auth-token": "^3.0.0", + "@octokit/graphql": "^5.0.0", + "@octokit/request": "^6.0.0", + "@octokit/request-error": "^3.0.0", + "@octokit/types": "^9.0.0", + "before-after-hook": "^2.2.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "packages/scratch-svg-renderer/node_modules/@octokit/endpoint": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.6.tgz", + "integrity": "sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/types": "^9.0.0", + "is-plain-object": "^5.0.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "packages/scratch-svg-renderer/node_modules/@octokit/graphql": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.6.tgz", + "integrity": "sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/request": "^6.0.0", + "@octokit/types": "^9.0.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "packages/scratch-svg-renderer/node_modules/@octokit/openapi-types": { + "version": "18.1.1", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.1.1.tgz", + "integrity": "sha512-VRaeH8nCDtF5aXWnjPuEMIYf1itK/s3JYyJcWFJT8X9pSNnBtriDf7wlEWsGuhPLl4QIH4xM8fqTXDwJ3Mu6sw==", + "dev": true, + "license": "MIT" + }, + "packages/scratch-svg-renderer/node_modules/@octokit/plugin-paginate-rest": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-6.1.2.tgz", + "integrity": "sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/tsconfig": "^1.0.2", + "@octokit/types": "^9.2.3" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "@octokit/core": ">=4" + } + }, + "packages/scratch-svg-renderer/node_modules/@octokit/plugin-retry": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-4.1.6.tgz", + "integrity": "sha512-obkYzIgEC75r8+9Pnfiiqy3y/x1bc3QLE5B7qvv9wi9Kj0R5tGQFC6QMBg1154WQ9lAVypuQDGyp3hNpp15gQQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/types": "^9.0.0", + "bottleneck": "^2.15.3" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "@octokit/core": ">=3" + } + }, + "packages/scratch-svg-renderer/node_modules/@octokit/plugin-throttling": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-5.2.3.tgz", + "integrity": "sha512-C9CFg9mrf6cugneKiaI841iG8DOv6P5XXkjmiNNut+swePxQ7RWEdAZRp5rJoE1hjsIqiYcKa/ZkOQ+ujPI39Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/types": "^9.0.0", + "bottleneck": "^2.15.3" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "@octokit/core": "^4.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/@octokit/request": { + "version": "6.2.8", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.8.tgz", + "integrity": "sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/endpoint": "^7.0.0", + "@octokit/request-error": "^3.0.0", + "@octokit/types": "^9.0.0", + "is-plain-object": "^5.0.0", + "node-fetch": "^2.6.7", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "packages/scratch-svg-renderer/node_modules/@octokit/request-error": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.3.tgz", + "integrity": "sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/types": "^9.0.0", + "deprecation": "^2.0.0", + "once": "^1.4.0" + }, + "engines": { + "node": ">= 14" + } + }, + "packages/scratch-svg-renderer/node_modules/@octokit/types": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz", + "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^18.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/@semantic-release/commit-analyzer": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/@semantic-release/commit-analyzer/-/commit-analyzer-9.0.2.tgz", + "integrity": "sha512-E+dr6L+xIHZkX4zNMe6Rnwg4YQrWNXK+rNsvwOPpdFppvZO1olE2fIgWhv89TkQErygevbjsZFSIxp+u6w2e5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "conventional-changelog-angular": "^5.0.0", + "conventional-commits-filter": "^2.0.0", + "conventional-commits-parser": "^3.2.3", + "debug": "^4.0.0", + "import-from": "^4.0.0", + "lodash": "^4.17.4", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=14.17" + }, + "peerDependencies": { + "semantic-release": ">=18.0.0-beta.1" + } + }, + "packages/scratch-svg-renderer/node_modules/@semantic-release/github": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-8.1.0.tgz", + "integrity": "sha512-erR9E5rpdsz0dW1I7785JtndQuMWN/iDcemcptf67tBNOmBUN0b2YNOgcjYUnBpgRpZ5ozfBHrK7Bz+2ets/Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/core": "^4.2.1", + "@octokit/plugin-paginate-rest": "^6.1.2", + "@octokit/plugin-retry": "^4.1.3", + "@octokit/plugin-throttling": "^5.2.3", + "@semantic-release/error": "^3.0.0", + "aggregate-error": "^3.0.0", + "debug": "^4.0.0", + "dir-glob": "^3.0.0", + "fs-extra": "^11.0.0", + "globby": "^11.0.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", + "issue-parser": "^6.0.0", + "lodash": "^4.17.4", + "mime": "^3.0.0", + "p-filter": "^2.0.0", + "url-join": "^4.0.0" + }, + "engines": { + "node": ">=14.17" + }, + "peerDependencies": { + "semantic-release": ">=18.0.0-beta.1" + } + }, + "packages/scratch-svg-renderer/node_modules/@semantic-release/npm": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-9.0.2.tgz", + "integrity": "sha512-zgsynF6McdzxPnFet+a4iO9HpAlARXOM5adz7VGVCvj0ne8wtL2ZOQoDV2wZPDmdEotDIbVeJjafhelZjs9j6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@semantic-release/error": "^3.0.0", + "aggregate-error": "^3.0.0", + "execa": "^5.0.0", + "fs-extra": "^11.0.0", + "lodash": "^4.17.15", + "nerf-dart": "^1.0.0", + "normalize-url": "^6.0.0", + "npm": "^8.3.0", + "rc": "^1.2.8", + "read-pkg": "^5.0.0", + "registry-auth-token": "^5.0.0", + "semver": "^7.1.2", + "tempy": "^1.0.0" + }, + "engines": { + "node": ">=16 || ^14.17" + }, + "peerDependencies": { + "semantic-release": ">=19.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/@semantic-release/release-notes-generator": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/@semantic-release/release-notes-generator/-/release-notes-generator-10.0.3.tgz", + "integrity": "sha512-k4x4VhIKneOWoBGHkx0qZogNjCldLPRiAjnIpMnlUh6PtaWXp/T+C9U7/TaNDDtgDa5HMbHl4WlREdxHio6/3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "conventional-changelog-angular": "^5.0.0", + "conventional-changelog-writer": "^5.0.0", + "conventional-commits-filter": "^2.0.0", + "conventional-commits-parser": "^3.2.3", + "debug": "^4.0.0", + "get-stream": "^6.0.0", + "import-from": "^4.0.0", + "into-stream": "^6.0.0", + "lodash": "^4.17.4", + "read-pkg-up": "^7.0.0" + }, + "engines": { + "node": ">=14.17" + }, + "peerDependencies": { + "semantic-release": ">=18.0.0-beta.1" + } + }, + "packages/scratch-svg-renderer/node_modules/ansi-escapes": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.1.tgz", + "integrity": "sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/scratch-svg-renderer/node_modules/before-after-hook": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", + "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", + "dev": true, + "license": "Apache-2.0" + }, + "packages/scratch-svg-renderer/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" + } + }, + "packages/scratch-svg-renderer/node_modules/conventional-changelog-angular": { + "version": "5.0.13", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz", + "integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==", + "dev": true, + "license": "ISC", + "dependencies": { + "compare-func": "^2.0.0", + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "packages/scratch-svg-renderer/node_modules/conventional-changelog-writer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-5.0.1.tgz", + "integrity": "sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "conventional-commits-filter": "^2.0.7", + "dateformat": "^3.0.0", + "handlebars": "^4.7.7", + "json-stringify-safe": "^5.0.1", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "semver": "^6.0.0", + "split": "^1.0.0", + "through2": "^4.0.0" + }, + "bin": { + "conventional-changelog-writer": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "packages/scratch-svg-renderer/node_modules/conventional-changelog-writer/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": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "packages/scratch-svg-renderer/node_modules/conventional-commits-filter": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz", + "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash.ismatch": "^4.4.0", + "modify-values": "^1.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "packages/scratch-svg-renderer/node_modules/conventional-commits-parser": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz", + "integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-text-path": "^1.0.1", + "JSONStream": "^1.0.4", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0" + }, + "bin": { + "conventional-commits-parser": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "packages/scratch-svg-renderer/node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "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" + }, + "engines": { + "node": ">=10" + } + }, + "packages/scratch-svg-renderer/node_modules/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "packages/scratch-svg-renderer/node_modules/env-ci": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/env-ci/-/env-ci-5.5.0.tgz", + "integrity": "sha512-o0JdWIbOLP+WJKIUt36hz1ImQQFuN92nhsfTkHHap+J8CiI8WgGpH/a9jEGHh4/TU5BUUGjlnKXNoDb57+ne+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^5.0.0", + "fromentries": "^1.3.2", + "java-properties": "^1.0.0" + }, + "engines": { + "node": ">=10.17" + } + }, + "packages/scratch-svg-renderer/node_modules/find-versions": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-4.0.0.tgz", + "integrity": "sha512-wgpWy002tA+wgmO27buH/9KzyEOQnKsG/R0yrcjPT9BOFm0zRBVQbZ95nRGXWMywS8YR5knRbpohio0bcJABxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver-regex": "^3.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/scratch-svg-renderer/node_modules/hook-std": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hook-std/-/hook-std-2.0.0.tgz", + "integrity": "sha512-zZ6T5WcuBMIUVh49iPQS9t977t7C0l7OtHrpeMb5uk48JdflRX0NSFvCekfYNmGQETnLq9W/isMyHl69kxGi8g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "packages/scratch-svg-renderer/node_modules/into-stream": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-6.0.0.tgz", + "integrity": "sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "from2": "^2.3.0", + "p-is-promise": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/scratch-svg-renderer/node_modules/issue-parser": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-6.0.0.tgz", + "integrity": "sha512-zKa/Dxq2lGsBIXQ7CUZWTHfvxPC2ej0KfO7fIPqLlHB9J2hJ7rGhZ5rilhuufylr4RXYPzJUeFjKxz305OsNlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash.capitalize": "^4.2.1", + "lodash.escaperegexp": "^4.1.2", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.uniqby": "^4.7.0" + }, + "engines": { + "node": ">=10.13" + } + }, + "packages/scratch-svg-renderer/node_modules/marked-terminal": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-5.2.0.tgz", + "integrity": "sha512-Piv6yNwAQXGFjZSaiNljyNFw7jKDdGrw70FSbtxEyldLsyeuV5ZHm/1wW++kWbrOF1VPnUgYOhB2oLL0ZpnekA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^6.2.0", + "cardinal": "^2.1.1", + "chalk": "^5.2.0", + "cli-table3": "^0.6.3", + "node-emoji": "^1.11.0", + "supports-hyperlinks": "^2.3.0" + }, + "engines": { + "node": ">=14.13.1 || >=16.0.0" + }, + "peerDependencies": { + "marked": "^1.0.0 || ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/marked-terminal/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" + } + }, + "packages/scratch-svg-renderer/node_modules/mime": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/mkdirp": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-2.1.6.tgz", + "integrity": "sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "packages/scratch-svg-renderer/node_modules/node-emoji": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", + "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4.17.21" + } + }, + "packages/scratch-svg-renderer/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" + } + }, + "packages/scratch-svg-renderer/node_modules/npm": { + "version": "8.19.4", + "resolved": "https://registry.npmjs.org/npm/-/npm-8.19.4.tgz", + "integrity": "sha512-3HANl8i9DKnUA89P4KEgVNN28EjSeDCmvEqbzOAuxCFDzdBZzjUl99zgnGpOUumvW5lvJo2HKcjrsc+tfyv1Hw==", + "bundleDependencies": [ + "@isaacs/string-locale-compare", + "@npmcli/arborist", + "@npmcli/ci-detect", + "@npmcli/config", + "@npmcli/fs", + "@npmcli/map-workspaces", + "@npmcli/package-json", + "@npmcli/run-script", + "abbrev", + "archy", + "cacache", + "chalk", + "chownr", + "cli-columns", + "cli-table3", + "columnify", + "fastest-levenshtein", + "fs-minipass", + "glob", + "graceful-fs", + "hosted-git-info", + "ini", + "init-package-json", + "is-cidr", + "json-parse-even-better-errors", + "libnpmaccess", + "libnpmdiff", + "libnpmexec", + "libnpmfund", + "libnpmhook", + "libnpmorg", + "libnpmpack", + "libnpmpublish", + "libnpmsearch", + "libnpmteam", + "libnpmversion", + "make-fetch-happen", + "minimatch", + "minipass", + "minipass-pipeline", + "mkdirp", + "mkdirp-infer-owner", + "ms", + "node-gyp", + "nopt", + "npm-audit-report", + "npm-install-checks", + "npm-package-arg", + "npm-pick-manifest", + "npm-profile", + "npm-registry-fetch", + "npm-user-validate", + "npmlog", + "opener", + "p-map", + "pacote", + "parse-conflict-json", + "proc-log", + "qrcode-terminal", + "read", + "read-package-json", + "read-package-json-fast", + "readdir-scoped-modules", + "rimraf", + "semver", + "ssri", + "tar", + "text-table", + "tiny-relative-date", + "treeverse", + "validate-npm-package-name", + "which", + "write-file-atomic" + ], + "dev": true, + "license": "Artistic-2.0", + "workspaces": [ + "docs", + "smoke-tests", + "workspaces/*" + ], + "dependencies": { + "@isaacs/string-locale-compare": "^1.1.0", + "@npmcli/arborist": "^5.6.3", + "@npmcli/ci-detect": "^2.0.0", + "@npmcli/config": "^4.2.1", + "@npmcli/fs": "^2.1.0", + "@npmcli/map-workspaces": "^2.0.3", + "@npmcli/package-json": "^2.0.0", + "@npmcli/run-script": "^4.2.1", + "abbrev": "~1.1.1", + "archy": "~1.0.0", + "cacache": "^16.1.3", + "chalk": "^4.1.2", + "chownr": "^2.0.0", + "cli-columns": "^4.0.0", + "cli-table3": "^0.6.2", + "columnify": "^1.6.0", + "fastest-levenshtein": "^1.0.12", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "graceful-fs": "^4.2.10", + "hosted-git-info": "^5.2.1", + "ini": "^3.0.1", + "init-package-json": "^3.0.2", + "is-cidr": "^4.0.2", + "json-parse-even-better-errors": "^2.3.1", + "libnpmaccess": "^6.0.4", + "libnpmdiff": "^4.0.5", + "libnpmexec": "^4.0.14", + "libnpmfund": "^3.0.5", + "libnpmhook": "^8.0.4", + "libnpmorg": "^4.0.4", + "libnpmpack": "^4.1.3", + "libnpmpublish": "^6.0.5", + "libnpmsearch": "^5.0.4", + "libnpmteam": "^4.0.4", + "libnpmversion": "^3.0.7", + "make-fetch-happen": "^10.2.0", + "minimatch": "^5.1.0", + "minipass": "^3.1.6", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "mkdirp-infer-owner": "^2.0.0", + "ms": "^2.1.2", + "node-gyp": "^9.1.0", + "nopt": "^6.0.0", + "npm-audit-report": "^3.0.0", + "npm-install-checks": "^5.0.0", + "npm-package-arg": "^9.1.0", + "npm-pick-manifest": "^7.0.2", + "npm-profile": "^6.2.0", + "npm-registry-fetch": "^13.3.1", + "npm-user-validate": "^1.0.1", + "npmlog": "^6.0.2", + "opener": "^1.5.2", + "p-map": "^4.0.0", + "pacote": "^13.6.2", + "parse-conflict-json": "^2.0.2", + "proc-log": "^2.0.1", + "qrcode-terminal": "^0.12.0", + "read": "~1.0.7", + "read-package-json": "^5.0.2", + "read-package-json-fast": "^2.0.3", + "readdir-scoped-modules": "^1.1.0", + "rimraf": "^3.0.2", + "semver": "^7.3.7", + "ssri": "^9.0.1", + "tar": "^6.1.11", + "text-table": "~0.2.0", + "tiny-relative-date": "^1.3.0", + "treeverse": "^2.0.0", + "validate-npm-package-name": "^4.0.0", + "which": "^2.0.2", + "write-file-atomic": "^4.0.1" + }, + "bin": { + "npm": "bin/npm-cli.js", + "npx": "bin/npx-cli.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/@colors/colors": { + "version": "1.5.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/@gar/promisify": { + "version": "1.1.3", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/@isaacs/string-locale-compare": { + "version": "1.1.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/@npmcli/arborist": { + "version": "5.6.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@isaacs/string-locale-compare": "^1.1.0", + "@npmcli/installed-package-contents": "^1.0.7", + "@npmcli/map-workspaces": "^2.0.3", + "@npmcli/metavuln-calculator": "^3.0.1", + "@npmcli/move-file": "^2.0.0", + "@npmcli/name-from-folder": "^1.0.1", + "@npmcli/node-gyp": "^2.0.0", + "@npmcli/package-json": "^2.0.0", + "@npmcli/query": "^1.2.0", + "@npmcli/run-script": "^4.1.3", + "bin-links": "^3.0.3", + "cacache": "^16.1.3", + "common-ancestor-path": "^1.0.1", + "hosted-git-info": "^5.2.1", + "json-parse-even-better-errors": "^2.3.1", + "json-stringify-nice": "^1.1.4", + "minimatch": "^5.1.0", + "mkdirp": "^1.0.4", + "mkdirp-infer-owner": "^2.0.0", + "nopt": "^6.0.0", + "npm-install-checks": "^5.0.0", + "npm-package-arg": "^9.0.0", + "npm-pick-manifest": "^7.0.2", + "npm-registry-fetch": "^13.0.0", + "npmlog": "^6.0.2", + "pacote": "^13.6.1", + "parse-conflict-json": "^2.0.1", + "proc-log": "^2.0.0", + "promise-all-reject-late": "^1.0.0", + "promise-call-limit": "^1.0.1", + "read-package-json-fast": "^2.0.2", + "readdir-scoped-modules": "^1.1.0", + "rimraf": "^3.0.2", + "semver": "^7.3.7", + "ssri": "^9.0.0", + "treeverse": "^2.0.0", + "walk-up-path": "^1.0.0" + }, + "bin": { + "arborist": "bin/index.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/@npmcli/ci-detect": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/@npmcli/config": { + "version": "4.2.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/map-workspaces": "^2.0.2", + "ini": "^3.0.0", + "mkdirp-infer-owner": "^2.0.0", + "nopt": "^6.0.0", + "proc-log": "^2.0.0", + "read-package-json-fast": "^2.0.3", + "semver": "^7.3.5", + "walk-up-path": "^1.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/@npmcli/disparity-colors": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "ansi-styles": "^4.3.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/@npmcli/fs": { + "version": "2.1.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/@npmcli/git": { + "version": "3.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/promise-spawn": "^3.0.0", + "lru-cache": "^7.4.4", + "mkdirp": "^1.0.4", + "npm-pick-manifest": "^7.0.0", + "proc-log": "^2.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^2.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/@npmcli/installed-package-contents": { + "version": "1.0.7", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-bundled": "^1.1.1", + "npm-normalize-package-bin": "^1.0.1" + }, + "bin": { + "installed-package-contents": "index.js" + }, + "engines": { + "node": ">= 10" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/@npmcli/installed-package-contents/node_modules/npm-bundled": { + "version": "1.1.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/@npmcli/map-workspaces": { + "version": "2.0.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/name-from-folder": "^1.0.1", + "glob": "^8.0.1", + "minimatch": "^5.0.1", + "read-package-json-fast": "^2.0.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/@npmcli/metavuln-calculator": { + "version": "3.1.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "cacache": "^16.0.0", + "json-parse-even-better-errors": "^2.3.1", + "pacote": "^13.0.3", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/@npmcli/move-file": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/@npmcli/name-from-folder": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/@npmcli/node-gyp": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/@npmcli/package-json": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "json-parse-even-better-errors": "^2.3.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/@npmcli/promise-spawn": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "infer-owner": "^1.0.4" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/@npmcli/query": { + "version": "1.2.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-package-arg": "^9.1.0", + "postcss-selector-parser": "^6.0.10", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/@npmcli/run-script": { + "version": "4.2.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/node-gyp": "^2.0.0", + "@npmcli/promise-spawn": "^3.0.0", + "node-gyp": "^9.0.0", + "read-package-json-fast": "^2.0.3", + "which": "^2.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/@tootallnate/once": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/abbrev": { + "version": "1.1.1", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/agent-base": { + "version": "6.0.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/agentkeepalive": { + "version": "4.2.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "depd": "^1.1.2", + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/aggregate-error": { + "version": "3.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/ansi-regex": { + "version": "5.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/aproba": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/archy": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/are-we-there-yet": { + "version": "3.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/asap": { + "version": "2.0.6", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/balanced-match": { + "version": "1.0.2", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/bin-links": { + "version": "3.0.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "cmd-shim": "^5.0.0", + "mkdirp-infer-owner": "^2.0.0", + "npm-normalize-package-bin": "^2.0.0", + "read-cmd-shim": "^3.0.0", + "rimraf": "^3.0.0", + "write-file-atomic": "^4.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/bin-links/node_modules/npm-normalize-package-bin": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/binary-extensions": { + "version": "2.2.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/brace-expansion": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/builtins": { + "version": "5.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "semver": "^7.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/cacache": { + "version": "16.1.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "inBundle": 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" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/chownr": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/cidr-regex": { + "version": "3.1.1", + "dev": true, + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "ip-regex": "^4.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/clean-stack": { + "version": "2.2.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/cli-columns": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/cli-table3": { + "version": "0.6.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/clone": { + "version": "1.0.4", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/cmd-shim": { + "version": "5.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "mkdirp-infer-owner": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/color-support": { + "version": "1.1.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "bin": { + "color-support": "bin.js" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/columnify": { + "version": "1.6.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "strip-ansi": "^6.0.1", + "wcwidth": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/common-ancestor-path": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/concat-map": { + "version": "0.0.1", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/console-control-strings": { + "version": "1.1.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/cssesc": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/debug": { + "version": "4.3.4", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/debug/node_modules/ms": { + "version": "2.1.2", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/debuglog": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/defaults": { + "version": "1.0.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "clone": "^1.0.2" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/delegates": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/depd": { + "version": "1.1.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/dezalgo": { + "version": "1.0.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/diff": { + "version": "5.1.0", + "dev": true, + "inBundle": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/encoding": { + "version": "0.1.13", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/env-paths": { + "version": "2.2.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/err-code": { + "version": "2.0.3", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/fastest-levenshtein": { + "version": "1.0.12", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/fs-minipass": { + "version": "2.1.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/fs.realpath": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/function-bind": { + "version": "1.1.1", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/gauge": { + "version": "4.0.4", + "dev": true, + "inBundle": 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": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/glob": { + "version": "8.0.3", + "dev": true, + "inBundle": 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" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/graceful-fs": { + "version": "4.2.10", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/has": { + "version": "1.0.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/has-unicode": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/hosted-git-info": { + "version": "5.2.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^7.5.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/http-cache-semantics": { + "version": "4.1.1", + "dev": true, + "inBundle": true, + "license": "BSD-2-Clause" + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/http-proxy-agent": { + "version": "5.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/https-proxy-agent": { + "version": "5.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/humanize-ms": { + "version": "1.2.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ms": "^2.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/iconv-lite": { + "version": "0.6.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/ignore-walk": { + "version": "5.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minimatch": "^5.0.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/imurmurhash": { + "version": "0.1.4", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/indent-string": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/infer-owner": { + "version": "1.0.4", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/inflight": { + "version": "1.0.6", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/inherits": { + "version": "2.0.4", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/ini": { + "version": "3.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/init-package-json": { + "version": "3.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-package-arg": "^9.0.1", + "promzard": "^0.3.0", + "read": "^1.0.7", + "read-package-json": "^5.0.0", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4", + "validate-npm-package-name": "^4.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/ip": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/ip-regex": { + "version": "4.3.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/is-cidr": { + "version": "4.0.2", + "dev": true, + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "cidr-regex": "^3.1.1" + }, + "engines": { + "node": ">=10" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/is-core-module": { + "version": "2.10.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/is-lambda": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/isexe": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/json-stringify-nice": { + "version": "1.1.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/jsonparse": { + "version": "1.3.1", + "dev": true, + "engines": [ + "node >= 0.2.0" + ], + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/just-diff": { + "version": "5.1.1", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/just-diff-apply": { + "version": "5.4.1", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/libnpmaccess": { + "version": "6.0.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^2.0.0", + "minipass": "^3.1.1", + "npm-package-arg": "^9.0.1", + "npm-registry-fetch": "^13.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/libnpmdiff": { + "version": "4.0.5", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/disparity-colors": "^2.0.0", + "@npmcli/installed-package-contents": "^1.0.7", + "binary-extensions": "^2.2.0", + "diff": "^5.1.0", + "minimatch": "^5.0.1", + "npm-package-arg": "^9.0.1", + "pacote": "^13.6.1", + "tar": "^6.1.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/libnpmexec": { + "version": "4.0.14", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/arborist": "^5.6.3", + "@npmcli/ci-detect": "^2.0.0", + "@npmcli/fs": "^2.1.1", + "@npmcli/run-script": "^4.2.0", + "chalk": "^4.1.0", + "mkdirp-infer-owner": "^2.0.0", + "npm-package-arg": "^9.0.1", + "npmlog": "^6.0.2", + "pacote": "^13.6.1", + "proc-log": "^2.0.0", + "read": "^1.0.7", + "read-package-json-fast": "^2.0.2", + "semver": "^7.3.7", + "walk-up-path": "^1.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/libnpmfund": { + "version": "3.0.5", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/arborist": "^5.6.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/libnpmhook": { + "version": "8.0.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^2.0.0", + "npm-registry-fetch": "^13.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/libnpmorg": { + "version": "4.0.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^2.0.0", + "npm-registry-fetch": "^13.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/libnpmpack": { + "version": "4.1.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/run-script": "^4.1.3", + "npm-package-arg": "^9.0.1", + "pacote": "^13.6.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/libnpmpublish": { + "version": "6.0.5", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "normalize-package-data": "^4.0.0", + "npm-package-arg": "^9.0.1", + "npm-registry-fetch": "^13.0.0", + "semver": "^7.3.7", + "ssri": "^9.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/libnpmsearch": { + "version": "5.0.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-registry-fetch": "^13.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/libnpmteam": { + "version": "4.0.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^2.0.0", + "npm-registry-fetch": "^13.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/libnpmversion": { + "version": "3.0.7", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^3.0.0", + "@npmcli/run-script": "^4.1.3", + "json-parse-even-better-errors": "^2.3.1", + "proc-log": "^2.0.0", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/lru-cache": { + "version": "7.13.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/make-fetch-happen": { + "version": "10.2.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^16.1.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^2.0.3", + "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": "^9.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/minimatch": { + "version": "5.1.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/minipass": { + "version": "3.3.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/minipass-collect": { + "version": "1.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/minipass-fetch": { + "version": "2.1.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/minipass-flush": { + "version": "1.0.5", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/minipass-json-stream": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "jsonparse": "^1.3.1", + "minipass": "^3.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/minipass-pipeline": { + "version": "1.2.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/minipass-sized": { + "version": "1.0.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/minizlib": { + "version": "2.1.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/mkdirp": { + "version": "1.0.4", + "dev": true, + "inBundle": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/mkdirp-infer-owner": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "infer-owner": "^1.0.4", + "mkdirp": "^1.0.3" + }, + "engines": { + "node": ">=10" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/ms": { + "version": "2.1.3", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/mute-stream": { + "version": "0.0.8", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/negotiator": { + "version": "0.6.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/node-gyp": { + "version": "9.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^10.0.3", + "nopt": "^5.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.22 || ^14.13 || >=16" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/node-gyp/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/node-gyp/node_modules/glob": { + "version": "7.2.3", + "dev": true, + "inBundle": 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" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/node-gyp/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/node-gyp/node_modules/nopt": { + "version": "5.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/nopt": { + "version": "6.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "abbrev": "^1.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/normalize-package-data": { + "version": "4.0.1", + "dev": true, + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^5.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/npm-audit-report": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "chalk": "^4.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/npm-bundled": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-normalize-package-bin": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/npm-bundled/node_modules/npm-normalize-package-bin": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/npm-install-checks": { + "version": "5.0.0", + "dev": true, + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "semver": "^7.1.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/npm-normalize-package-bin": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/npm-package-arg": { + "version": "9.1.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "hosted-git-info": "^5.0.0", + "proc-log": "^2.0.1", + "semver": "^7.3.5", + "validate-npm-package-name": "^4.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/npm-packlist": { + "version": "5.1.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "glob": "^8.0.1", + "ignore-walk": "^5.0.1", + "npm-bundled": "^2.0.0", + "npm-normalize-package-bin": "^2.0.0" + }, + "bin": { + "npm-packlist": "bin/index.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/npm-packlist/node_modules/npm-normalize-package-bin": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/npm-pick-manifest": { + "version": "7.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-install-checks": "^5.0.0", + "npm-normalize-package-bin": "^2.0.0", + "npm-package-arg": "^9.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/npm-pick-manifest/node_modules/npm-normalize-package-bin": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/npm-profile": { + "version": "6.2.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-registry-fetch": "^13.0.1", + "proc-log": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/npm-registry-fetch": { + "version": "13.3.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "make-fetch-happen": "^10.0.6", + "minipass": "^3.1.6", + "minipass-fetch": "^2.0.3", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.1.2", + "npm-package-arg": "^9.0.1", + "proc-log": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/npm-user-validate": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "BSD-2-Clause" + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/npmlog": { + "version": "6.0.2", + "dev": true, + "inBundle": 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" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/once": { + "version": "1.4.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/opener": { + "version": "1.5.2", + "dev": true, + "inBundle": true, + "license": "(WTFPL OR MIT)", + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/p-map": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/pacote": { + "version": "13.6.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^3.0.0", + "@npmcli/installed-package-contents": "^1.0.7", + "@npmcli/promise-spawn": "^3.0.0", + "@npmcli/run-script": "^4.1.0", + "cacache": "^16.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "infer-owner": "^1.0.4", + "minipass": "^3.1.6", + "mkdirp": "^1.0.4", + "npm-package-arg": "^9.0.0", + "npm-packlist": "^5.1.0", + "npm-pick-manifest": "^7.0.0", + "npm-registry-fetch": "^13.0.1", + "proc-log": "^2.0.0", + "promise-retry": "^2.0.1", + "read-package-json": "^5.0.0", + "read-package-json-fast": "^2.0.3", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11" + }, + "bin": { + "pacote": "lib/bin.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/parse-conflict-json": { + "version": "2.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "json-parse-even-better-errors": "^2.3.1", + "just-diff": "^5.0.1", + "just-diff-apply": "^5.2.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/path-is-absolute": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/postcss-selector-parser": { + "version": "6.0.10", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/proc-log": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/promise-all-reject-late": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/promise-call-limit": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/promise-inflight": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/promise-retry": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/promzard": { + "version": "0.3.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "read": "1" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/qrcode-terminal": { + "version": "0.12.0", + "dev": true, + "inBundle": true, + "bin": { + "qrcode-terminal": "bin/qrcode-terminal.js" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/read": { + "version": "1.0.7", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "mute-stream": "~0.0.4" + }, + "engines": { + "node": ">=0.8" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/read-cmd-shim": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/read-package-json": { + "version": "5.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "glob": "^8.0.1", + "json-parse-even-better-errors": "^2.3.1", + "normalize-package-data": "^4.0.0", + "npm-normalize-package-bin": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/read-package-json-fast": { + "version": "2.0.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "json-parse-even-better-errors": "^2.3.0", + "npm-normalize-package-bin": "^1.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/read-package-json/node_modules/npm-normalize-package-bin": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/readable-stream": { + "version": "3.6.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/readdir-scoped-modules": { + "version": "1.1.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "graceful-fs": "^4.1.2", + "once": "^1.3.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/retry": { + "version": "0.12.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/rimraf": { + "version": "3.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/rimraf/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "dev": true, + "inBundle": 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" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/rimraf/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/safe-buffer": { + "version": "5.2.1", + "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" + } + ], + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/safer-buffer": { + "version": "2.1.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/semver": { + "version": "7.3.7", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/set-blocking": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/signal-exit": { + "version": "3.0.7", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/smart-buffer": { + "version": "4.2.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/socks": { + "version": "2.7.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/socks-proxy-agent": { + "version": "7.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + }, + "engines": { + "node": ">= 10" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/spdx-correct": { + "version": "3.1.1", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/spdx-exceptions": { + "version": "2.3.0", + "dev": true, + "inBundle": true, + "license": "CC-BY-3.0" + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/spdx-expression-parse": { + "version": "3.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/spdx-license-ids": { + "version": "3.0.11", + "dev": true, + "inBundle": true, + "license": "CC0-1.0" + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/ssri": { + "version": "9.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/string_decoder": { + "version": "1.3.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/strip-ansi": { + "version": "6.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/tar": { + "version": "6.1.11", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/text-table": { + "version": "0.2.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/tiny-relative-date": { + "version": "1.3.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/treeverse": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/unique-filename": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "unique-slug": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/unique-slug": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/util-deprecate": { + "version": "1.0.2", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/validate-npm-package-license": { + "version": "3.0.4", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/validate-npm-package-name": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "builtins": "^5.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/walk-up-path": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/wcwidth": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/which": { + "version": "2.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/wide-align": { + "version": "1.1.5", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/wrappy": { + "version": "1.0.2", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/write-file-atomic": { + "version": "4.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-svg-renderer/node_modules/npm/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-svg-renderer/node_modules/p-each-series": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", + "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/scratch-svg-renderer/node_modules/p-filter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz", + "integrity": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-map": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "packages/scratch-svg-renderer/node_modules/p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "packages/scratch-svg-renderer/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": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "packages/scratch-svg-renderer/node_modules/semantic-release": { + "version": "19.0.5", + "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-19.0.5.tgz", + "integrity": "sha512-NMPKdfpXTnPn49FDogMBi36SiBfXkSOJqCkk0E4iWOY1tusvvgBwqUmxTX1kmlT6kIYed9YwNKD1sfPpqa5yaA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@semantic-release/commit-analyzer": "^9.0.2", + "@semantic-release/error": "^3.0.0", + "@semantic-release/github": "^8.0.0", + "@semantic-release/npm": "^9.0.0", + "@semantic-release/release-notes-generator": "^10.0.0", + "aggregate-error": "^3.0.0", + "cosmiconfig": "^7.0.0", + "debug": "^4.0.0", + "env-ci": "^5.0.0", + "execa": "^5.0.0", + "figures": "^3.0.0", + "find-versions": "^4.0.0", + "get-stream": "^6.0.0", + "git-log-parser": "^1.2.0", + "hook-std": "^2.0.0", + "hosted-git-info": "^4.0.0", + "lodash": "^4.17.21", + "marked": "^4.0.10", + "marked-terminal": "^5.0.0", + "micromatch": "^4.0.2", + "p-each-series": "^2.1.0", + "p-reduce": "^2.0.0", + "read-pkg-up": "^7.0.0", + "resolve-from": "^5.0.0", + "semver": "^7.3.2", + "semver-diff": "^3.1.1", + "signale": "^1.2.1", + "yargs": "^16.2.0" + }, + "bin": { + "semantic-release": "bin/semantic-release.js" + }, + "engines": { + "node": ">=16 || ^14.17" + } + }, + "packages/scratch-svg-renderer/node_modules/semver-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "packages/scratch-svg-renderer/node_modules/semver-diff/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": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "packages/scratch-svg-renderer/node_modules/semver-regex": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-3.1.4.tgz", + "integrity": "sha512-6IiqeZNgq01qGf0TId0t3NvKzSvUsjcpdEO3AQNeIjR6A2+ckTnQlDpl4qu1bjRv0RzN3FP9hzFmws3lKqRWkA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/scratch-svg-renderer/node_modules/supports-hyperlinks": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "packages/scratch-svg-renderer/node_modules/temp-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "packages/scratch-svg-renderer/node_modules/tempy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-1.0.1.tgz", + "integrity": "sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "del": "^6.0.0", + "is-stream": "^2.0.0", + "temp-dir": "^2.0.0", + "type-fest": "^0.16.0", + "unique-string": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/scratch-svg-renderer/node_modules/type-fest": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", + "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/scratch-svg-renderer/node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "packages/scratch-svg-renderer/node_modules/universal-user-agent": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", + "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==", + "dev": true, + "license": "ISC" + }, + "packages/scratch-svg-renderer/node_modules/url-join": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", + "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", + "dev": true, + "license": "MIT" + }, + "packages/scratch-svg-renderer/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "packages/scratch-svg-renderer/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "packages/scratch-vm": { + "name": "@scratch/scratch-vm", + "version": "12.3.1", + "license": "AGPL-3.0-only", + "dependencies": { + "@scratch/scratch-render": "12.3.1", + "@scratch/scratch-svg-renderer": "12.3.1", + "@vernier/godirect": "1.8.3", + "arraybuffer-loader": "1.0.8", + "atob": "2.1.2", + "btoa": "1.2.1", + "canvas-toBlob": "1.0.0", + "decode-html": "2.0.0", + "diff-match-patch": "1.0.5", + "format-message": "6.2.4", + "htmlparser2": "3.10.1", + "immutable": "3.8.2", + "jszip": "3.10.1", + "scratch-audio": "2.0.268", + "scratch-parser": "6.0.0", + "scratch-sb1-converter": "2.0.279", + "scratch-storage": "5.0.10", + "scratch-translate-extension-languages": "1.0.7", + "text-encoding": "0.7.0", + "tslog": "4.10.2", + "uuid": "8.3.2", + "web-worker": "1.3.0" + }, + "devDependencies": { + "@babel/core": "7.28.6", + "@babel/preset-env": "7.28.6", + "adm-zip": "0.4.11", + "babel-loader": "9.2.1", + "callsite": "1.0.0", + "copy-webpack-plugin": "6.4.1", + "docdash": "1.2.0", + "eslint": "9.39.2", + "eslint-config-scratch": "12.0.46", + "expose-loader": "1.0.3", + "file-loader": "6.2.0", + "format-message-cli": "6.2.4", + "globals": "16.5.0", + "in-publish": "2.0.1", + "js-md5": "0.7.3", + "jsdoc": "3.6.11", + "pngjs": "3.4.0", + "scratch-blocks": "1.3.0", + "scratch-l10n": "6.1.57", + "scratch-render-fonts": "1.0.252", + "scratch-semantic-release-config": "4.0.1", + "scratch-webpack-configuration": "3.1.0", + "script-loader": "0.7.2", + "semantic-release": "19.0.5", + "stats.js": "0.17.0", + "tap": "21.5.0", + "webpack": "5.104.1", + "webpack-cli": "4.10.0", + "webpack-dev-server": "5.2.3" + } + }, + "packages/scratch-vm/node_modules/@octokit/auth-token": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.4.tgz", + "integrity": "sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "packages/scratch-vm/node_modules/@octokit/core": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.2.4.tgz", + "integrity": "sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/auth-token": "^3.0.0", + "@octokit/graphql": "^5.0.0", + "@octokit/request": "^6.0.0", + "@octokit/request-error": "^3.0.0", + "@octokit/types": "^9.0.0", + "before-after-hook": "^2.2.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "packages/scratch-vm/node_modules/@octokit/endpoint": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.6.tgz", + "integrity": "sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/types": "^9.0.0", + "is-plain-object": "^5.0.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "packages/scratch-vm/node_modules/@octokit/graphql": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.6.tgz", + "integrity": "sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/request": "^6.0.0", + "@octokit/types": "^9.0.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "packages/scratch-vm/node_modules/@octokit/openapi-types": { + "version": "18.1.1", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.1.1.tgz", + "integrity": "sha512-VRaeH8nCDtF5aXWnjPuEMIYf1itK/s3JYyJcWFJT8X9pSNnBtriDf7wlEWsGuhPLl4QIH4xM8fqTXDwJ3Mu6sw==", + "dev": true, + "license": "MIT" + }, + "packages/scratch-vm/node_modules/@octokit/plugin-paginate-rest": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-6.1.2.tgz", + "integrity": "sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/tsconfig": "^1.0.2", + "@octokit/types": "^9.2.3" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "@octokit/core": ">=4" + } + }, + "packages/scratch-vm/node_modules/@octokit/plugin-retry": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-4.1.6.tgz", + "integrity": "sha512-obkYzIgEC75r8+9Pnfiiqy3y/x1bc3QLE5B7qvv9wi9Kj0R5tGQFC6QMBg1154WQ9lAVypuQDGyp3hNpp15gQQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/types": "^9.0.0", + "bottleneck": "^2.15.3" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "@octokit/core": ">=3" + } + }, + "packages/scratch-vm/node_modules/@octokit/plugin-throttling": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-5.2.3.tgz", + "integrity": "sha512-C9CFg9mrf6cugneKiaI841iG8DOv6P5XXkjmiNNut+swePxQ7RWEdAZRp5rJoE1hjsIqiYcKa/ZkOQ+ujPI39Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/types": "^9.0.0", + "bottleneck": "^2.15.3" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "@octokit/core": "^4.0.0" + } + }, + "packages/scratch-vm/node_modules/@octokit/request": { + "version": "6.2.8", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.8.tgz", + "integrity": "sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/endpoint": "^7.0.0", + "@octokit/request-error": "^3.0.0", + "@octokit/types": "^9.0.0", + "is-plain-object": "^5.0.0", + "node-fetch": "^2.6.7", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "packages/scratch-vm/node_modules/@octokit/request-error": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.3.tgz", + "integrity": "sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/types": "^9.0.0", + "deprecation": "^2.0.0", + "once": "^1.4.0" + }, + "engines": { + "node": ">= 14" + } + }, + "packages/scratch-vm/node_modules/@octokit/types": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz", + "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^18.0.0" + } + }, + "packages/scratch-vm/node_modules/@semantic-release/commit-analyzer": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/@semantic-release/commit-analyzer/-/commit-analyzer-9.0.2.tgz", + "integrity": "sha512-E+dr6L+xIHZkX4zNMe6Rnwg4YQrWNXK+rNsvwOPpdFppvZO1olE2fIgWhv89TkQErygevbjsZFSIxp+u6w2e5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "conventional-changelog-angular": "^5.0.0", + "conventional-commits-filter": "^2.0.0", + "conventional-commits-parser": "^3.2.3", + "debug": "^4.0.0", + "import-from": "^4.0.0", + "lodash": "^4.17.4", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=14.17" + }, + "peerDependencies": { + "semantic-release": ">=18.0.0-beta.1" + } + }, + "packages/scratch-vm/node_modules/@semantic-release/github": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-8.1.0.tgz", + "integrity": "sha512-erR9E5rpdsz0dW1I7785JtndQuMWN/iDcemcptf67tBNOmBUN0b2YNOgcjYUnBpgRpZ5ozfBHrK7Bz+2ets/Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/core": "^4.2.1", + "@octokit/plugin-paginate-rest": "^6.1.2", + "@octokit/plugin-retry": "^4.1.3", + "@octokit/plugin-throttling": "^5.2.3", + "@semantic-release/error": "^3.0.0", + "aggregate-error": "^3.0.0", + "debug": "^4.0.0", + "dir-glob": "^3.0.0", + "fs-extra": "^11.0.0", + "globby": "^11.0.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", + "issue-parser": "^6.0.0", + "lodash": "^4.17.4", + "mime": "^3.0.0", + "p-filter": "^2.0.0", + "url-join": "^4.0.0" + }, + "engines": { + "node": ">=14.17" + }, + "peerDependencies": { + "semantic-release": ">=18.0.0-beta.1" + } + }, + "packages/scratch-vm/node_modules/@semantic-release/npm": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-9.0.2.tgz", + "integrity": "sha512-zgsynF6McdzxPnFet+a4iO9HpAlARXOM5adz7VGVCvj0ne8wtL2ZOQoDV2wZPDmdEotDIbVeJjafhelZjs9j6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@semantic-release/error": "^3.0.0", + "aggregate-error": "^3.0.0", + "execa": "^5.0.0", + "fs-extra": "^11.0.0", + "lodash": "^4.17.15", + "nerf-dart": "^1.0.0", + "normalize-url": "^6.0.0", + "npm": "^8.3.0", + "rc": "^1.2.8", + "read-pkg": "^5.0.0", + "registry-auth-token": "^5.0.0", + "semver": "^7.1.2", + "tempy": "^1.0.0" + }, + "engines": { + "node": ">=16 || ^14.17" + }, + "peerDependencies": { + "semantic-release": ">=19.0.0" + } + }, + "packages/scratch-vm/node_modules/@semantic-release/release-notes-generator": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/@semantic-release/release-notes-generator/-/release-notes-generator-10.0.3.tgz", + "integrity": "sha512-k4x4VhIKneOWoBGHkx0qZogNjCldLPRiAjnIpMnlUh6PtaWXp/T+C9U7/TaNDDtgDa5HMbHl4WlREdxHio6/3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "conventional-changelog-angular": "^5.0.0", + "conventional-changelog-writer": "^5.0.0", + "conventional-commits-filter": "^2.0.0", + "conventional-commits-parser": "^3.2.3", + "debug": "^4.0.0", + "get-stream": "^6.0.0", + "import-from": "^4.0.0", + "into-stream": "^6.0.0", + "lodash": "^4.17.4", + "read-pkg-up": "^7.0.0" + }, + "engines": { + "node": ">=14.17" + }, + "peerDependencies": { + "semantic-release": ">=18.0.0-beta.1" + } + }, + "packages/scratch-vm/node_modules/@webpack-cli/configtest": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", + "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "webpack": "4.x.x || 5.x.x", + "webpack-cli": "4.x.x" + } + }, + "packages/scratch-vm/node_modules/@webpack-cli/info": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz", + "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "envinfo": "^7.7.3" + }, + "peerDependencies": { + "webpack-cli": "4.x.x" + } + }, + "packages/scratch-vm/node_modules/@webpack-cli/serve": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz", + "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "webpack-cli": "4.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } + }, + "packages/scratch-vm/node_modules/ansi-escapes": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.1.tgz", + "integrity": "sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/scratch-vm/node_modules/before-after-hook": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", + "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", + "dev": true, + "license": "Apache-2.0" + }, + "packages/scratch-vm/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" + } + }, + "packages/scratch-vm/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "packages/scratch-vm/node_modules/conventional-changelog-angular": { + "version": "5.0.13", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz", + "integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==", + "dev": true, + "license": "ISC", + "dependencies": { + "compare-func": "^2.0.0", + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "packages/scratch-vm/node_modules/conventional-changelog-writer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-5.0.1.tgz", + "integrity": "sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "conventional-commits-filter": "^2.0.7", + "dateformat": "^3.0.0", + "handlebars": "^4.7.7", + "json-stringify-safe": "^5.0.1", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "semver": "^6.0.0", + "split": "^1.0.0", + "through2": "^4.0.0" + }, + "bin": { + "conventional-changelog-writer": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "packages/scratch-vm/node_modules/conventional-changelog-writer/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": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "packages/scratch-vm/node_modules/conventional-commits-filter": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz", + "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash.ismatch": "^4.4.0", + "modify-values": "^1.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "packages/scratch-vm/node_modules/conventional-commits-parser": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz", + "integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-text-path": "^1.0.1", + "JSONStream": "^1.0.4", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0" + }, + "bin": { + "conventional-commits-parser": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "packages/scratch-vm/node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "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" + }, + "engines": { + "node": ">=10" + } + }, + "packages/scratch-vm/node_modules/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "packages/scratch-vm/node_modules/docdash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/docdash/-/docdash-1.2.0.tgz", + "integrity": "sha512-IYZbgYthPTspgqYeciRJNPhSwL51yer7HAwDXhF5p+H7mTDbPvY3PCk/QDjNxdPCpWkaJVFC4t7iCNB/t9E5Kw==", + "dev": true, + "license": "Apache-2.0" + }, + "packages/scratch-vm/node_modules/env-ci": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/env-ci/-/env-ci-5.5.0.tgz", + "integrity": "sha512-o0JdWIbOLP+WJKIUt36hz1ImQQFuN92nhsfTkHHap+J8CiI8WgGpH/a9jEGHh4/TU5BUUGjlnKXNoDb57+ne+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^5.0.0", + "fromentries": "^1.3.2", + "java-properties": "^1.0.0" + }, + "engines": { + "node": ">=10.17" + } + }, + "packages/scratch-vm/node_modules/find-versions": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-4.0.0.tgz", + "integrity": "sha512-wgpWy002tA+wgmO27buH/9KzyEOQnKsG/R0yrcjPT9BOFm0zRBVQbZ95nRGXWMywS8YR5knRbpohio0bcJABxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver-regex": "^3.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/scratch-vm/node_modules/hook-std": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hook-std/-/hook-std-2.0.0.tgz", + "integrity": "sha512-zZ6T5WcuBMIUVh49iPQS9t977t7C0l7OtHrpeMb5uk48JdflRX0NSFvCekfYNmGQETnLq9W/isMyHl69kxGi8g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "packages/scratch-vm/node_modules/interpret": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "packages/scratch-vm/node_modules/into-stream": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-6.0.0.tgz", + "integrity": "sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "from2": "^2.3.0", + "p-is-promise": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/scratch-vm/node_modules/issue-parser": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-6.0.0.tgz", + "integrity": "sha512-zKa/Dxq2lGsBIXQ7CUZWTHfvxPC2ej0KfO7fIPqLlHB9J2hJ7rGhZ5rilhuufylr4RXYPzJUeFjKxz305OsNlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash.capitalize": "^4.2.1", + "lodash.escaperegexp": "^4.1.2", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.uniqby": "^4.7.0" + }, + "engines": { + "node": ">=10.13" + } + }, + "packages/scratch-vm/node_modules/marked-terminal": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-5.2.0.tgz", + "integrity": "sha512-Piv6yNwAQXGFjZSaiNljyNFw7jKDdGrw70FSbtxEyldLsyeuV5ZHm/1wW++kWbrOF1VPnUgYOhB2oLL0ZpnekA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^6.2.0", + "cardinal": "^2.1.1", + "chalk": "^5.2.0", + "cli-table3": "^0.6.3", + "node-emoji": "^1.11.0", + "supports-hyperlinks": "^2.3.0" + }, + "engines": { + "node": ">=14.13.1 || >=16.0.0" + }, + "peerDependencies": { + "marked": "^1.0.0 || ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0" + } + }, + "packages/scratch-vm/node_modules/marked-terminal/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" + } + }, + "packages/scratch-vm/node_modules/mime": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "packages/scratch-vm/node_modules/node-emoji": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", + "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4.17.21" + } + }, + "packages/scratch-vm/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" + } + }, + "packages/scratch-vm/node_modules/npm": { + "version": "8.19.4", + "resolved": "https://registry.npmjs.org/npm/-/npm-8.19.4.tgz", + "integrity": "sha512-3HANl8i9DKnUA89P4KEgVNN28EjSeDCmvEqbzOAuxCFDzdBZzjUl99zgnGpOUumvW5lvJo2HKcjrsc+tfyv1Hw==", + "bundleDependencies": [ + "@isaacs/string-locale-compare", + "@npmcli/arborist", + "@npmcli/ci-detect", + "@npmcli/config", + "@npmcli/fs", + "@npmcli/map-workspaces", + "@npmcli/package-json", + "@npmcli/run-script", + "abbrev", + "archy", + "cacache", + "chalk", + "chownr", + "cli-columns", + "cli-table3", + "columnify", + "fastest-levenshtein", + "fs-minipass", + "glob", + "graceful-fs", + "hosted-git-info", + "ini", + "init-package-json", + "is-cidr", + "json-parse-even-better-errors", + "libnpmaccess", + "libnpmdiff", + "libnpmexec", + "libnpmfund", + "libnpmhook", + "libnpmorg", + "libnpmpack", + "libnpmpublish", + "libnpmsearch", + "libnpmteam", + "libnpmversion", + "make-fetch-happen", + "minimatch", + "minipass", + "minipass-pipeline", + "mkdirp", + "mkdirp-infer-owner", + "ms", + "node-gyp", + "nopt", + "npm-audit-report", + "npm-install-checks", + "npm-package-arg", + "npm-pick-manifest", + "npm-profile", + "npm-registry-fetch", + "npm-user-validate", + "npmlog", + "opener", + "p-map", + "pacote", + "parse-conflict-json", + "proc-log", + "qrcode-terminal", + "read", + "read-package-json", + "read-package-json-fast", + "readdir-scoped-modules", + "rimraf", + "semver", + "ssri", + "tar", + "text-table", + "tiny-relative-date", + "treeverse", + "validate-npm-package-name", + "which", + "write-file-atomic" + ], + "dev": true, + "license": "Artistic-2.0", + "workspaces": [ + "docs", + "smoke-tests", + "workspaces/*" + ], + "dependencies": { + "@isaacs/string-locale-compare": "^1.1.0", + "@npmcli/arborist": "^5.6.3", + "@npmcli/ci-detect": "^2.0.0", + "@npmcli/config": "^4.2.1", + "@npmcli/fs": "^2.1.0", + "@npmcli/map-workspaces": "^2.0.3", + "@npmcli/package-json": "^2.0.0", + "@npmcli/run-script": "^4.2.1", + "abbrev": "~1.1.1", + "archy": "~1.0.0", + "cacache": "^16.1.3", + "chalk": "^4.1.2", + "chownr": "^2.0.0", + "cli-columns": "^4.0.0", + "cli-table3": "^0.6.2", + "columnify": "^1.6.0", + "fastest-levenshtein": "^1.0.12", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "graceful-fs": "^4.2.10", + "hosted-git-info": "^5.2.1", + "ini": "^3.0.1", + "init-package-json": "^3.0.2", + "is-cidr": "^4.0.2", + "json-parse-even-better-errors": "^2.3.1", + "libnpmaccess": "^6.0.4", + "libnpmdiff": "^4.0.5", + "libnpmexec": "^4.0.14", + "libnpmfund": "^3.0.5", + "libnpmhook": "^8.0.4", + "libnpmorg": "^4.0.4", + "libnpmpack": "^4.1.3", + "libnpmpublish": "^6.0.5", + "libnpmsearch": "^5.0.4", + "libnpmteam": "^4.0.4", + "libnpmversion": "^3.0.7", + "make-fetch-happen": "^10.2.0", + "minimatch": "^5.1.0", + "minipass": "^3.1.6", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "mkdirp-infer-owner": "^2.0.0", + "ms": "^2.1.2", + "node-gyp": "^9.1.0", + "nopt": "^6.0.0", + "npm-audit-report": "^3.0.0", + "npm-install-checks": "^5.0.0", + "npm-package-arg": "^9.1.0", + "npm-pick-manifest": "^7.0.2", + "npm-profile": "^6.2.0", + "npm-registry-fetch": "^13.3.1", + "npm-user-validate": "^1.0.1", + "npmlog": "^6.0.2", + "opener": "^1.5.2", + "p-map": "^4.0.0", + "pacote": "^13.6.2", + "parse-conflict-json": "^2.0.2", + "proc-log": "^2.0.1", + "qrcode-terminal": "^0.12.0", + "read": "~1.0.7", + "read-package-json": "^5.0.2", + "read-package-json-fast": "^2.0.3", + "readdir-scoped-modules": "^1.1.0", + "rimraf": "^3.0.2", + "semver": "^7.3.7", + "ssri": "^9.0.1", + "tar": "^6.1.11", + "text-table": "~0.2.0", + "tiny-relative-date": "^1.3.0", + "treeverse": "^2.0.0", + "validate-npm-package-name": "^4.0.0", + "which": "^2.0.2", + "write-file-atomic": "^4.0.1" + }, + "bin": { + "npm": "bin/npm-cli.js", + "npx": "bin/npx-cli.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/@colors/colors": { + "version": "1.5.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/@gar/promisify": { + "version": "1.1.3", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-vm/node_modules/npm/node_modules/@isaacs/string-locale-compare": { + "version": "1.1.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-vm/node_modules/npm/node_modules/@npmcli/arborist": { + "version": "5.6.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@isaacs/string-locale-compare": "^1.1.0", + "@npmcli/installed-package-contents": "^1.0.7", + "@npmcli/map-workspaces": "^2.0.3", + "@npmcli/metavuln-calculator": "^3.0.1", + "@npmcli/move-file": "^2.0.0", + "@npmcli/name-from-folder": "^1.0.1", + "@npmcli/node-gyp": "^2.0.0", + "@npmcli/package-json": "^2.0.0", + "@npmcli/query": "^1.2.0", + "@npmcli/run-script": "^4.1.3", + "bin-links": "^3.0.3", + "cacache": "^16.1.3", + "common-ancestor-path": "^1.0.1", + "hosted-git-info": "^5.2.1", + "json-parse-even-better-errors": "^2.3.1", + "json-stringify-nice": "^1.1.4", + "minimatch": "^5.1.0", + "mkdirp": "^1.0.4", + "mkdirp-infer-owner": "^2.0.0", + "nopt": "^6.0.0", + "npm-install-checks": "^5.0.0", + "npm-package-arg": "^9.0.0", + "npm-pick-manifest": "^7.0.2", + "npm-registry-fetch": "^13.0.0", + "npmlog": "^6.0.2", + "pacote": "^13.6.1", + "parse-conflict-json": "^2.0.1", + "proc-log": "^2.0.0", + "promise-all-reject-late": "^1.0.0", + "promise-call-limit": "^1.0.1", + "read-package-json-fast": "^2.0.2", + "readdir-scoped-modules": "^1.1.0", + "rimraf": "^3.0.2", + "semver": "^7.3.7", + "ssri": "^9.0.0", + "treeverse": "^2.0.0", + "walk-up-path": "^1.0.0" + }, + "bin": { + "arborist": "bin/index.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/@npmcli/ci-detect": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/@npmcli/config": { + "version": "4.2.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/map-workspaces": "^2.0.2", + "ini": "^3.0.0", + "mkdirp-infer-owner": "^2.0.0", + "nopt": "^6.0.0", + "proc-log": "^2.0.0", + "read-package-json-fast": "^2.0.3", + "semver": "^7.3.5", + "walk-up-path": "^1.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/@npmcli/disparity-colors": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "ansi-styles": "^4.3.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/@npmcli/fs": { + "version": "2.1.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/@npmcli/git": { + "version": "3.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/promise-spawn": "^3.0.0", + "lru-cache": "^7.4.4", + "mkdirp": "^1.0.4", + "npm-pick-manifest": "^7.0.0", + "proc-log": "^2.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^2.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/@npmcli/installed-package-contents": { + "version": "1.0.7", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-bundled": "^1.1.1", + "npm-normalize-package-bin": "^1.0.1" + }, + "bin": { + "installed-package-contents": "index.js" + }, + "engines": { + "node": ">= 10" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/@npmcli/installed-package-contents/node_modules/npm-bundled": { + "version": "1.1.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/@npmcli/map-workspaces": { + "version": "2.0.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/name-from-folder": "^1.0.1", + "glob": "^8.0.1", + "minimatch": "^5.0.1", + "read-package-json-fast": "^2.0.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/@npmcli/metavuln-calculator": { + "version": "3.1.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "cacache": "^16.0.0", + "json-parse-even-better-errors": "^2.3.1", + "pacote": "^13.0.3", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/@npmcli/move-file": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/@npmcli/name-from-folder": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-vm/node_modules/npm/node_modules/@npmcli/node-gyp": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/@npmcli/package-json": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "json-parse-even-better-errors": "^2.3.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/@npmcli/promise-spawn": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "infer-owner": "^1.0.4" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/@npmcli/query": { + "version": "1.2.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-package-arg": "^9.1.0", + "postcss-selector-parser": "^6.0.10", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/@npmcli/run-script": { + "version": "4.2.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/node-gyp": "^2.0.0", + "@npmcli/promise-spawn": "^3.0.0", + "node-gyp": "^9.0.0", + "read-package-json-fast": "^2.0.3", + "which": "^2.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/@tootallnate/once": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/abbrev": { + "version": "1.1.1", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-vm/node_modules/npm/node_modules/agent-base": { + "version": "6.0.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/agentkeepalive": { + "version": "4.2.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "depd": "^1.1.2", + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/aggregate-error": { + "version": "3.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/ansi-regex": { + "version": "5.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/aproba": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-vm/node_modules/npm/node_modules/archy": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-vm/node_modules/npm/node_modules/are-we-there-yet": { + "version": "3.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/asap": { + "version": "2.0.6", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-vm/node_modules/npm/node_modules/balanced-match": { + "version": "1.0.2", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-vm/node_modules/npm/node_modules/bin-links": { + "version": "3.0.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "cmd-shim": "^5.0.0", + "mkdirp-infer-owner": "^2.0.0", + "npm-normalize-package-bin": "^2.0.0", + "read-cmd-shim": "^3.0.0", + "rimraf": "^3.0.0", + "write-file-atomic": "^4.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/bin-links/node_modules/npm-normalize-package-bin": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/binary-extensions": { + "version": "2.2.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/brace-expansion": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/builtins": { + "version": "5.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "semver": "^7.0.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/cacache": { + "version": "16.1.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "inBundle": 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" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/chownr": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/cidr-regex": { + "version": "3.1.1", + "dev": true, + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "ip-regex": "^4.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/clean-stack": { + "version": "2.2.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/cli-columns": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/cli-table3": { + "version": "0.6.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/clone": { + "version": "1.0.4", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/cmd-shim": { + "version": "5.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "mkdirp-infer-owner": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-vm/node_modules/npm/node_modules/color-support": { + "version": "1.1.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "bin": { + "color-support": "bin.js" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/columnify": { + "version": "1.6.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "strip-ansi": "^6.0.1", + "wcwidth": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/common-ancestor-path": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-vm/node_modules/npm/node_modules/concat-map": { + "version": "0.0.1", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-vm/node_modules/npm/node_modules/console-control-strings": { + "version": "1.1.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-vm/node_modules/npm/node_modules/cssesc": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/debug": { + "version": "4.3.4", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/debug/node_modules/ms": { + "version": "2.1.2", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-vm/node_modules/npm/node_modules/debuglog": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/defaults": { + "version": "1.0.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "clone": "^1.0.2" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/delegates": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-vm/node_modules/npm/node_modules/depd": { + "version": "1.1.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/dezalgo": { + "version": "1.0.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/diff": { + "version": "5.1.0", + "dev": true, + "inBundle": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-vm/node_modules/npm/node_modules/encoding": { + "version": "0.1.13", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/env-paths": { + "version": "2.2.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/err-code": { + "version": "2.0.3", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-vm/node_modules/npm/node_modules/fastest-levenshtein": { + "version": "1.0.12", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-vm/node_modules/npm/node_modules/fs-minipass": { + "version": "2.1.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/fs.realpath": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-vm/node_modules/npm/node_modules/function-bind": { + "version": "1.1.1", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-vm/node_modules/npm/node_modules/gauge": { + "version": "4.0.4", + "dev": true, + "inBundle": 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": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/glob": { + "version": "8.0.3", + "dev": true, + "inBundle": 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" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/graceful-fs": { + "version": "4.2.10", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-vm/node_modules/npm/node_modules/has": { + "version": "1.0.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/has-unicode": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-vm/node_modules/npm/node_modules/hosted-git-info": { + "version": "5.2.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^7.5.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/http-cache-semantics": { + "version": "4.1.1", + "dev": true, + "inBundle": true, + "license": "BSD-2-Clause" + }, + "packages/scratch-vm/node_modules/npm/node_modules/http-proxy-agent": { + "version": "5.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/https-proxy-agent": { + "version": "5.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/humanize-ms": { + "version": "1.2.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ms": "^2.0.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/iconv-lite": { + "version": "0.6.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/ignore-walk": { + "version": "5.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minimatch": "^5.0.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/imurmurhash": { + "version": "0.1.4", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/indent-string": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/infer-owner": { + "version": "1.0.4", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-vm/node_modules/npm/node_modules/inflight": { + "version": "1.0.6", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/inherits": { + "version": "2.0.4", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-vm/node_modules/npm/node_modules/ini": { + "version": "3.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/init-package-json": { + "version": "3.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-package-arg": "^9.0.1", + "promzard": "^0.3.0", + "read": "^1.0.7", + "read-package-json": "^5.0.0", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4", + "validate-npm-package-name": "^4.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/ip": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-vm/node_modules/npm/node_modules/ip-regex": { + "version": "4.3.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/is-cidr": { + "version": "4.0.2", + "dev": true, + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "cidr-regex": "^3.1.1" + }, + "engines": { + "node": ">=10" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/is-core-module": { + "version": "2.10.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/is-lambda": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-vm/node_modules/npm/node_modules/isexe": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-vm/node_modules/npm/node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-vm/node_modules/npm/node_modules/json-stringify-nice": { + "version": "1.1.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/jsonparse": { + "version": "1.3.1", + "dev": true, + "engines": [ + "node >= 0.2.0" + ], + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-vm/node_modules/npm/node_modules/just-diff": { + "version": "5.1.1", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-vm/node_modules/npm/node_modules/just-diff-apply": { + "version": "5.4.1", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-vm/node_modules/npm/node_modules/libnpmaccess": { + "version": "6.0.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^2.0.0", + "minipass": "^3.1.1", + "npm-package-arg": "^9.0.1", + "npm-registry-fetch": "^13.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/libnpmdiff": { + "version": "4.0.5", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/disparity-colors": "^2.0.0", + "@npmcli/installed-package-contents": "^1.0.7", + "binary-extensions": "^2.2.0", + "diff": "^5.1.0", + "minimatch": "^5.0.1", + "npm-package-arg": "^9.0.1", + "pacote": "^13.6.1", + "tar": "^6.1.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/libnpmexec": { + "version": "4.0.14", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/arborist": "^5.6.3", + "@npmcli/ci-detect": "^2.0.0", + "@npmcli/fs": "^2.1.1", + "@npmcli/run-script": "^4.2.0", + "chalk": "^4.1.0", + "mkdirp-infer-owner": "^2.0.0", + "npm-package-arg": "^9.0.1", + "npmlog": "^6.0.2", + "pacote": "^13.6.1", + "proc-log": "^2.0.0", + "read": "^1.0.7", + "read-package-json-fast": "^2.0.2", + "semver": "^7.3.7", + "walk-up-path": "^1.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/libnpmfund": { + "version": "3.0.5", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/arborist": "^5.6.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/libnpmhook": { + "version": "8.0.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^2.0.0", + "npm-registry-fetch": "^13.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/libnpmorg": { + "version": "4.0.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^2.0.0", + "npm-registry-fetch": "^13.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/libnpmpack": { + "version": "4.1.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/run-script": "^4.1.3", + "npm-package-arg": "^9.0.1", + "pacote": "^13.6.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/libnpmpublish": { + "version": "6.0.5", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "normalize-package-data": "^4.0.0", + "npm-package-arg": "^9.0.1", + "npm-registry-fetch": "^13.0.0", + "semver": "^7.3.7", + "ssri": "^9.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/libnpmsearch": { + "version": "5.0.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-registry-fetch": "^13.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/libnpmteam": { + "version": "4.0.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^2.0.0", + "npm-registry-fetch": "^13.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/libnpmversion": { + "version": "3.0.7", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^3.0.0", + "@npmcli/run-script": "^4.1.3", + "json-parse-even-better-errors": "^2.3.1", + "proc-log": "^2.0.0", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/lru-cache": { + "version": "7.13.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/make-fetch-happen": { + "version": "10.2.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^16.1.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^2.0.3", + "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": "^9.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/minimatch": { + "version": "5.1.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/minipass": { + "version": "3.3.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/minipass-collect": { + "version": "1.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/minipass-fetch": { + "version": "2.1.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/minipass-flush": { + "version": "1.0.5", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/minipass-json-stream": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "jsonparse": "^1.3.1", + "minipass": "^3.0.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/minipass-pipeline": { + "version": "1.2.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/minipass-sized": { + "version": "1.0.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/minizlib": { + "version": "2.1.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/mkdirp": { + "version": "1.0.4", + "dev": true, + "inBundle": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/mkdirp-infer-owner": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "infer-owner": "^1.0.4", + "mkdirp": "^1.0.3" + }, + "engines": { + "node": ">=10" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/ms": { + "version": "2.1.3", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-vm/node_modules/npm/node_modules/mute-stream": { + "version": "0.0.8", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-vm/node_modules/npm/node_modules/negotiator": { + "version": "0.6.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/node-gyp": { + "version": "9.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^10.0.3", + "nopt": "^5.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.22 || ^14.13 || >=16" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/node-gyp/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/node-gyp/node_modules/glob": { + "version": "7.2.3", + "dev": true, + "inBundle": 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" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/node-gyp/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/node-gyp/node_modules/nopt": { + "version": "5.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/nopt": { + "version": "6.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "abbrev": "^1.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/normalize-package-data": { + "version": "4.0.1", + "dev": true, + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^5.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/npm-audit-report": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "chalk": "^4.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/npm-bundled": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-normalize-package-bin": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/npm-bundled/node_modules/npm-normalize-package-bin": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/npm-install-checks": { + "version": "5.0.0", + "dev": true, + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "semver": "^7.1.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/npm-normalize-package-bin": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-vm/node_modules/npm/node_modules/npm-package-arg": { + "version": "9.1.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "hosted-git-info": "^5.0.0", + "proc-log": "^2.0.1", + "semver": "^7.3.5", + "validate-npm-package-name": "^4.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/npm-packlist": { + "version": "5.1.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "glob": "^8.0.1", + "ignore-walk": "^5.0.1", + "npm-bundled": "^2.0.0", + "npm-normalize-package-bin": "^2.0.0" + }, + "bin": { + "npm-packlist": "bin/index.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/npm-packlist/node_modules/npm-normalize-package-bin": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/npm-pick-manifest": { + "version": "7.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-install-checks": "^5.0.0", + "npm-normalize-package-bin": "^2.0.0", + "npm-package-arg": "^9.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/npm-pick-manifest/node_modules/npm-normalize-package-bin": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/npm-profile": { + "version": "6.2.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-registry-fetch": "^13.0.1", + "proc-log": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/npm-registry-fetch": { + "version": "13.3.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "make-fetch-happen": "^10.0.6", + "minipass": "^3.1.6", + "minipass-fetch": "^2.0.3", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.1.2", + "npm-package-arg": "^9.0.1", + "proc-log": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/npm-user-validate": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "BSD-2-Clause" + }, + "packages/scratch-vm/node_modules/npm/node_modules/npmlog": { + "version": "6.0.2", + "dev": true, + "inBundle": 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" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/once": { + "version": "1.4.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/opener": { + "version": "1.5.2", + "dev": true, + "inBundle": true, + "license": "(WTFPL OR MIT)", + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/p-map": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/pacote": { + "version": "13.6.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^3.0.0", + "@npmcli/installed-package-contents": "^1.0.7", + "@npmcli/promise-spawn": "^3.0.0", + "@npmcli/run-script": "^4.1.0", + "cacache": "^16.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "infer-owner": "^1.0.4", + "minipass": "^3.1.6", + "mkdirp": "^1.0.4", + "npm-package-arg": "^9.0.0", + "npm-packlist": "^5.1.0", + "npm-pick-manifest": "^7.0.0", + "npm-registry-fetch": "^13.0.1", + "proc-log": "^2.0.0", + "promise-retry": "^2.0.1", + "read-package-json": "^5.0.0", + "read-package-json-fast": "^2.0.3", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11" + }, + "bin": { + "pacote": "lib/bin.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/parse-conflict-json": { + "version": "2.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "json-parse-even-better-errors": "^2.3.1", + "just-diff": "^5.0.1", + "just-diff-apply": "^5.2.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/path-is-absolute": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/postcss-selector-parser": { + "version": "6.0.10", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/proc-log": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/promise-all-reject-late": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/promise-call-limit": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/promise-inflight": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-vm/node_modules/npm/node_modules/promise-retry": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/promzard": { + "version": "0.3.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "read": "1" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/qrcode-terminal": { + "version": "0.12.0", + "dev": true, + "inBundle": true, + "bin": { + "qrcode-terminal": "bin/qrcode-terminal.js" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/read": { + "version": "1.0.7", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "mute-stream": "~0.0.4" + }, + "engines": { + "node": ">=0.8" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/read-cmd-shim": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/read-package-json": { + "version": "5.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "glob": "^8.0.1", + "json-parse-even-better-errors": "^2.3.1", + "normalize-package-data": "^4.0.0", + "npm-normalize-package-bin": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/read-package-json-fast": { + "version": "2.0.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "json-parse-even-better-errors": "^2.3.0", + "npm-normalize-package-bin": "^1.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/read-package-json/node_modules/npm-normalize-package-bin": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/readable-stream": { + "version": "3.6.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/readdir-scoped-modules": { + "version": "1.1.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "graceful-fs": "^4.1.2", + "once": "^1.3.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/retry": { + "version": "0.12.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/rimraf": { + "version": "3.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/rimraf/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "dev": true, + "inBundle": 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" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/rimraf/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/safe-buffer": { + "version": "5.2.1", + "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" + } + ], + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-vm/node_modules/npm/node_modules/safer-buffer": { + "version": "2.1.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true + }, + "packages/scratch-vm/node_modules/npm/node_modules/semver": { + "version": "7.3.7", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/set-blocking": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-vm/node_modules/npm/node_modules/signal-exit": { + "version": "3.0.7", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-vm/node_modules/npm/node_modules/smart-buffer": { + "version": "4.2.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/socks": { + "version": "2.7.0", + "dev": true, + "inBundle": true, + "license": "MIT", "dependencies": { - "@scratch/scratch-render": "12.3.1", - "@scratch/scratch-svg-renderer": "12.3.1", - "@vernier/godirect": "1.8.3", - "arraybuffer-loader": "1.0.8", - "atob": "2.1.2", - "btoa": "1.2.1", - "canvas-toBlob": "1.0.0", - "decode-html": "2.0.0", - "diff-match-patch": "1.0.5", - "format-message": "6.2.4", - "htmlparser2": "3.10.1", - "immutable": "3.8.2", - "jszip": "3.10.1", - "scratch-audio": "2.0.268", - "scratch-parser": "6.0.0", - "scratch-sb1-converter": "2.0.279", - "scratch-storage": "5.0.10", - "scratch-translate-extension-languages": "1.0.7", - "text-encoding": "0.7.0", - "tslog": "4.10.2", - "uuid": "8.3.2", - "web-worker": "1.3.0" + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" }, - "devDependencies": { - "@babel/core": "7.28.6", - "@babel/preset-env": "7.28.6", - "adm-zip": "0.4.11", - "babel-loader": "9.2.1", - "callsite": "1.0.0", - "copy-webpack-plugin": "6.4.1", - "docdash": "1.2.0", - "eslint": "9.39.2", - "eslint-config-scratch": "12.0.46", - "expose-loader": "1.0.3", - "file-loader": "6.2.0", - "format-message-cli": "6.2.4", - "globals": "16.5.0", - "in-publish": "2.0.1", - "js-md5": "0.7.3", - "jsdoc": "3.6.11", - "pngjs": "3.4.0", - "scratch-blocks": "1.3.0", - "scratch-l10n": "6.1.57", - "scratch-render-fonts": "1.0.252", - "scratch-semantic-release-config": "4.0.0", - "scratch-webpack-configuration": "3.1.0", - "script-loader": "0.7.2", - "semantic-release": "19.0.5", - "stats.js": "0.17.0", - "tap": "21.5.0", - "webpack": "5.104.1", - "webpack-cli": "4.10.0", - "webpack-dev-server": "5.2.3" + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" } }, - "packages/scratch-vm/node_modules/@webpack-cli/configtest": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", - "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", + "packages/scratch-vm/node_modules/npm/node_modules/socks-proxy-agent": { + "version": "7.0.0", "dev": true, + "inBundle": true, "license": "MIT", - "peerDependencies": { - "webpack": "4.x.x || 5.x.x", - "webpack-cli": "4.x.x" + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + }, + "engines": { + "node": ">= 10" } }, - "packages/scratch-vm/node_modules/@webpack-cli/info": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz", - "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==", + "packages/scratch-vm/node_modules/npm/node_modules/spdx-correct": { + "version": "3.1.1", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/spdx-exceptions": { + "version": "2.3.0", + "dev": true, + "inBundle": true, + "license": "CC-BY-3.0" + }, + "packages/scratch-vm/node_modules/npm/node_modules/spdx-expression-parse": { + "version": "3.0.1", "dev": true, + "inBundle": true, "license": "MIT", "dependencies": { - "envinfo": "^7.7.3" + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/spdx-license-ids": { + "version": "3.0.11", + "dev": true, + "inBundle": true, + "license": "CC0-1.0" + }, + "packages/scratch-vm/node_modules/npm/node_modules/ssri": { + "version": "9.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.1.1" }, - "peerDependencies": { - "webpack-cli": "4.x.x" + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "packages/scratch-vm/node_modules/@webpack-cli/serve": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz", - "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", + "packages/scratch-vm/node_modules/npm/node_modules/string_decoder": { + "version": "1.3.0", "dev": true, + "inBundle": true, "license": "MIT", - "peerDependencies": { - "webpack-cli": "4.x.x" + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, - "peerDependenciesMeta": { - "webpack-dev-server": { - "optional": true - } + "engines": { + "node": ">=8" } }, - "packages/scratch-vm/node_modules/commander": { + "packages/scratch-vm/node_modules/npm/node_modules/strip-ansi": { + "version": "6.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "dev": true, + "inBundle": true, "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/tar": { + "version": "6.1.11", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, "engines": { "node": ">= 10" } }, - "packages/scratch-vm/node_modules/docdash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/docdash/-/docdash-1.2.0.tgz", - "integrity": "sha512-IYZbgYthPTspgqYeciRJNPhSwL51yer7HAwDXhF5p+H7mTDbPvY3PCk/QDjNxdPCpWkaJVFC4t7iCNB/t9E5Kw==", + "packages/scratch-vm/node_modules/npm/node_modules/text-table": { + "version": "0.2.0", "dev": true, - "license": "Apache-2.0" + "inBundle": true, + "license": "MIT" }, - "packages/scratch-vm/node_modules/interpret": { + "packages/scratch-vm/node_modules/npm/node_modules/tiny-relative-date": { + "version": "1.3.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-vm/node_modules/npm/node_modules/treeverse": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/unique-filename": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "unique-slug": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/unique-slug": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/util-deprecate": { + "version": "1.0.2", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "packages/scratch-vm/node_modules/npm/node_modules/validate-npm-package-license": { + "version": "3.0.4", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/validate-npm-package-name": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "builtins": "^5.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/walk-up-path": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-vm/node_modules/npm/node_modules/wcwidth": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/which": { + "version": "2.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/wide-align": { + "version": "1.1.5", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/wrappy": { + "version": "1.0.2", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-vm/node_modules/npm/node_modules/write-file-atomic": { + "version": "4.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/scratch-vm/node_modules/npm/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "packages/scratch-vm/node_modules/p-each-series": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", - "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", + "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.10" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/scratch-vm/node_modules/p-filter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz", + "integrity": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-map": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "packages/scratch-vm/node_modules/p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" } }, "packages/scratch-vm/node_modules/rechoir": { @@ -41782,6 +56483,169 @@ "node": ">= 0.10" } }, + "packages/scratch-vm/node_modules/semantic-release": { + "version": "19.0.5", + "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-19.0.5.tgz", + "integrity": "sha512-NMPKdfpXTnPn49FDogMBi36SiBfXkSOJqCkk0E4iWOY1tusvvgBwqUmxTX1kmlT6kIYed9YwNKD1sfPpqa5yaA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@semantic-release/commit-analyzer": "^9.0.2", + "@semantic-release/error": "^3.0.0", + "@semantic-release/github": "^8.0.0", + "@semantic-release/npm": "^9.0.0", + "@semantic-release/release-notes-generator": "^10.0.0", + "aggregate-error": "^3.0.0", + "cosmiconfig": "^7.0.0", + "debug": "^4.0.0", + "env-ci": "^5.0.0", + "execa": "^5.0.0", + "figures": "^3.0.0", + "find-versions": "^4.0.0", + "get-stream": "^6.0.0", + "git-log-parser": "^1.2.0", + "hook-std": "^2.0.0", + "hosted-git-info": "^4.0.0", + "lodash": "^4.17.21", + "marked": "^4.0.10", + "marked-terminal": "^5.0.0", + "micromatch": "^4.0.2", + "p-each-series": "^2.1.0", + "p-reduce": "^2.0.0", + "read-pkg-up": "^7.0.0", + "resolve-from": "^5.0.0", + "semver": "^7.3.2", + "semver-diff": "^3.1.1", + "signale": "^1.2.1", + "yargs": "^16.2.0" + }, + "bin": { + "semantic-release": "bin/semantic-release.js" + }, + "engines": { + "node": ">=16 || ^14.17" + } + }, + "packages/scratch-vm/node_modules/semver-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "packages/scratch-vm/node_modules/semver-diff/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": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "packages/scratch-vm/node_modules/semver-regex": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-3.1.4.tgz", + "integrity": "sha512-6IiqeZNgq01qGf0TId0t3NvKzSvUsjcpdEO3AQNeIjR6A2+ckTnQlDpl4qu1bjRv0RzN3FP9hzFmws3lKqRWkA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/scratch-vm/node_modules/supports-hyperlinks": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "packages/scratch-vm/node_modules/temp-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "packages/scratch-vm/node_modules/tempy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-1.0.1.tgz", + "integrity": "sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "del": "^6.0.0", + "is-stream": "^2.0.0", + "temp-dir": "^2.0.0", + "type-fest": "^0.16.0", + "unique-string": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/scratch-vm/node_modules/type-fest": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", + "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/scratch-vm/node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "packages/scratch-vm/node_modules/universal-user-agent": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", + "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==", + "dev": true, + "license": "ISC" + }, + "packages/scratch-vm/node_modules/url-join": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", + "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", + "dev": true, + "license": "MIT" + }, "packages/scratch-vm/node_modules/webpack-cli": { "version": "4.10.0", "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz", @@ -41830,6 +56694,35 @@ } } }, + "packages/scratch-vm/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "packages/scratch-vm/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, "packages/task-herder": { "name": "@scratch/task-herder", "version": "12.3.1", diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index e384eebdf3d..52102eeeb59 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -167,7 +167,7 @@ "react-test-renderer": "18.3.1", "redux-mock-store": "1.5.5", "rimraf": "2.7.1", - "scratch-semantic-release-config": "4.0.0", + "scratch-semantic-release-config": "4.0.1", "scratch-webpack-configuration": "3.1.0", "selenium-webdriver": "3.6.0", "semantic-release": "19.0.5", diff --git a/packages/scratch-render/package.json b/packages/scratch-render/package.json index 8e0035e9a8b..510515e60ca 100644 --- a/packages/scratch-render/package.json +++ b/packages/scratch-render/package.json @@ -74,7 +74,7 @@ "jsdoc": "3.6.11", "playwright-chromium": "1.57.0", "scratch-render-fonts": "1.0.252", - "scratch-semantic-release-config": "4.0.0", + "scratch-semantic-release-config": "4.0.1", "scratch-storage": "5.0.10", "scratch-webpack-configuration": "3.1.0", "semantic-release": "19.0.5", diff --git a/packages/scratch-svg-renderer/package.json b/packages/scratch-svg-renderer/package.json index 2a117cc001a..376cf16cf50 100644 --- a/packages/scratch-svg-renderer/package.json +++ b/packages/scratch-svg-renderer/package.json @@ -59,7 +59,7 @@ "mkdirp": "2.1.6", "rimraf": "3.0.2", "scratch-render-fonts": "1.0.252", - "scratch-semantic-release-config": "4.0.0", + "scratch-semantic-release-config": "4.0.1", "scratch-webpack-configuration": "3.1.0", "semantic-release": "19.0.5", "tap": "21.5.0", diff --git a/packages/scratch-vm/package.json b/packages/scratch-vm/package.json index e8954e2bcba..0eccc042a6d 100644 --- a/packages/scratch-vm/package.json +++ b/packages/scratch-vm/package.json @@ -96,7 +96,7 @@ "scratch-blocks": "1.3.0", "scratch-l10n": "6.1.57", "scratch-render-fonts": "1.0.252", - "scratch-semantic-release-config": "4.0.0", + "scratch-semantic-release-config": "4.0.1", "scratch-webpack-configuration": "3.1.0", "script-loader": "0.7.2", "semantic-release": "19.0.5", From 30d9f99bf8815984e7c64307b883e9b0aac28817 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 22 Jan 2026 05:23:02 +0000 Subject: [PATCH 182/521] fix(deps): update dependency isomorphic-dompurify to v2.35.0 (#323) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 359 +++++++++++++++------ packages/scratch-svg-renderer/package.json | 2 +- 2 files changed, 269 insertions(+), 92 deletions(-) diff --git a/package-lock.json b/package-lock.json index 32850c45727..774f51fef3c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,6 +25,12 @@ "ts-node": "10.9.2" } }, + "node_modules/@acemir/cssom": { + "version": "0.9.31", + "resolved": "https://registry.npmjs.org/@acemir/cssom/-/cssom-0.9.31.tgz", + "integrity": "sha512-ZnR3GSaH+/vJ0YlHau21FjfLYjMpYVIzTD8M8vIEQvIGxeOXyXdzCI140rrCY862p/C/BbzWsjc1dgnM9mkoTA==", + "license": "MIT" + }, "node_modules/@actions/core": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/@actions/core/-/core-2.0.2.tgz", @@ -125,23 +131,73 @@ } }, "node_modules/@asamuzakjp/css-color": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-3.2.0.tgz", - "integrity": "sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-4.1.1.tgz", + "integrity": "sha512-B0Hv6G3gWGMn0xKJ0txEi/jM5iFpT3MfDxmhZFb4W047GvytCf1DHQ1D69W3zHI4yWe2aTZAA0JnbMZ7Xc8DuQ==", "license": "MIT", "dependencies": { - "@csstools/css-calc": "^2.1.3", - "@csstools/css-color-parser": "^3.0.9", - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3", - "lru-cache": "^10.4.3" + "@csstools/css-calc": "^2.1.4", + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "lru-cache": "^11.2.4" } }, "node_modules/@asamuzakjp/css-color/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" + "version": "11.2.4", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", + "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@asamuzakjp/dom-selector": { + "version": "6.7.6", + "resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-6.7.6.tgz", + "integrity": "sha512-hBaJER6A9MpdG3WgdlOolHmbOYvSk46y7IQN/1+iqiCuUu6iWdQrs9DGKF8ocqsEqWujWf/V7b7vaDgiUmIvUg==", + "license": "MIT", + "dependencies": { + "@asamuzakjp/nwsapi": "^2.3.9", + "bidi-js": "^1.0.3", + "css-tree": "^3.1.0", + "is-potential-custom-element-name": "^1.0.1", + "lru-cache": "^11.2.4" + } + }, + "node_modules/@asamuzakjp/dom-selector/node_modules/css-tree": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", + "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.12.2", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/@asamuzakjp/dom-selector/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==", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@asamuzakjp/dom-selector/node_modules/mdn-data": { + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", + "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", + "license": "CC0-1.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==", + "license": "MIT" }, "node_modules/@babel/cli": { "version": "7.28.6", @@ -2546,6 +2602,25 @@ "@csstools/css-tokenizer": "^3.0.4" } }, + "node_modules/@csstools/css-syntax-patches-for-csstree": { + "version": "1.0.25", + "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.0.25.tgz", + "integrity": "sha512-g0Kw9W3vjx5BEBAF8c5Fm2NcB/Fs8jJXh85aXqwEXiL+tqtOut07TWgyaGzAAfTM+gKckrrncyeGEZPcaRgm2Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + } + }, "node_modules/@csstools/css-tokenizer": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", @@ -12602,6 +12677,15 @@ "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==", + "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", @@ -15991,9 +16075,9 @@ } }, "node_modules/dompurify": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.3.0.tgz", - "integrity": "sha512-r+f6MYR1gGN1eJv0TVQbhA7if/U7P87cdPl3HN5rikqaBSBxLiCb/b9O+2eG0cxz0ghyU+mU1QkbsOwERMYlWQ==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.3.1.tgz", + "integrity": "sha512-qkdCKzLNtrgPFP1Vo+98FRzJnBRGe4ffyCea9IwHB1fyxPOeNTHpLKYGd4Uk9xvNoH0ZoOjwZxNptyMwqrId1Q==", "license": "(MPL-2.0 OR Apache-2.0)", "optionalDependencies": { "@types/trusted-types": "^2.0.7" @@ -21050,6 +21134,7 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "devOptional": true, "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -22473,85 +22558,152 @@ } }, "node_modules/isomorphic-dompurify": { - "version": "2.26.0", - "resolved": "https://registry.npmjs.org/isomorphic-dompurify/-/isomorphic-dompurify-2.26.0.tgz", - "integrity": "sha512-nZmoK4wKdzPs5USq4JHBiimjdKSVAOm2T1KyDoadtMPNXYHxiENd19ou4iU/V4juFM6LVgYQnpxCYmxqNP4Obw==", + "version": "2.35.0", + "resolved": "https://registry.npmjs.org/isomorphic-dompurify/-/isomorphic-dompurify-2.35.0.tgz", + "integrity": "sha512-a9+LQqylQCU8f1zmsYmg2tfrbdY2YS/Hc+xntcq/mDI2MY3Q108nq8K23BWDIg6YGC5JsUMC15fj2ZMqCzt/+A==", "license": "MIT", "dependencies": { - "dompurify": "^3.2.6", - "jsdom": "^26.1.0" + "dompurify": "^3.3.1", + "jsdom": "^27.4.0" }, "engines": { - "node": ">=18" + "node": ">=20.19.5" + } + }, + "node_modules/isomorphic-dompurify/node_modules/@exodus/bytes": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@exodus/bytes/-/bytes-1.9.0.tgz", + "integrity": "sha512-lagqsvnk09NKogQaN/XrtlWeUF8SRhT12odMvbTIIaVObqzwAogL6jhR4DAp0gPuKoM1AOVrKUshJpRdpMFrww==", + "license": "MIT", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@noble/hashes": "^1.8.0 || ^2.0.0" + }, + "peerDependenciesMeta": { + "@noble/hashes": { + "optional": true + } + } + }, + "node_modules/isomorphic-dompurify/node_modules/@noble/hashes": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.0.1.tgz", + "integrity": "sha512-XlOlEbQcE9fmuXxrVTXCTlG2nlRXa9Rj3rr5Ue/+tX+nmkgbX720YHh0VR3hBF9xDvwnb8D2shVGOwNx+ulArw==", + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/isomorphic-dompurify/node_modules/css-tree": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", + "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.12.2", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" } }, "node_modules/isomorphic-dompurify/node_modules/cssstyle": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.6.0.tgz", - "integrity": "sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==", + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-5.3.7.tgz", + "integrity": "sha512-7D2EPVltRrsTkhpQmksIu+LxeWAIEk6wRDMJ1qljlv+CKHJM+cJLlfhWIzNA44eAsHXSNe3+vO6DW1yCYx8SuQ==", "license": "MIT", "dependencies": { - "@asamuzakjp/css-color": "^3.2.0", - "rrweb-cssom": "^0.8.0" + "@asamuzakjp/css-color": "^4.1.1", + "@csstools/css-syntax-patches-for-csstree": "^1.0.21", + "css-tree": "^3.1.0", + "lru-cache": "^11.2.4" }, "engines": { - "node": ">=18" + "node": ">=20" } }, "node_modules/isomorphic-dompurify/node_modules/data-urls": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", - "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-6.0.1.tgz", + "integrity": "sha512-euIQENZg6x8mj3fO6o9+fOW8MimUI4PpD/fZBhJfeioZVy9TUpM4UY7KjQNVZFlqwJ0UdzRDzkycB997HEq1BQ==", "license": "MIT", "dependencies": { - "whatwg-mimetype": "^4.0.0", - "whatwg-url": "^14.0.0" + "whatwg-mimetype": "^5.0.0", + "whatwg-url": "^15.1.0" }, "engines": { - "node": ">=18" + "node": ">=20" + } + }, + "node_modules/isomorphic-dompurify/node_modules/data-urls/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==", + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/isomorphic-dompurify/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" } }, "node_modules/isomorphic-dompurify/node_modules/html-encoding-sniffer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", - "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", + "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==", "license": "MIT", "dependencies": { - "whatwg-encoding": "^3.1.1" + "@exodus/bytes": "^1.6.0" }, "engines": { - "node": ">=18" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" } }, "node_modules/isomorphic-dompurify/node_modules/jsdom": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-26.1.0.tgz", - "integrity": "sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==", - "license": "MIT", - "dependencies": { - "cssstyle": "^4.2.1", - "data-urls": "^5.0.0", - "decimal.js": "^10.5.0", - "html-encoding-sniffer": "^4.0.0", + "version": "27.4.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-27.4.0.tgz", + "integrity": "sha512-mjzqwWRD9Y1J1KUi7W97Gja1bwOOM5Ug0EZ6UDK3xS7j7mndrkwozHtSblfomlzyB4NepioNt+B2sOSzczVgtQ==", + "license": "MIT", + "dependencies": { + "@acemir/cssom": "^0.9.28", + "@asamuzakjp/dom-selector": "^6.7.6", + "@exodus/bytes": "^1.6.0", + "cssstyle": "^5.3.4", + "data-urls": "^6.0.0", + "decimal.js": "^10.6.0", + "html-encoding-sniffer": "^6.0.0", "http-proxy-agent": "^7.0.2", "https-proxy-agent": "^7.0.6", "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.16", - "parse5": "^7.2.1", - "rrweb-cssom": "^0.8.0", + "parse5": "^8.0.0", "saxes": "^6.0.0", "symbol-tree": "^3.2.4", - "tough-cookie": "^5.1.1", + "tough-cookie": "^6.0.0", "w3c-xmlserializer": "^5.0.0", - "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^3.1.1", + "webidl-conversions": "^8.0.0", "whatwg-mimetype": "^4.0.0", - "whatwg-url": "^14.1.1", - "ws": "^8.18.0", + "whatwg-url": "^15.1.0", + "ws": "^8.18.3", "xml-name-validator": "^5.0.0" }, "engines": { - "node": ">=18" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { "canvas": "^3.0.0" @@ -22562,6 +22714,33 @@ } } }, + "node_modules/isomorphic-dompurify/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==", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/isomorphic-dompurify/node_modules/mdn-data": { + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", + "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", + "license": "CC0-1.0" + }, + "node_modules/isomorphic-dompurify/node_modules/parse5": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.0.tgz", + "integrity": "sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==", + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, "node_modules/isomorphic-dompurify/node_modules/saxes": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", @@ -22575,27 +22754,27 @@ } }, "node_modules/isomorphic-dompurify/node_modules/tough-cookie": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz", - "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.0.tgz", + "integrity": "sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==", "license": "BSD-3-Clause", "dependencies": { - "tldts": "^6.1.32" + "tldts": "^7.0.5" }, "engines": { "node": ">=16" } }, "node_modules/isomorphic-dompurify/node_modules/tr46": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", - "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-6.0.0.tgz", + "integrity": "sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==", "license": "MIT", "dependencies": { "punycode": "^2.3.1" }, "engines": { - "node": ">=18" + "node": ">=20" } }, "node_modules/isomorphic-dompurify/node_modules/w3c-xmlserializer": { @@ -22611,31 +22790,31 @@ } }, "node_modules/isomorphic-dompurify/node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "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==", "license": "BSD-2-Clause", "engines": { - "node": ">=12" + "node": ">=20" } }, "node_modules/isomorphic-dompurify/node_modules/whatwg-url": { - "version": "14.2.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", - "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-15.1.0.tgz", + "integrity": "sha512-2ytDk0kiEj/yu90JOAp44PVPUkO9+jVhyf+SybKlRHSDlvOOZhdPIrr7xTH64l4WixO2cP+wQIcgujkGBPPz6g==", "license": "MIT", "dependencies": { - "tr46": "^5.1.0", - "webidl-conversions": "^7.0.0" + "tr46": "^6.0.0", + "webidl-conversions": "^8.0.0" }, "engines": { - "node": ">=18" + "node": ">=20" } }, "node_modules/isomorphic-dompurify/node_modules/ws": { - "version": "8.18.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", - "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", + "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", "license": "MIT", "engines": { "node": ">=10.0.0" @@ -31134,6 +31313,7 @@ "version": "2.2.22", "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.22.tgz", "integrity": "sha512-ujSMe1OWVn55euT1ihwCI1ZcAaAU3nxUiDwfDQldc51ZXaB9m2AyOn6/jh1BLe2t/G8xd6uKG1UBF2aZJeg2SQ==", + "dev": true, "license": "MIT" }, "node_modules/oauth-sign": { @@ -32045,6 +32225,7 @@ "version": "7.3.0", "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "dev": true, "license": "MIT", "dependencies": { "entities": "^6.0.0" @@ -32084,6 +32265,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=0.12" @@ -35110,12 +35292,6 @@ "@rolldown/binding-win32-x64-msvc": "1.0.0-beta.53" } }, - "node_modules/rrweb-cssom": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", - "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==", - "license": "MIT" - }, "node_modules/run-applescript": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", @@ -39451,21 +39627,21 @@ } }, "node_modules/tldts": { - "version": "6.1.86", - "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.86.tgz", - "integrity": "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==", + "version": "7.0.19", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.0.19.tgz", + "integrity": "sha512-8PWx8tvC4jDB39BQw1m4x8y5MH1BcQ5xHeL2n7UVFulMPH/3Q0uiamahFJ3lXA0zO2SUyRXuVVbWSDmstlt9YA==", "license": "MIT", "dependencies": { - "tldts-core": "^6.1.86" + "tldts-core": "^7.0.19" }, "bin": { "tldts": "bin/cli.js" } }, "node_modules/tldts-core": { - "version": "6.1.86", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.86.tgz", - "integrity": "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==", + "version": "7.0.19", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.0.19.tgz", + "integrity": "sha512-lJX2dEWx0SGH4O6p+7FPwYmJ/bu1JbcGJ8RLaG9b7liIgZ85itUVEPbMtWRVrde/0fnDPEPHW10ZsKW3kVsE9A==", "license": "MIT" }, "node_modules/tmp": { @@ -42009,6 +42185,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "dev": true, "license": "MIT", "dependencies": { "iconv-lite": "0.6.3" @@ -49766,7 +49943,7 @@ "base64-loader": "1.0.0", "css-tree": "1.1.3", "fastestsmallesttextencoderdecoder": "1.0.22", - "isomorphic-dompurify": "2.26.0", + "isomorphic-dompurify": "2.35.0", "transformation-matrix": "1.15.3", "tslog": "4.10.2" }, diff --git a/packages/scratch-svg-renderer/package.json b/packages/scratch-svg-renderer/package.json index 376cf16cf50..012891062dc 100644 --- a/packages/scratch-svg-renderer/package.json +++ b/packages/scratch-svg-renderer/package.json @@ -43,7 +43,7 @@ "base64-loader": "1.0.0", "css-tree": "1.1.3", "fastestsmallesttextencoderdecoder": "1.0.22", - "isomorphic-dompurify": "2.26.0", + "isomorphic-dompurify": "2.35.0", "transformation-matrix": "1.15.3", "tslog": "4.10.2" }, From 95810ee3d0a765f1aa4c2a90b67f6ce84583282b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 22 Jan 2026 05:23:37 +0000 Subject: [PATCH 183/521] fix(deps): update dependency scratch-l10n to v6.1.59 --- package-lock.json | 10 +++++----- packages/scratch-gui/package.json | 2 +- packages/scratch-vm/package.json | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 774f51fef3c..e08e0492826 100644 --- a/package-lock.json +++ b/package-lock.json @@ -35584,9 +35584,9 @@ } }, "node_modules/scratch-l10n": { - "version": "6.1.57", - "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-6.1.57.tgz", - "integrity": "sha512-6W0rXMyuMt3IyCqRBtQIRL5fKH3o2WNxXbhgJHPr8IqKMmxLFqLwtc1erbckuAeRoMWXDkAVcQBtx6uXXuCnCg==", + "version": "6.1.59", + "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-6.1.59.tgz", + "integrity": "sha512-L1eRy3REvLuT3slDj3S6XWGKwzGmZB6fJaabu0OfBPsvkocpdaLBtYlYpGXkeopfWT9JRIpII1oTqFv7sn1xQQ==", "license": "AGPL-3.0-only", "dependencies": { "@transifex/api": "7.1.5", @@ -42853,7 +42853,7 @@ "redux-throttle": "0.1.1", "scratch-audio": "2.0.268", "scratch-blocks": "1.3.0", - "scratch-l10n": "6.1.57", + "scratch-l10n": "6.1.59", "scratch-paint": "4.1.50", "scratch-render-fonts": "1.0.252", "scratch-storage": "5.0.10", @@ -53406,7 +53406,7 @@ "jsdoc": "3.6.11", "pngjs": "3.4.0", "scratch-blocks": "1.3.0", - "scratch-l10n": "6.1.57", + "scratch-l10n": "6.1.59", "scratch-render-fonts": "1.0.252", "scratch-semantic-release-config": "4.0.1", "scratch-webpack-configuration": "3.1.0", diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index 52102eeeb59..543bb684857 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -117,7 +117,7 @@ "redux-throttle": "0.1.1", "scratch-audio": "2.0.268", "scratch-blocks": "1.3.0", - "scratch-l10n": "6.1.57", + "scratch-l10n": "6.1.59", "scratch-paint": "4.1.50", "scratch-render-fonts": "1.0.252", "scratch-storage": "5.0.10", diff --git a/packages/scratch-vm/package.json b/packages/scratch-vm/package.json index 0eccc042a6d..a8e97e817ae 100644 --- a/packages/scratch-vm/package.json +++ b/packages/scratch-vm/package.json @@ -94,7 +94,7 @@ "jsdoc": "3.6.11", "pngjs": "3.4.0", "scratch-blocks": "1.3.0", - "scratch-l10n": "6.1.57", + "scratch-l10n": "6.1.59", "scratch-render-fonts": "1.0.252", "scratch-semantic-release-config": "4.0.1", "scratch-webpack-configuration": "3.1.0", From 036f61c091ea43411b37e992c2f06a2e9919acc3 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 22 Jan 2026 09:41:59 +0000 Subject: [PATCH 184/521] fix(deps): update dependency scratch-storage to v5.0.11 --- package-lock.json | 12 ++++++------ packages/scratch-gui/package.json | 2 +- packages/scratch-render/package.json | 2 +- packages/scratch-vm/package.json | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index e08e0492826..c44635c7942 100644 --- a/package-lock.json +++ b/package-lock.json @@ -35726,9 +35726,9 @@ } }, "node_modules/scratch-storage": { - "version": "5.0.10", - "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-5.0.10.tgz", - "integrity": "sha512-qtBjqFRYWqpnD+pPanVMadPielmNLZH4zCSuz/cnzKFY1RPJXjigMMP8vgm/XvM4zn01tUyl4z/OliWRB9hxbw==", + "version": "5.0.11", + "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-5.0.11.tgz", + "integrity": "sha512-N5oz1T+rrByJUuXgksG7W20VXldS/Hd+2JHDswfn10VryI+dnfFXFMBKqEvC0aDtYSe0DWihF66E374GXHLqEg==", "license": "AGPL-3.0-only", "dependencies": { "@babel/runtime": "^7.21.0", @@ -42856,7 +42856,7 @@ "scratch-l10n": "6.1.59", "scratch-paint": "4.1.50", "scratch-render-fonts": "1.0.252", - "scratch-storage": "5.0.10", + "scratch-storage": "5.0.11", "startaudiocontext": "1.2.1", "style-loader": "4.0.0", "text-encoding": "0.7.0", @@ -46309,7 +46309,7 @@ "playwright-chromium": "1.57.0", "scratch-render-fonts": "1.0.252", "scratch-semantic-release-config": "4.0.1", - "scratch-storage": "5.0.10", + "scratch-storage": "5.0.11", "scratch-webpack-configuration": "3.1.0", "semantic-release": "19.0.5", "tap": "21.5.0", @@ -53380,7 +53380,7 @@ "scratch-audio": "2.0.268", "scratch-parser": "6.0.0", "scratch-sb1-converter": "2.0.279", - "scratch-storage": "5.0.10", + "scratch-storage": "5.0.11", "scratch-translate-extension-languages": "1.0.7", "text-encoding": "0.7.0", "tslog": "4.10.2", diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index 543bb684857..dc690861507 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -120,7 +120,7 @@ "scratch-l10n": "6.1.59", "scratch-paint": "4.1.50", "scratch-render-fonts": "1.0.252", - "scratch-storage": "5.0.10", + "scratch-storage": "5.0.11", "startaudiocontext": "1.2.1", "style-loader": "4.0.0", "text-encoding": "0.7.0", diff --git a/packages/scratch-render/package.json b/packages/scratch-render/package.json index 510515e60ca..cbc6160cea8 100644 --- a/packages/scratch-render/package.json +++ b/packages/scratch-render/package.json @@ -75,7 +75,7 @@ "playwright-chromium": "1.57.0", "scratch-render-fonts": "1.0.252", "scratch-semantic-release-config": "4.0.1", - "scratch-storage": "5.0.10", + "scratch-storage": "5.0.11", "scratch-webpack-configuration": "3.1.0", "semantic-release": "19.0.5", "tap": "21.5.0", diff --git a/packages/scratch-vm/package.json b/packages/scratch-vm/package.json index a8e97e817ae..7a8101c95e5 100644 --- a/packages/scratch-vm/package.json +++ b/packages/scratch-vm/package.json @@ -68,7 +68,7 @@ "scratch-audio": "2.0.268", "scratch-parser": "6.0.0", "scratch-sb1-converter": "2.0.279", - "scratch-storage": "5.0.10", + "scratch-storage": "5.0.11", "scratch-translate-extension-languages": "1.0.7", "text-encoding": "0.7.0", "tslog": "4.10.2", From e332434a4356197999e970412290bbfff1772303 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 22 Jan 2026 13:02:36 +0000 Subject: [PATCH 185/521] fix(deps): update dependency scratch-webpack-configuration to v3.1.1 --- package-lock.json | 14 +++++++------- packages/scratch-gui/package.json | 2 +- packages/scratch-render/package.json | 2 +- packages/scratch-svg-renderer/package.json | 2 +- packages/scratch-vm/package.json | 2 +- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/package-lock.json b/package-lock.json index c44635c7942..42d03742368 100644 --- a/package-lock.json +++ b/package-lock.json @@ -35748,9 +35748,9 @@ "license": "BSD-3-Clause" }, "node_modules/scratch-webpack-configuration": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/scratch-webpack-configuration/-/scratch-webpack-configuration-3.1.0.tgz", - "integrity": "sha512-7hdjePBCaoFMmsWeRYqmb237OfFTHNEDgsf4q7a4g4cy9A1yL4QxQbJegUJj330ZnymOX1MRZbFNZzy1EUYJSQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/scratch-webpack-configuration/-/scratch-webpack-configuration-3.1.1.tgz", + "integrity": "sha512-rMaxuC7+507rbMaFcpZQ5BJPevq+/EKwGzT458G2mo90ZIHXOnzkjDmANvNFnfjjWcuQzp595rm/UrUg9CvBVg==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -42898,7 +42898,7 @@ "redux-mock-store": "1.5.5", "rimraf": "2.7.1", "scratch-semantic-release-config": "4.0.1", - "scratch-webpack-configuration": "3.1.0", + "scratch-webpack-configuration": "3.1.1", "selenium-webdriver": "3.6.0", "semantic-release": "19.0.5", "stream-browserify": "3.0.0", @@ -46310,7 +46310,7 @@ "scratch-render-fonts": "1.0.252", "scratch-semantic-release-config": "4.0.1", "scratch-storage": "5.0.11", - "scratch-webpack-configuration": "3.1.0", + "scratch-webpack-configuration": "3.1.1", "semantic-release": "19.0.5", "tap": "21.5.0", "terser-webpack-plugin": "5.3.16", @@ -49960,7 +49960,7 @@ "rimraf": "3.0.2", "scratch-render-fonts": "1.0.252", "scratch-semantic-release-config": "4.0.1", - "scratch-webpack-configuration": "3.1.0", + "scratch-webpack-configuration": "3.1.1", "semantic-release": "19.0.5", "tap": "21.5.0", "webpack": "5.104.1", @@ -53409,7 +53409,7 @@ "scratch-l10n": "6.1.59", "scratch-render-fonts": "1.0.252", "scratch-semantic-release-config": "4.0.1", - "scratch-webpack-configuration": "3.1.0", + "scratch-webpack-configuration": "3.1.1", "script-loader": "0.7.2", "semantic-release": "19.0.5", "stats.js": "0.17.0", diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index dc690861507..8da5dac4d60 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -168,7 +168,7 @@ "redux-mock-store": "1.5.5", "rimraf": "2.7.1", "scratch-semantic-release-config": "4.0.1", - "scratch-webpack-configuration": "3.1.0", + "scratch-webpack-configuration": "3.1.1", "selenium-webdriver": "3.6.0", "semantic-release": "19.0.5", "stream-browserify": "3.0.0", diff --git a/packages/scratch-render/package.json b/packages/scratch-render/package.json index cbc6160cea8..7d1d30d9564 100644 --- a/packages/scratch-render/package.json +++ b/packages/scratch-render/package.json @@ -76,7 +76,7 @@ "scratch-render-fonts": "1.0.252", "scratch-semantic-release-config": "4.0.1", "scratch-storage": "5.0.11", - "scratch-webpack-configuration": "3.1.0", + "scratch-webpack-configuration": "3.1.1", "semantic-release": "19.0.5", "tap": "21.5.0", "terser-webpack-plugin": "5.3.16", diff --git a/packages/scratch-svg-renderer/package.json b/packages/scratch-svg-renderer/package.json index 012891062dc..56271695560 100644 --- a/packages/scratch-svg-renderer/package.json +++ b/packages/scratch-svg-renderer/package.json @@ -60,7 +60,7 @@ "rimraf": "3.0.2", "scratch-render-fonts": "1.0.252", "scratch-semantic-release-config": "4.0.1", - "scratch-webpack-configuration": "3.1.0", + "scratch-webpack-configuration": "3.1.1", "semantic-release": "19.0.5", "tap": "21.5.0", "webpack": "5.104.1", diff --git a/packages/scratch-vm/package.json b/packages/scratch-vm/package.json index 7a8101c95e5..bb6d152c02b 100644 --- a/packages/scratch-vm/package.json +++ b/packages/scratch-vm/package.json @@ -97,7 +97,7 @@ "scratch-l10n": "6.1.59", "scratch-render-fonts": "1.0.252", "scratch-semantic-release-config": "4.0.1", - "scratch-webpack-configuration": "3.1.0", + "scratch-webpack-configuration": "3.1.1", "script-loader": "0.7.2", "semantic-release": "19.0.5", "stats.js": "0.17.0", From f8150b0ead2a0ce02cff63c5278551424b1cf35f Mon Sep 17 00:00:00 2001 From: Ayshe Dzhindzhi Date: Thu, 22 Jan 2026 15:51:24 +0200 Subject: [PATCH 186/521] feat: display membership filter tag for dynamic member assets --- .../library-item/lib-icon--member-asset.svg | 3 +++ .../components/library-item/library-item.css | 9 +++++++ .../components/library-item/library-item.jsx | 27 ++++++++++++++++--- .../src/components/library/library.css | 10 ++++--- .../src/components/library/library.jsx | 14 ++++++++-- .../src/components/tag-button/tag-button.css | 2 +- .../src/containers/library-item.jsx | 4 ++- packages/scratch-gui/src/css/colors.css | 1 + .../src/lib/merge-dynamic-assets.js | 24 ++++++++++++++++- 9 files changed, 82 insertions(+), 12 deletions(-) create mode 100644 packages/scratch-gui/src/components/library-item/lib-icon--member-asset.svg diff --git a/packages/scratch-gui/src/components/library-item/lib-icon--member-asset.svg b/packages/scratch-gui/src/components/library-item/lib-icon--member-asset.svg new file mode 100644 index 00000000000..dbddf16ca4e --- /dev/null +++ b/packages/scratch-gui/src/components/library-item/lib-icon--member-asset.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/packages/scratch-gui/src/components/library-item/library-item.css b/packages/scratch-gui/src/components/library-item/library-item.css index 3ebac24ee6f..4eee9474668 100644 --- a/packages/scratch-gui/src/components/library-item/library-item.css +++ b/packages/scratch-gui/src/components/library-item/library-item.css @@ -231,6 +231,15 @@ $radiate-distance: 20px; animation-delay: 0.7s; } +.member-asset-icon { + position: absolute; + left: 0.625rem; + top: 0.625rem; + width: 1.25rem; + height: 1.25rem; + z-index: 1; +} + @keyframes radiate { 0% { box-shadow: 0 0 0 0 rgba(var(--radiate-color), 0.7); diff --git a/packages/scratch-gui/src/components/library-item/library-item.jsx b/packages/scratch-gui/src/components/library-item/library-item.jsx index 93163c8690a..805fab13169 100644 --- a/packages/scratch-gui/src/components/library-item/library-item.jsx +++ b/packages/scratch-gui/src/components/library-item/library-item.jsx @@ -1,4 +1,4 @@ -import {FormattedMessage} from 'react-intl'; +import {defineMessages, FormattedMessage, injectIntl} from 'react-intl'; import PropTypes from 'prop-types'; import bindAll from 'lodash.bindall'; import React from 'react'; @@ -12,9 +12,18 @@ import classNames from 'classnames'; import bluetoothIconURL from './bluetooth.svg'; import internetConnectionIconURL from './internet-connection.svg'; +import memberAssetIconURL from './lib-icon--member-asset.svg'; +import intlShape from '../../lib/intlShape'; import {PLATFORM} from '../../lib/platform.js'; +const messages = defineMessages({ + memberAssetImgAlt: { + defaultMessage: 'Blue star icon indicating an asset is for members', + description: 'Alt text for star icon indicating an asset is for members', + id: 'gui.libraryItem.memberAssetImgAlt' + } +}); class LibraryItemComponent extends React.PureComponent { constructor (props) { @@ -156,6 +165,13 @@ class LibraryItemComponent extends React.PureComponent { onMouseEnter={this.props.showPlayButton ? null : this.props.onMouseEnter} onMouseLeave={this.props.showPlayButton ? null : this.props.onMouseLeave} > + {this.props.isMemberOnly && ( + {this.props.intl.formatMessage(messages.memberAssetImgAlt)} + )} {/* Layers of wrapping is to prevent layout thrashing on animation */} AssetType.ImageBitmap. * @param {string} fileExtension - the file extension to look up. @@ -161,6 +168,7 @@ class LibraryComponent extends React.Component { }; this.driver = null; + this.memberAssetTagList = this.props.data.some(item => item.isMemberOnly) ? [MEMBERSHIP_TAG] : []; } componentDidMount () { // Allow the spinner to display before loading the content @@ -366,6 +374,7 @@ class LibraryComponent extends React.Component { onMouseLeave={this.handleMouseLeave} onSelect={this.handleSelect} showItemCallout={this.state.shouldShowFaceSensingCallout && data.extensionId === 'faceSensing'} + isMemberOnly={data.isMemberOnly} />); } renderData (data) { @@ -429,13 +438,14 @@ class LibraryComponent extends React.Component { )} {this.props.tags &&
- {tagListPrefix.concat(this.props.tags).map((tagProps, id) => ( + {tagListPrefix.concat(this.props.tags, this.memberAssetTagList).map((tagProps, id) => ( ); } @@ -173,7 +174,8 @@ LibraryItem.propTypes = { onSelect: PropTypes.func.isRequired, platform: PropTypes.oneOf(Object.keys(PLATFORM)), showPlayButton: PropTypes.bool, - showItemCallout: PropTypes.bool + showItemCallout: PropTypes.bool, + isMemberOnly: PropTypes.bool }; export default compose( diff --git a/packages/scratch-gui/src/css/colors.css b/packages/scratch-gui/src/css/colors.css index f01a3f69090..73d32a0080b 100644 --- a/packages/scratch-gui/src/css/colors.css +++ b/packages/scratch-gui/src/css/colors.css @@ -50,4 +50,5 @@ $extensions-tertiary: hsla(163, 85%, 30%, 1); /* #0B8E69 */ $extensions-transparent: hsla(163, 85%, 40%, 0.35); /* 35% transparent version of extensions-primary */ $extensions-light: hsla(163, 57%, 85%, 1); /* opaque version of extensions-transparent, on white bg */ +$membership-blue: hsla(215, 60%, 46%, 1); /* #2F6ABC */ $drop-highlight: hsla(215, 100%, 77%, 1); /* lighter than motion-primary */ diff --git a/packages/scratch-gui/src/lib/merge-dynamic-assets.js b/packages/scratch-gui/src/lib/merge-dynamic-assets.js index c256231b12e..4396d9829a2 100644 --- a/packages/scratch-gui/src/lib/merge-dynamic-assets.js +++ b/packages/scratch-gui/src/lib/merge-dynamic-assets.js @@ -1,3 +1,25 @@ +/** + * Maps a dynamic asset object to a new object based on its visibility. + * If the asset is public, returns it unchanged. + * Otherwise, marks it as member-only and adds a 'membership' tag. + * @param {object} item - The asset object to map. + * @param {boolean} item.isPublic - Indicates if the asset is public. + * @param {boolean} [item.isMemberOnly] - Indicates if the asset is member-only. + * @param {string[]} [item.tags] - The tags associated with the asset. + * @returns {object} The mapped asset object. + */ +const mapDynamicAsset = item => { + if (item.isPublic) { + return item; + } + + return { + ...item, + isMemberOnly: true, + tags: [...(item.tags || []), 'membership'] + }; +}; + /** * Merge static and dynamic assets, using name as key, giving precedence to dynamic assets * @param {Array} staticAssets the static assets bundled with the editor @@ -13,7 +35,7 @@ const mergeDynamicAssets = (staticAssets, dynamicAssets) => { if (effectiveDynamicAssets.length > 0) { const map = new Map(); staticAssets.forEach(item => map.set(item.name, item)); - effectiveDynamicAssets.forEach(item => map.set(item.name, item)); + effectiveDynamicAssets.forEach(item => map.set(item.name, mapDynamicAsset(item))); data = Array.from(map.values()); data.sort((a, b) => (a.name || '').localeCompare(b.name || '')); } From eee6113e70fbe336e01477dc4bd4f0433f0ba623 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 22 Jan 2026 17:42:32 +0000 Subject: [PATCH 187/521] style(deps): update dependency eslint-config-scratch to v12.0.47 --- package-lock.json | 16 ++++++++-------- packages/scratch-gui/package.json | 2 +- packages/scratch-render/package.json | 2 +- packages/scratch-svg-renderer/package.json | 2 +- packages/scratch-vm/package.json | 2 +- packages/task-herder/package.json | 2 +- 6 files changed, 13 insertions(+), 13 deletions(-) diff --git a/package-lock.json b/package-lock.json index 42d03742368..197e92dc706 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17056,9 +17056,9 @@ } }, "node_modules/eslint-config-scratch": { - "version": "12.0.46", - "resolved": "https://registry.npmjs.org/eslint-config-scratch/-/eslint-config-scratch-12.0.46.tgz", - "integrity": "sha512-L1WEsYsAgRY4SlqCfHVlKThczTlRmMke4uikQxd9TEkorCUKnXSi9lw4guSbjsugCwZWP+GcHu37SXLa4TrmWw==", + "version": "12.0.47", + "resolved": "https://registry.npmjs.org/eslint-config-scratch/-/eslint-config-scratch-12.0.47.tgz", + "integrity": "sha512-czazYXIYGJIMjFhIkAbYZyiO2FAQhpwRcvuuIfH0i7gerSCBXNu0AxJ4cxzHdX7Al5nF+hnP6H4AsGmzO0QOHQ==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -42882,7 +42882,7 @@ "cheerio": "1.1.2", "cross-env": "7.0.3", "eslint": "9.39.2", - "eslint-config-scratch": "12.0.46", + "eslint-config-scratch": "12.0.47", "eslint-import-resolver-webpack": "0.13.10", "eslint-plugin-import": "2.32.0", "eslint-plugin-react": "7.37.5", @@ -46301,7 +46301,7 @@ "copy-webpack-plugin": "6.4.1", "docdash": "0.4.0", "eslint": "9.39.2", - "eslint-config-scratch": "12.0.46", + "eslint-config-scratch": "12.0.47", "gh-pages": "1.2.0", "globals": "16.5.0", "html-webpack-plugin": "5.6.6", @@ -49953,7 +49953,7 @@ "babel-loader": "9.2.1", "copy-webpack-plugin": "6.4.1", "eslint": "9.39.2", - "eslint-config-scratch": "12.0.46", + "eslint-config-scratch": "12.0.47", "globals": "16.5.0", "jsdom": "13.2.0", "mkdirp": "2.1.6", @@ -53396,7 +53396,7 @@ "copy-webpack-plugin": "6.4.1", "docdash": "1.2.0", "eslint": "9.39.2", - "eslint-config-scratch": "12.0.46", + "eslint-config-scratch": "12.0.47", "expose-loader": "1.0.3", "file-loader": "6.2.0", "format-message-cli": "6.2.4", @@ -56907,7 +56907,7 @@ "devDependencies": { "@vitest/coverage-v8": "4.0.17", "eslint": "9.39.2", - "eslint-config-scratch": "12.0.46", + "eslint-config-scratch": "12.0.47", "prettier": "3.8.0", "rimraf": "6.1.2", "typescript": "5.9.3", diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index 8da5dac4d60..67d01aea615 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -152,7 +152,7 @@ "cheerio": "1.1.2", "cross-env": "7.0.3", "eslint": "9.39.2", - "eslint-config-scratch": "12.0.46", + "eslint-config-scratch": "12.0.47", "eslint-import-resolver-webpack": "0.13.10", "eslint-plugin-import": "2.32.0", "eslint-plugin-react": "7.37.5", diff --git a/packages/scratch-render/package.json b/packages/scratch-render/package.json index 7d1d30d9564..74bcd5c45fd 100644 --- a/packages/scratch-render/package.json +++ b/packages/scratch-render/package.json @@ -67,7 +67,7 @@ "copy-webpack-plugin": "6.4.1", "docdash": "0.4.0", "eslint": "9.39.2", - "eslint-config-scratch": "12.0.46", + "eslint-config-scratch": "12.0.47", "gh-pages": "1.2.0", "globals": "16.5.0", "html-webpack-plugin": "5.6.6", diff --git a/packages/scratch-svg-renderer/package.json b/packages/scratch-svg-renderer/package.json index 56271695560..59aa5a8242c 100644 --- a/packages/scratch-svg-renderer/package.json +++ b/packages/scratch-svg-renderer/package.json @@ -53,7 +53,7 @@ "babel-loader": "9.2.1", "copy-webpack-plugin": "6.4.1", "eslint": "9.39.2", - "eslint-config-scratch": "12.0.46", + "eslint-config-scratch": "12.0.47", "globals": "16.5.0", "jsdom": "13.2.0", "mkdirp": "2.1.6", diff --git a/packages/scratch-vm/package.json b/packages/scratch-vm/package.json index bb6d152c02b..53605c3fc04 100644 --- a/packages/scratch-vm/package.json +++ b/packages/scratch-vm/package.json @@ -84,7 +84,7 @@ "copy-webpack-plugin": "6.4.1", "docdash": "1.2.0", "eslint": "9.39.2", - "eslint-config-scratch": "12.0.46", + "eslint-config-scratch": "12.0.47", "expose-loader": "1.0.3", "file-loader": "6.2.0", "format-message-cli": "6.2.4", diff --git a/packages/task-herder/package.json b/packages/task-herder/package.json index 70d206cfad2..f4702e37fe8 100644 --- a/packages/task-herder/package.json +++ b/packages/task-herder/package.json @@ -39,7 +39,7 @@ "devDependencies": { "@vitest/coverage-v8": "4.0.17", "eslint": "9.39.2", - "eslint-config-scratch": "12.0.46", + "eslint-config-scratch": "12.0.47", "prettier": "3.8.0", "rimraf": "6.1.2", "typescript": "5.9.3", From 77131c5080b059e6ec4d84618910cfd6dea41a24 Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Fri, 23 Jan 2026 09:51:30 +0000 Subject: [PATCH 188/521] chore(release): 12.4.0 [skip ci] --- package-lock.json | 45 +++++++++++++++------- package.json | 2 +- packages/scratch-gui/package.json | 8 ++-- packages/scratch-render/package.json | 6 +-- packages/scratch-svg-renderer/package.json | 2 +- packages/scratch-vm/package.json | 6 +-- packages/task-herder/package.json | 2 +- 7 files changed, 44 insertions(+), 27 deletions(-) diff --git a/package-lock.json b/package-lock.json index 197e92dc706..ba636b5d2b3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "scratch-editor", - "version": "12.3.1", + "version": "12.4.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "scratch-editor", - "version": "12.3.1", + "version": "12.4.0", "license": "AGPL-3.0-only", "workspaces": [ "packages/task-herder", @@ -42792,15 +42792,15 @@ }, "packages/scratch-gui": { "name": "@scratch/scratch-gui", - "version": "12.3.1", + "version": "12.4.0", "license": "AGPL-3.0-only", "dependencies": { "@mediapipe/face_detection": "0.4.1646425229", "@microbit/microbit-universal-hex": "0.2.2", "@radix-ui/react-context-menu": "2.2.16", - "@scratch/scratch-render": "12.3.1", - "@scratch/scratch-svg-renderer": "12.3.1", - "@scratch/scratch-vm": "12.3.1", + "@scratch/scratch-render": "12.4.0", + "@scratch/scratch-svg-renderer": "12.4.0", + "@scratch/scratch-vm": "12.4.0", "@tensorflow-models/face-detection": "1.0.3", "@tensorflow/tfjs": "4.22.0", "@testing-library/user-event": "14.6.1", @@ -43084,6 +43084,23 @@ "integrity": "sha512-sf7oGoLuaYAScB4VGr0tzetsYlS8EJH6qnTCfQ/WVEa89hALQ4RQfCKt5xCyPQKPDUbVUAIP1QsxAwfAjlDp7Q==", "extraneous": true }, + "packages/scratch-gui/node_modules/@scratch/scratch-vm/node_modules/scratch-storage": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-5.0.10.tgz", + "integrity": "sha512-qtBjqFRYWqpnD+pPanVMadPielmNLZH4zCSuz/cnzKFY1RPJXjigMMP8vgm/XvM4zn01tUyl4z/OliWRB9hxbw==", + "extraneous": true, + "license": "AGPL-3.0-only", + "dependencies": { + "@babel/runtime": "^7.21.0", + "arraybuffer-loader": "^1.0.3", + "base64-js": "^1.3.0", + "buffer": "6.0.3", + "cross-fetch": "^4.1.0", + "fastestsmallesttextencoderdecoder": "^1.0.7", + "js-md5": "^0.7.3", + "minilog": "^3.1.0" + } + }, "packages/scratch-gui/node_modules/@semantic-release/commit-analyzer": { "version": "9.0.2", "resolved": "https://registry.npmjs.org/@semantic-release/commit-analyzer/-/commit-analyzer-9.0.2.tgz", @@ -46280,10 +46297,10 @@ }, "packages/scratch-render": { "name": "@scratch/scratch-render", - "version": "12.3.1", + "version": "12.4.0", "license": "AGPL-3.0-only", "dependencies": { - "@scratch/scratch-svg-renderer": "12.3.1", + "@scratch/scratch-svg-renderer": "12.4.0", "grapheme-breaker": "0.3.2", "hull.js": "0.2.10", "ify-loader": "1.1.0", @@ -46296,7 +46313,7 @@ "@babel/core": "7.28.6", "@babel/polyfill": "7.12.1", "@babel/preset-env": "7.28.6", - "@scratch/scratch-vm": "12.3.1", + "@scratch/scratch-vm": "12.4.0", "babel-loader": "9.2.1", "copy-webpack-plugin": "6.4.1", "docdash": "0.4.0", @@ -49936,7 +49953,7 @@ }, "packages/scratch-svg-renderer": { "name": "@scratch/scratch-svg-renderer", - "version": "12.3.1", + "version": "12.4.0", "license": "AGPL-3.0-only", "dependencies": { "base64-js": "1.5.1", @@ -53361,11 +53378,11 @@ }, "packages/scratch-vm": { "name": "@scratch/scratch-vm", - "version": "12.3.1", + "version": "12.4.0", "license": "AGPL-3.0-only", "dependencies": { - "@scratch/scratch-render": "12.3.1", - "@scratch/scratch-svg-renderer": "12.3.1", + "@scratch/scratch-render": "12.4.0", + "@scratch/scratch-svg-renderer": "12.4.0", "@vernier/godirect": "1.8.3", "arraybuffer-loader": "1.0.8", "atob": "2.1.2", @@ -56902,7 +56919,7 @@ }, "packages/task-herder": { "name": "@scratch/task-herder", - "version": "12.3.1", + "version": "12.4.0", "license": "AGPL-3.0-only", "devDependencies": { "@vitest/coverage-v8": "4.0.17", diff --git a/package.json b/package.json index 36e05199d5a..a49e4400a0d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "scratch-editor", - "version": "12.3.1", + "version": "12.4.0", "private": "true", "description": "Scratch editor mono-repository", "author": "Scratch Foundation", diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index 67d01aea615..94ea4e17940 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -1,6 +1,6 @@ { "name": "@scratch/scratch-gui", - "version": "12.3.1", + "version": "12.4.0", "description": "Graphical User Interface for creating and running Scratch 3.0 projects", "author": "Massachusetts Institute of Technology", "license": "AGPL-3.0-only", @@ -62,9 +62,9 @@ "@mediapipe/face_detection": "0.4.1646425229", "@microbit/microbit-universal-hex": "0.2.2", "@radix-ui/react-context-menu": "2.2.16", - "@scratch/scratch-render": "12.3.1", - "@scratch/scratch-svg-renderer": "12.3.1", - "@scratch/scratch-vm": "12.3.1", + "@scratch/scratch-render": "12.4.0", + "@scratch/scratch-svg-renderer": "12.4.0", + "@scratch/scratch-vm": "12.4.0", "@tensorflow-models/face-detection": "1.0.3", "@tensorflow/tfjs": "4.22.0", "@testing-library/user-event": "14.6.1", diff --git a/packages/scratch-render/package.json b/packages/scratch-render/package.json index 74bcd5c45fd..48cae91d1af 100644 --- a/packages/scratch-render/package.json +++ b/packages/scratch-render/package.json @@ -1,6 +1,6 @@ { "name": "@scratch/scratch-render", - "version": "12.3.1", + "version": "12.4.0", "description": "WebGL Renderer for Scratch 3.0", "author": "Massachusetts Institute of Technology", "license": "AGPL-3.0-only", @@ -46,7 +46,7 @@ "iOS >= 8" ], "dependencies": { - "@scratch/scratch-svg-renderer": "12.3.1", + "@scratch/scratch-svg-renderer": "12.4.0", "grapheme-breaker": "0.3.2", "hull.js": "0.2.10", "ify-loader": "1.1.0", @@ -62,7 +62,7 @@ "@babel/core": "7.28.6", "@babel/polyfill": "7.12.1", "@babel/preset-env": "7.28.6", - "@scratch/scratch-vm": "12.3.1", + "@scratch/scratch-vm": "12.4.0", "babel-loader": "9.2.1", "copy-webpack-plugin": "6.4.1", "docdash": "0.4.0", diff --git a/packages/scratch-svg-renderer/package.json b/packages/scratch-svg-renderer/package.json index 59aa5a8242c..3551e01ad61 100644 --- a/packages/scratch-svg-renderer/package.json +++ b/packages/scratch-svg-renderer/package.json @@ -1,6 +1,6 @@ { "name": "@scratch/scratch-svg-renderer", - "version": "12.3.1", + "version": "12.4.0", "description": "SVG renderer for Scratch", "main": "./dist/node/scratch-svg-renderer.js", "browser": "./dist/web/scratch-svg-renderer.js", diff --git a/packages/scratch-vm/package.json b/packages/scratch-vm/package.json index 53605c3fc04..94717ea32fd 100644 --- a/packages/scratch-vm/package.json +++ b/packages/scratch-vm/package.json @@ -1,6 +1,6 @@ { "name": "@scratch/scratch-vm", - "version": "12.3.1", + "version": "12.4.0", "description": "Virtual Machine for Scratch 3.0", "author": "Massachusetts Institute of Technology", "license": "AGPL-3.0-only", @@ -52,8 +52,8 @@ "allow-incomplete-coverage": true }, "dependencies": { - "@scratch/scratch-render": "12.3.1", - "@scratch/scratch-svg-renderer": "12.3.1", + "@scratch/scratch-render": "12.4.0", + "@scratch/scratch-svg-renderer": "12.4.0", "@vernier/godirect": "1.8.3", "arraybuffer-loader": "1.0.8", "atob": "2.1.2", diff --git a/packages/task-herder/package.json b/packages/task-herder/package.json index f4702e37fe8..06ccdcf52c6 100644 --- a/packages/task-herder/package.json +++ b/packages/task-herder/package.json @@ -1,6 +1,6 @@ { "name": "@scratch/task-herder", - "version": "12.3.1", + "version": "12.4.0", "description": "An asynchronous task runner with configurable rate limiting / throttling and concurrency control.", "keywords": [ "rate limit", From 3eddc6ba01ef901c46f18193b1408af83c6087cd Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 23 Jan 2026 09:57:43 +0000 Subject: [PATCH 189/521] fix(deps): update dependency scratch-l10n to v6.1.60 --- package-lock.json | 10 +++++----- packages/scratch-gui/package.json | 2 +- packages/scratch-vm/package.json | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index ba636b5d2b3..b5ce27e9dfb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -35584,9 +35584,9 @@ } }, "node_modules/scratch-l10n": { - "version": "6.1.59", - "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-6.1.59.tgz", - "integrity": "sha512-L1eRy3REvLuT3slDj3S6XWGKwzGmZB6fJaabu0OfBPsvkocpdaLBtYlYpGXkeopfWT9JRIpII1oTqFv7sn1xQQ==", + "version": "6.1.60", + "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-6.1.60.tgz", + "integrity": "sha512-oRNtvEc9XD0I4fBVi1Rl5OdTW6cciZ7Yvd8h/I9GmMiwTXzFeXt5rlynWTtAHBzb/qzVCzPOr39oeoOlYVkQpw==", "license": "AGPL-3.0-only", "dependencies": { "@transifex/api": "7.1.5", @@ -42853,7 +42853,7 @@ "redux-throttle": "0.1.1", "scratch-audio": "2.0.268", "scratch-blocks": "1.3.0", - "scratch-l10n": "6.1.59", + "scratch-l10n": "6.1.60", "scratch-paint": "4.1.50", "scratch-render-fonts": "1.0.252", "scratch-storage": "5.0.11", @@ -53423,7 +53423,7 @@ "jsdoc": "3.6.11", "pngjs": "3.4.0", "scratch-blocks": "1.3.0", - "scratch-l10n": "6.1.59", + "scratch-l10n": "6.1.60", "scratch-render-fonts": "1.0.252", "scratch-semantic-release-config": "4.0.1", "scratch-webpack-configuration": "3.1.1", diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index 94ea4e17940..aaee151ac67 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -117,7 +117,7 @@ "redux-throttle": "0.1.1", "scratch-audio": "2.0.268", "scratch-blocks": "1.3.0", - "scratch-l10n": "6.1.59", + "scratch-l10n": "6.1.60", "scratch-paint": "4.1.50", "scratch-render-fonts": "1.0.252", "scratch-storage": "5.0.11", diff --git a/packages/scratch-vm/package.json b/packages/scratch-vm/package.json index 94717ea32fd..e65d42eb231 100644 --- a/packages/scratch-vm/package.json +++ b/packages/scratch-vm/package.json @@ -94,7 +94,7 @@ "jsdoc": "3.6.11", "pngjs": "3.4.0", "scratch-blocks": "1.3.0", - "scratch-l10n": "6.1.59", + "scratch-l10n": "6.1.60", "scratch-render-fonts": "1.0.252", "scratch-semantic-release-config": "4.0.1", "scratch-webpack-configuration": "3.1.1", From 91522eb195b21de4efb7f84163ce30fd53c6c8c8 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 23 Jan 2026 19:41:20 +0000 Subject: [PATCH 190/521] fix(deps): update dependency scratch-storage to v6 --- package-lock.json | 71 +++++----------------------- packages/scratch-gui/package.json | 2 +- packages/scratch-render/package.json | 2 +- packages/scratch-vm/package.json | 2 +- 4 files changed, 16 insertions(+), 61 deletions(-) diff --git a/package-lock.json b/package-lock.json index b5ce27e9dfb..5af05b6f8e9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14906,57 +14906,6 @@ "yarn": ">=1" } }, - "node_modules/cross-fetch": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.1.0.tgz", - "integrity": "sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw==", - "license": "MIT", - "dependencies": { - "node-fetch": "^2.7.0" - } - }, - "node_modules/cross-fetch/node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "license": "MIT", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/cross-fetch/node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "license": "MIT" - }, - "node_modules/cross-fetch/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "license": "BSD-2-Clause" - }, - "node_modules/cross-fetch/node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "license": "MIT", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -35726,21 +35675,27 @@ } }, "node_modules/scratch-storage": { - "version": "5.0.11", - "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-5.0.11.tgz", - "integrity": "sha512-N5oz1T+rrByJUuXgksG7W20VXldS/Hd+2JHDswfn10VryI+dnfFXFMBKqEvC0aDtYSe0DWihF66E374GXHLqEg==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-6.0.1.tgz", + "integrity": "sha512-1gqCjC4F06aXFQ1YsYQW6gaFjHiPPjxACGmQDi33wL5RatNlIOR2lNQqIeh6mg6AkGj3mbP0P3SbRS5GERe/Kw==", "license": "AGPL-3.0-only", "dependencies": { "@babel/runtime": "^7.21.0", + "@scratch/task-herder": "12.3.1", "arraybuffer-loader": "^1.0.3", "base64-js": "^1.3.0", "buffer": "6.0.3", - "cross-fetch": "^4.1.0", "fastestsmallesttextencoderdecoder": "^1.0.7", "js-md5": "^0.7.3", "minilog": "^3.1.0" } }, + "node_modules/scratch-storage/node_modules/@scratch/task-herder": { + "version": "12.3.1", + "resolved": "https://registry.npmjs.org/@scratch/task-herder/-/task-herder-12.3.1.tgz", + "integrity": "sha512-bxBTi9GopJJ3bxSOl3PXa3u4CC08xL7aaOrv6dOYu6+o7+5k+VafzrWIzzTlfuika8gy/B/KB54dNkzKG1HzhA==", + "license": "AGPL-3.0-only" + }, "node_modules/scratch-translate-extension-languages": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/scratch-translate-extension-languages/-/scratch-translate-extension-languages-1.0.7.tgz", @@ -42856,7 +42811,7 @@ "scratch-l10n": "6.1.60", "scratch-paint": "4.1.50", "scratch-render-fonts": "1.0.252", - "scratch-storage": "5.0.11", + "scratch-storage": "6.0.1", "startaudiocontext": "1.2.1", "style-loader": "4.0.0", "text-encoding": "0.7.0", @@ -46326,7 +46281,7 @@ "playwright-chromium": "1.57.0", "scratch-render-fonts": "1.0.252", "scratch-semantic-release-config": "4.0.1", - "scratch-storage": "5.0.11", + "scratch-storage": "6.0.1", "scratch-webpack-configuration": "3.1.1", "semantic-release": "19.0.5", "tap": "21.5.0", @@ -53397,7 +53352,7 @@ "scratch-audio": "2.0.268", "scratch-parser": "6.0.0", "scratch-sb1-converter": "2.0.279", - "scratch-storage": "5.0.11", + "scratch-storage": "6.0.1", "scratch-translate-extension-languages": "1.0.7", "text-encoding": "0.7.0", "tslog": "4.10.2", diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index aaee151ac67..ed8c8efc4ed 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -120,7 +120,7 @@ "scratch-l10n": "6.1.60", "scratch-paint": "4.1.50", "scratch-render-fonts": "1.0.252", - "scratch-storage": "5.0.11", + "scratch-storage": "6.0.1", "startaudiocontext": "1.2.1", "style-loader": "4.0.0", "text-encoding": "0.7.0", diff --git a/packages/scratch-render/package.json b/packages/scratch-render/package.json index 48cae91d1af..ad71bca94b3 100644 --- a/packages/scratch-render/package.json +++ b/packages/scratch-render/package.json @@ -75,7 +75,7 @@ "playwright-chromium": "1.57.0", "scratch-render-fonts": "1.0.252", "scratch-semantic-release-config": "4.0.1", - "scratch-storage": "5.0.11", + "scratch-storage": "6.0.1", "scratch-webpack-configuration": "3.1.1", "semantic-release": "19.0.5", "tap": "21.5.0", diff --git a/packages/scratch-vm/package.json b/packages/scratch-vm/package.json index e65d42eb231..9b2b7454bc0 100644 --- a/packages/scratch-vm/package.json +++ b/packages/scratch-vm/package.json @@ -68,7 +68,7 @@ "scratch-audio": "2.0.268", "scratch-parser": "6.0.0", "scratch-sb1-converter": "2.0.279", - "scratch-storage": "5.0.11", + "scratch-storage": "6.0.1", "scratch-translate-extension-languages": "1.0.7", "text-encoding": "0.7.0", "tslog": "4.10.2", From 6d68512a0608ecd8b1beb7280ae5a129a5ed5680 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 23 Jan 2026 21:31:16 +0000 Subject: [PATCH 191/521] feat(deps): update dependency scratch-storage to v6.1.0 --- package-lock.json | 12 ++++++------ packages/scratch-gui/package.json | 2 +- packages/scratch-render/package.json | 2 +- packages/scratch-vm/package.json | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5af05b6f8e9..f4126283099 100644 --- a/package-lock.json +++ b/package-lock.json @@ -35675,9 +35675,9 @@ } }, "node_modules/scratch-storage": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-6.0.1.tgz", - "integrity": "sha512-1gqCjC4F06aXFQ1YsYQW6gaFjHiPPjxACGmQDi33wL5RatNlIOR2lNQqIeh6mg6AkGj3mbP0P3SbRS5GERe/Kw==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-6.1.0.tgz", + "integrity": "sha512-5v8oI7aT3RaXgvcMAy/zKc3Q++vPQjtDPhqmYiT1L9pyvA3jkgOPG0GbaWHpCU7dz1PoDdSs4bU/QHgDNibT6A==", "license": "AGPL-3.0-only", "dependencies": { "@babel/runtime": "^7.21.0", @@ -42811,7 +42811,7 @@ "scratch-l10n": "6.1.60", "scratch-paint": "4.1.50", "scratch-render-fonts": "1.0.252", - "scratch-storage": "6.0.1", + "scratch-storage": "6.1.0", "startaudiocontext": "1.2.1", "style-loader": "4.0.0", "text-encoding": "0.7.0", @@ -46281,7 +46281,7 @@ "playwright-chromium": "1.57.0", "scratch-render-fonts": "1.0.252", "scratch-semantic-release-config": "4.0.1", - "scratch-storage": "6.0.1", + "scratch-storage": "6.1.0", "scratch-webpack-configuration": "3.1.1", "semantic-release": "19.0.5", "tap": "21.5.0", @@ -53352,7 +53352,7 @@ "scratch-audio": "2.0.268", "scratch-parser": "6.0.0", "scratch-sb1-converter": "2.0.279", - "scratch-storage": "6.0.1", + "scratch-storage": "6.1.0", "scratch-translate-extension-languages": "1.0.7", "text-encoding": "0.7.0", "tslog": "4.10.2", diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index ed8c8efc4ed..8037a1b1370 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -120,7 +120,7 @@ "scratch-l10n": "6.1.60", "scratch-paint": "4.1.50", "scratch-render-fonts": "1.0.252", - "scratch-storage": "6.0.1", + "scratch-storage": "6.1.0", "startaudiocontext": "1.2.1", "style-loader": "4.0.0", "text-encoding": "0.7.0", diff --git a/packages/scratch-render/package.json b/packages/scratch-render/package.json index ad71bca94b3..c63428d2d17 100644 --- a/packages/scratch-render/package.json +++ b/packages/scratch-render/package.json @@ -75,7 +75,7 @@ "playwright-chromium": "1.57.0", "scratch-render-fonts": "1.0.252", "scratch-semantic-release-config": "4.0.1", - "scratch-storage": "6.0.1", + "scratch-storage": "6.1.0", "scratch-webpack-configuration": "3.1.1", "semantic-release": "19.0.5", "tap": "21.5.0", diff --git a/packages/scratch-vm/package.json b/packages/scratch-vm/package.json index 9b2b7454bc0..7cf0df4a08e 100644 --- a/packages/scratch-vm/package.json +++ b/packages/scratch-vm/package.json @@ -68,7 +68,7 @@ "scratch-audio": "2.0.268", "scratch-parser": "6.0.0", "scratch-sb1-converter": "2.0.279", - "scratch-storage": "6.0.1", + "scratch-storage": "6.1.0", "scratch-translate-extension-languages": "1.0.7", "text-encoding": "0.7.0", "tslog": "4.10.2", From 06aeb89b749cb301fc1aa39b30a64d5883c162c2 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 23 Jan 2026 21:33:42 +0000 Subject: [PATCH 192/521] chore(deps): update node.js to v24 --- .nvmrc | 2 +- packages/scratch-gui/.nvmrc | 2 +- packages/scratch-render/.nvmrc | 2 +- packages/scratch-svg-renderer/.nvmrc | 2 +- packages/scratch-vm/.nvmrc | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.nvmrc b/.nvmrc index 586e275eb9b..3fe3b1570a5 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -20.20.0 +24.13.0 diff --git a/packages/scratch-gui/.nvmrc b/packages/scratch-gui/.nvmrc index 586e275eb9b..3fe3b1570a5 100644 --- a/packages/scratch-gui/.nvmrc +++ b/packages/scratch-gui/.nvmrc @@ -1 +1 @@ -20.20.0 +24.13.0 diff --git a/packages/scratch-render/.nvmrc b/packages/scratch-render/.nvmrc index 586e275eb9b..3fe3b1570a5 100644 --- a/packages/scratch-render/.nvmrc +++ b/packages/scratch-render/.nvmrc @@ -1 +1 @@ -20.20.0 +24.13.0 diff --git a/packages/scratch-svg-renderer/.nvmrc b/packages/scratch-svg-renderer/.nvmrc index 586e275eb9b..3fe3b1570a5 100644 --- a/packages/scratch-svg-renderer/.nvmrc +++ b/packages/scratch-svg-renderer/.nvmrc @@ -1 +1 @@ -20.20.0 +24.13.0 diff --git a/packages/scratch-vm/.nvmrc b/packages/scratch-vm/.nvmrc index 586e275eb9b..3fe3b1570a5 100644 --- a/packages/scratch-vm/.nvmrc +++ b/packages/scratch-vm/.nvmrc @@ -1 +1 @@ -20.20.0 +24.13.0 From f09c10292f43876b55b063b7f196d28afd034249 Mon Sep 17 00:00:00 2001 From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com> Date: Fri, 23 Jan 2026 14:21:15 -0800 Subject: [PATCH 193/521] fix: prevent excessive extension service requests --- packages/scratch-vm/src/engine/runtime.js | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/packages/scratch-vm/src/engine/runtime.js b/packages/scratch-vm/src/engine/runtime.js index dfadd7f5f71..ce99eabb4a7 100644 --- a/packages/scratch-vm/src/engine/runtime.js +++ b/packages/scratch-vm/src/engine/runtime.js @@ -1640,6 +1640,20 @@ class Runtime extends EventEmitter { this.storage = storage; fetchWithTimeout.setFetch(storage.scratchFetch.scratchFetch); this.resetRunId(); + + /** @type {Parameters[1]} */ + const extensionServiceQueueOptions = { + concurrency: 1, + burstLimit: 3, + sustainRate: 1/4, + }; + + /** @todo The extensions should probably specify their own queue options (within existing limits) */ + ['scratch.mit.edu', 'scratch.org'].forEach(scratchDomain => { + ['synthesis-service', 'translate-service'].forEach(service => { + storage.scratchFetch.createQueue(`${service}.${scratchDomain}`, extensionServiceQueueOptions); + }); + }); } // ----------------------------------------------------------------------------- From 380715c6f8ca7311284806fc35c4d82b2d38400f Mon Sep 17 00:00:00 2001 From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com> Date: Fri, 23 Jan 2026 17:42:32 -0800 Subject: [PATCH 194/521] fix: further refine extension service queueing --- packages/scratch-vm/src/engine/runtime.js | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/packages/scratch-vm/src/engine/runtime.js b/packages/scratch-vm/src/engine/runtime.js index ce99eabb4a7..0ecc92e490d 100644 --- a/packages/scratch-vm/src/engine/runtime.js +++ b/packages/scratch-vm/src/engine/runtime.js @@ -32,6 +32,10 @@ const Video = require('../io/video'); const StringUtil = require('../util/string-util'); const uid = require('../util/uid'); +/** + * @import {ScratchStorage} from 'scratch-storage' + */ + const defaultBlockPackages = { scratch3_control: require('../blocks/scratch3_control'), scratch3_event: require('../blocks/scratch3_event'), @@ -1641,11 +1645,17 @@ class Runtime extends EventEmitter { fetchWithTimeout.setFetch(storage.scratchFetch.scratchFetch); this.resetRunId(); + // How many seconds should an action "cost" after we've exhausted the burst allowance? + // Setting this too high makes the extension frustrating to use, but setting it too low costs us real money. + // We should tune this over time based on user feedback and our budget. + const secondsPerAction = 4; + /** @type {Parameters[1]} */ const extensionServiceQueueOptions = { - concurrency: 1, - burstLimit: 3, - sustainRate: 1/4, + burstLimit: 3, // How many actions can be sent in a short time if we haven't done any for a while? + concurrency: 1, // Number of concurrent connections to the service + queueCostLimit: 10, // Don't queue more actions than can finish before the `fetchWithTimeout` timeout. + sustainRate: 1 / secondsPerAction, // See `secondsPerAction` above. }; /** @todo The extensions should probably specify their own queue options (within existing limits) */ From 948425528d701c5fa8d7f6bd41ad3b4f6574b39d Mon Sep 17 00:00:00 2001 From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com> Date: Fri, 23 Jan 2026 17:53:52 -0800 Subject: [PATCH 195/521] style: lint fix --- packages/scratch-vm/src/engine/runtime.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/scratch-vm/src/engine/runtime.js b/packages/scratch-vm/src/engine/runtime.js index 0ecc92e490d..ddcf55b1af8 100644 --- a/packages/scratch-vm/src/engine/runtime.js +++ b/packages/scratch-vm/src/engine/runtime.js @@ -1655,7 +1655,7 @@ class Runtime extends EventEmitter { burstLimit: 3, // How many actions can be sent in a short time if we haven't done any for a while? concurrency: 1, // Number of concurrent connections to the service queueCostLimit: 10, // Don't queue more actions than can finish before the `fetchWithTimeout` timeout. - sustainRate: 1 / secondsPerAction, // See `secondsPerAction` above. + sustainRate: 1 / secondsPerAction // See `secondsPerAction` above. }; /** @todo The extensions should probably specify their own queue options (within existing limits) */ From e1f78078d36ea7affc042256ed0b2d212293578d Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Sat, 24 Jan 2026 02:45:59 +0000 Subject: [PATCH 196/521] chore(release): 12.5.0 [skip ci] --- package-lock.json | 34 +++++++++++----------- package.json | 2 +- packages/scratch-gui/package.json | 8 ++--- packages/scratch-render/package.json | 6 ++-- packages/scratch-svg-renderer/package.json | 2 +- packages/scratch-vm/package.json | 6 ++-- packages/task-herder/package.json | 2 +- 7 files changed, 30 insertions(+), 30 deletions(-) diff --git a/package-lock.json b/package-lock.json index f4126283099..1f9a1f5066c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "scratch-editor", - "version": "12.4.0", + "version": "12.5.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "scratch-editor", - "version": "12.4.0", + "version": "12.5.0", "license": "AGPL-3.0-only", "workspaces": [ "packages/task-herder", @@ -42747,15 +42747,15 @@ }, "packages/scratch-gui": { "name": "@scratch/scratch-gui", - "version": "12.4.0", + "version": "12.5.0", "license": "AGPL-3.0-only", "dependencies": { "@mediapipe/face_detection": "0.4.1646425229", "@microbit/microbit-universal-hex": "0.2.2", "@radix-ui/react-context-menu": "2.2.16", - "@scratch/scratch-render": "12.4.0", - "@scratch/scratch-svg-renderer": "12.4.0", - "@scratch/scratch-vm": "12.4.0", + "@scratch/scratch-render": "12.5.0", + "@scratch/scratch-svg-renderer": "12.5.0", + "@scratch/scratch-vm": "12.5.0", "@tensorflow-models/face-detection": "1.0.3", "@tensorflow/tfjs": "4.22.0", "@testing-library/user-event": "14.6.1", @@ -43040,9 +43040,9 @@ "extraneous": true }, "packages/scratch-gui/node_modules/@scratch/scratch-vm/node_modules/scratch-storage": { - "version": "5.0.10", - "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-5.0.10.tgz", - "integrity": "sha512-qtBjqFRYWqpnD+pPanVMadPielmNLZH4zCSuz/cnzKFY1RPJXjigMMP8vgm/XvM4zn01tUyl4z/OliWRB9hxbw==", + "version": "5.0.11", + "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-5.0.11.tgz", + "integrity": "sha512-N5oz1T+rrByJUuXgksG7W20VXldS/Hd+2JHDswfn10VryI+dnfFXFMBKqEvC0aDtYSe0DWihF66E374GXHLqEg==", "extraneous": true, "license": "AGPL-3.0-only", "dependencies": { @@ -46252,10 +46252,10 @@ }, "packages/scratch-render": { "name": "@scratch/scratch-render", - "version": "12.4.0", + "version": "12.5.0", "license": "AGPL-3.0-only", "dependencies": { - "@scratch/scratch-svg-renderer": "12.4.0", + "@scratch/scratch-svg-renderer": "12.5.0", "grapheme-breaker": "0.3.2", "hull.js": "0.2.10", "ify-loader": "1.1.0", @@ -46268,7 +46268,7 @@ "@babel/core": "7.28.6", "@babel/polyfill": "7.12.1", "@babel/preset-env": "7.28.6", - "@scratch/scratch-vm": "12.4.0", + "@scratch/scratch-vm": "12.5.0", "babel-loader": "9.2.1", "copy-webpack-plugin": "6.4.1", "docdash": "0.4.0", @@ -49908,7 +49908,7 @@ }, "packages/scratch-svg-renderer": { "name": "@scratch/scratch-svg-renderer", - "version": "12.4.0", + "version": "12.5.0", "license": "AGPL-3.0-only", "dependencies": { "base64-js": "1.5.1", @@ -53333,11 +53333,11 @@ }, "packages/scratch-vm": { "name": "@scratch/scratch-vm", - "version": "12.4.0", + "version": "12.5.0", "license": "AGPL-3.0-only", "dependencies": { - "@scratch/scratch-render": "12.4.0", - "@scratch/scratch-svg-renderer": "12.4.0", + "@scratch/scratch-render": "12.5.0", + "@scratch/scratch-svg-renderer": "12.5.0", "@vernier/godirect": "1.8.3", "arraybuffer-loader": "1.0.8", "atob": "2.1.2", @@ -56874,7 +56874,7 @@ }, "packages/task-herder": { "name": "@scratch/task-herder", - "version": "12.4.0", + "version": "12.5.0", "license": "AGPL-3.0-only", "devDependencies": { "@vitest/coverage-v8": "4.0.17", diff --git a/package.json b/package.json index a49e4400a0d..dfb23b2b26d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "scratch-editor", - "version": "12.4.0", + "version": "12.5.0", "private": "true", "description": "Scratch editor mono-repository", "author": "Scratch Foundation", diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index 8037a1b1370..4fc8ff1b802 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -1,6 +1,6 @@ { "name": "@scratch/scratch-gui", - "version": "12.4.0", + "version": "12.5.0", "description": "Graphical User Interface for creating and running Scratch 3.0 projects", "author": "Massachusetts Institute of Technology", "license": "AGPL-3.0-only", @@ -62,9 +62,9 @@ "@mediapipe/face_detection": "0.4.1646425229", "@microbit/microbit-universal-hex": "0.2.2", "@radix-ui/react-context-menu": "2.2.16", - "@scratch/scratch-render": "12.4.0", - "@scratch/scratch-svg-renderer": "12.4.0", - "@scratch/scratch-vm": "12.4.0", + "@scratch/scratch-render": "12.5.0", + "@scratch/scratch-svg-renderer": "12.5.0", + "@scratch/scratch-vm": "12.5.0", "@tensorflow-models/face-detection": "1.0.3", "@tensorflow/tfjs": "4.22.0", "@testing-library/user-event": "14.6.1", diff --git a/packages/scratch-render/package.json b/packages/scratch-render/package.json index c63428d2d17..5d82f2abd51 100644 --- a/packages/scratch-render/package.json +++ b/packages/scratch-render/package.json @@ -1,6 +1,6 @@ { "name": "@scratch/scratch-render", - "version": "12.4.0", + "version": "12.5.0", "description": "WebGL Renderer for Scratch 3.0", "author": "Massachusetts Institute of Technology", "license": "AGPL-3.0-only", @@ -46,7 +46,7 @@ "iOS >= 8" ], "dependencies": { - "@scratch/scratch-svg-renderer": "12.4.0", + "@scratch/scratch-svg-renderer": "12.5.0", "grapheme-breaker": "0.3.2", "hull.js": "0.2.10", "ify-loader": "1.1.0", @@ -62,7 +62,7 @@ "@babel/core": "7.28.6", "@babel/polyfill": "7.12.1", "@babel/preset-env": "7.28.6", - "@scratch/scratch-vm": "12.4.0", + "@scratch/scratch-vm": "12.5.0", "babel-loader": "9.2.1", "copy-webpack-plugin": "6.4.1", "docdash": "0.4.0", diff --git a/packages/scratch-svg-renderer/package.json b/packages/scratch-svg-renderer/package.json index 3551e01ad61..e5843feafa9 100644 --- a/packages/scratch-svg-renderer/package.json +++ b/packages/scratch-svg-renderer/package.json @@ -1,6 +1,6 @@ { "name": "@scratch/scratch-svg-renderer", - "version": "12.4.0", + "version": "12.5.0", "description": "SVG renderer for Scratch", "main": "./dist/node/scratch-svg-renderer.js", "browser": "./dist/web/scratch-svg-renderer.js", diff --git a/packages/scratch-vm/package.json b/packages/scratch-vm/package.json index 7cf0df4a08e..6f76001808f 100644 --- a/packages/scratch-vm/package.json +++ b/packages/scratch-vm/package.json @@ -1,6 +1,6 @@ { "name": "@scratch/scratch-vm", - "version": "12.4.0", + "version": "12.5.0", "description": "Virtual Machine for Scratch 3.0", "author": "Massachusetts Institute of Technology", "license": "AGPL-3.0-only", @@ -52,8 +52,8 @@ "allow-incomplete-coverage": true }, "dependencies": { - "@scratch/scratch-render": "12.4.0", - "@scratch/scratch-svg-renderer": "12.4.0", + "@scratch/scratch-render": "12.5.0", + "@scratch/scratch-svg-renderer": "12.5.0", "@vernier/godirect": "1.8.3", "arraybuffer-loader": "1.0.8", "atob": "2.1.2", diff --git a/packages/task-herder/package.json b/packages/task-herder/package.json index 06ccdcf52c6..79baecf1405 100644 --- a/packages/task-herder/package.json +++ b/packages/task-herder/package.json @@ -1,6 +1,6 @@ { "name": "@scratch/task-herder", - "version": "12.4.0", + "version": "12.5.0", "description": "An asynchronous task runner with configurable rate limiting / throttling and concurrency control.", "keywords": [ "rate limit", From 4bdddfe9ff6d82e12b3cf3e2de63fc32533445c7 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 24 Jan 2026 21:57:55 +0000 Subject: [PATCH 197/521] chore(deps): update dependency prettier to v3.8.1 --- package-lock.json | 196 ++++++++++++++++-------------- packages/task-herder/package.json | 2 +- 2 files changed, 103 insertions(+), 95 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1f9a1f5066c..62612af3df5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -270,6 +270,7 @@ "integrity": "sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.28.6", "@babel/generator": "^7.28.6", @@ -2595,6 +2596,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=18" }, @@ -2636,6 +2638,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=18" } @@ -4657,7 +4660,8 @@ "version": "0.4.1646425229", "resolved": "https://registry.npmjs.org/@mediapipe/face_detection/-/face_detection-0.4.1646425229.tgz", "integrity": "sha512-aeCN+fRAojv9ch3NXorP6r5tcGVLR3/gC1HmtqB0WEZBRXrdP6/3W/sGR0dHr1iT6ueiK95G9PVjbzFosf/hrg==", - "license": "Apache-2.0" + "license": "Apache-2.0", + "peer": true }, "node_modules/@microbit/microbit-universal-hex": { "version": "0.2.2", @@ -5187,6 +5191,7 @@ "integrity": "sha512-DhGl4xMVFGVIyMwswXeyzdL4uXD5OGILGX5N8Y+f6W7LhC1Ze2poSNrkF/fedpVDHEEZ+PHFW0vL14I+mm8K3Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@octokit/auth-token": "^6.0.0", "@octokit/graphql": "^9.0.3", @@ -8870,6 +8875,7 @@ "dev": true, "inBundle": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -9696,6 +9702,7 @@ "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-backend-webgl/-/tfjs-backend-webgl-4.22.0.tgz", "integrity": "sha512-H535XtZWnWgNwSzv538czjVlbJebDl5QTMOth4RXr2p/kJ1qSIXE0vZvEtO+5EC9b00SvhplECny2yDewQb/Yg==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@tensorflow/tfjs-backend-cpu": "4.22.0", "@types/offscreencanvas": "~2019.3.0", @@ -9714,6 +9721,7 @@ "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-converter/-/tfjs-converter-4.22.0.tgz", "integrity": "sha512-PT43MGlnzIo+YfbsjM79Lxk9lOq6uUwZuCc8rrp0hfpLjF6Jv8jS84u2jFb+WpUeuF4K33ZDNx8CjiYrGQ2trQ==", "license": "Apache-2.0", + "peer": true, "peerDependencies": { "@tensorflow/tfjs-core": "4.22.0" } @@ -9723,6 +9731,7 @@ "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-core/-/tfjs-core-4.22.0.tgz", "integrity": "sha512-LEkOyzbknKFoWUwfkr59vSB68DMJ4cjwwHgicXN0DUi3a0Vh1Er3JQqCI1Hl86GGZQvY8ezVrtDIvqR1ZFW55A==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@types/long": "^4.0.1", "@types/offscreencanvas": "~2019.7.0", @@ -10480,6 +10489,7 @@ "integrity": "sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/linkify-it": "*", "@types/mdurl": "*" @@ -10528,6 +10538,7 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.0.tgz", "integrity": "sha512-qzQZRBqkFsYyaSWXuEHc2WR9c0a0CXwiE5FWUvn7ZM+vdy1uZLfCunD38UzhuB7YN/J11ndbDBcTmOdxJo9Q7A==", "license": "MIT", + "peer": true, "dependencies": { "undici-types": "~7.16.0" } @@ -10602,6 +10613,7 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.26.tgz", "integrity": "sha512-RFA/bURkcKzx/X9oumPG9Vp3D3JUgus/d0b67KB0t5S/raciymilkOa66olh78MUI92QLbEJevO7rvqU/kjwKA==", "license": "MIT", + "peer": true, "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -10613,6 +10625,7 @@ "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", "devOptional": true, "license": "MIT", + "peer": true, "peerDependencies": { "@types/react": "^18.0.0" } @@ -10825,6 +10838,7 @@ "integrity": "sha512-6m1I5RmHBGTnUGS113G04DMu3CpSdxCAU/UvtjNWL4Nuf3MW9tQhiJqRlHzChIkhy6kZSAQmc+I1bcGjE3yNKg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.46.3", "@typescript-eslint/types": "8.46.3", @@ -11495,6 +11509,7 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -11608,6 +11623,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -11726,8 +11742,7 @@ "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/anymatch": { "version": "3.1.3", @@ -12002,6 +12017,7 @@ "resolved": "https://registry.npmjs.org/arraybuffer-loader/-/arraybuffer-loader-1.0.8.tgz", "integrity": "sha512-CwUVCcxCgcgZUu2w741OV6Xj1tvRVQebq22RCyGXiLgJOJ4e4M/59EPYdtK2MLfIN28t1TDvuh2ojstNq3Kh5g==", "license": "MIT", + "peer": true, "dependencies": { "loader-utils": "^1.1.0" }, @@ -12349,6 +12365,7 @@ "integrity": "sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "find-cache-dir": "^4.0.0", "schema-utils": "^4.0.0" @@ -12978,6 +12995,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -13867,7 +13885,6 @@ "integrity": "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "chalk": "^4.0.0", "highlight.js": "^10.7.1", @@ -13890,7 +13907,6 @@ "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -13902,8 +13918,7 @@ "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/cli-highlight/node_modules/parse5-htmlparser2-tree-adapter": { "version": "6.0.1", @@ -13911,7 +13926,6 @@ "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "parse5": "^6.0.1" } @@ -13921,8 +13935,7 @@ "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/cli-highlight/node_modules/yargs": { "version": "16.2.0", @@ -13930,7 +13943,6 @@ "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "cliui": "^7.0.2", "escalade": "^3.1.1", @@ -14537,7 +14549,6 @@ "integrity": "sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -14612,6 +14623,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -14809,6 +14821,7 @@ "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", @@ -14983,6 +14996,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -16261,8 +16275,7 @@ "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz", "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/emojis-list": { "version": "3.0.0", @@ -16777,6 +16790,7 @@ "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==", "hasInstallScript": true, "license": "MIT", + "peer": true, "bin": { "esbuild": "bin/esbuild" }, @@ -16934,6 +16948,7 @@ "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -17034,6 +17049,22 @@ "eslint": "^9.23.0" } }, + "node_modules/eslint-config-scratch/node_modules/prettier": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.0.tgz", + "integrity": "sha512-yEPsovQfpxYfgWNhCfECjG5AQaO+K3dp6XERmOepyPDVqcJm+bjyCVO3pmU+nAPe0N5dDvekfGezt/EIiRe1TA==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, "node_modules/eslint-import-resolver-node": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", @@ -17238,6 +17269,7 @@ "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.9", @@ -17808,6 +17840,7 @@ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -18277,6 +18310,7 @@ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -18522,7 +18556,6 @@ "integrity": "sha512-2kCCtc+JvcZ86IGAz3Z2Y0A1baIz9fL31pH/0S1IqZr9Iwnjq8izfPtrCyQKO6TLMPELLsQMre7VDqeIKCsHkA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "semver-regex": "^4.0.5", "super-regex": "^1.0.0" @@ -19521,7 +19554,6 @@ "integrity": "sha512-939eZS4gJ3htTHAldmyyuzlrD58P03fHG49v2JfFXbV6OhvZKRC9j2yAtdHw/zrp2zXHuv05zMIy40F0ge7spA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -20542,7 +20574,6 @@ "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "engines": { "node": "*" } @@ -20568,7 +20599,6 @@ "integrity": "sha512-IHI4bEVOt3vRUDJ+bFA9VUJlo7SzvFARPNLw75pqSmAOP2HmTWfFJtPvLBrDrlgjEYXY9zs7SFdHPQaJShkSCQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=20" }, @@ -22536,20 +22566,6 @@ } } }, - "node_modules/isomorphic-dompurify/node_modules/@noble/hashes": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.0.1.tgz", - "integrity": "sha512-XlOlEbQcE9fmuXxrVTXCTlG2nlRXa9Rj3rr5Ue/+tX+nmkgbX720YHh0VR3hBF9xDvwnb8D2shVGOwNx+ulArw==", - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/isomorphic-dompurify/node_modules/css-tree": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", @@ -22970,6 +22986,7 @@ "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/core": "^29.7.0", "@jest/types": "^29.6.3", @@ -24705,6 +24722,7 @@ "integrity": "sha512-cG1NtMWO9hWpqRNRR3dSvEQa8bFI6iLlqU2x4kwX51FQjp0qus8T9aBaAO6iGp3DeBrhdwuKxckknohkmfvsFw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "abab": "^2.0.0", "acorn": "^6.0.4", @@ -25823,7 +25841,6 @@ "integrity": "sha512-T9BPOmEOhp6SmV25SwLVcHK4E6JyG/coH3C6F1NjNXSziv/fd4GmsqMk8YR6qpPOswfaOCApSNkZv6fxoaYFcQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "p-event": "^6.0.0", "type-fest": "^4.6.0", @@ -25842,7 +25859,6 @@ "integrity": "sha512-Q6Bekk5wpzW5qIyUP4gdMEujObYstZl6DMMOSenwBvV0BlE5LkDwkjs5yHbZmdCEq2o4RJx4tE1vwxFVf2FG1w==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "p-timeout": "^6.1.2" }, @@ -25859,7 +25875,6 @@ "integrity": "sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=14.16" }, @@ -25873,7 +25888,6 @@ "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", "dev": true, "license": "(MIT OR CC0-1.0)", - "peer": true, "engines": { "node": ">=16" }, @@ -25886,8 +25900,7 @@ "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.2.0.tgz", "integrity": "sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==", "dev": true, - "license": "Apache-2.0", - "peer": true + "license": "Apache-2.0" }, "node_modules/make-dir": { "version": "2.1.0", @@ -26286,6 +26299,7 @@ "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", "dev": true, "license": "MIT", + "peer": true, "bin": { "marked": "bin/marked.js" }, @@ -26299,7 +26313,6 @@ "integrity": "sha512-t4rBvPsHc57uE/2nJOLmMbZCQ4tgAccAED3ngXQqW6g+TxA488JzJ+FK3lQkzBQOI1mRV/r/Kq+1ZlJ4D0owQw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-escapes": "^7.0.0", "ansi-regex": "^6.1.0", @@ -26322,7 +26335,6 @@ "integrity": "sha512-g6LhBsl+GBPRWGWsBtutpzBYuIIdBkLEvad5C/va/74Db018+5TZiyA26cZJAr3Rft5lprVqOIPxf5Vid6tqAw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "environment": "^1.0.0" }, @@ -26339,7 +26351,6 @@ "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -26353,7 +26364,6 @@ "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, @@ -27851,7 +27861,6 @@ "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", @@ -27930,7 +27939,6 @@ "integrity": "sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@sindresorhus/is": "^4.6.0", "char-regex": "^1.0.2", @@ -27947,7 +27955,6 @@ "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -30988,6 +30995,7 @@ "dev": true, "inBundle": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -31582,7 +31590,6 @@ "integrity": "sha512-lastgtAdoH9YaLyDa5i5z64q+kzOcQHsQ5SsZJD3q0VEyI8mq872S3geuNbRUQLVAE9siMfgKrpj7MloKFHruw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -32734,6 +32741,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -32816,6 +32824,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -33030,11 +33039,12 @@ } }, "node_modules/prettier": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.0.tgz", - "integrity": "sha512-yEPsovQfpxYfgWNhCfECjG5AQaO+K3dp6XERmOepyPDVqcJm+bjyCVO3pmU+nAPe0N5dDvekfGezt/EIiRe1TA==", + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz", + "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", "dev": true, "license": "MIT", + "peer": true, "bin": { "prettier": "bin/prettier.cjs" }, @@ -33271,6 +33281,7 @@ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", @@ -33614,6 +33625,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -33703,6 +33715,7 @@ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -33957,6 +33970,7 @@ "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-8.1.3.tgz", "integrity": "sha512-n0ZrutD7DaX/j9VscF+uTALI3oUPa/pO4Z3soOBIjuRn/FzVu6aehhysxZCLi6y7duMf52WNZGMl7CtuK5EnRw==", "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.12.1", "@types/hoist-non-react-statics": "^3.3.1", @@ -34049,6 +34063,7 @@ "resolved": "https://registry.npmjs.org/react-responsive/-/react-responsive-9.0.2.tgz", "integrity": "sha512-+4CCab7z8G8glgJoRjAwocsgsv6VA2w7JPxFWHRc7kvz8mec1/K5LutNC2MG28Mn8mu6+bu04XZxHv5gyfT7xQ==", "license": "MIT", + "peer": true, "dependencies": { "hyphenate-style-name": "^1.0.0", "matchmediaquery": "^0.3.0", @@ -34081,6 +34096,7 @@ "resolved": "https://registry.npmjs.org/react-style-proptype/-/react-style-proptype-3.2.2.tgz", "integrity": "sha512-ywYLSjNkxKHiZOqNlso9PZByNEY+FTyh3C+7uuziK0xFXu9xzdyfHwg4S9iyiRRoPCR4k2LqaBBsWVmSBwCWYQ==", "license": "MIT", + "peer": true, "dependencies": { "prop-types": "^15.5.4" } @@ -34880,6 +34896,7 @@ "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", "license": "Apache-2.0", + "peer": true, "dependencies": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", @@ -35215,6 +35232,7 @@ "integrity": "sha512-Qd9c2p0XKZdgT5AYd+KgAMggJ8ZmCs3JnS9PTMWkyUfteKlfmKtxJbWTHkVakxwXs1Ub7jrRYVeFeF7N0sQxyw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@oxc-project/types": "=0.101.0", "@rolldown/pluginutils": "1.0.0-beta.53" @@ -35642,6 +35660,7 @@ "version": "1.0.252", "resolved": "https://registry.npmjs.org/scratch-render-fonts/-/scratch-render-fonts-1.0.252.tgz", "integrity": "sha512-leYCgtHMIqy36KqjraAiwaPYc9Bjy2L8J+vZ/CEnUE2PVP3z0dDoA4akz42/hk44kpVDzD574Th3SANt+PlLVA==", + "peer": true, "dependencies": { "base64-loader": "^1.0.0" } @@ -35747,7 +35766,8 @@ "version": "3.0.5", "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz", "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/seek-bzip": { "version": "1.0.6", @@ -35855,8 +35875,7 @@ "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-26.0.0.tgz", "integrity": "sha512-7AtcfKtpo77j7Ts73b4OWhOZHTKo/gGY8bB3bNBQz4H+GRSWqx2yvj8TXRsbdTE0eRmYmXOEY66jM7mJ7LzfsA==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/semantic-release/node_modules/@octokit/plugin-paginate-rest": { "version": "13.2.1", @@ -35864,7 +35883,6 @@ "integrity": "sha512-Tj4PkZyIL6eBMYcG/76QGsedF0+dWVeLhYprTmuFVVxzDW7PQh23tM0TP0z+1MvSkxB29YFZwnUX+cXfTiSdyw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@octokit/types": "^15.0.1" }, @@ -35881,7 +35899,6 @@ "integrity": "sha512-rR+5VRjhYSer7sC51krfCctQhVTmjyUMAaShfPB8mscVa8tSoLyon3coxQmXu0ahJoLVWl8dSGD/3OGZlFV44Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@octokit/openapi-types": "^26.0.0" } @@ -35892,7 +35909,6 @@ "integrity": "sha512-mgdxrHTLOjOddRVYIYDo0fR3/v61GNN1YGkfbrjuIKg/uMgCd+Qzo3UAXJ+woLQQpos4pl5Esuw5A7AoNlzjUQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=18" } @@ -35903,7 +35919,6 @@ "integrity": "sha512-ctDzdSMrT3H+pwKBPdyCPty6Y47X8dSrjd3aPZ5KKIKKWTwZBE9De8GtsH3TyAlw3Uyo2stegMx6rJMXKpJwJA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@octokit/core": "^7.0.0", "@octokit/plugin-paginate-rest": "^13.0.0", @@ -35935,7 +35950,6 @@ "integrity": "sha512-+M9/Lb35IgnlUO6OSJ40Ie+hUsZLuph2fqXC/qrKn0fMvUU/jiCjpoL6zEm69vzcmaZJ8yNKtMBEKHWN49WBbQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@semantic-release/error": "^4.0.0", "aggregate-error": "^5.0.0", @@ -35964,7 +35978,6 @@ "integrity": "sha512-gOsf2YwSlleG6IjRYG2A7k0HmBMEo6qVNk9Bp/EaLgAJT5ngH6PXbqa4ItvnEwCm/velL5jAnQgsHsWnjhGmvw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "clean-stack": "^5.2.0", "indent-string": "^5.0.0" @@ -35982,7 +35995,6 @@ "integrity": "sha512-9ngPTOhYGQqNVSfeJkYXHmF7AGWp4/nN5D/QqNQs3Dvxd1Kk/WpjHfNujKHYUQ/5CoGyOyFNoWSPk5afzP0QVg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "escape-string-regexp": "5.0.0" }, @@ -35999,7 +36011,6 @@ "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "env-paths": "^2.2.1", "import-fresh": "^3.3.0", @@ -36027,7 +36038,6 @@ "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -36041,7 +36051,6 @@ "integrity": "sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@sindresorhus/merge-streams": "^4.0.0", "cross-spawn": "^7.0.6", @@ -36069,7 +36078,6 @@ "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@sec-ant/readable-stream": "^0.4.1", "is-stream": "^4.0.1" @@ -36087,7 +36095,6 @@ "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "is-unicode-supported": "^2.0.0" }, @@ -36104,7 +36111,6 @@ "integrity": "sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "lru-cache": "^10.0.1" }, @@ -36118,7 +36124,6 @@ "integrity": "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==", "dev": true, "license": "Apache-2.0", - "peer": true, "engines": { "node": ">=18.18.0" } @@ -36129,7 +36134,6 @@ "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -36143,7 +36147,6 @@ "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -36157,7 +36160,6 @@ "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -36170,8 +36172,7 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/semantic-release/node_modules/marked": { "version": "15.0.12", @@ -36179,7 +36180,6 @@ "integrity": "sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA==", "dev": true, "license": "MIT", - "peer": true, "bin": { "marked": "bin/marked.js" }, @@ -36193,7 +36193,6 @@ "integrity": "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==", "dev": true, "license": "BSD-2-Clause", - "peer": true, "dependencies": { "hosted-git-info": "^7.0.0", "semver": "^7.3.5", @@ -36209,7 +36208,6 @@ "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "lru-cache": "^10.0.1" }, @@ -36223,7 +36221,6 @@ "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "path-key": "^4.0.0", "unicorn-magic": "^0.3.0" @@ -36241,7 +36238,6 @@ "integrity": "sha512-xsrIUgI0Kn6iyDYm9StOpOeK29XM1aboGji26+QEortiFST1hGZaUQOLhtEbqHErPpGW/aSz6allwK2qcptp0Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -36255,7 +36251,6 @@ "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -36269,7 +36264,6 @@ "integrity": "sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/normalize-package-data": "^2.4.3", "normalize-package-data": "^6.0.0", @@ -36290,7 +36284,6 @@ "integrity": "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.26.2", "index-to-position": "^1.1.0", @@ -36309,7 +36302,6 @@ "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -36323,7 +36315,6 @@ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, "license": "ISC", - "peer": true, "engines": { "node": ">=14" }, @@ -36337,7 +36328,6 @@ "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -36351,7 +36341,6 @@ "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", "dev": true, "license": "(MIT OR CC0-1.0)", - "peer": true, "engines": { "node": ">=16" }, @@ -36381,7 +36370,6 @@ "deprecated": "Deprecated as the semver package now supports this built-in.", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "semver": "^7.3.5" }, @@ -36398,7 +36386,6 @@ "integrity": "sha512-hunMQrEy1T6Jr2uEVjrAIqjwWcQTgOAcIM52C8MY1EZSD3DDNft04XzvYKPqjED65bNVVko0YI38nYeEHCX3yw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -36985,7 +36972,6 @@ "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "unicode-emoji-modifier-base": "^1.0.0" }, @@ -37949,6 +37935,7 @@ "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-4.0.0.tgz", "integrity": "sha512-1V4WqhhZZgjVAVJyt7TdDPZoPBPNHbekX4fWnCJL1yQukhCeZhJySUL+gL9y6sNdN95uEOS83Y55SqHcP7MzLA==", "license": "MIT", + "peer": true, "engines": { "node": ">= 18.12.0" }, @@ -37966,7 +37953,6 @@ "integrity": "sha512-WHkws2ZflZe41zj6AolvvmaTrWds/VuyeYr9iPVv/oQeaIoVxMKaushfFWpOGDT+GuBrM/sVqF8KUCYQlSSTdQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "function-timeout": "^1.0.1", "make-asynchronous": "^1.0.1", @@ -37997,7 +37983,6 @@ "integrity": "sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" @@ -38464,6 +38449,7 @@ "integrity": "sha512-agJabQ9P4iW+CshG8B/5OORwySzU3yaLhCSzHNGSIwvhVlXcN0coMYdBuKLo1kCZM3X2D24pa1tO7NcUqVyNyQ==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "dependencies": { "@tapjs/processinfo": "^3.1.9", "@tapjs/stack": "4.3.0", @@ -39259,6 +39245,7 @@ "resolved": "https://registry.npmjs.org/terser/-/terser-5.44.1.tgz", "integrity": "sha512-t/R3R/n0MSwnnazuPpPNVO60LX0SKL45pyl9YlvxIdkH0Of7D5qM2EVe+yASRIlY5pZ73nclYJfNANGWPwFDZw==", "license": "BSD-2-Clause", + "peer": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.15.0", @@ -39415,7 +39402,6 @@ "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "any-promise": "^1.0.0" } @@ -39426,7 +39412,6 @@ "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "thenify": ">= 3.1.0 < 4" }, @@ -39480,7 +39465,6 @@ "integrity": "sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "convert-hrtime": "^5.0.0" }, @@ -39564,6 +39548,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -39823,6 +39808,7 @@ "integrity": "sha512-fSpWtOO/1AjSNQguk43hb/JCo16oJDnMJf3CdEGNkqsEX3t0KX96xvyX1D7PfLCpVoKu4MfVrqUkFyblYoY4lA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "bs-logger": "^0.2.6", "fast-json-stable-stringify": "^2.1.0", @@ -39912,6 +39898,7 @@ "integrity": "sha512-nCz0rEwunlTZiy6rXFByQU1kVVpCIgUpc/psFiKVrUwrizdnIbRFu8w7bxhUF0X613DYwT4XzrZHpVyMe758hQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "chalk": "^4.1.0", "enhanced-resolve": "^5.0.0", @@ -39971,6 +39958,7 @@ "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", @@ -40204,7 +40192,8 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" + "license": "0BSD", + "peer": true }, "node_modules/tslog": { "version": "4.10.2", @@ -40223,6 +40212,7 @@ "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", "license": "MIT", + "peer": true, "dependencies": { "esbuild": "~0.27.0", "get-tsconfig": "^4.7.5" @@ -40659,6 +40649,7 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "devOptional": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -40811,7 +40802,6 @@ "integrity": "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4" } @@ -41147,6 +41137,7 @@ "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "loader-utils": "^2.0.0", "mime-types": "^2.1.27", @@ -41175,6 +41166,7 @@ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -41453,6 +41445,7 @@ "integrity": "sha512-LYzdNAjRHhF2yA4JUQm/QyARyi216N2rpJ0lJZb8E9FU2y5v6Vk+xq/U4XBOxMefpWixT5H3TslmAHm1rqIq2w==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@oxc-project/runtime": "0.101.0", "fdir": "^6.5.0", @@ -41547,6 +41540,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -41560,6 +41554,7 @@ "integrity": "sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@vitest/expect": "4.0.17", "@vitest/mocker": "4.0.17", @@ -41764,6 +41759,7 @@ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.104.1.tgz", "integrity": "sha512-Qphch25abbMNtekmEGJmeRUhLDbe+QfiWTiqpKYkpCOWY64v9eyl+KRRLmqOFA2AvKPpc9DC6+u2n76tQLBoaA==", "license": "MIT", + "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.8", @@ -41813,6 +41809,7 @@ "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@discoveryjs/json-ext": "^0.5.0", "@webpack-cli/configtest": "^2.1.1", @@ -42596,6 +42593,7 @@ "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", "dev": true, "license": "ISC", + "peer": true, "bin": { "yaml": "bin.mjs" }, @@ -42717,6 +42715,7 @@ "integrity": "sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ==", "dev": true, "license": "MIT", + "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } @@ -42889,6 +42888,7 @@ "integrity": "sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@octokit/auth-token": "^3.0.0", "@octokit/graphql": "^5.0.0", @@ -46064,6 +46064,7 @@ "integrity": "sha512-NMPKdfpXTnPn49FDogMBi36SiBfXkSOJqCkk0E4iWOY1tusvvgBwqUmxTX1kmlT6kIYed9YwNKD1sfPpqa5yaA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@semantic-release/commit-analyzer": "^9.0.2", "@semantic-release/error": "^3.0.0", @@ -46310,6 +46311,7 @@ "integrity": "sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@octokit/auth-token": "^3.0.0", "@octokit/graphql": "^5.0.0", @@ -49700,6 +49702,7 @@ "integrity": "sha512-NMPKdfpXTnPn49FDogMBi36SiBfXkSOJqCkk0E4iWOY1tusvvgBwqUmxTX1kmlT6kIYed9YwNKD1sfPpqa5yaA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@semantic-release/commit-analyzer": "^9.0.2", "@semantic-release/error": "^3.0.0", @@ -49960,6 +49963,7 @@ "integrity": "sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@octokit/auth-token": "^3.0.0", "@octokit/graphql": "^5.0.0", @@ -53145,6 +53149,7 @@ "integrity": "sha512-NMPKdfpXTnPn49FDogMBi36SiBfXkSOJqCkk0E4iWOY1tusvvgBwqUmxTX1kmlT6kIYed9YwNKD1sfPpqa5yaA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@semantic-release/commit-analyzer": "^9.0.2", "@semantic-release/error": "^3.0.0", @@ -53407,6 +53412,7 @@ "integrity": "sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@octokit/auth-token": "^3.0.0", "@octokit/graphql": "^5.0.0", @@ -56638,6 +56644,7 @@ "integrity": "sha512-NMPKdfpXTnPn49FDogMBi36SiBfXkSOJqCkk0E4iWOY1tusvvgBwqUmxTX1kmlT6kIYed9YwNKD1sfPpqa5yaA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@semantic-release/commit-analyzer": "^9.0.2", "@semantic-release/error": "^3.0.0", @@ -56801,6 +56808,7 @@ "integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@discoveryjs/json-ext": "^0.5.0", "@webpack-cli/configtest": "^1.2.0", @@ -56880,7 +56888,7 @@ "@vitest/coverage-v8": "4.0.17", "eslint": "9.39.2", "eslint-config-scratch": "12.0.47", - "prettier": "3.8.0", + "prettier": "3.8.1", "rimraf": "6.1.2", "typescript": "5.9.3", "unplugin-dts": "1.0.0-beta.6", diff --git a/packages/task-herder/package.json b/packages/task-herder/package.json index 79baecf1405..ccc1fcde016 100644 --- a/packages/task-herder/package.json +++ b/packages/task-herder/package.json @@ -40,7 +40,7 @@ "@vitest/coverage-v8": "4.0.17", "eslint": "9.39.2", "eslint-config-scratch": "12.0.47", - "prettier": "3.8.0", + "prettier": "3.8.1", "rimraf": "6.1.2", "typescript": "5.9.3", "unplugin-dts": "1.0.0-beta.6", From 51d078c41f9dc7a8c717eed6b350c90e8e0b2fe4 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 25 Jan 2026 01:09:45 +0000 Subject: [PATCH 198/521] style(deps): update dependency eslint-config-scratch to v12.0.48 --- package-lock.json | 37 +++++++--------------- packages/scratch-gui/package.json | 2 +- packages/scratch-render/package.json | 2 +- packages/scratch-svg-renderer/package.json | 2 +- packages/scratch-vm/package.json | 2 +- packages/task-herder/package.json | 2 +- 6 files changed, 16 insertions(+), 31 deletions(-) diff --git a/package-lock.json b/package-lock.json index 62612af3df5..c1038aacdad 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4736,8 +4736,9 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", - "dev": true, + "devOptional": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 16" }, @@ -17020,9 +17021,9 @@ } }, "node_modules/eslint-config-scratch": { - "version": "12.0.47", - "resolved": "https://registry.npmjs.org/eslint-config-scratch/-/eslint-config-scratch-12.0.47.tgz", - "integrity": "sha512-czazYXIYGJIMjFhIkAbYZyiO2FAQhpwRcvuuIfH0i7gerSCBXNu0AxJ4cxzHdX7Al5nF+hnP6H4AsGmzO0QOHQ==", + "version": "12.0.48", + "resolved": "https://registry.npmjs.org/eslint-config-scratch/-/eslint-config-scratch-12.0.48.tgz", + "integrity": "sha512-Pd/zL4iZLwByt5xYQ/J0Eo3WEQe8l7JrT5Gl31Df1xg/4Z+DrSONPHYWgiWKbuEAAK7UOtKHY94b6JCIv3ym6g==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -17042,29 +17043,13 @@ "eslint-plugin-react": "7.37.5", "eslint-plugin-react-hooks": "7.0.1", "globals": "16.5.0", - "prettier": "3.8.0", + "prettier": "3.8.1", "typescript-eslint": "8.46.3" }, "peerDependencies": { "eslint": "^9.23.0" } }, - "node_modules/eslint-config-scratch/node_modules/prettier": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.0.tgz", - "integrity": "sha512-yEPsovQfpxYfgWNhCfECjG5AQaO+K3dp6XERmOepyPDVqcJm+bjyCVO3pmU+nAPe0N5dDvekfGezt/EIiRe1TA==", - "dev": true, - "license": "MIT", - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, "node_modules/eslint-import-resolver-node": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", @@ -42836,7 +42821,7 @@ "cheerio": "1.1.2", "cross-env": "7.0.3", "eslint": "9.39.2", - "eslint-config-scratch": "12.0.47", + "eslint-config-scratch": "12.0.48", "eslint-import-resolver-webpack": "0.13.10", "eslint-plugin-import": "2.32.0", "eslint-plugin-react": "7.37.5", @@ -46274,7 +46259,7 @@ "copy-webpack-plugin": "6.4.1", "docdash": "0.4.0", "eslint": "9.39.2", - "eslint-config-scratch": "12.0.47", + "eslint-config-scratch": "12.0.48", "gh-pages": "1.2.0", "globals": "16.5.0", "html-webpack-plugin": "5.6.6", @@ -49928,7 +49913,7 @@ "babel-loader": "9.2.1", "copy-webpack-plugin": "6.4.1", "eslint": "9.39.2", - "eslint-config-scratch": "12.0.47", + "eslint-config-scratch": "12.0.48", "globals": "16.5.0", "jsdom": "13.2.0", "mkdirp": "2.1.6", @@ -53373,7 +53358,7 @@ "copy-webpack-plugin": "6.4.1", "docdash": "1.2.0", "eslint": "9.39.2", - "eslint-config-scratch": "12.0.47", + "eslint-config-scratch": "12.0.48", "expose-loader": "1.0.3", "file-loader": "6.2.0", "format-message-cli": "6.2.4", @@ -56887,7 +56872,7 @@ "devDependencies": { "@vitest/coverage-v8": "4.0.17", "eslint": "9.39.2", - "eslint-config-scratch": "12.0.47", + "eslint-config-scratch": "12.0.48", "prettier": "3.8.1", "rimraf": "6.1.2", "typescript": "5.9.3", diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index 4fc8ff1b802..ad33f8b0b66 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -152,7 +152,7 @@ "cheerio": "1.1.2", "cross-env": "7.0.3", "eslint": "9.39.2", - "eslint-config-scratch": "12.0.47", + "eslint-config-scratch": "12.0.48", "eslint-import-resolver-webpack": "0.13.10", "eslint-plugin-import": "2.32.0", "eslint-plugin-react": "7.37.5", diff --git a/packages/scratch-render/package.json b/packages/scratch-render/package.json index 5d82f2abd51..680f377f14e 100644 --- a/packages/scratch-render/package.json +++ b/packages/scratch-render/package.json @@ -67,7 +67,7 @@ "copy-webpack-plugin": "6.4.1", "docdash": "0.4.0", "eslint": "9.39.2", - "eslint-config-scratch": "12.0.47", + "eslint-config-scratch": "12.0.48", "gh-pages": "1.2.0", "globals": "16.5.0", "html-webpack-plugin": "5.6.6", diff --git a/packages/scratch-svg-renderer/package.json b/packages/scratch-svg-renderer/package.json index e5843feafa9..f4d9d2e3e6b 100644 --- a/packages/scratch-svg-renderer/package.json +++ b/packages/scratch-svg-renderer/package.json @@ -53,7 +53,7 @@ "babel-loader": "9.2.1", "copy-webpack-plugin": "6.4.1", "eslint": "9.39.2", - "eslint-config-scratch": "12.0.47", + "eslint-config-scratch": "12.0.48", "globals": "16.5.0", "jsdom": "13.2.0", "mkdirp": "2.1.6", diff --git a/packages/scratch-vm/package.json b/packages/scratch-vm/package.json index 6f76001808f..fc95a162be0 100644 --- a/packages/scratch-vm/package.json +++ b/packages/scratch-vm/package.json @@ -84,7 +84,7 @@ "copy-webpack-plugin": "6.4.1", "docdash": "1.2.0", "eslint": "9.39.2", - "eslint-config-scratch": "12.0.47", + "eslint-config-scratch": "12.0.48", "expose-loader": "1.0.3", "file-loader": "6.2.0", "format-message-cli": "6.2.4", diff --git a/packages/task-herder/package.json b/packages/task-herder/package.json index ccc1fcde016..77cd25e7147 100644 --- a/packages/task-herder/package.json +++ b/packages/task-herder/package.json @@ -39,7 +39,7 @@ "devDependencies": { "@vitest/coverage-v8": "4.0.17", "eslint": "9.39.2", - "eslint-config-scratch": "12.0.47", + "eslint-config-scratch": "12.0.48", "prettier": "3.8.1", "rimraf": "6.1.2", "typescript": "5.9.3", From 588fbd7a927465f540561fb3312e3c40d8edc414 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 25 Jan 2026 18:27:13 +0000 Subject: [PATCH 199/521] chore(deps): update vitest monorepo to v4.0.18 --- package-lock.json | 98 +++++++++++++++---------------- packages/task-herder/package.json | 4 +- 2 files changed, 51 insertions(+), 51 deletions(-) diff --git a/package-lock.json b/package-lock.json index c1038aacdad..c0f0f840b15 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11072,14 +11072,14 @@ "license": "BSD-3-Clause" }, "node_modules/@vitest/coverage-v8": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-4.0.17.tgz", - "integrity": "sha512-/6zU2FLGg0jsd+ePZcwHRy3+WpNTBBhDY56P4JTRqUN/Dp6CvOEa9HrikcQ4KfV2b2kAHUFB4dl1SuocWXSFEw==", + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-4.0.18.tgz", + "integrity": "sha512-7i+N2i0+ME+2JFZhfuz7Tg/FqKtilHjGyGvoHYQ6iLV0zahbsJ9sljC9OcFcPDbhYKCet+sG8SsVqlyGvPflZg==", "dev": true, "license": "MIT", "dependencies": { "@bcoe/v8-coverage": "^1.0.2", - "@vitest/utils": "4.0.17", + "@vitest/utils": "4.0.18", "ast-v8-to-istanbul": "^0.3.10", "istanbul-lib-coverage": "^3.2.2", "istanbul-lib-report": "^3.0.1", @@ -11093,8 +11093,8 @@ "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "@vitest/browser": "4.0.17", - "vitest": "4.0.17" + "@vitest/browser": "4.0.18", + "vitest": "4.0.18" }, "peerDependenciesMeta": { "@vitest/browser": { @@ -11113,16 +11113,16 @@ } }, "node_modules/@vitest/expect": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", - "integrity": "sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==", + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.18.tgz", + "integrity": "sha512-8sCWUyckXXYvx4opfzVY03EOiYVxyNrHS5QxX3DAIi5dpJAAkyJezHCP77VMX4HKA2LDT/Jpfo8i2r5BE3GnQQ==", "dev": true, "license": "MIT", "dependencies": { "@standard-schema/spec": "^1.0.0", "@types/chai": "^5.2.2", - "@vitest/spy": "4.0.17", - "@vitest/utils": "4.0.17", + "@vitest/spy": "4.0.18", + "@vitest/utils": "4.0.18", "chai": "^6.2.1", "tinyrainbow": "^3.0.3" }, @@ -11131,13 +11131,13 @@ } }, "node_modules/@vitest/mocker": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.17.tgz", - "integrity": "sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==", + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.18.tgz", + "integrity": "sha512-HhVd0MDnzzsgevnOWCBj5Otnzobjy5wLBe4EdeeFGv8luMsGcYqDuFRMcttKWZA5vVO8RFjexVovXvAM4JoJDQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "4.0.17", + "@vitest/spy": "4.0.18", "estree-walker": "^3.0.3", "magic-string": "^0.30.21" }, @@ -11158,9 +11158,9 @@ } }, "node_modules/@vitest/pretty-format": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", - "integrity": "sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==", + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.18.tgz", + "integrity": "sha512-P24GK3GulZWC5tz87ux0m8OADrQIUVDPIjjj65vBXYG17ZeU3qD7r+MNZ1RNv4l8CGU2vtTRqixrOi9fYk/yKw==", "dev": true, "license": "MIT", "dependencies": { @@ -11171,13 +11171,13 @@ } }, "node_modules/@vitest/runner": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.17.tgz", - "integrity": "sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==", + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.18.tgz", + "integrity": "sha512-rpk9y12PGa22Jg6g5M3UVVnTS7+zycIGk9ZNGN+m6tZHKQb7jrP7/77WfZy13Y/EUDd52NDsLRQhYKtv7XfPQw==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "4.0.17", + "@vitest/utils": "4.0.18", "pathe": "^2.0.3" }, "funding": { @@ -11185,13 +11185,13 @@ } }, "node_modules/@vitest/snapshot": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.17.tgz", - "integrity": "sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==", + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.18.tgz", + "integrity": "sha512-PCiV0rcl7jKQjbgYqjtakly6T1uwv/5BQ9SwBLekVg/EaYeQFPiXcgrC2Y7vDMA8dM1SUEAEV82kgSQIlXNMvA==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "4.0.17", + "@vitest/pretty-format": "4.0.18", "magic-string": "^0.30.21", "pathe": "^2.0.3" }, @@ -11200,9 +11200,9 @@ } }, "node_modules/@vitest/spy": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.17.tgz", - "integrity": "sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==", + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.18.tgz", + "integrity": "sha512-cbQt3PTSD7P2OARdVW3qWER5EGq7PHlvE+QfzSC0lbwO+xnt7+XH06ZzFjFRgzUX//JmpxrCu92VdwvEPlWSNw==", "dev": true, "license": "MIT", "funding": { @@ -11210,13 +11210,13 @@ } }, "node_modules/@vitest/utils": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.17.tgz", - "integrity": "sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==", + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.18.tgz", + "integrity": "sha512-msMRKLMVLWygpK3u2Hybgi4MNjcYJvwTb0Ru09+fOyCXIgT5raYP041DRRdiJiI3k/2U6SEbAETB3YtBrUkCFA==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "4.0.17", + "@vitest/pretty-format": "4.0.18", "tinyrainbow": "^3.0.3" }, "funding": { @@ -41534,20 +41534,20 @@ } }, "node_modules/vitest": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", - "integrity": "sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==", + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.18.tgz", + "integrity": "sha512-hOQuK7h0FGKgBAas7v0mSAsnvrIgAvWmRFjmzpJ7SwFHH3g1k2u37JtYwOwmEKhK6ZO3v9ggDBBm0La1LCK4uQ==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@vitest/expect": "4.0.17", - "@vitest/mocker": "4.0.17", - "@vitest/pretty-format": "4.0.17", - "@vitest/runner": "4.0.17", - "@vitest/snapshot": "4.0.17", - "@vitest/spy": "4.0.17", - "@vitest/utils": "4.0.17", + "@vitest/expect": "4.0.18", + "@vitest/mocker": "4.0.18", + "@vitest/pretty-format": "4.0.18", + "@vitest/runner": "4.0.18", + "@vitest/snapshot": "4.0.18", + "@vitest/spy": "4.0.18", + "@vitest/utils": "4.0.18", "es-module-lexer": "^1.7.0", "expect-type": "^1.2.2", "magic-string": "^0.30.21", @@ -41575,10 +41575,10 @@ "@edge-runtime/vm": "*", "@opentelemetry/api": "^1.9.0", "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.0.17", - "@vitest/browser-preview": "4.0.17", - "@vitest/browser-webdriverio": "4.0.17", - "@vitest/ui": "4.0.17", + "@vitest/browser-playwright": "4.0.18", + "@vitest/browser-preview": "4.0.18", + "@vitest/browser-webdriverio": "4.0.18", + "@vitest/ui": "4.0.18", "happy-dom": "*", "jsdom": "*" }, @@ -56870,7 +56870,7 @@ "version": "12.5.0", "license": "AGPL-3.0-only", "devDependencies": { - "@vitest/coverage-v8": "4.0.17", + "@vitest/coverage-v8": "4.0.18", "eslint": "9.39.2", "eslint-config-scratch": "12.0.48", "prettier": "3.8.1", @@ -56878,7 +56878,7 @@ "typescript": "5.9.3", "unplugin-dts": "1.0.0-beta.6", "vite": "npm:rolldown-vite@7.3.1", - "vitest": "4.0.17" + "vitest": "4.0.18" } }, "packages/task-herder/node_modules/glob": { diff --git a/packages/task-herder/package.json b/packages/task-herder/package.json index 77cd25e7147..0357fda7ecd 100644 --- a/packages/task-herder/package.json +++ b/packages/task-herder/package.json @@ -37,7 +37,7 @@ "test": "npm run lint && vitest run --coverage" }, "devDependencies": { - "@vitest/coverage-v8": "4.0.17", + "@vitest/coverage-v8": "4.0.18", "eslint": "9.39.2", "eslint-config-scratch": "12.0.48", "prettier": "3.8.1", @@ -45,7 +45,7 @@ "typescript": "5.9.3", "unplugin-dts": "1.0.0-beta.6", "vite": "npm:rolldown-vite@7.3.1", - "vitest": "4.0.17" + "vitest": "4.0.18" }, "overrides": { "vite": "npm:rolldown-vite@7.3.1" From 8b0e7825509e81b971ae0a149ec08972b1569a95 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 26 Jan 2026 12:37:48 +0000 Subject: [PATCH 200/521] chore(deps): update dependency playwright-chromium to v1.58.0 --- package-lock.json | 16 ++++++++-------- packages/scratch-render/package.json | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index c0f0f840b15..012ea8c2e26 100644 --- a/package-lock.json +++ b/package-lock.json @@ -32639,14 +32639,14 @@ } }, "node_modules/playwright-chromium": { - "version": "1.57.0", - "resolved": "https://registry.npmjs.org/playwright-chromium/-/playwright-chromium-1.57.0.tgz", - "integrity": "sha512-GCVVTbmIDrZuBxWYoQ70rehRXMb3Q7ccENe63a+rGTWwypeVAgh/DD5o5QQ898oer5pdIv3vGINUlEkHtOZQEw==", + "version": "1.58.0", + "resolved": "https://registry.npmjs.org/playwright-chromium/-/playwright-chromium-1.58.0.tgz", + "integrity": "sha512-oJKFmkeQTxV7DiSv1HiTru5srYCh3hGt+1ctyi0eCOkCJZnDf5p6aSWoGtH6od4rjO4zJ3IVrK1C6HJQeha6VQ==", "dev": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.57.0" + "playwright-core": "1.58.0" }, "bin": { "playwright": "cli.js" @@ -32656,9 +32656,9 @@ } }, "node_modules/playwright-core": { - "version": "1.57.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.57.0.tgz", - "integrity": "sha512-agTcKlMw/mjBWOnD6kFZttAAGHgi/Nw0CZ2o6JqWSbMlI219lAFLZZCyqByTsvVAJq5XA5H8cA6PrvBRpBWEuQ==", + "version": "1.58.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.58.0.tgz", + "integrity": "sha512-aaoB1RWrdNi3//rOeKuMiS65UCcgOVljU46At6eFcOFPFHWtd2weHRRow6z/n+Lec0Lvu0k9ZPKJSjPugikirw==", "dev": true, "license": "Apache-2.0", "bin": { @@ -46264,7 +46264,7 @@ "globals": "16.5.0", "html-webpack-plugin": "5.6.6", "jsdoc": "3.6.11", - "playwright-chromium": "1.57.0", + "playwright-chromium": "1.58.0", "scratch-render-fonts": "1.0.252", "scratch-semantic-release-config": "4.0.1", "scratch-storage": "6.1.0", diff --git a/packages/scratch-render/package.json b/packages/scratch-render/package.json index 680f377f14e..6ad55f37a3f 100644 --- a/packages/scratch-render/package.json +++ b/packages/scratch-render/package.json @@ -72,7 +72,7 @@ "globals": "16.5.0", "html-webpack-plugin": "5.6.6", "jsdoc": "3.6.11", - "playwright-chromium": "1.57.0", + "playwright-chromium": "1.58.0", "scratch-render-fonts": "1.0.252", "scratch-semantic-release-config": "4.0.1", "scratch-storage": "6.1.0", From 770eb57d6203df3dd268668d93c1fbdbabd46e3b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 26 Jan 2026 17:53:19 +0000 Subject: [PATCH 201/521] fix(deps): update dependency scratch-storage to v6.1.1 --- package-lock.json | 20 ++++++++++---------- packages/scratch-gui/package.json | 2 +- packages/scratch-render/package.json | 2 +- packages/scratch-vm/package.json | 2 +- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/package-lock.json b/package-lock.json index 012ea8c2e26..be726ff8dbc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -35679,13 +35679,13 @@ } }, "node_modules/scratch-storage": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-6.1.0.tgz", - "integrity": "sha512-5v8oI7aT3RaXgvcMAy/zKc3Q++vPQjtDPhqmYiT1L9pyvA3jkgOPG0GbaWHpCU7dz1PoDdSs4bU/QHgDNibT6A==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-6.1.1.tgz", + "integrity": "sha512-AJOR+BNQdz6z0OcOCJ6S3QQg8hCtawtB4VJvGadVHwojiKIz24GRoMzY4G8gKSm44m7aazv4l/fxDcB79ndxvQ==", "license": "AGPL-3.0-only", "dependencies": { "@babel/runtime": "^7.21.0", - "@scratch/task-herder": "12.3.1", + "@scratch/task-herder": "12.4.0", "arraybuffer-loader": "^1.0.3", "base64-js": "^1.3.0", "buffer": "6.0.3", @@ -35695,9 +35695,9 @@ } }, "node_modules/scratch-storage/node_modules/@scratch/task-herder": { - "version": "12.3.1", - "resolved": "https://registry.npmjs.org/@scratch/task-herder/-/task-herder-12.3.1.tgz", - "integrity": "sha512-bxBTi9GopJJ3bxSOl3PXa3u4CC08xL7aaOrv6dOYu6+o7+5k+VafzrWIzzTlfuika8gy/B/KB54dNkzKG1HzhA==", + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/@scratch/task-herder/-/task-herder-12.4.0.tgz", + "integrity": "sha512-ArVB+ZI9VYbBTRF5uBWJV5edF4wXO9hgiqdZdIJgOVo9Lr92M1twDXIWk5NBxHffJgFihBCAWd2Kle4B+dr81g==", "license": "AGPL-3.0-only" }, "node_modules/scratch-translate-extension-languages": { @@ -42795,7 +42795,7 @@ "scratch-l10n": "6.1.60", "scratch-paint": "4.1.50", "scratch-render-fonts": "1.0.252", - "scratch-storage": "6.1.0", + "scratch-storage": "6.1.1", "startaudiocontext": "1.2.1", "style-loader": "4.0.0", "text-encoding": "0.7.0", @@ -46267,7 +46267,7 @@ "playwright-chromium": "1.58.0", "scratch-render-fonts": "1.0.252", "scratch-semantic-release-config": "4.0.1", - "scratch-storage": "6.1.0", + "scratch-storage": "6.1.1", "scratch-webpack-configuration": "3.1.1", "semantic-release": "19.0.5", "tap": "21.5.0", @@ -53342,7 +53342,7 @@ "scratch-audio": "2.0.268", "scratch-parser": "6.0.0", "scratch-sb1-converter": "2.0.279", - "scratch-storage": "6.1.0", + "scratch-storage": "6.1.1", "scratch-translate-extension-languages": "1.0.7", "text-encoding": "0.7.0", "tslog": "4.10.2", diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index ad33f8b0b66..6d2857dc6be 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -120,7 +120,7 @@ "scratch-l10n": "6.1.60", "scratch-paint": "4.1.50", "scratch-render-fonts": "1.0.252", - "scratch-storage": "6.1.0", + "scratch-storage": "6.1.1", "startaudiocontext": "1.2.1", "style-loader": "4.0.0", "text-encoding": "0.7.0", diff --git a/packages/scratch-render/package.json b/packages/scratch-render/package.json index 6ad55f37a3f..b26266191c2 100644 --- a/packages/scratch-render/package.json +++ b/packages/scratch-render/package.json @@ -75,7 +75,7 @@ "playwright-chromium": "1.58.0", "scratch-render-fonts": "1.0.252", "scratch-semantic-release-config": "4.0.1", - "scratch-storage": "6.1.0", + "scratch-storage": "6.1.1", "scratch-webpack-configuration": "3.1.1", "semantic-release": "19.0.5", "tap": "21.5.0", diff --git a/packages/scratch-vm/package.json b/packages/scratch-vm/package.json index fc95a162be0..f66a9b57d28 100644 --- a/packages/scratch-vm/package.json +++ b/packages/scratch-vm/package.json @@ -68,7 +68,7 @@ "scratch-audio": "2.0.268", "scratch-parser": "6.0.0", "scratch-sb1-converter": "2.0.279", - "scratch-storage": "6.1.0", + "scratch-storage": "6.1.1", "scratch-translate-extension-languages": "1.0.7", "text-encoding": "0.7.0", "tslog": "4.10.2", From 158cfd68ee1ef5976585218172d39af55547e7b5 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 26 Jan 2026 22:15:37 +0000 Subject: [PATCH 202/521] style(deps): update dependency eslint-config-scratch to v12.0.49 --- package-lock.json | 24 +++++++++++----------- packages/scratch-gui/package.json | 2 +- packages/scratch-render/package.json | 2 +- packages/scratch-svg-renderer/package.json | 2 +- packages/scratch-vm/package.json | 2 +- packages/task-herder/package.json | 2 +- 6 files changed, 17 insertions(+), 17 deletions(-) diff --git a/package-lock.json b/package-lock.json index be726ff8dbc..d911067b925 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17021,9 +17021,9 @@ } }, "node_modules/eslint-config-scratch": { - "version": "12.0.48", - "resolved": "https://registry.npmjs.org/eslint-config-scratch/-/eslint-config-scratch-12.0.48.tgz", - "integrity": "sha512-Pd/zL4iZLwByt5xYQ/J0Eo3WEQe8l7JrT5Gl31Df1xg/4Z+DrSONPHYWgiWKbuEAAK7UOtKHY94b6JCIv3ym6g==", + "version": "12.0.49", + "resolved": "https://registry.npmjs.org/eslint-config-scratch/-/eslint-config-scratch-12.0.49.tgz", + "integrity": "sha512-ush96swq/qBlbK5Ej8TREgVMQIozpTlKQZECFWV5s+thu2zWFB+jSgLMXorjaAx+6CbCRf+sI4SiGBdlCl2UxQ==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -17036,7 +17036,7 @@ "@trivago/prettier-plugin-sort-imports": "5.2.2", "eslint-config-prettier": "10.1.8", "eslint-plugin-formatjs": "5.4.2", - "eslint-plugin-html": "8.1.3", + "eslint-plugin-html": "8.1.4", "eslint-plugin-import": "2.32.0", "eslint-plugin-jsdoc": "61.7.1", "eslint-plugin-jsx-a11y": "6.10.2", @@ -17203,9 +17203,9 @@ } }, "node_modules/eslint-plugin-html": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-html/-/eslint-plugin-html-8.1.3.tgz", - "integrity": "sha512-cnCdO7yb/jrvgSJJAfRkGDOwLu1AOvNdw8WCD6nh/2C4RnxuI4tz6QjMEAmmSiHSeugq/fXcIO8yBpIBQrMZCg==", + "version": "8.1.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-html/-/eslint-plugin-html-8.1.4.tgz", + "integrity": "sha512-Eno3oPEj3s6AhvDJ5zHhnHPDvXp6LNFXuy3w51fNebOKYuTrfjOHUGwP+mOrGFpR6eOJkO1xkB8ivtbfMjbMjg==", "dev": true, "license": "ISC", "dependencies": { @@ -42821,7 +42821,7 @@ "cheerio": "1.1.2", "cross-env": "7.0.3", "eslint": "9.39.2", - "eslint-config-scratch": "12.0.48", + "eslint-config-scratch": "12.0.49", "eslint-import-resolver-webpack": "0.13.10", "eslint-plugin-import": "2.32.0", "eslint-plugin-react": "7.37.5", @@ -46259,7 +46259,7 @@ "copy-webpack-plugin": "6.4.1", "docdash": "0.4.0", "eslint": "9.39.2", - "eslint-config-scratch": "12.0.48", + "eslint-config-scratch": "12.0.49", "gh-pages": "1.2.0", "globals": "16.5.0", "html-webpack-plugin": "5.6.6", @@ -49913,7 +49913,7 @@ "babel-loader": "9.2.1", "copy-webpack-plugin": "6.4.1", "eslint": "9.39.2", - "eslint-config-scratch": "12.0.48", + "eslint-config-scratch": "12.0.49", "globals": "16.5.0", "jsdom": "13.2.0", "mkdirp": "2.1.6", @@ -53358,7 +53358,7 @@ "copy-webpack-plugin": "6.4.1", "docdash": "1.2.0", "eslint": "9.39.2", - "eslint-config-scratch": "12.0.48", + "eslint-config-scratch": "12.0.49", "expose-loader": "1.0.3", "file-loader": "6.2.0", "format-message-cli": "6.2.4", @@ -56872,7 +56872,7 @@ "devDependencies": { "@vitest/coverage-v8": "4.0.18", "eslint": "9.39.2", - "eslint-config-scratch": "12.0.48", + "eslint-config-scratch": "12.0.49", "prettier": "3.8.1", "rimraf": "6.1.2", "typescript": "5.9.3", diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index 6d2857dc6be..09e958692c8 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -152,7 +152,7 @@ "cheerio": "1.1.2", "cross-env": "7.0.3", "eslint": "9.39.2", - "eslint-config-scratch": "12.0.48", + "eslint-config-scratch": "12.0.49", "eslint-import-resolver-webpack": "0.13.10", "eslint-plugin-import": "2.32.0", "eslint-plugin-react": "7.37.5", diff --git a/packages/scratch-render/package.json b/packages/scratch-render/package.json index b26266191c2..915b0099914 100644 --- a/packages/scratch-render/package.json +++ b/packages/scratch-render/package.json @@ -67,7 +67,7 @@ "copy-webpack-plugin": "6.4.1", "docdash": "0.4.0", "eslint": "9.39.2", - "eslint-config-scratch": "12.0.48", + "eslint-config-scratch": "12.0.49", "gh-pages": "1.2.0", "globals": "16.5.0", "html-webpack-plugin": "5.6.6", diff --git a/packages/scratch-svg-renderer/package.json b/packages/scratch-svg-renderer/package.json index f4d9d2e3e6b..8c175e8bf9f 100644 --- a/packages/scratch-svg-renderer/package.json +++ b/packages/scratch-svg-renderer/package.json @@ -53,7 +53,7 @@ "babel-loader": "9.2.1", "copy-webpack-plugin": "6.4.1", "eslint": "9.39.2", - "eslint-config-scratch": "12.0.48", + "eslint-config-scratch": "12.0.49", "globals": "16.5.0", "jsdom": "13.2.0", "mkdirp": "2.1.6", diff --git a/packages/scratch-vm/package.json b/packages/scratch-vm/package.json index f66a9b57d28..fc322219748 100644 --- a/packages/scratch-vm/package.json +++ b/packages/scratch-vm/package.json @@ -84,7 +84,7 @@ "copy-webpack-plugin": "6.4.1", "docdash": "1.2.0", "eslint": "9.39.2", - "eslint-config-scratch": "12.0.48", + "eslint-config-scratch": "12.0.49", "expose-loader": "1.0.3", "file-loader": "6.2.0", "format-message-cli": "6.2.4", diff --git a/packages/task-herder/package.json b/packages/task-herder/package.json index 0357fda7ecd..5aa8d5cd52f 100644 --- a/packages/task-herder/package.json +++ b/packages/task-herder/package.json @@ -39,7 +39,7 @@ "devDependencies": { "@vitest/coverage-v8": "4.0.18", "eslint": "9.39.2", - "eslint-config-scratch": "12.0.48", + "eslint-config-scratch": "12.0.49", "prettier": "3.8.1", "rimraf": "6.1.2", "typescript": "5.9.3", From 226b49cb32becb87347d02439d03679d5fcf241c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 27 Jan 2026 00:29:36 +0000 Subject: [PATCH 203/521] chore(deps): update dependency cheerio to v1.2.0 --- package-lock.json | 34 +++++++++++++++---------------- packages/scratch-gui/package.json | 2 +- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/package-lock.json b/package-lock.json index d911067b925..465c1a0ee7f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13681,9 +13681,9 @@ "license": "MIT" }, "node_modules/cheerio": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.1.2.tgz", - "integrity": "sha512-IkxPpb5rS/d1IiLbHMgfPuS0FgiWTtFIm/Nj+2woXDLTZ7fOT2eqzgYbdMlLweqlHbsZjxEChoVK+7iph7jyQg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.2.0.tgz", + "integrity": "sha512-WDrybc/gKFpTYQutKIK6UvfcuxijIZfMfXaYm8NMsPQxSYvf+13fXUJ4rztGGbJcBQ/GF55gvrZ0Bc0bj/mqvg==", "dev": true, "license": "MIT", "dependencies": { @@ -13692,11 +13692,11 @@ "domhandler": "^5.0.3", "domutils": "^3.2.2", "encoding-sniffer": "^0.2.1", - "htmlparser2": "^10.0.0", + "htmlparser2": "^10.1.0", "parse5": "^7.3.0", "parse5-htmlparser2-tree-adapter": "^7.1.0", "parse5-parser-stream": "^7.1.2", - "undici": "^7.12.0", + "undici": "^7.19.0", "whatwg-mimetype": "^4.0.0" }, "engines": { @@ -13725,9 +13725,9 @@ } }, "node_modules/cheerio/node_modules/entities": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -13738,9 +13738,9 @@ } }, "node_modules/cheerio/node_modules/htmlparser2": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.0.0.tgz", - "integrity": "sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.1.0.tgz", + "integrity": "sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==", "dev": true, "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", @@ -13753,8 +13753,8 @@ "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", - "domutils": "^3.2.1", - "entities": "^6.0.0" + "domutils": "^3.2.2", + "entities": "^7.0.1" } }, "node_modules/chokidar": { @@ -40756,9 +40756,9 @@ "license": "MIT" }, "node_modules/undici": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.16.0.tgz", - "integrity": "sha512-QEg3HPMll0o3t2ourKwOeUAZ159Kn9mx5pnzHRQO8+Wixmh88YdZRiIwat0iNzNNXn0yoEtXJqFpyW7eM8BV7g==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.19.1.tgz", + "integrity": "sha512-Gpq0iNm5M6cQWlyHQv9MV+uOj1jWk7LpkoE5vSp/7zjb4zMdAcUD+VL5y0nH4p9EbUklq00eVIIX/XcDHzu5xg==", "dev": true, "license": "MIT", "engines": { @@ -42818,7 +42818,7 @@ "babel-loader": "9.2.1", "babel-plugin-react-intl": "3.5.1", "buffer": "6.0.3", - "cheerio": "1.1.2", + "cheerio": "1.2.0", "cross-env": "7.0.3", "eslint": "9.39.2", "eslint-config-scratch": "12.0.49", diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index 09e958692c8..034e990cf33 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -149,7 +149,7 @@ "babel-loader": "9.2.1", "babel-plugin-react-intl": "3.5.1", "buffer": "6.0.3", - "cheerio": "1.1.2", + "cheerio": "1.2.0", "cross-env": "7.0.3", "eslint": "9.39.2", "eslint-config-scratch": "12.0.49", From e76ede39a7e206065cbabbabd6f7b93c40a05f28 Mon Sep 17 00:00:00 2001 From: Ayshe Dzhindzhi Date: Tue, 27 Jan 2026 13:17:32 +0200 Subject: [PATCH 204/521] feat: remove face sensing feature callouts --- .../extension-button/extension-button.css | 30 ---- .../extension-button/extension-button.jsx | 141 +----------------- .../extension-button/extension-button.raw.css | 47 +----- .../scratch-gui/src/components/gui/gui.jsx | 6 - .../components/library-item/library-item.css | 30 ---- .../components/library-item/library-item.jsx | 7 +- .../library-item/library-item.raw.css | 51 +------ .../src/components/library/library.css | 5 - .../src/components/library/library.jsx | 112 +------------- .../scratch-gui/src/containers/blocks.jsx | 6 +- .../src/containers/extension-library.jsx | 6 +- .../src/containers/library-item.jsx | 4 +- 12 files changed, 24 insertions(+), 421 deletions(-) diff --git a/packages/scratch-gui/src/components/extension-button/extension-button.css b/packages/scratch-gui/src/components/extension-button/extension-button.css index a5d738c67c8..c0a4af961a4 100644 --- a/packages/scratch-gui/src/components/extension-button/extension-button.css +++ b/packages/scratch-gui/src/components/extension-button/extension-button.css @@ -36,7 +36,6 @@ $fade-out-distance: 15px; width: 100%; height: 100%; cursor: pointer; - --radiate-color: 133, 92, 214; /* $looks-secondary */ } .extension-button:focus-visible { @@ -55,32 +54,3 @@ $fade-out-distance: 15px; .extension-button > div { margin-top: 0; } - -$radiate-distance: 20px; - -.radiate:before, -.radiate:after { - content: ''; - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - - z-index: -1; - animation: radiate 2.5s infinite; - clip-path: inset(-$radiate-distance -$radiate-distance 0 0); -} - -.radiate:after { - animation-delay: 0.7s; -} - -@keyframes radiate { - 0% { - box-shadow: 0 0 0 0 rgba(var(--radiate-color), 0.7); - } - 100% { - box-shadow: 0 0 0 $radiate-distance rgba(var(--radiate-color), 0); - } -} diff --git a/packages/scratch-gui/src/components/extension-button/extension-button.jsx b/packages/scratch-gui/src/components/extension-button/extension-button.jsx index df8ff4a502f..ce7f3b77bc1 100644 --- a/packages/scratch-gui/src/components/extension-button/extension-button.jsx +++ b/packages/scratch-gui/src/components/extension-button/extension-button.jsx @@ -1,18 +1,12 @@ -import React, {useEffect, useCallback, useState, useRef, useContext} from 'react'; +import React, {useCallback, useContext} from 'react'; import classNames from 'classnames'; -// eslint-disable-next-line import/no-unresolved -import {driver} from 'driver.js'; -import 'driver.js/dist/driver.css'; import {defineMessages, injectIntl} from 'react-intl'; import intlShape from '../../lib/intlShape.js'; import PropTypes from 'prop-types'; import Box from '../box/box.jsx'; -import {BLOCKS_TAB_INDEX} from '../../reducers/editor-tab'; -import {getLocalStorageValue, setLocalStorageValue} from '../../lib/local-storage.js'; import addExtensionIcon from '../gui/icon--extensions.svg'; import styles from './extension-button.css'; -import './extension-button.raw.css'; import {ModalFocusContext} from '../../contexts/modal-focus-context.jsx'; const messages = defineMessages({ @@ -20,147 +14,25 @@ const messages = defineMessages({ id: 'gui.gui.addExtension', description: 'Button to add an extension in the target pane', defaultMessage: 'Add Extension' - }, - faceSensingCalloutTitle: { - id: 'gui.gui.faceSensingCalloutTitle', - description: 'Hey there! \u{1F44B}', - defaultMessage: 'Hey there! \u{1F44B}' - }, - faceSensingCalloutDescription: { - id: 'gui.gui.faceSensingCalloutDescription', - description: 'There is a new extension!', - defaultMessage: 'There is a new extension!' } }); -const localStorageAvailable = - 'localStorage' in window && window.localStorage !== null; - -// Default to true to make sure we don't end up showing the feature -// callouts multiple times if localStorage isn't available. -const hasIntroducedFaceSensing = (username = 'guest') => { - if (!localStorageAvailable) return true; - return getLocalStorageValue('hasIntroducedFaceSensing', username) === true; -}; - -const setHasIntroducedFaceSensing = (username = 'guest') => { - if (!localStorageAvailable) return; - setLocalStorageValue('hasIntroducedFaceSensing', username, true); -}; - -const hasUsedFaceSensing = (username = 'guest') => { - if (!localStorageAvailable) return true; - return getLocalStorageValue('hasUsedFaceSensing', username) === true; -}; - const ExtensionButton = props => { const { - activeTabIndex, intl, - showNewFeatureCallouts, - onExtensionButtonClick, - username + onExtensionButtonClick } = props; - - const driverRef = useRef(null); const {captureFocus} = useContext(ModalFocusContext); - // Keep in a state to avoid reads from localStorage on every render. - const [shouldShowFaceSensingCallouts, setShouldShowFaceSensingCallouts] = - useState(showNewFeatureCallouts && !hasIntroducedFaceSensing(username) && !hasUsedFaceSensing(username)); - const [clicked, setClicked] = useState(false); - - useEffect(() => { - if (!shouldShowFaceSensingCallouts) return; - - const onFirstInteraction = e => { - // Make sure to clean up event listeners after first interaction - window.removeEventListener('click', onFirstInteraction); - window.removeEventListener('keydown', onFirstInteraction); - - const isExtensionButtonVisible = document.querySelector('div[class*="extension-button-container"]'); - if (!isExtensionButtonVisible) return; - - if (e.type === 'keydown') { - // Prevent focus from jumping to the next element in the tab order after keydown finishes - e.preventDefault(); - } - - const tooltip = driver({ - allowClose: false, - allowInteraction: true, - overlayColor: 'transparent', - popoverOffset: -3, - steps: [{ - element: 'div[class*="extension-button-container"]', - popover: { - title: intl.formatMessage(messages.faceSensingCalloutTitle), - description: intl.formatMessage(messages.faceSensingCalloutDescription), - side: 'right', - align: 'center', - popoverClass: 'tooltip-face-sensing', - showButtons: [] - } - }] - }); - setClicked(true); - driverRef.current = tooltip; - tooltip.drive(); - }; - - window.addEventListener('click', onFirstInteraction, {once: true}); - window.addEventListener('keydown', onFirstInteraction, {once: true}); - - return () => { - if (driverRef.current) { - driverRef.current.destroy(); - driverRef.current = null; - } - }; - }, []); - - useEffect(() => { - if (!driverRef.current) return; - - if (!shouldShowFaceSensingCallouts && driverRef.current) { - driverRef.current.destroy(); - } - - if (!shouldShowFaceSensingCallouts || !clicked) return; - - const isExtensionButtonVisible = document.querySelector('div[class*="extension-button-container"]'); - - if (!isExtensionButtonVisible || activeTabIndex !== BLOCKS_TAB_INDEX) { - driverRef.current.destroy(); - } - - if (isExtensionButtonVisible && activeTabIndex === BLOCKS_TAB_INDEX) { - driverRef.current.drive(); - } - }, [shouldShowFaceSensingCallouts, activeTabIndex, clicked]); - const handleExtensionButtonClick = useCallback(() => { - if (driverRef.current) { - driverRef.current.destroy(); - driverRef.current = null; - } - - if (shouldShowFaceSensingCallouts) { - setHasIntroducedFaceSensing(username); - setShouldShowFaceSensingCallouts(false); - } - captureFocus(); onExtensionButtonClick?.(); - }, [shouldShowFaceSensingCallouts, captureFocus, onExtensionButtonClick]); + }, [captureFocus, onExtensionButtonClick]); return ( ` @@ -1379,9 +1267,7 @@ class Runtime extends EventEmitter { */ _constructInlineImageJson (argInfo) { if (!argInfo.dataURI) { - log.warn( - 'Missing data URI in extension block with argument type IMAGE' - ); + log.warn('Missing data URI in extension block with argument type IMAGE'); } return { type: 'field_image', @@ -1414,13 +1300,8 @@ class Runtime extends EventEmitter { let argTypeInfo = ArgumentTypeMap[argInfo.type] || {}; // Field type not a standard field type, see if extension has registered custom field type - if ( - !ArgumentTypeMap[argInfo.type] && - context.categoryInfo.customFieldTypes[argInfo.type] - ) { - argTypeInfo = - context.categoryInfo.customFieldTypes[argInfo.type] - .argumentTypeInfo; + if (!ArgumentTypeMap[argInfo.type] && context.categoryInfo.customFieldTypes[argInfo.type]) { + argTypeInfo = context.categoryInfo.customFieldTypes[argInfo.type].argumentTypeInfo; } // Start to construct the scratch-blocks style JSON defining how the block should be @@ -1441,14 +1322,8 @@ class Runtime extends EventEmitter { }; const defaultValue = - typeof argInfo.defaultValue === 'undefined' ? - '' : - xmlEscape( - maybeFormatMessage( - argInfo.defaultValue, - this.makeMessageContextForTarget() - ).toString() - ); + typeof argInfo.defaultValue === 'undefined' ? '' : + xmlEscape(maybeFormatMessage(argInfo.defaultValue, this.makeMessageContextForTarget()).toString()); if (argTypeInfo.check) { // Right now the only type of 'check' we have specifies that the @@ -1464,10 +1339,7 @@ class Runtime extends EventEmitter { const menuInfo = context.categoryInfo.menuInfo[argInfo.menu]; if (menuInfo.acceptReporters) { valueName = placeholder; - shadowType = this._makeExtensionMenuId( - argInfo.menu, - context.categoryInfo.id - ); + shadowType = this._makeExtensionMenuId(argInfo.menu, context.categoryInfo.id); fieldName = argInfo.menu; } else { argJSON.type = 'field_dropdown'; @@ -1478,11 +1350,8 @@ class Runtime extends EventEmitter { } } else { valueName = placeholder; - shadowType = - (argTypeInfo.shadow && argTypeInfo.shadow.type) || null; - fieldName = - (argTypeInfo.shadow && argTypeInfo.shadow.fieldName) || - null; + shadowType = (argTypeInfo.shadow && argTypeInfo.shadow.type) || null; + fieldName = (argTypeInfo.shadow && argTypeInfo.shadow.fieldName) || null; } // is the ScratchBlocks name for a block input. @@ -1499,9 +1368,7 @@ class Runtime extends EventEmitter { // A displays a dynamic value: a user-editable text field, a drop-down menu, etc. // Leave out the field if defaultValue or fieldName are not specified if (defaultValue && fieldName) { - context.inputList.push( - `${defaultValue}` - ); + context.inputList.push(`${defaultValue}`); } if (shadowType) { @@ -1514,8 +1381,7 @@ class Runtime extends EventEmitter { } const argsName = `args${context.outLineNum}`; - const blockArgs = (context.blockJSON[argsName] = - context.blockJSON[argsName] || []); + const blockArgs = (context.blockJSON[argsName] = context.blockJSON[argsName] || []); if (argJSON) blockArgs.push(argJSON); const argNum = blockArgs.length; context.argsMap[placeholder] = argNum; @@ -1557,7 +1423,8 @@ class Runtime extends EventEmitter { } else if (categoryInfo.blockIconURI) { menuIconURI = categoryInfo.blockIconURI; } - const menuIconXML = menuIconURI ? `iconURI="${menuIconURI}"` : ''; + const menuIconXML = menuIconURI ? + `iconURI="${menuIconURI}"` : ''; let statusButtonXML = ''; if (categoryInfo.showStatusButton) { @@ -1566,11 +1433,8 @@ class Runtime extends EventEmitter { return { id: categoryInfo.id, - xml: `${paletteBlocks - .map(block => block.xml) - .join('')}` + xml: `${paletteBlocks.map(block => block.xml).join('')}` }; }); } @@ -1580,12 +1444,7 @@ class Runtime extends EventEmitter { */ getBlocksJSON () { return this._blockInfo.reduce( - (result, categoryInfo) => - result.concat( - categoryInfo.blocks.map(blockInfo => blockInfo.json) - ), - [] - ); + (result, categoryInfo) => result.concat(categoryInfo.blocks.map(blockInfo => blockInfo.json)), []); } /** @@ -1594,8 +1453,7 @@ class Runtime extends EventEmitter { _initScratchLink () { // Check that we're actually in a real browser, not Node.js or JSDOM, and we have a valid-looking origin. // note that `if (self?....)` will throw if `self` is undefined, so check for that first! - if ( - typeof self !== 'undefined' && + if (typeof self !== 'undefined' && typeof document !== 'undefined' && document.getElementById && self.origin && @@ -1608,9 +1466,7 @@ class Runtime extends EventEmitter { ) ) { // Create a script tag for the Scratch Link browser extension, unless one already exists - const scriptElement = document.getElementById( - 'scratch-link-extension-script' - ); + const scriptElement = document.getElementById('scratch-link-extension-script'); if (!scriptElement) { const script = document.createElement('script'); script.id = 'scratch-link-extension-script'; @@ -1629,8 +1485,7 @@ class Runtime extends EventEmitter { * @returns {ScratchLinkSocket} The scratch link socket. */ getScratchLinkSocket (type) { - const factory = - this._linkSocketFactory || this._defaultScratchLinkSocketFactory; + const factory = this._linkSocketFactory || this._defaultScratchLinkSocketFactory; return factory(type); } @@ -1650,15 +1505,10 @@ class Runtime extends EventEmitter { */ _defaultScratchLinkSocketFactory (type) { const Scratch = self.Scratch; - const ScratchLinkSafariSocket = - Scratch && Scratch.ScratchLinkSafariSocket; + const ScratchLinkSafariSocket = Scratch && Scratch.ScratchLinkSafariSocket; // detect this every time in case the user turns on the extension after loading the page - const useSafariSocket = - ScratchLinkSafariSocket && - ScratchLinkSafariSocket.isSafariHelperCompatible(); - return useSafariSocket ? - new ScratchLinkSafariSocket(type) : - new ScratchLinkWebSocket(type); + const useSafariSocket = ScratchLinkSafariSocket && ScratchLinkSafariSocket.isSafariHelperCompatible(); + return useSafariSocket ? new ScratchLinkSafariSocket(type) : new ScratchLinkWebSocket(type); } /** @@ -1751,12 +1601,11 @@ class Runtime extends EventEmitter { * @returns {boolean} True if the op is known to be a edge-activated hat. */ getIsEdgeActivatedHat (opcode) { - return ( - Object.prototype.hasOwnProperty.call(this._hats, opcode) && - this._hats[opcode].edgeActivated - ); + return Object.prototype.hasOwnProperty.call(this._hats, opcode) && + this._hats[opcode].edgeActivated; } + /** * Attach the audio engine * @param {!AudioEngine} audioEngine The audio engine to attach @@ -1880,10 +1729,10 @@ class Runtime extends EventEmitter { */ isActiveThread (thread) { return ( - thread.stack.length > 0 && - thread.status !== Thread.STATUS_DONE && - this.threads.indexOf(thread) > -1 - ); + ( + thread.stack.length > 0 && + thread.status !== Thread.STATUS_DONE) && + this.threads.indexOf(thread) > -1); } /** @@ -1908,29 +1757,18 @@ class Runtime extends EventEmitter { * determines whether we show a visual report when turning on the script. */ toggleScript (topBlockId, opts) { - opts = Object.assign( - { - target: this._editingTarget, - stackClick: false - }, - opts - ); + opts = Object.assign({ + target: this._editingTarget, + stackClick: false + }, opts); // Remove any existing thread. for (let i = 0; i < this.threads.length; i++) { // Toggling a script that's already running turns it off - if ( - this.threads[i].topBlock === topBlockId && - this.threads[i].status !== Thread.STATUS_DONE - ) { + if (this.threads[i].topBlock === topBlockId && this.threads[i].status !== Thread.STATUS_DONE) { const blockContainer = opts.target.blocks; - const opcode = blockContainer.getOpcode( - blockContainer.getBlock(topBlockId) - ); + const opcode = blockContainer.getOpcode(blockContainer.getBlock(topBlockId)); - if ( - this.getIsEdgeActivatedHat(opcode) && - this.threads[i].stackClick !== opts.stackClick - ) { + if (this.getIsEdgeActivatedHat(opcode) && this.threads[i].stackClick !== opts.stackClick) { // Allow edge activated hat thread stack click to coexist with // edge activated hat thread that runs every frame continue; @@ -1952,11 +1790,8 @@ class Runtime extends EventEmitter { if (!optTarget) optTarget = this._editingTarget; for (let i = 0; i < this.threads.length; i++) { // Don't re-add the script if it's already running - if ( - this.threads[i].topBlock === topBlockId && - this.threads[i].status !== Thread.STATUS_DONE && - this.threads[i].updateMonitor - ) { + if (this.threads[i].topBlock === topBlockId && this.threads[i].status !== Thread.STATUS_DONE && + this.threads[i].updateMonitor) { return; } } @@ -1994,10 +1829,7 @@ class Runtime extends EventEmitter { } for (let t = targets.length - 1; t >= 0; t--) { const target = targets[t]; - const scripts = BlocksRuntimeCache.getScripts( - target.blocks, - opcode - ); + const scripts = BlocksRuntimeCache.getScripts(target.blocks, opcode); for (let j = 0; j < scripts.length; j++) { f(scripts[j], target); } @@ -2011,13 +1843,9 @@ class Runtime extends EventEmitter { * @param {Target=} optTarget Optionally, a target to restrict to. * @returns {Array.} List of threads started by this function. */ - startHats (requestedHatOpcode, optMatchFields, optTarget) { - if ( - !Object.prototype.hasOwnProperty.call( - this._hats, - requestedHatOpcode - ) - ) { + startHats (requestedHatOpcode, + optMatchFields, optTarget) { + if (!Object.prototype.hasOwnProperty.call(this._hats, requestedHatOpcode)) { // No known hat with this opcode. return; } @@ -2027,71 +1855,58 @@ class Runtime extends EventEmitter { const hatMeta = instance._hats[requestedHatOpcode]; for (const opts in optMatchFields) { - if (!Object.prototype.hasOwnProperty.call(optMatchFields, opts)) { - continue; - } + if (!Object.prototype.hasOwnProperty.call(optMatchFields, opts)) continue; optMatchFields[opts] = optMatchFields[opts].toUpperCase(); } // Consider all scripts, looking for hats with opcode `requestedHatOpcode`. - this.allScriptsByOpcodeDo( - requestedHatOpcode, - (script, target) => { - const {blockId: topBlockId, fieldsOfInputs: hatFields} = - script; - - // Match any requested fields. - // For example: ensures that broadcasts match. - // This needs to happen before the block is evaluated - // (i.e., before the predicate can be run) because "broadcast and wait" - // needs to have a precise collection of started threads. - for (const matchField in optMatchFields) { - if ( - hatFields[matchField].value !== - optMatchFields[matchField] - ) { - // Field mismatch. - return; - } + this.allScriptsByOpcodeDo(requestedHatOpcode, (script, target) => { + const { + blockId: topBlockId, + fieldsOfInputs: hatFields + } = script; + + // Match any requested fields. + // For example: ensures that broadcasts match. + // This needs to happen before the block is evaluated + // (i.e., before the predicate can be run) because "broadcast and wait" + // needs to have a precise collection of started threads. + for (const matchField in optMatchFields) { + if (hatFields[matchField].value !== optMatchFields[matchField]) { + // Field mismatch. + return; } + } - if (hatMeta.restartExistingThreads) { - // If `restartExistingThreads` is true, we should stop - // any existing threads starting with the top block. - for (let i = 0; i < this.threads.length; i++) { - if ( - this.threads[i].target === target && - this.threads[i].topBlock === topBlockId && - // stack click threads and hat threads can coexist - !this.threads[i].stackClick - ) { - newThreads.push( - this._restartThread(this.threads[i]) - ); - return; - } + if (hatMeta.restartExistingThreads) { + // If `restartExistingThreads` is true, we should stop + // any existing threads starting with the top block. + for (let i = 0; i < this.threads.length; i++) { + if (this.threads[i].target === target && + this.threads[i].topBlock === topBlockId && + // stack click threads and hat threads can coexist + !this.threads[i].stackClick) { + newThreads.push(this._restartThread(this.threads[i])); + return; } - } else { - // If `restartExistingThreads` is false, we should - // give up if any threads with the top block are running. - for (let j = 0; j < this.threads.length; j++) { - if ( - this.threads[j].target === target && - this.threads[j].topBlock === topBlockId && - // stack click threads and hat threads can coexist - !this.threads[j].stackClick && - this.threads[j].status !== Thread.STATUS_DONE - ) { - // Some thread is already running. - return; - } + } + } else { + // If `restartExistingThreads` is false, we should + // give up if any threads with the top block are running. + for (let j = 0; j < this.threads.length; j++) { + if (this.threads[j].target === target && + this.threads[j].topBlock === topBlockId && + // stack click threads and hat threads can coexist + !this.threads[j].stackClick && + this.threads[j].status !== Thread.STATUS_DONE) { + // Some thread is already running. + return; } } - // Start the thread with this top block. - newThreads.push(this._pushThread(topBlockId, target)); - }, - optTarget - ); + } + // Start the thread with this top block. + newThreads.push(this._pushThread(topBlockId, target)); + }, optTarget); // For compatibility with Scratch 2, edge triggered hats need to be processed before // threads are stepped. See ScratchRuntime.as for original implementation newThreads.forEach(thread => { @@ -2101,6 +1916,7 @@ class Runtime extends EventEmitter { return newThreads; } + /** * Dispose all targets. Return to clean state. */ @@ -2132,10 +1948,8 @@ class Runtime extends EventEmitter { const newCloudDataManager = cloudDataManager(); this.hasCloudData = newCloudDataManager.hasCloudVariables; this.canAddCloudVariable = newCloudDataManager.canAddCloudVariable; - this.addCloudVariable = - this._initializeAddCloudVariable(newCloudDataManager); - this.removeCloudVariable = - this._initializeRemoveCloudVariable(newCloudDataManager); + this.addCloudVariable = this._initializeAddCloudVariable(newCloudDataManager); + this.removeCloudVariable = this._initializeRemoveCloudVariable(newCloudDataManager); } /** @@ -2166,10 +1980,7 @@ class Runtime extends EventEmitter { newIndex = this.executableTargets.length; } if (newIndex <= 0) { - if ( - this.executableTargets.length > 0 && - this.executableTargets[0].isStage - ) { + if (this.executableTargets.length > 0 && this.executableTargets[0].isStage) { newIndex = 1; } else { newIndex = 0; @@ -2248,10 +2059,7 @@ class Runtime extends EventEmitter { } const newRunId = uuid.v1(); - this.storage.scratchFetch.setMetadata( - this.storage.scratchFetch.RequestMetadata.RunId, - newRunId - ); + this.storage.scratchFetch.setMetadata(this.storage.scratchFetch.RequestMetadata.RunId, newRunId); } /** @@ -2280,13 +2088,8 @@ class Runtime extends EventEmitter { const newTargets = []; for (let i = 0; i < this.targets.length; i++) { this.targets[i].onStopAll(); - if ( - Object.prototype.hasOwnProperty.call( - this.targets[i], - 'isOriginal' - ) && - !this.targets[i].isOriginal - ) { + if (Object.prototype.hasOwnProperty.call(this.targets[i], 'isOriginal') && + !this.targets[i].isOriginal) { this.targets[i].dispose(); } else { newTargets.push(this.targets[i]); @@ -2320,9 +2123,7 @@ class Runtime extends EventEmitter { // Find all edge-activated hats, and add them to threads to be evaluated. for (const hatType in this._hats) { - if (!Object.prototype.hasOwnProperty.call(this._hats, hatType)) { - continue; - } + if (!Object.prototype.hasOwnProperty.call(this._hats, hatType)) continue; const hat = this._hats[hatType]; if (hat.edgeActivated) { this.startHats(hatType); @@ -2332,9 +2133,7 @@ class Runtime extends EventEmitter { this._pushMonitors(); if (this.profiler !== null) { if (stepThreadsProfilerId === -1) { - stepThreadsProfilerId = this.profiler.idByName( - 'Sequencer.stepThreads' - ); + stepThreadsProfilerId = this.profiler.idByName('Sequencer.stepThreads'); } this.profiler.start(stepThreadsProfilerId); } @@ -2346,10 +2145,8 @@ class Runtime extends EventEmitter { // Add done threads so that even if a thread finishes within 1 frame, the green // flag will still indicate that a script ran. this._emitProjectRunStatus( - this.threads.length + - doneThreads.length - - this._getMonitorThreadCount([...this.threads, ...doneThreads]) - ); + this.threads.length + doneThreads.length - + this._getMonitorThreadCount([...this.threads, ...doneThreads])); // Store threads that completed this iteration for testing and other // internal purposes. this._lastStepDoneThreads = doneThreads; @@ -2357,8 +2154,7 @@ class Runtime extends EventEmitter { // @todo: Only render when this.redrawRequested or clones rendered. if (this.profiler !== null) { if (rendererDrawProfilerId === -1) { - rendererDrawProfilerId = - this.profiler.idByName('RenderWebGL.draw'); + rendererDrawProfilerId = this.profiler.idByName('RenderWebGL.draw'); } this.profiler.start(rendererDrawProfilerId); } @@ -2369,10 +2165,7 @@ class Runtime extends EventEmitter { } if (this._refreshTargets) { - this.emit( - Runtime.TARGETS_UPDATE, - false /* Don't emit project changed */ - ); + this.emit(Runtime.TARGETS_UPDATE, false /* Don't emit project changed */); this._refreshTargets = false; } @@ -2459,12 +2252,12 @@ class Runtime extends EventEmitter { if (target === this._editingTarget) { const blockForThread = thread.blockGlowInFrame; if (thread.requestScriptGlowInFrame || thread.stackClick) { - let script = - target.blocks.getTopLevelScript(blockForThread); + let script = target.blocks.getTopLevelScript(blockForThread); if (!script) { // Attempt to find in flyout blocks. - script = - this.flyoutBlocks.getTopLevelScript(blockForThread); + script = this.flyoutBlocks.getTopLevelScript( + blockForThread + ); } if (script) { requestedGlowsThisFrame.push(script); @@ -2581,8 +2374,7 @@ class Runtime extends EventEmitter { */ requestAddMonitor (monitor) { const id = monitor.get('id'); - if (!this.requestUpdateMonitor(monitor)) { - // update monitor if it exists in the state + if (!this.requestUpdateMonitor(monitor)) { // update monitor if it exists in the state // if the monitor did not exist in the state, add it this._monitorState = this._monitorState.set(id, monitor); } @@ -2600,15 +2392,12 @@ class Runtime extends EventEmitter { if (this._monitorState.has(id)) { this._monitorState = // Use mergeWith here to prevent undefined values from overwriting existing ones - this._monitorState.set( - id, - this._monitorState.get(id).mergeWith((prev, next) => { - if (typeof next === 'undefined' || next === null) { - return prev; - } - return next; - }, monitor) - ); + this._monitorState.set(id, this._monitorState.get(id).mergeWith((prev, next) => { + if (typeof next === 'undefined' || next === null) { + return prev; + } + return next; + }, monitor)); return true; } return false; @@ -2629,12 +2418,10 @@ class Runtime extends EventEmitter { * @returns {boolean} true if monitor exists and was updated, false otherwise */ requestHideMonitor (monitorId) { - return this.requestUpdateMonitor( - new Map([ - ['id', monitorId], - ['visible', false] - ]) - ); + return this.requestUpdateMonitor(new Map([ + ['id', monitorId], + ['visible', false] + ])); } /** @@ -2644,12 +2431,10 @@ class Runtime extends EventEmitter { * @returns {boolean} true if monitor exists and was updated, false otherwise */ requestShowMonitor (monitorId) { - return this.requestUpdateMonitor( - new Map([ - ['id', monitorId], - ['visible', true] - ]) - ); + return this.requestUpdateMonitor(new Map([ + ['id', monitorId], + ['visible', true] + ])); } /** @@ -2658,9 +2443,7 @@ class Runtime extends EventEmitter { * @param {!string} targetId Remove all monitors with given target ID. */ requestRemoveMonitorByTargetId (targetId) { - this._monitorState = this._monitorState.filterNot( - value => value.targetId === targetId - ); + this._monitorState = this._monitorState.filterNot(value => value.targetId === targetId); } /** @@ -2780,10 +2563,7 @@ class Runtime extends EventEmitter { getAllVarNamesOfType (varType) { let varNames = []; for (const target of this.targets) { - const targetVarNames = target.getAllVariableNamesInScopeByType( - varType, - true - ); + const targetVarNames = target.getAllVariableNamesInScopeByType(varType, true); varNames = varNames.concat(targetVarNames); } return varNames; @@ -2824,8 +2604,7 @@ class Runtime extends EventEmitter { * @returns {Variable} The new variable that was created. */ createNewGlobalVariable (variableName, optVarId, optVarType) { - const varType = - typeof optVarType === 'string' ? optVarType : Variable.SCALAR_TYPE; + const varType = (typeof optVarType === 'string') ? optVarType : Variable.SCALAR_TYPE; const allVariableNames = this.getAllVarNamesOfType(varType); const newName = StringUtil.unusedName(variableName, allVariableNames); const variable = new Variable(optVarId || uid(), newName, varType); From 93f1542195b6203325bd436cfe5b3c1e6c71c1a2 Mon Sep 17 00:00:00 2001 From: Georgi Angelov Date: Fri, 20 Feb 2026 14:44:06 +0200 Subject: [PATCH 254/521] chore: remove a weird test for something that shouldn't actually happen --- .../scratch-gui/test/integration/backpack.test.js | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/packages/scratch-gui/test/integration/backpack.test.js b/packages/scratch-gui/test/integration/backpack.test.js index ce3125959bb..05f6d49b72c 100644 --- a/packages/scratch-gui/test/integration/backpack.test.js +++ b/packages/scratch-gui/test/integration/backpack.test.js @@ -28,17 +28,4 @@ describe('Working with the how-to library', () => { const logs = await getLogs(); await expect(logs).toEqual([]); }); - - test('Backpack can be expanded with backpack host param', async () => { - await loadUri(`${uri}?backpack_host=https://backpack.scratch.mit.edu`); - - // Try activating the backpack from the costumes tab to make sure it isn't pushed off - await clickText('Costumes'); - - // Check that the backpack header is visible and wrapped in a coming soon tooltip - await clickText('Backpack'); // Not wrapped in tooltip - await clickText('Backpack is empty'); // Make sure it can expand, is empty - const logs = await getLogs(); - await expect(logs).toEqual([]); - }); }); From 11d6aa8bc2bfcaeae64e3aba53feb1dded892167 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 22 Feb 2026 00:58:50 +0000 Subject: [PATCH 255/521] chore(deps): update dependency tap to v21.6.1 --- package-lock.json | 1817 ++++++++++---------- packages/scratch-render/package.json | 2 +- packages/scratch-svg-renderer/package.json | 2 +- packages/scratch-vm/package.json | 2 +- 4 files changed, 871 insertions(+), 952 deletions(-) diff --git a/package-lock.json b/package-lock.json index 66509da1943..5a554dfab2c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3934,6 +3934,29 @@ } } }, + "node_modules/@isaacs/which": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/@isaacs/which/-/which-7.0.4.tgz", + "integrity": "sha512-qXToWZFY9CKvWsveV3R5VHNJLQkHTIJXO9J4Xa1UgNwVCRA2LEsmvWC84MIdnezFLsjn2Q+GzbL/8yVF1/ozJw==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^4.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@isaacs/which/node_modules/isexe": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-4.0.0.tgz", + "integrity": "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=20" + } + }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -9635,201 +9658,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/@tapjs/after": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@tapjs/after/-/after-3.3.1.tgz", - "integrity": "sha512-/RZb0DZxfHP74ursSByTpgKU6jVUtNOtoQ3/prf76+5+G7Q7D7QIQtlrH3bUgk84DI89j+4Nc2DTkMCOLy7BWQ==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "is-actual-promise": "^1.0.1" - }, - "engines": { - "node": "20 || >=22" - }, - "peerDependencies": { - "@tapjs/core": "4.4.1" - } - }, - "node_modules/@tapjs/after-each": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tapjs/after-each/-/after-each-4.3.1.tgz", - "integrity": "sha512-kgRbmhKisIl31FsCxFkDmZLNj0qCdNte0aarVLsaFq1LVJOtpITdBfnuiKigrLj4Go9XiASmIpGrU8h1uYF2Xw==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "function-loop": "^4.0.0" - }, - "engines": { - "node": "20 || >=22" - }, - "peerDependencies": { - "@tapjs/core": "4.4.1" - } - }, - "node_modules/@tapjs/asserts": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tapjs/asserts/-/asserts-4.3.1.tgz", - "integrity": "sha512-PyBE1/umvg/o9Ntg3gryWaamCFHhMV0zSdoD6n5saexa8AYUb9XM6XA4y7uXRisdSFVVnD8/yX0OAWsQhryE0g==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@tapjs/stack": "4.3.0", - "is-actual-promise": "^1.0.1", - "tcompare": "9.3.0", - "trivial-deferred": "^2.0.0" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "peerDependencies": { - "@tapjs/core": "4.4.1" - } - }, - "node_modules/@tapjs/before": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tapjs/before/-/before-4.3.1.tgz", - "integrity": "sha512-zxa+DrruCGJhTQCLjYa8nfyYihLsWBWCEgiSvtwOkQKNZhxcaLmH/W85zEWKJ+MnZaa4wVqkyyRkhAM12eq0Lg==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "is-actual-promise": "^1.0.1" - }, - "engines": { - "node": "20 || >=22" - }, - "peerDependencies": { - "@tapjs/core": "4.4.1" - } - }, - "node_modules/@tapjs/before-each": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tapjs/before-each/-/before-each-4.3.1.tgz", - "integrity": "sha512-vPCbni80H7/6JtQY2LoO4kiRmuyOwPJXpgR2SRrH9Aq07EVveSlgMkKJxomkbuE5lGr/l6zhO/TZDPnuorSvrg==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "function-loop": "^4.0.0" - }, - "engines": { - "node": "20 || >=22" - }, - "peerDependencies": { - "@tapjs/core": "4.4.1" - } - }, - "node_modules/@tapjs/chdir": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@tapjs/chdir/-/chdir-3.3.1.tgz", - "integrity": "sha512-8awqiQswpJRtlOdag+wV/ezuX1kv9YKiG3DAKcNVr7exkGr61StL7qV1cdHah2rPAXlJv6blgDIYbR80d3s9qA==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": "20 || >=22" - }, - "peerDependencies": { - "@tapjs/core": "4.4.1" - } - }, - "node_modules/@tapjs/config": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/@tapjs/config/-/config-5.4.1.tgz", - "integrity": "sha512-ZK1Zs58ALGWx6Zxd0fDlN9VlGNxoudpXZqjlr2asC/Zu6v5oyilN9CX2r9PWHyTHNe6b/TpfpOvt2gTCTpuROA==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@tapjs/core": "4.4.1", - "@tapjs/test": "4.3.1", - "chalk": "^5.6.2", - "jackspeak": "^4.1.2", - "polite-json": "^5.0.0", - "tap-yaml": "4.3.0", - "walk-up-path": "^4.0.0" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "peerDependencies": { - "@tapjs/core": "4.4.1", - "@tapjs/test": "4.3.1" - } - }, - "node_modules/@tapjs/config/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/@tapjs/core": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@tapjs/core/-/core-4.4.1.tgz", - "integrity": "sha512-zEeDgt6YNOKXs4NfGGZ1Lz5aLTlHNCUpwvx5hVl7CuL+/noudWZvL39Vy2rKb+zZnTSgF7b34DqGLoy8+jgpfg==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@tapjs/processinfo": "^3.1.9", - "@tapjs/stack": "4.3.0", - "@tapjs/test": "4.3.1", - "async-hook-domain": "^4.0.1", - "diff": "^8.0.2", - "is-actual-promise": "^1.0.1", - "minipass": "^7.0.4", - "signal-exit": "4.1", - "tap-parser": "18.3.0", - "tap-yaml": "4.3.0", - "tcompare": "9.3.0", - "trivial-deferred": "^2.0.0" - }, - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/@tapjs/core/node_modules/diff": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.3.tgz", - "integrity": "sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/@tapjs/core/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/@tapjs/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": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@tapjs/error-serdes": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/@tapjs/error-serdes/-/error-serdes-4.3.0.tgz", @@ -9856,182 +9684,6 @@ "node": ">=16 || 14 >=14.17" } }, - "node_modules/@tapjs/filter": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tapjs/filter/-/filter-4.3.1.tgz", - "integrity": "sha512-oyoqmUcHjYvr5f7LOryVB9ruEtjTiABdwZghx3XgeRnaNiVX3J9J8/xvdctnkbDB7cq3g9Ao2DYzweDl6Zfvhg==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "peerDependencies": { - "@tapjs/core": "4.4.1" - } - }, - "node_modules/@tapjs/fixture": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tapjs/fixture/-/fixture-4.3.1.tgz", - "integrity": "sha512-x3w6Ro4H6UAxNSkDTtmz73kVCjZP4TNY2m+wLLiRdi8fa3lCn7WfvHUn9zoATgRFjgOnG4XrXSkjybhqHZ4Ibw==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "mkdirp": "^3.0.0", - "rimraf": "^6.0.0" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "peerDependencies": { - "@tapjs/core": "4.4.1" - } - }, - "node_modules/@tapjs/fixture/node_modules/glob": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.1.tgz", - "integrity": "sha512-B7U/vJpE3DkJ5WXTgTpTRN63uV42DseiXXKMwG14LQBXmsdeIoHAPbU/MEo6II0k5ED74uc2ZGTC6MwHFQhF6w==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "minimatch": "^10.1.2", - "minipass": "^7.1.2", - "path-scurry": "^2.0.0" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@tapjs/fixture/node_modules/minimatch": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.2.tgz", - "integrity": "sha512-fu656aJ0n2kcXwsnwnv9g24tkU5uSmOlTjd6WyyaKm2Z+h1qmY6bAjrcaIxF/BslFqbZ8UBtbJi7KgQOZD2PTw==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/brace-expansion": "^5.0.1" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@tapjs/fixture/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/@tapjs/fixture/node_modules/mkdirp": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", - "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", - "dev": true, - "license": "MIT", - "bin": { - "mkdirp": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@tapjs/fixture/node_modules/rimraf": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.1.2.tgz", - "integrity": "sha512-cFCkPslJv7BAXJsYlK1dZsbP8/ZNLkCAQ0bi1hf5EKX2QHegmDFEFA6QhuYJlk7UDdc+02JjO80YSOrWPpw06g==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "glob": "^13.0.0", - "package-json-from-dist": "^1.0.1" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@tapjs/intercept": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tapjs/intercept/-/intercept-4.3.1.tgz", - "integrity": "sha512-AvfZwFqAh8g+226HRVMUwoHm1ncf6xMHRQfcsPPIMtjnIrbJZjr2S2uM9qTWTnlk2EVgerqfyh3H8R6ykJsGIg==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@tapjs/after": "3.3.1", - "@tapjs/stack": "4.3.0" - }, - "engines": { - "node": "20 || >=22" - }, - "peerDependencies": { - "@tapjs/core": "4.4.1" - } - }, - "node_modules/@tapjs/mock": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tapjs/mock/-/mock-4.3.1.tgz", - "integrity": "sha512-oiR34RhC0+h0fqLNHkDA5QmQXmVJkujvdGwUEBxR3HzUIKZWp5SfVw4dY2/Lvl33tPBOtsFDFuqnpt3+f6SrXg==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@tapjs/after": "3.3.1", - "@tapjs/stack": "4.3.0", - "resolve-import": "^2.1.1", - "walk-up-path": "^4.0.0" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "peerDependencies": { - "@tapjs/core": "4.4.1" - } - }, - "node_modules/@tapjs/node-serialize": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tapjs/node-serialize/-/node-serialize-4.3.1.tgz", - "integrity": "sha512-dOsTr75HFESskVvuv8L6SAw23c2WtF6aoNkaD9SwtbTQZxvZQNGMechWPWYGaMsHB+aB+6EBg1MVnqWHQrOVcw==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@tapjs/error-serdes": "4.3.0", - "@tapjs/stack": "4.3.0", - "tap-parser": "18.3.0" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "peerDependencies": { - "@tapjs/core": "4.4.1" - } - }, "node_modules/@tapjs/processinfo": { "version": "3.1.9", "resolved": "https://registry.npmjs.org/@tapjs/processinfo/-/processinfo-3.1.9.tgz", @@ -10062,379 +9714,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@tapjs/reporter": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@tapjs/reporter/-/reporter-4.4.1.tgz", - "integrity": "sha512-kOppWVcv3sa0fmsBrpzwJiUZbwEdhixBAg0J39dUDMDdNIYrefVUSJsi7f1Agi9uRRXeJfZlUw23tII4CV06rQ==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@tapjs/config": "5.4.1", - "@tapjs/stack": "4.3.0", - "chalk": "^5.6.2", - "ink": "^5.2.1", - "minipass": "^7.0.4", - "ms": "^2.1.3", - "patch-console": "^2.0.0", - "prismjs-terminal": "^1.2.3", - "react": "^18.2.0", - "string-length": "^6.0.0", - "tap-parser": "18.3.0", - "tap-yaml": "4.3.0", - "tcompare": "9.3.0" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "peerDependencies": { - "@tapjs/core": "4.4.1" - } - }, - "node_modules/@tapjs/reporter/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@tapjs/reporter/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/@tapjs/reporter/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/@tapjs/reporter/node_modules/string-length": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-6.0.0.tgz", - "integrity": "sha512-1U361pxZHEQ+FeSjzqRpV+cu2vTzYeWeafXFLykiFlv4Vc0n3njgU8HrMbyik5uwm77naWMuVG8fhEF+Ovb1Kg==", - "dev": true, - "license": "MIT", - "dependencies": { - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@tapjs/reporter/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@tapjs/run": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@tapjs/run/-/run-4.4.1.tgz", - "integrity": "sha512-mVD9FCknr1mkkCv1vMKL2x4pmpka8ArqHufMP8Mb3Etj6blfePNv0Mu75RWVN9bKYzKAkqPGLenDBPb9hnbUgg==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@tapjs/after": "3.3.1", - "@tapjs/before": "4.3.1", - "@tapjs/config": "5.4.1", - "@tapjs/processinfo": "^3.1.9", - "@tapjs/reporter": "4.4.1", - "@tapjs/spawn": "4.3.1", - "@tapjs/stdin": "4.3.1", - "@tapjs/test": "4.3.1", - "c8": "^10.1.3", - "chalk": "^5.6.2", - "chokidar": "^4.0.2", - "foreground-child": "^4.0.0", - "glob": "^13.0.0", - "minipass": "^7.0.4", - "mkdirp": "^3.0.1", - "node-options-to-argv": "^1.0.0", - "opener": "^1.5.2", - "pacote": "^21.0.4", - "path-scurry": "^2.0.0", - "resolve-import": "^2.0.0", - "rimraf": "^6.0.0", - "semver": "^7.7.2", - "signal-exit": "^4.1.0", - "tap-parser": "18.3.0", - "tap-yaml": "4.3.0", - "tcompare": "9.3.0", - "trivial-deferred": "^2.0.0", - "which": "^5.0.0" - }, - "bin": { - "tap-run": "dist/esm/index.js" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "peerDependencies": { - "@tapjs/core": "4.4.1" - } - }, - "node_modules/@tapjs/run/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/@tapjs/run/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": "MIT", - "dependencies": { - "readdirp": "^4.0.1" - }, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@tapjs/run/node_modules/foreground-child": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-4.0.3.tgz", - "integrity": "sha512-yeXZaNbCBGaT9giTpLPBdtedzjwhlJBUoL/R4BVQU5mn0TQXOHwVIl1Q2DMuBIdNno4ktA1abZ7dQFVxD6uHxw==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@tapjs/run/node_modules/glob": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.1.tgz", - "integrity": "sha512-B7U/vJpE3DkJ5WXTgTpTRN63uV42DseiXXKMwG14LQBXmsdeIoHAPbU/MEo6II0k5ED74uc2ZGTC6MwHFQhF6w==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "minimatch": "^10.1.2", - "minipass": "^7.1.2", - "path-scurry": "^2.0.0" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@tapjs/run/node_modules/isexe": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.4.tgz", - "integrity": "sha512-jCErc4h4RnTPjFq53G4whhjAMbUAqinGrCrTT4dmMNyi4zTthK+wphqbRLJtL4BN/Mq7Zzltr0m/b1X0m7PGFQ==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=20" - } - }, - "node_modules/@tapjs/run/node_modules/minimatch": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.2.tgz", - "integrity": "sha512-fu656aJ0n2kcXwsnwnv9g24tkU5uSmOlTjd6WyyaKm2Z+h1qmY6bAjrcaIxF/BslFqbZ8UBtbJi7KgQOZD2PTw==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/brace-expansion": "^5.0.1" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@tapjs/run/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/@tapjs/run/node_modules/mkdirp": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", - "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", - "dev": true, - "license": "MIT", - "bin": { - "mkdirp": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@tapjs/run/node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.18.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@tapjs/run/node_modules/rimraf": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.1.2.tgz", - "integrity": "sha512-cFCkPslJv7BAXJsYlK1dZsbP8/ZNLkCAQ0bi1hf5EKX2QHegmDFEFA6QhuYJlk7UDdc+02JjO80YSOrWPpw06g==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "glob": "^13.0.0", - "package-json-from-dist": "^1.0.1" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@tapjs/run/node_modules/semver": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@tapjs/run/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": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@tapjs/run/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/@tapjs/snapshot": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tapjs/snapshot/-/snapshot-4.3.1.tgz", - "integrity": "sha512-xPE5yxnck9EhpbH2i60xIB9HxgG39wSyn6Hj+UQal/lDgprbdYNG+36Owdp52TNHOL14GcVO3aiqyOy4UdkN6A==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "is-actual-promise": "^1.0.1", - "tcompare": "9.3.0", - "trivial-deferred": "^2.0.0" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "peerDependencies": { - "@tapjs/core": "4.4.1" - } - }, - "node_modules/@tapjs/spawn": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tapjs/spawn/-/spawn-4.3.1.tgz", - "integrity": "sha512-bQ5Mb0F8Vm07TDe3DYFEzuIN1aCbRyFPYjM6cD62iszT0B4znaXL4PseRXB0VoL9cxJICeNm6AiT0G9PF09z4Q==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": "20 || >=22" - }, - "peerDependencies": { - "@tapjs/core": "4.4.1" - } - }, "node_modules/@tapjs/stack": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/@tapjs/stack/-/stack-4.3.0.tgz", @@ -10448,174 +9727,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@tapjs/stdin": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tapjs/stdin/-/stdin-4.3.1.tgz", - "integrity": "sha512-wD4bJM+1LmnDkBpR7aLJ6tlwDM/OT0RaiHPFgRrpDv7FB50LeR3h9wh7s+c+Ysc9OgZDkLNLkvG9jIhb937bZA==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": "20 || >=22" - }, - "peerDependencies": { - "@tapjs/core": "4.4.1" - } - }, - "node_modules/@tapjs/test": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tapjs/test/-/test-4.3.1.tgz", - "integrity": "sha512-NOsYB1VhaSPmWqrvsdeVnUuklNtJwFEQnybPHjVCqq0ecjP/SZKW+nnVzt9ISAPF+FDtQisqgJV2/Y54jzhpgA==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/ts-node-temp-fork-for-pr-2009": "^10.9.7", - "@tapjs/after": "3.3.1", - "@tapjs/after-each": "4.3.1", - "@tapjs/asserts": "4.3.1", - "@tapjs/before": "4.3.1", - "@tapjs/before-each": "4.3.1", - "@tapjs/chdir": "3.3.1", - "@tapjs/filter": "4.3.1", - "@tapjs/fixture": "4.3.1", - "@tapjs/intercept": "4.3.1", - "@tapjs/mock": "4.3.1", - "@tapjs/node-serialize": "4.3.1", - "@tapjs/snapshot": "4.3.1", - "@tapjs/spawn": "4.3.1", - "@tapjs/stdin": "4.3.1", - "@tapjs/typescript": "3.5.1", - "@tapjs/worker": "4.3.1", - "glob": "^13.0.0", - "jackspeak": "^4.1.2", - "mkdirp": "^3.0.0", - "package-json-from-dist": "^1.0.0", - "resolve-import": "^2.1.1", - "rimraf": "^6.0.0", - "sync-content": "^2.0.1", - "tap-parser": "18.3.0", - "tshy": "^3.1.3", - "typescript": "5.9", - "walk-up-path": "^4.0.0" - }, - "bin": { - "generate-tap-test-class": "dist/esm/build.mjs" - }, - "engines": { - "node": "20 || >=22" - }, - "peerDependencies": { - "@tapjs/core": "4.4.1" - } - }, - "node_modules/@tapjs/test/node_modules/glob": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.1.tgz", - "integrity": "sha512-B7U/vJpE3DkJ5WXTgTpTRN63uV42DseiXXKMwG14LQBXmsdeIoHAPbU/MEo6II0k5ED74uc2ZGTC6MwHFQhF6w==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "minimatch": "^10.1.2", - "minipass": "^7.1.2", - "path-scurry": "^2.0.0" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@tapjs/test/node_modules/minimatch": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.2.tgz", - "integrity": "sha512-fu656aJ0n2kcXwsnwnv9g24tkU5uSmOlTjd6WyyaKm2Z+h1qmY6bAjrcaIxF/BslFqbZ8UBtbJi7KgQOZD2PTw==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/brace-expansion": "^5.0.1" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@tapjs/test/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/@tapjs/test/node_modules/mkdirp": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", - "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", - "dev": true, - "license": "MIT", - "bin": { - "mkdirp": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@tapjs/test/node_modules/rimraf": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.1.2.tgz", - "integrity": "sha512-cFCkPslJv7BAXJsYlK1dZsbP8/ZNLkCAQ0bi1hf5EKX2QHegmDFEFA6QhuYJlk7UDdc+02JjO80YSOrWPpw06g==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "glob": "^13.0.0", - "package-json-from-dist": "^1.0.1" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@tapjs/typescript": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/@tapjs/typescript/-/typescript-3.5.1.tgz", - "integrity": "sha512-4clGpzF1OTjLZYlavI167rCseSVsLpd5ygBAf297o468VEtpRAJPYx1IjoPrnGWC/M5iJadsCrTlIuBYABw81g==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/ts-node-temp-fork-for-pr-2009": "^10.9.7" - }, - "engines": { - "node": "20 || >=22" - }, - "peerDependencies": { - "@tapjs/core": "4.4.1" - } - }, - "node_modules/@tapjs/worker": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tapjs/worker/-/worker-4.3.1.tgz", - "integrity": "sha512-RInbFaGUH+KsAl/ozRVCMhpXaQPsvwEQ7PiKprpXgKjxjUrzwlkAbFAxo4K79axCWWdm6JUD5pH93n0FJ75jYQ==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": "20 || >=22" - }, - "peerDependencies": { - "@tapjs/core": "4.4.1" - } - }, "node_modules/@tensorflow-models/face-detection": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@tensorflow-models/face-detection/-/face-detection-1.0.3.tgz", @@ -12035,6 +11146,123 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@typescript/native-preview": { + "version": "7.0.0-dev.20260221.1", + "resolved": "https://registry.npmjs.org/@typescript/native-preview/-/native-preview-7.0.0-dev.20260221.1.tgz", + "integrity": "sha512-tEUzcnj6pD+z1vANchRzhpPl+3RMD+xQRvIN//0+qjtP5zyYB5T+MIaAWycpKDwlHP9C13JnQgcgYnC+LlNkrg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsgo": "bin/tsgo.js" + }, + "optionalDependencies": { + "@typescript/native-preview-darwin-arm64": "7.0.0-dev.20260221.1", + "@typescript/native-preview-darwin-x64": "7.0.0-dev.20260221.1", + "@typescript/native-preview-linux-arm": "7.0.0-dev.20260221.1", + "@typescript/native-preview-linux-arm64": "7.0.0-dev.20260221.1", + "@typescript/native-preview-linux-x64": "7.0.0-dev.20260221.1", + "@typescript/native-preview-win32-arm64": "7.0.0-dev.20260221.1", + "@typescript/native-preview-win32-x64": "7.0.0-dev.20260221.1" + } + }, + "node_modules/@typescript/native-preview-darwin-arm64": { + "version": "7.0.0-dev.20260221.1", + "resolved": "https://registry.npmjs.org/@typescript/native-preview-darwin-arm64/-/native-preview-darwin-arm64-7.0.0-dev.20260221.1.tgz", + "integrity": "sha512-m3ttEpK+eXV7P06RVZZuSuUvNDj8psXODrMJRRQWpTNsk3qITbIdBSgOx2Q/M3tbQ9Mo2IBHt6jUjqOdRW9oZQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@typescript/native-preview-darwin-x64": { + "version": "7.0.0-dev.20260221.1", + "resolved": "https://registry.npmjs.org/@typescript/native-preview-darwin-x64/-/native-preview-darwin-x64-7.0.0-dev.20260221.1.tgz", + "integrity": "sha512-BNaNe3rox2rpkh5sWcnZZob6sDA/at9KK55/WSRAH4W+9dFReOLFAR9YXhKxrLGZ1QpleuIBahKbV8o037S+pA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@typescript/native-preview-linux-arm": { + "version": "7.0.0-dev.20260221.1", + "resolved": "https://registry.npmjs.org/@typescript/native-preview-linux-arm/-/native-preview-linux-arm-7.0.0-dev.20260221.1.tgz", + "integrity": "sha512-+/uyIw7vg4FyAnNpsCJHmSOhMiR2m56lqaEo1J5pMAstJmfLTTKQdJ1muIWCDCqc24k2U30IStHOaCqUerp/nQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@typescript/native-preview-linux-arm64": { + "version": "7.0.0-dev.20260221.1", + "resolved": "https://registry.npmjs.org/@typescript/native-preview-linux-arm64/-/native-preview-linux-arm64-7.0.0-dev.20260221.1.tgz", + "integrity": "sha512-Y4jsvwDq86LXq63UYRLqCAd+nD1r6C2NVaGNR39H+c6D8SgOBkPLJa8quTH0Ir8E5bsR8vTN4E6xHY9jD4J2PA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@typescript/native-preview-linux-x64": { + "version": "7.0.0-dev.20260221.1", + "resolved": "https://registry.npmjs.org/@typescript/native-preview-linux-x64/-/native-preview-linux-x64-7.0.0-dev.20260221.1.tgz", + "integrity": "sha512-7agd5FtVLPp+gRMvsecSDmdQ/XM80q/uaQ6+Kahan9uNrCuPJIyMiAtJvCoYYgT1nXX2AjwZk39DH63fRaw/Mg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@typescript/native-preview-win32-arm64": { + "version": "7.0.0-dev.20260221.1", + "resolved": "https://registry.npmjs.org/@typescript/native-preview-win32-arm64/-/native-preview-win32-arm64-7.0.0-dev.20260221.1.tgz", + "integrity": "sha512-lXbsy5vDzS//oE0evX+QwZBwpKselXTd8H18lT42CBQo2hL2r0+w9YBguaYXrnGkAoHjDXEfKA2xii8yVZKVUg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@typescript/native-preview-win32-x64": { + "version": "7.0.0-dev.20260221.1", + "resolved": "https://registry.npmjs.org/@typescript/native-preview-win32-x64/-/native-preview-win32-x64-7.0.0-dev.20260221.1.tgz", + "integrity": "sha512-O02pfQlVlRTsBmp0hODs/bOHm2ic2kXZpIchBP5Qm0wKCp1Ytz/7i3SNT1gN47I+KC4axn/AHhFmkWQyIu9kRQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@vernier/godirect": { "version": "1.8.3", "resolved": "https://registry.npmjs.org/@vernier/godirect/-/godirect-1.8.3.tgz", @@ -32983,9 +32211,9 @@ "license": "MIT" }, "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==", + "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": { @@ -32993,7 +32221,7 @@ "minipass": "^7.1.2" }, "engines": { - "node": "20 || >=22" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -35741,9 +34969,9 @@ } }, "node_modules/resolve-import": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/resolve-import/-/resolve-import-2.1.1.tgz", - "integrity": "sha512-pgTo41KMWjSZNNA4Ptgs+AtB+/w+a2/MDm6VzZiEnt2op2rXHYK/EYdRYhBsPlGN1naYMogJopBoJxtHgGTHEA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/resolve-import/-/resolve-import-2.4.0.tgz", + "integrity": "sha512-gLWKdA5tiv5j/D7ipR47u3ovbVfzFPrctTdw2Ulnpmr6PPVVSvPKGNWu09jXVNlOSLLAeD6CA13bjIelpWttSw==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -38939,32 +38167,32 @@ } }, "node_modules/tap": { - "version": "21.5.1", - "resolved": "https://registry.npmjs.org/tap/-/tap-21.5.1.tgz", - "integrity": "sha512-uhS20sTR4Q+/T2ovawxgVLjdsTQuU+xFz9htRwlx5jwkaWiv+1xes/0ZW5IlO+hlQp9iQH3rj30FNRlnN2ZVtw==", + "version": "21.6.1", + "resolved": "https://registry.npmjs.org/tap/-/tap-21.6.1.tgz", + "integrity": "sha512-QKKZg/2oWGCMRRCBq4AVeaJSNwxZqIkasNMdKQLge3CR5hRbRMEN3Hh8qN+V9EoHKOS8OBMabM9pPCqtLKyTjg==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { - "@tapjs/after": "3.3.1", - "@tapjs/after-each": "4.3.1", - "@tapjs/asserts": "4.3.1", - "@tapjs/before": "4.3.1", - "@tapjs/before-each": "4.3.1", - "@tapjs/chdir": "3.3.1", - "@tapjs/core": "4.4.1", - "@tapjs/filter": "4.3.1", - "@tapjs/fixture": "4.3.1", - "@tapjs/intercept": "4.3.1", - "@tapjs/mock": "4.3.1", - "@tapjs/node-serialize": "4.3.1", - "@tapjs/run": "4.4.1", - "@tapjs/snapshot": "4.3.1", - "@tapjs/spawn": "4.3.1", - "@tapjs/stdin": "4.3.1", - "@tapjs/test": "4.3.1", - "@tapjs/typescript": "3.5.1", - "@tapjs/worker": "4.3.1", - "resolve-import": "^2.1.1" + "@tapjs/after": "3.3.3", + "@tapjs/after-each": "4.3.3", + "@tapjs/asserts": "4.3.3", + "@tapjs/before": "4.3.3", + "@tapjs/before-each": "4.3.3", + "@tapjs/chdir": "3.3.3", + "@tapjs/core": "4.5.1", + "@tapjs/filter": "4.3.3", + "@tapjs/fixture": "4.3.3", + "@tapjs/intercept": "4.3.3", + "@tapjs/mock": "4.4.1", + "@tapjs/node-serialize": "4.3.3", + "@tapjs/run": "4.5.1", + "@tapjs/snapshot": "4.3.3", + "@tapjs/spawn": "4.3.3", + "@tapjs/stdin": "4.3.3", + "@tapjs/test": "4.4.1", + "@tapjs/typescript": "3.5.3", + "@tapjs/worker": "4.3.3", + "resolve-import": "^2.4.0" }, "bin": { "tap": "dist/esm/run.mjs" @@ -39007,6 +38235,696 @@ "node": "20 || >=22" } }, + "node_modules/tap/node_modules/@tapjs/after": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@tapjs/after/-/after-3.3.3.tgz", + "integrity": "sha512-kGG4zOM1LXfWr1+MvBfzLHUm/azBC1YGQxS7eFNPe67cQjJFG/GcwnRXTqZWEhRv/g0M9IERE8YIEuta9owFpw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "is-actual-promise": "^1.0.1" + }, + "engines": { + "node": "20 || >=22" + }, + "peerDependencies": { + "@tapjs/core": "4.5.1" + } + }, + "node_modules/tap/node_modules/@tapjs/after-each": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tapjs/after-each/-/after-each-4.3.3.tgz", + "integrity": "sha512-68IPZPVjgMId5LU3Uuo0Kr1MGRPTYffx4gSWkwEIiNc20+j0z5BkPeyq08xm8vQykO/hDxZqX2FoOdGCWtbb0g==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "function-loop": "^4.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "peerDependencies": { + "@tapjs/core": "4.5.1" + } + }, + "node_modules/tap/node_modules/@tapjs/asserts": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tapjs/asserts/-/asserts-4.3.3.tgz", + "integrity": "sha512-ZrKW94qQlUcRs+zmSuuxgoTjkSgXvq1G3Qv/4dD0gUatTckCRM+rQIBsPcgAC5jMyBAgQJ+q8U2Wo3h+r9Jrog==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@tapjs/stack": "4.3.0", + "is-actual-promise": "^1.0.1", + "tcompare": "9.3.0", + "trivial-deferred": "^2.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "peerDependencies": { + "@tapjs/core": "4.5.1" + } + }, + "node_modules/tap/node_modules/@tapjs/before": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tapjs/before/-/before-4.3.3.tgz", + "integrity": "sha512-tVFrSmlN6nCYgNkkzqLQ/DFrI9b2AsJ5Aka1wa1wQJAy+F0QOmLkAH44wnqkE2pKjEWHSkdYdFUlixyfs8lDRw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "is-actual-promise": "^1.0.1" + }, + "engines": { + "node": "20 || >=22" + }, + "peerDependencies": { + "@tapjs/core": "4.5.1" + } + }, + "node_modules/tap/node_modules/@tapjs/before-each": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tapjs/before-each/-/before-each-4.3.3.tgz", + "integrity": "sha512-wEvwHCHdCwZZCPHSMJ3kIE/bqrzdSKI/p5PswSAPm+KQmtnhyXjau1bBfz9aK9S/Pwez+NCwJKn5+POVTeUXKw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "function-loop": "^4.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "peerDependencies": { + "@tapjs/core": "4.5.1" + } + }, + "node_modules/tap/node_modules/@tapjs/chdir": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@tapjs/chdir/-/chdir-3.3.3.tgz", + "integrity": "sha512-METLxtROGpmvGjfT9XZV/qu1q8BjxSAcWsyr8wTvCfDcv0eMi1odvlPpBfUU+WhKGXzVTYCz1go0S1tLaNbQDQ==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + }, + "peerDependencies": { + "@tapjs/core": "4.5.1" + } + }, + "node_modules/tap/node_modules/@tapjs/config": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@tapjs/config/-/config-5.5.1.tgz", + "integrity": "sha512-j2pg8+MMlTLX0FKU9cHqc4HkauV0c/ClfMYqkIriOWsibhuFJ0hdoP5b+MQSHgbENctgeI7gVBIW4aaHPa9/bA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@tapjs/core": "4.5.1", + "@tapjs/test": "4.4.1", + "chalk": "^5.6.2", + "jackspeak": "^4.2.3", + "polite-json": "^5.0.0", + "tap-yaml": "4.3.0", + "walk-up-path": "^4.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "peerDependencies": { + "@tapjs/core": "4.5.1", + "@tapjs/test": "4.4.1" + } + }, + "node_modules/tap/node_modules/@tapjs/core": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@tapjs/core/-/core-4.5.1.tgz", + "integrity": "sha512-fDZ3iwmXkjv+QuMYMmKnqFhIib2hspTfmBieCbMM6YcTL3FJWGebj0+nA0X43EMOgNlLrvCY6X/KolqEeu/+TA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@tapjs/processinfo": "^3.1.9", + "@tapjs/stack": "4.3.0", + "@tapjs/test": "4.4.1", + "async-hook-domain": "^4.0.1", + "diff": "^8.0.2", + "is-actual-promise": "^1.0.1", + "minipass": "^7.0.4", + "signal-exit": "4.1", + "tap-parser": "18.3.0", + "tap-yaml": "4.3.0", + "tcompare": "9.3.0", + "trivial-deferred": "^2.0.0" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/tap/node_modules/@tapjs/filter": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tapjs/filter/-/filter-4.3.3.tgz", + "integrity": "sha512-qohTjnMtLjU8/VIe24FjvNmZ55NRV/wK/rvI0D4tuPGlcJwe99tDs5hZ/uWGYzZ5jneqqH2s9EoH6j1bxZ74WA==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "peerDependencies": { + "@tapjs/core": "4.5.1" + } + }, + "node_modules/tap/node_modules/@tapjs/fixture": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tapjs/fixture/-/fixture-4.3.3.tgz", + "integrity": "sha512-uMySXLR1JC/lQp/nxbYTY6wn3ziuS/lkvw/7Ob7/sa47jUHDzGNQuLYN2/Q2Xw+R6xIW061LfxtHBEP6/PRdpA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "mkdirp": "^3.0.0", + "rimraf": "^6.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "peerDependencies": { + "@tapjs/core": "4.5.1" + } + }, + "node_modules/tap/node_modules/@tapjs/intercept": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tapjs/intercept/-/intercept-4.3.3.tgz", + "integrity": "sha512-0uxtyL/PuvjbrnTTJnCektTrVQjdN96luR+1iuWd4uFKMMQEyJz/qCx2Pqh3yIWSLjFSNsuStPvZ2DFIVHrvSA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@tapjs/after": "3.3.3", + "@tapjs/stack": "4.3.0" + }, + "engines": { + "node": "20 || >=22" + }, + "peerDependencies": { + "@tapjs/core": "4.5.1" + } + }, + "node_modules/tap/node_modules/@tapjs/mock": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@tapjs/mock/-/mock-4.4.1.tgz", + "integrity": "sha512-jdn5FE/kgsTWabe8VegnAv4LMYxEKfhvK/9QCLirngjleWLFSZNVhEv0eawpNwnnjKuXbxj1t2j6Q6DblYKi4A==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@tapjs/after": "3.3.3", + "@tapjs/stack": "4.3.0", + "resolve-import": "^2.4.0", + "walk-up-path": "^4.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "peerDependencies": { + "@tapjs/core": "4.5.1" + } + }, + "node_modules/tap/node_modules/@tapjs/node-serialize": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tapjs/node-serialize/-/node-serialize-4.3.3.tgz", + "integrity": "sha512-PuXE4xiXjmUIM99z4h+QDyQI8vFZoEvxtFF1vZExE6up7Ab6T+a4g0nGjSbfMSanIgVjbQPr/S0LW4KH6zqcJw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@tapjs/error-serdes": "4.3.0", + "@tapjs/stack": "4.3.0", + "tap-parser": "18.3.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "peerDependencies": { + "@tapjs/core": "4.5.1" + } + }, + "node_modules/tap/node_modules/@tapjs/reporter": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@tapjs/reporter/-/reporter-4.4.3.tgz", + "integrity": "sha512-+4TC4w7yGLwGOKf/tDe+4C+Ancs+9bsnMxdqsGT5SPPCdxqB64EgOPUu6dGBA/miAEr6VVyCIxErriW/KFTVBA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@tapjs/config": "5.5.1", + "@tapjs/stack": "4.3.0", + "chalk": "^5.6.2", + "ink": "^5.2.1", + "minipass": "^7.0.4", + "ms": "^2.1.3", + "patch-console": "^2.0.0", + "prismjs-terminal": "^1.2.3", + "react": "^18.2.0", + "string-length": "^6.0.0", + "tap-parser": "18.3.0", + "tap-yaml": "4.3.0", + "tcompare": "9.3.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "peerDependencies": { + "@tapjs/core": "4.5.1" + } + }, + "node_modules/tap/node_modules/@tapjs/run": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@tapjs/run/-/run-4.5.1.tgz", + "integrity": "sha512-quUh0PUv8gKX9bVL9hiUrI1B2dMj2sybsnRnXyfQ+tnG0zV/nK5rosXQ13J8FyTufsKh5Jwp+2FGAH7+CT3X/A==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/which": "^7.0.4", + "@tapjs/after": "3.3.3", + "@tapjs/before": "4.3.3", + "@tapjs/config": "5.5.1", + "@tapjs/processinfo": "^3.1.9", + "@tapjs/reporter": "4.4.3", + "@tapjs/spawn": "4.3.3", + "@tapjs/stdin": "4.3.3", + "@tapjs/test": "4.4.1", + "c8": "^10.1.3", + "chalk": "^5.6.2", + "chokidar": "^4.0.2", + "foreground-child": "^4.0.0", + "glob": "^13.0.2", + "minipass": "^7.0.4", + "mkdirp": "^3.0.1", + "node-options-to-argv": "^1.0.0", + "opener": "^1.5.2", + "pacote": "^21.0.4", + "path-scurry": "^2.0.0", + "resolve-import": "^2.4.0", + "rimraf": "^6.0.0", + "semver": "^7.7.2", + "signal-exit": "^4.1.0", + "tap-parser": "18.3.0", + "tap-yaml": "4.3.0", + "tcompare": "9.3.0", + "trivial-deferred": "^2.0.0" + }, + "bin": { + "tap-run": "dist/esm/index.js" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "peerDependencies": { + "@tapjs/core": "4.5.1" + } + }, + "node_modules/tap/node_modules/@tapjs/snapshot": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tapjs/snapshot/-/snapshot-4.3.3.tgz", + "integrity": "sha512-l8cFbXc97GvL1qjnhdvbsDQZ4ze1CT+vfr3gJdXB4ZhBAKRBmfnXrmFcuyTRANWwb27GOTOISP8fc33bNX7bSA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "is-actual-promise": "^1.0.1", + "tcompare": "9.3.0", + "trivial-deferred": "^2.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "peerDependencies": { + "@tapjs/core": "4.5.1" + } + }, + "node_modules/tap/node_modules/@tapjs/spawn": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tapjs/spawn/-/spawn-4.3.3.tgz", + "integrity": "sha512-YSwCN+7sooEvICF3T3eB6mJy9kEn7AFDyCVH3M6uHiKNUXKj834nrHfKMZbaRydVFTOTGYupqOdLXsr7Czcljg==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + }, + "peerDependencies": { + "@tapjs/core": "4.5.1" + } + }, + "node_modules/tap/node_modules/@tapjs/stdin": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tapjs/stdin/-/stdin-4.3.3.tgz", + "integrity": "sha512-8cAD0h7llgVVeavPUCtentKSzwLeLKDYfF5v6huPEArl6yTqXuj2zTI2VWyYDOEdQl/afkjxagGsGmzWk3K38g==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + }, + "peerDependencies": { + "@tapjs/core": "4.5.1" + } + }, + "node_modules/tap/node_modules/@tapjs/test": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@tapjs/test/-/test-4.4.1.tgz", + "integrity": "sha512-yn5eFeg0zzw11Q14Fhwy0WFwEata5ez/LEC33NPOhpPxeqWzhaqjXXNKk+/qaydF8CbEclDUNIILeu605pjI3A==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/ts-node-temp-fork-for-pr-2009": "^10.9.7", + "@tapjs/after": "3.3.3", + "@tapjs/after-each": "4.3.3", + "@tapjs/asserts": "4.3.3", + "@tapjs/before": "4.3.3", + "@tapjs/before-each": "4.3.3", + "@tapjs/chdir": "3.3.3", + "@tapjs/filter": "4.3.3", + "@tapjs/fixture": "4.3.3", + "@tapjs/intercept": "4.3.3", + "@tapjs/mock": "4.4.1", + "@tapjs/node-serialize": "4.3.3", + "@tapjs/snapshot": "4.3.3", + "@tapjs/spawn": "4.3.3", + "@tapjs/stdin": "4.3.3", + "@tapjs/typescript": "3.5.3", + "@tapjs/worker": "4.3.3", + "glob": "^13.0.2", + "jackspeak": "^4.2.3", + "mkdirp": "^3.0.0", + "package-json-from-dist": "^1.0.0", + "resolve-import": "^2.4.0", + "rimraf": "^6.0.0", + "sync-content": "^2.0.4", + "tap-parser": "18.3.0", + "tshy": "^3.3.2", + "typescript": "5.9", + "walk-up-path": "^4.0.0" + }, + "bin": { + "generate-tap-test-class": "dist/esm/build.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "peerDependencies": { + "@tapjs/core": "4.5.1" + } + }, + "node_modules/tap/node_modules/@tapjs/typescript": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/@tapjs/typescript/-/typescript-3.5.3.tgz", + "integrity": "sha512-YrDlDxESUMioAlx5ddfrnnTKCXAe+prX+iKF/sVaSDSzkxQh9eKB1zvFaP3W/CTb+gTR8vp2UeYF3JtApBae8A==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/ts-node-temp-fork-for-pr-2009": "^10.9.7" + }, + "engines": { + "node": "20 || >=22" + }, + "peerDependencies": { + "@tapjs/core": "4.5.1" + } + }, + "node_modules/tap/node_modules/@tapjs/worker": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tapjs/worker/-/worker-4.3.3.tgz", + "integrity": "sha512-bQvpqdSJlklfYqxANLvdwU9M2rLu5eSv4x65pSZxWIW3K/oz/8SN+/JG0i8qixioQWZz/QVV82EpfZIgDE1J3g==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + }, + "peerDependencies": { + "@tapjs/core": "4.5.1" + } + }, + "node_modules/tap/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/tap/node_modules/balanced-match": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.3.tgz", + "integrity": "sha512-1pHv8LX9CpKut1Zp4EXey7Z8OfH11ONNH6Dhi2WDUt31VVZFXZzKwXcysBgqSumFCmR+0dqjMK5v5JiFHzi0+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/tap/node_modules/brace-expansion": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.2.tgz", + "integrity": "sha512-Pdk8c9poy+YhOgVWw1JNN22/HcivgKWwpxKq04M/jTmHyCZn12WPJebZxdjSa5TmBqISrUSgNYU3eRORljfCCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/tap/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/tap/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": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/tap/node_modules/diff": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.3.tgz", + "integrity": "sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/tap/node_modules/foreground-child": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-4.0.3.tgz", + "integrity": "sha512-yeXZaNbCBGaT9giTpLPBdtedzjwhlJBUoL/R4BVQU5mn0TQXOHwVIl1Q2DMuBIdNno4ktA1abZ7dQFVxD6uHxw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/tap/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/tap/node_modules/minimatch": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.2.tgz", + "integrity": "sha512-+G4CpNBxa5MprY+04MbgOw1v7So6n5JY166pFi9KfYwT78fxScCeSNQSNzp6dpPSW2rONOps6Ocam1wFhCgoVw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/tap/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/tap/node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/tap/node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/tap/node_modules/rimraf": { + "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", + "package-json-from-dist": "^1.0.1" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/tap/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tap/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": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/tap/node_modules/string-length": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-6.0.0.tgz", + "integrity": "sha512-1U361pxZHEQ+FeSjzqRpV+cu2vTzYeWeafXFLykiFlv4Vc0n3njgU8HrMbyik5uwm77naWMuVG8fhEF+Ovb1Kg==", + "dev": true, + "license": "MIT", + "dependencies": { + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tap/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/tapable": { "version": "0.1.10", "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.1.10.tgz", @@ -40000,12 +39918,13 @@ } }, "node_modules/tshy": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/tshy/-/tshy-3.2.0.tgz", - "integrity": "sha512-/HqAZP+2lAn3P6t4IwnkseP6WPiRmv5fNirXzGA4YB15XJ3YXM7maQd1OBAEKlU3kek2iEO3VzQ/gzMhXlvAIA==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/tshy/-/tshy-3.3.2.tgz", + "integrity": "sha512-vOIXkqMtBWNjKUR/c99+6N50LhWdnKG1xE3+5wf8IPdzxx2lcIFPvbGgFdBBgoTMbdNb8mz06MUm7hY+TFnJcw==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { + "@typescript/native-preview": "^7.0.0-dev.20260218.1", "chalk": "^5.6.2", "chokidar": "^4.0.3", "foreground-child": "^4.0.0", @@ -40013,7 +39932,7 @@ "minimatch": "^10.0.3", "mkdirp": "^3.0.1", "polite-json": "^5.0.0", - "resolve-import": "^2.1.1", + "resolve-import": "^2.4.0", "rimraf": "^6.1.2", "sync-content": "^2.0.3", "typescript": "^5.9.3", @@ -42964,7 +42883,7 @@ "scratch-storage": "6.1.8", "scratch-webpack-configuration": "3.1.1", "semantic-release": "25.0.3", - "tap": "21.5.1", + "tap": "21.6.1", "terser-webpack-plugin": "5.3.16", "typedoc": "0.28.16", "webpack": "5.105.2", @@ -43130,7 +43049,7 @@ "scratch-semantic-release-config": "4.0.1", "scratch-webpack-configuration": "3.1.1", "semantic-release": "25.0.3", - "tap": "21.5.1", + "tap": "21.6.1", "webpack": "5.105.2", "webpack-cli": "5.1.4", "webpack-dev-server": "5.2.3", @@ -43225,7 +43144,7 @@ "script-loader": "0.7.2", "semantic-release": "25.0.3", "stats.js": "0.17.0", - "tap": "21.5.1", + "tap": "21.6.1", "tiny-worker": "2.3.0", "typedoc": "0.28.16", "webpack": "5.105.2", diff --git a/packages/scratch-render/package.json b/packages/scratch-render/package.json index 5bd4fa2bf47..f9e8142e357 100644 --- a/packages/scratch-render/package.json +++ b/packages/scratch-render/package.json @@ -82,7 +82,7 @@ "scratch-storage": "6.1.8", "scratch-webpack-configuration": "3.1.1", "semantic-release": "25.0.3", - "tap": "21.5.1", + "tap": "21.6.1", "terser-webpack-plugin": "5.3.16", "typedoc": "0.28.16", "webpack": "5.105.2", diff --git a/packages/scratch-svg-renderer/package.json b/packages/scratch-svg-renderer/package.json index ea0fff27d37..cb0f2303949 100644 --- a/packages/scratch-svg-renderer/package.json +++ b/packages/scratch-svg-renderer/package.json @@ -72,7 +72,7 @@ "scratch-semantic-release-config": "4.0.1", "scratch-webpack-configuration": "3.1.1", "semantic-release": "25.0.3", - "tap": "21.5.1", + "tap": "21.6.1", "webpack": "5.105.2", "webpack-cli": "5.1.4", "webpack-dev-server": "5.2.3", diff --git a/packages/scratch-vm/package.json b/packages/scratch-vm/package.json index 6735c00018e..dfe1758d6d6 100644 --- a/packages/scratch-vm/package.json +++ b/packages/scratch-vm/package.json @@ -107,7 +107,7 @@ "script-loader": "0.7.2", "semantic-release": "25.0.3", "stats.js": "0.17.0", - "tap": "21.5.1", + "tap": "21.6.1", "tiny-worker": "2.3.0", "typedoc": "0.28.16", "webpack": "5.105.2", From d8ceec05d9ff34dbf984788ec994750bf3dc5035 Mon Sep 17 00:00:00 2001 From: Hristo Georgiev Date: Mon, 23 Feb 2026 16:30:51 +0200 Subject: [PATCH 256/521] feat: export modal for usage in NGP --- packages/scratch-gui/src/exported-reducers.ts | 72 +++++++++++++++---- 1 file changed, 58 insertions(+), 14 deletions(-) diff --git a/packages/scratch-gui/src/exported-reducers.ts b/packages/scratch-gui/src/exported-reducers.ts index 9b1d210b540..f34ffdf6dbc 100644 --- a/packages/scratch-gui/src/exported-reducers.ts +++ b/packages/scratch-gui/src/exported-reducers.ts @@ -1,8 +1,18 @@ -import {ScratchPaintReducer} from 'scratch-paint'; -import LocalesReducer, {localesInitialState, initLocale, selectLocale} from './reducers/locales.js'; -import GuiReducer, {buildInitialState, guiMiddleware, initEmbedded, initFullScreen, initPlayer} from './reducers/gui'; -import {setFullScreen, setPlayer, setEmbedded} from './reducers/mode.js'; -import {activateDeck} from './reducers/cards.js'; +import { ScratchPaintReducer } from "scratch-paint"; +import LocalesReducer, { + localesInitialState, + initLocale, + selectLocale, +} from "./reducers/locales.js"; +import GuiReducer, { + buildInitialState, + guiMiddleware, + initEmbedded, + initFullScreen, + initPlayer, +} from "./reducers/gui"; +import { setFullScreen, setPlayer, setEmbedded } from "./reducers/mode.js"; +import { activateDeck } from "./reducers/cards.js"; import { LoadingStates, onFetchedProjectData, @@ -12,19 +22,37 @@ import { remixProject, requestNewProject, requestProjectUpload, - setProjectId -} from './reducers/project-state.js'; + setProjectId, +} from "./reducers/project-state.js"; import { openLoadingProject, closeLoadingProject, - openTelemetryModal -} from './reducers/modals.js'; -import {setStageSize} from './reducers/stage-size'; + openTelemetryModal, + openTipsLibrary, + openBackdropLibrary, + openCostumeLibrary, + openDebugModal, + openExtensionLibrary, + openSoundLibrary, + openSpriteLibrary, + openSoundRecorder, + openConnectionModal, + closeCostumeLibrary, + closeDebugModal, + closeExtensionLibrary, + closeSpriteLibrary, + closeSoundLibrary, + closeSoundRecorder, + closeTipsLibrary, + closeBackdropLibrary, + closeConnectionModal, +} from "./reducers/modals.js"; +import { setStageSize } from "./reducers/stage-size"; export const guiReducers = { locales: LocalesReducer, scratchGui: GuiReducer, - scratchPaint: ScratchPaintReducer + scratchPaint: ScratchPaintReducer, }; export { @@ -38,11 +66,27 @@ export { requestProjectUpload, setProjectId, setStageSize, - openLoadingProject, closeLoadingProject, openTelemetryModal, - + openTipsLibrary, + openBackdropLibrary, + openCostumeLibrary, + openDebugModal, + openExtensionLibrary, + openSoundLibrary, + openSpriteLibrary, + openSoundRecorder, + openConnectionModal, + closeCostumeLibrary, + closeDebugModal, + closeExtensionLibrary, + closeSpriteLibrary, + closeSoundLibrary, + closeSoundRecorder, + closeTipsLibrary, + closeBackdropLibrary, + closeConnectionModal, buildInitialState, guiMiddleware, initEmbedded, @@ -54,5 +98,5 @@ export { setPlayer, setEmbedded, activateDeck, - selectLocale + selectLocale, }; From cf3bf9e0329126b4324ab29ad1b09e88217448ca Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 23 Feb 2026 14:40:52 +0000 Subject: [PATCH 257/521] chore(deps): update dependency eslint to v9.39.3 --- package-lock.json | 37 +++++++++++++++------- packages/scratch-gui/package.json | 2 +- packages/scratch-render/package.json | 2 +- packages/scratch-svg-renderer/package.json | 2 +- packages/scratch-vm/package.json | 2 +- packages/task-herder/package.json | 2 +- 6 files changed, 30 insertions(+), 17 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5a554dfab2c..1c4167a872e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17025,9 +17025,9 @@ } }, "node_modules/eslint": { - "version": "9.39.2", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz", - "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", + "version": "9.39.3", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.3.tgz", + "integrity": "sha512-VmQ+sifHUbI/IcSopBCF/HO3YiHQx/AVd3UVyYL6weuwW+HvON9VYn5l6Zl1WZzPWXPNZrSQpxwkkZ/VuvJZzg==", "dev": true, "license": "MIT", "dependencies": { @@ -17037,7 +17037,7 @@ "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.39.2", + "@eslint/js": "9.39.3", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", @@ -17647,10 +17647,23 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint/node_modules/@eslint/js": { + "version": "9.39.3", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.3.tgz", + "integrity": "sha512-1B1VkCq6FuUNlQvlBYb+1jDu/gV297TIs/OeiaSR9l1H27SVW55ONE1e1Vp16NqP683+xEGzxYtv4XCiDPaQiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, "node_modules/eslint/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "dev": true, "license": "MIT", "dependencies": { @@ -42790,7 +42803,7 @@ "buffer": "6.0.3", "cheerio": "1.2.0", "cross-env": "7.0.3", - "eslint": "9.39.2", + "eslint": "9.39.3", "eslint-config-scratch": "12.0.49", "eslint-import-resolver-webpack": "0.13.10", "eslint-plugin-import": "2.32.0", @@ -42872,7 +42885,7 @@ "babel-loader": "9.2.1", "copy-webpack-plugin": "6.4.1", "docdash": "0.4.0", - "eslint": "9.39.2", + "eslint": "9.39.3", "eslint-config-scratch": "12.0.49", "gh-pages": "1.2.0", "globals": "16.5.0", @@ -43039,7 +43052,7 @@ "@babel/preset-env": "7.29.0", "babel-loader": "9.2.1", "copy-webpack-plugin": "6.4.1", - "eslint": "9.39.2", + "eslint": "9.39.3", "eslint-config-scratch": "12.0.49", "globals": "16.5.0", "jsdom": "13.2.0", @@ -43127,7 +43140,7 @@ "callsite": "1.0.0", "copy-webpack-plugin": "6.4.1", "docdash": "1.2.0", - "eslint": "9.39.2", + "eslint": "9.39.3", "eslint-config-scratch": "12.0.49", "expose-loader": "1.0.3", "file-loader": "6.2.0", @@ -43285,7 +43298,7 @@ "license": "AGPL-3.0-only", "devDependencies": { "@vitest/coverage-v8": "4.0.18", - "eslint": "9.39.2", + "eslint": "9.39.3", "eslint-config-scratch": "12.0.49", "prettier": "3.8.1", "rimraf": "6.1.2", diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index 0e5535baa8a..4e4e74bf703 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -195,7 +195,7 @@ "buffer": "6.0.3", "cheerio": "1.2.0", "cross-env": "7.0.3", - "eslint": "9.39.2", + "eslint": "9.39.3", "eslint-config-scratch": "12.0.49", "eslint-import-resolver-webpack": "0.13.10", "eslint-plugin-import": "2.32.0", diff --git a/packages/scratch-render/package.json b/packages/scratch-render/package.json index f9e8142e357..870db6494dd 100644 --- a/packages/scratch-render/package.json +++ b/packages/scratch-render/package.json @@ -71,7 +71,7 @@ "babel-loader": "9.2.1", "copy-webpack-plugin": "6.4.1", "docdash": "0.4.0", - "eslint": "9.39.2", + "eslint": "9.39.3", "eslint-config-scratch": "12.0.49", "gh-pages": "1.2.0", "globals": "16.5.0", diff --git a/packages/scratch-svg-renderer/package.json b/packages/scratch-svg-renderer/package.json index cb0f2303949..5aaa3e28d61 100644 --- a/packages/scratch-svg-renderer/package.json +++ b/packages/scratch-svg-renderer/package.json @@ -62,7 +62,7 @@ "@babel/preset-env": "7.29.0", "babel-loader": "9.2.1", "copy-webpack-plugin": "6.4.1", - "eslint": "9.39.2", + "eslint": "9.39.3", "eslint-config-scratch": "12.0.49", "globals": "16.5.0", "jsdom": "13.2.0", diff --git a/packages/scratch-vm/package.json b/packages/scratch-vm/package.json index dfe1758d6d6..9a91b82dc3b 100644 --- a/packages/scratch-vm/package.json +++ b/packages/scratch-vm/package.json @@ -90,7 +90,7 @@ "callsite": "1.0.0", "copy-webpack-plugin": "6.4.1", "docdash": "1.2.0", - "eslint": "9.39.2", + "eslint": "9.39.3", "eslint-config-scratch": "12.0.49", "expose-loader": "1.0.3", "file-loader": "6.2.0", diff --git a/packages/task-herder/package.json b/packages/task-herder/package.json index 23016423e9a..4f0e1076781 100644 --- a/packages/task-herder/package.json +++ b/packages/task-herder/package.json @@ -44,7 +44,7 @@ }, "devDependencies": { "@vitest/coverage-v8": "4.0.18", - "eslint": "9.39.2", + "eslint": "9.39.3", "eslint-config-scratch": "12.0.49", "prettier": "3.8.1", "rimraf": "6.1.2", From b07ac4fd82b731c669750849a9a9ce5b349a824b Mon Sep 17 00:00:00 2001 From: Hristo Georgiev Date: Mon, 23 Feb 2026 17:01:28 +0200 Subject: [PATCH 258/521] fix: lint errors fixed --- packages/scratch-gui/src/exported-reducers.ts | 60 +++++++++---------- 1 file changed, 27 insertions(+), 33 deletions(-) diff --git a/packages/scratch-gui/src/exported-reducers.ts b/packages/scratch-gui/src/exported-reducers.ts index f34ffdf6dbc..7329729706e 100644 --- a/packages/scratch-gui/src/exported-reducers.ts +++ b/packages/scratch-gui/src/exported-reducers.ts @@ -1,18 +1,8 @@ -import { ScratchPaintReducer } from "scratch-paint"; -import LocalesReducer, { - localesInitialState, - initLocale, - selectLocale, -} from "./reducers/locales.js"; -import GuiReducer, { - buildInitialState, - guiMiddleware, - initEmbedded, - initFullScreen, - initPlayer, -} from "./reducers/gui"; -import { setFullScreen, setPlayer, setEmbedded } from "./reducers/mode.js"; -import { activateDeck } from "./reducers/cards.js"; +import {ScratchPaintReducer} from 'scratch-paint'; +import LocalesReducer, {localesInitialState, initLocale, selectLocale} from './reducers/locales.js'; +import GuiReducer, {buildInitialState, guiMiddleware, initEmbedded, initFullScreen, initPlayer} from './reducers/gui'; +import {setFullScreen, setPlayer, setEmbedded} from './reducers/mode.js'; +import {activateDeck} from './reducers/cards.js'; import { LoadingStates, onFetchedProjectData, @@ -22,37 +12,38 @@ import { remixProject, requestNewProject, requestProjectUpload, - setProjectId, -} from "./reducers/project-state.js"; + setProjectId +} from './reducers/project-state.js'; import { - openLoadingProject, - closeLoadingProject, - openTelemetryModal, - openTipsLibrary, openBackdropLibrary, openCostumeLibrary, openDebugModal, openExtensionLibrary, + openLoadingProject, + openTelemetryModal, openSoundLibrary, openSpriteLibrary, openSoundRecorder, openConnectionModal, + openTipsLibrary, + closeBackdropLibrary, closeCostumeLibrary, closeDebugModal, closeExtensionLibrary, + closeLoadingProject, + closeTelemetryModal, closeSpriteLibrary, closeSoundLibrary, closeSoundRecorder, closeTipsLibrary, - closeBackdropLibrary, - closeConnectionModal, -} from "./reducers/modals.js"; -import { setStageSize } from "./reducers/stage-size"; + closeConnectionModal +} from './reducers/modals.js'; +import {setStageSize} from './reducers/stage-size'; export const guiReducers = { locales: LocalesReducer, scratchGui: GuiReducer, - scratchPaint: ScratchPaintReducer, + scratchPaint: ScratchPaintReducer }; export { @@ -66,27 +57,30 @@ export { requestProjectUpload, setProjectId, setStageSize, - openLoadingProject, - closeLoadingProject, - openTelemetryModal, - openTipsLibrary, + openBackdropLibrary, openCostumeLibrary, openDebugModal, openExtensionLibrary, + openLoadingProject, + openTelemetryModal, openSoundLibrary, openSpriteLibrary, openSoundRecorder, openConnectionModal, + openTipsLibrary, + closeBackdropLibrary, closeCostumeLibrary, closeDebugModal, closeExtensionLibrary, + closeLoadingProject, + closeTelemetryModal, closeSpriteLibrary, closeSoundLibrary, closeSoundRecorder, closeTipsLibrary, - closeBackdropLibrary, closeConnectionModal, + buildInitialState, guiMiddleware, initEmbedded, @@ -98,5 +92,5 @@ export { setPlayer, setEmbedded, activateDeck, - selectLocale, -}; + selectLocale +}; \ No newline at end of file From d0333174743ac6fdaeedb1802300ff3c0d7bdcc5 Mon Sep 17 00:00:00 2001 From: Hristo Georgiev Date: Mon, 23 Feb 2026 17:10:49 +0200 Subject: [PATCH 259/521] fix: new line at the bottom added --- packages/scratch-gui/src/exported-reducers.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/scratch-gui/src/exported-reducers.ts b/packages/scratch-gui/src/exported-reducers.ts index 7329729706e..4bd32288611 100644 --- a/packages/scratch-gui/src/exported-reducers.ts +++ b/packages/scratch-gui/src/exported-reducers.ts @@ -93,4 +93,4 @@ export { setEmbedded, activateDeck, selectLocale -}; \ No newline at end of file +}; From a1350ab585c81a87692e8af2e8c44574048538a6 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 23 Feb 2026 17:31:45 +0000 Subject: [PATCH 260/521] chore(deps): update dependency tap to v21.6.2 --- package-lock.json | 10849 ++++++++++--------- packages/scratch-render/package.json | 2 +- packages/scratch-svg-renderer/package.json | 2 +- packages/scratch-vm/package.json | 2 +- 4 files changed, 5560 insertions(+), 5295 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1c4167a872e..61b5c46c5da 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9658,762 +9658,1717 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/@tapjs/error-serdes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@tapjs/error-serdes/-/error-serdes-4.3.0.tgz", - "integrity": "sha512-qP266uvPm2G95ClPFpqAN6n4nicLbHrZYbZWl0UO+biOdmvjSSuxeY5f7YFygTl+UuzlyxjlRgHTq8qifnqTcw==", + "node_modules/@tapjs/after": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@tapjs/after/-/after-3.3.4.tgz", + "integrity": "sha512-Y8DL0F9Ux6Swe7b5g4qLFgJUEFrVr5fhmVOENw4D/x7rDRyx/3c86Ya1p9iJrpkE2RnvdGq9AxR/rTM137Y7Lg==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { - "minipass": "^7.0.4" + "is-actual-promise": "^1.0.1" }, "engines": { "node": "20 || >=22" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@tapjs/error-serdes/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": { + "@tapjs/core": "4.5.2" } }, - "node_modules/@tapjs/processinfo": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/@tapjs/processinfo/-/processinfo-3.1.9.tgz", - "integrity": "sha512-yIbYH9ROI5m5F2B5Hpk6t89OkHBrDbL3qncPO9OfPuSvJsvAIDG91I0hxGQNohdaxmqz5L4QiIYc5Y0KmtLzCQ==", + "node_modules/@tapjs/after-each": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@tapjs/after-each/-/after-each-4.3.4.tgz", + "integrity": "sha512-TM1OWz7Ht3aimbT/MLYnoywI9SBGsTus6TQ+94n1yjr1izO3K21PP5Q9UYdqZ2Qq1WiZmGa+CZKUZANUn1ZcvQ==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { - "node-options-to-argv": "^1.0.0", - "pirates": "^4.0.5", - "process-on-spawn": "^1.0.0", - "signal-exit": "^4.0.2", - "uuid": "^8.3.2" + "function-loop": "^4.0.0" }, "engines": { - "node": ">=16.17" - } - }, - "node_modules/@tapjs/processinfo/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": "ISC", - "engines": { - "node": ">=14" + "node": "20 || >=22" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "peerDependencies": { + "@tapjs/core": "4.5.2" } }, - "node_modules/@tapjs/stack": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@tapjs/stack/-/stack-4.3.0.tgz", - "integrity": "sha512-SFASe4YaVBzMr/FXTm/QsSzbzXZOmgDNpmY3EU0JNiDCN4izHMUnoXY+Kh0EY35hx9C4JDvRjgv2MSIM7bBygg==", + "node_modules/@tapjs/asserts": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@tapjs/asserts/-/asserts-4.3.4.tgz", + "integrity": "sha512-1kf2q0oQ7LCZKy5l4Oe7/ZVijhJ9YxbS4qmqGtj7cYwOw4Q78KNLwthh14c9EBbI2QHKUDS2LaLM8a1qMLmPiA==", "dev": true, "license": "BlueOak-1.0.0", + "dependencies": { + "@tapjs/stack": "4.3.0", + "is-actual-promise": "^1.0.1", + "tcompare": "9.3.0", + "trivial-deferred": "^2.0.0" + }, "engines": { "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@tensorflow-models/face-detection": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tensorflow-models/face-detection/-/face-detection-1.0.3.tgz", - "integrity": "sha512-4Ld/vFF8MrdFdrMWhlLKZD4hMW0PNY9OkYeqoCPNZ+LwFyenxAqVaNaWrR8JKp37vw9Nuzp4ILbkal5zPUnA0g==", - "license": "Apache-2.0", - "dependencies": { - "rimraf": "^3.0.2", - "tslib": "2.4.0" }, "peerDependencies": { - "@mediapipe/face_detection": "~0.4.0", - "@tensorflow/tfjs-backend-webgl": "^4.21.0", - "@tensorflow/tfjs-converter": "^4.21.0", - "@tensorflow/tfjs-core": "^4.21.0" + "@tapjs/core": "4.5.2" } }, - "node_modules/@tensorflow-models/face-detection/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", - "license": "ISC", + "node_modules/@tapjs/before": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@tapjs/before/-/before-4.3.4.tgz", + "integrity": "sha512-53n/8/RktPkbCuZveDTYiplbrzWjFkYAnmYCrFixESsFoUrkfTCPjeCRmojBS14zuRdVe4kLsX6XWYkaUpLdZA==", + "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { - "glob": "^7.1.3" + "is-actual-promise": "^1.0.1" }, - "bin": { - "rimraf": "bin.js" + "engines": { + "node": "20 || >=22" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "peerDependencies": { + "@tapjs/core": "4.5.2" } }, - "node_modules/@tensorflow-models/face-detection/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "license": "0BSD" - }, - "node_modules/@tensorflow/tfjs": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@tensorflow/tfjs/-/tfjs-4.22.0.tgz", - "integrity": "sha512-0TrIrXs6/b7FLhLVNmfh8Sah6JgjBPH4mZ8JGb7NU6WW+cx00qK5BcAZxw7NCzxj6N8MRAIfHq+oNbPUNG5VAg==", - "license": "Apache-2.0", + "node_modules/@tapjs/before-each": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@tapjs/before-each/-/before-each-4.3.4.tgz", + "integrity": "sha512-WkLsDvCjBrxrRkyhEBpfmGObUsf8Eb+tsqlxnGUG67XbPMkwkP/AoUPonc/g1Nv+pwtR+t5j6maNblrubWuG3A==", + "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { - "@tensorflow/tfjs-backend-cpu": "4.22.0", - "@tensorflow/tfjs-backend-webgl": "4.22.0", - "@tensorflow/tfjs-converter": "4.22.0", - "@tensorflow/tfjs-core": "4.22.0", - "@tensorflow/tfjs-data": "4.22.0", - "@tensorflow/tfjs-layers": "4.22.0", - "argparse": "^1.0.10", - "chalk": "^4.1.0", - "core-js": "3.29.1", - "regenerator-runtime": "^0.13.5", - "yargs": "^16.0.3" + "function-loop": "^4.0.0" }, - "bin": { - "tfjs-custom-module": "dist/tools/custom_module/cli.js" + "engines": { + "node": "20 || >=22" + }, + "peerDependencies": { + "@tapjs/core": "4.5.2" } }, - "node_modules/@tensorflow/tfjs-backend-cpu": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-backend-cpu/-/tfjs-backend-cpu-4.22.0.tgz", - "integrity": "sha512-1u0FmuLGuRAi8D2c3cocHTASGXOmHc/4OvoVDENJayjYkS119fcTcQf4iHrtLthWyDIPy3JiPhRrZQC9EwnhLw==", - "license": "Apache-2.0", - "dependencies": { - "@types/seedrandom": "^2.4.28", - "seedrandom": "^3.0.5" - }, + "node_modules/@tapjs/chdir": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@tapjs/chdir/-/chdir-3.3.4.tgz", + "integrity": "sha512-B37eGrs47xseJ7dm9ikhStX7KNqflvZViT2lMqVACeNvoxSpRgy1pu7cPix4wKvBlZCtNYaOD8iDNm+5nDfvSQ==", + "dev": true, + "license": "BlueOak-1.0.0", "engines": { - "yarn": ">= 1.3.2" + "node": "20 || >=22" }, "peerDependencies": { - "@tensorflow/tfjs-core": "4.22.0" + "@tapjs/core": "4.5.2" } }, - "node_modules/@tensorflow/tfjs-backend-webgl": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-backend-webgl/-/tfjs-backend-webgl-4.22.0.tgz", - "integrity": "sha512-H535XtZWnWgNwSzv538czjVlbJebDl5QTMOth4RXr2p/kJ1qSIXE0vZvEtO+5EC9b00SvhplECny2yDewQb/Yg==", - "license": "Apache-2.0", + "node_modules/@tapjs/config": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/@tapjs/config/-/config-5.5.2.tgz", + "integrity": "sha512-GQyKl40fGamoSvT4SsfQfZyaHT8fboNW5OhrA1hhMc34di5j/efiD15VlNVbPGE51BZSs5M3Jw7YukF2/Cg8CA==", + "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { - "@tensorflow/tfjs-backend-cpu": "4.22.0", - "@types/offscreencanvas": "~2019.3.0", - "@types/seedrandom": "^2.4.28", - "seedrandom": "^3.0.5" + "@tapjs/core": "4.5.2", + "@tapjs/test": "4.4.2", + "chalk": "^5.6.2", + "jackspeak": "^4.2.3", + "polite-json": "^5.0.0", + "tap-yaml": "4.3.0", + "walk-up-path": "^4.0.0" }, "engines": { - "yarn": ">= 1.3.2" + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" }, "peerDependencies": { - "@tensorflow/tfjs-core": "4.22.0" + "@tapjs/core": "4.5.2", + "@tapjs/test": "4.4.2" } }, - "node_modules/@tensorflow/tfjs-converter": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-converter/-/tfjs-converter-4.22.0.tgz", - "integrity": "sha512-PT43MGlnzIo+YfbsjM79Lxk9lOq6uUwZuCc8rrp0hfpLjF6Jv8jS84u2jFb+WpUeuF4K33ZDNx8CjiYrGQ2trQ==", - "license": "Apache-2.0", - "peerDependencies": { - "@tensorflow/tfjs-core": "4.22.0" + "node_modules/@tapjs/config/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/@tensorflow/tfjs-core": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-core/-/tfjs-core-4.22.0.tgz", - "integrity": "sha512-LEkOyzbknKFoWUwfkr59vSB68DMJ4cjwwHgicXN0DUi3a0Vh1Er3JQqCI1Hl86GGZQvY8ezVrtDIvqR1ZFW55A==", - "license": "Apache-2.0", + "node_modules/@tapjs/core": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/@tapjs/core/-/core-4.5.2.tgz", + "integrity": "sha512-0KKabYyBN4W2CRgnD0rOhDvexbMLMPuT0OElQTz5ezCsx1QGtuUHP9TmRXEGCJAoeL44Us0L2DxPpS4BUW1KEQ==", + "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { - "@types/long": "^4.0.1", - "@types/offscreencanvas": "~2019.7.0", - "@types/seedrandom": "^2.4.28", - "@webgpu/types": "0.1.38", - "long": "4.0.0", - "node-fetch": "~2.6.1", - "seedrandom": "^3.0.5" + "@tapjs/processinfo": "^3.1.9", + "@tapjs/stack": "4.3.0", + "@tapjs/test": "4.4.2", + "async-hook-domain": "^4.0.1", + "diff": "^8.0.2", + "is-actual-promise": "^1.0.1", + "minipass": "^7.0.4", + "signal-exit": "4.1", + "tap-parser": "18.3.0", + "tap-yaml": "4.3.0", + "tcompare": "9.3.0", + "trivial-deferred": "^2.0.0" }, "engines": { - "yarn": ">= 1.3.2" + "node": "20 || >=22" } }, - "node_modules/@tensorflow/tfjs-core/node_modules/@types/offscreencanvas": { - "version": "2019.7.3", - "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.7.3.tgz", - "integrity": "sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==", - "license": "MIT" + "node_modules/@tapjs/core/node_modules/diff": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.3.tgz", + "integrity": "sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } }, - "node_modules/@tensorflow/tfjs-data": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-data/-/tfjs-data-4.22.0.tgz", - "integrity": "sha512-dYmF3LihQIGvtgJrt382hSRH4S0QuAp2w1hXJI2+kOaEqo5HnUPG0k5KA6va+S1yUhx7UBToUKCBHeLHFQRV4w==", - "license": "Apache-2.0", - "dependencies": { - "@types/node-fetch": "^2.1.2", - "node-fetch": "~2.6.1", - "string_decoder": "^1.3.0" - }, - "peerDependencies": { - "@tensorflow/tfjs-core": "4.22.0", - "seedrandom": "^3.0.5" + "node_modules/@tapjs/core/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/@tensorflow/tfjs-layers": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-layers/-/tfjs-layers-4.22.0.tgz", - "integrity": "sha512-lybPj4ZNj9iIAPUj7a8ZW1hg8KQGfqWLlCZDi9eM/oNKCCAgchiyzx8OrYoWmRrB+AM6VNEeIT+2gZKg5ReihA==", - "license": "Apache-2.0 AND MIT", - "peerDependencies": { - "@tensorflow/tfjs-core": "4.22.0" + "node_modules/@tapjs/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": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@tensorflow/tfjs/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "license": "MIT", + "node_modules/@tapjs/error-serdes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tapjs/error-serdes/-/error-serdes-4.3.0.tgz", + "integrity": "sha512-qP266uvPm2G95ClPFpqAN6n4nicLbHrZYbZWl0UO+biOdmvjSSuxeY5f7YFygTl+UuzlyxjlRgHTq8qifnqTcw==", + "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { - "sprintf-js": "~1.0.2" + "minipass": "^7.0.4" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@tensorflow/tfjs/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==", + "node_modules/@tapjs/error-serdes/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", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" + "engines": { + "node": ">=16 || 14 >=14.17" } }, - "node_modules/@tensorflow/tfjs/node_modules/core-js": { - "version": "3.29.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.29.1.tgz", - "integrity": "sha512-+jwgnhg6cQxKYIIjGtAHq2nwUOolo9eoFZ4sHfUH09BLXBgxnH4gA0zEd+t+BO2cNB8idaBtZFcFTRjQJRJmAw==", - "hasInstallScript": true, - "license": "MIT", + "node_modules/@tapjs/filter": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@tapjs/filter/-/filter-4.3.4.tgz", + "integrity": "sha512-Bpbahk/Bv30ZfGoDpZVjGhvg8Cq2yqCZcawd+4qtTTSDY+V7GEpdJGu2/2EvwXP+s4PklPx2kFry8X9m6OtAog==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" + "url": "https://github.com/sponsors/isaacs" + }, + "peerDependencies": { + "@tapjs/core": "4.5.2" } }, - "node_modules/@tensorflow/tfjs/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "license": "MIT", + "node_modules/@tapjs/fixture": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@tapjs/fixture/-/fixture-4.3.4.tgz", + "integrity": "sha512-zRv1vD2H/2abt0S5Yr5ICV/ZaIqXmusBZ6H4Qbih9oE2jvbs6AVDz5Td0adZbWurtHrPLuOFTIz2UsbJfhCCcw==", + "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" + "mkdirp": "^3.0.0", + "rimraf": "^6.0.0" }, "engines": { - "node": ">=10" + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "peerDependencies": { + "@tapjs/core": "4.5.2" } }, - "node_modules/@testing-library/dom": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz", - "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", + "node_modules/@tapjs/fixture/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", - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^5.0.1", - "aria-query": "5.3.0", - "dom-accessibility-api": "^0.5.9", - "lz-string": "^1.5.0", - "picocolors": "1.1.1", - "pretty-format": "^27.0.2" - }, "engines": { - "node": ">=18" + "node": "18 || 20 || >=22" } }, - "node_modules/@testing-library/jest-dom": { - "version": "5.17.0", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.17.0.tgz", - "integrity": "sha512-ynmNeT7asXyH3aSVv4vvX4Rb+0qjOhdNHnO/3vuZNqPmhDpV/+rCSGwQ7bLcmU2cJ4dvoheIO85LQj0IbJHEtg==", + "node_modules/@tapjs/fixture/node_modules/brace-expansion": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz", + "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==", "dev": true, "license": "MIT", "dependencies": { - "@adobe/css-tools": "^4.0.1", - "@babel/runtime": "^7.9.2", - "@types/testing-library__jest-dom": "^5.9.1", - "aria-query": "^5.0.0", - "chalk": "^3.0.0", - "css.escape": "^1.5.1", - "dom-accessibility-api": "^0.5.6", - "lodash": "^4.17.15", - "redent": "^3.0.0" + "balanced-match": "^4.0.2" }, "engines": { - "node": ">=8", - "npm": ">=6", - "yarn": ">=1" + "node": "18 || 20 || >=22" } }, - "node_modules/@testing-library/jest-dom/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "node_modules/@tapjs/fixture/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": "MIT", + "license": "BlueOak-1.0.0", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" }, "engines": { - "node": ">=8" + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@testing-library/react": { - "version": "14.3.1", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-14.3.1.tgz", - "integrity": "sha512-H99XjUhWQw0lTgyMN05W3xQG1Nh4lq574D8keFf1dDoNTJgp66VbJozRaczoF+wsiaPJNt/TcnfpLGufGxSrZQ==", + "node_modules/@tapjs/fixture/node_modules/minimatch": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.2.tgz", + "integrity": "sha512-+G4CpNBxa5MprY+04MbgOw1v7So6n5JY166pFi9KfYwT78fxScCeSNQSNzp6dpPSW2rONOps6Ocam1wFhCgoVw==", "dev": true, - "license": "MIT", + "license": "BlueOak-1.0.0", "dependencies": { - "@babel/runtime": "^7.12.5", - "@testing-library/dom": "^9.0.0", - "@types/react-dom": "^18.0.0" + "brace-expansion": "^5.0.2" }, "engines": { - "node": ">=14" + "node": "18 || 20 || >=22" }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@testing-library/react/node_modules/@testing-library/dom": { - "version": "9.3.4", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.4.tgz", - "integrity": "sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==", + "node_modules/@tapjs/fixture/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/@tapjs/fixture/node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", "dev": true, "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^5.0.1", - "aria-query": "5.1.3", - "chalk": "^4.1.0", - "dom-accessibility-api": "^0.5.9", - "lz-string": "^1.5.0", - "pretty-format": "^27.0.2" + "bin": { + "mkdirp": "dist/cjs/src/bin.js" }, "engines": { - "node": ">=14" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@testing-library/react/node_modules/aria-query": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", - "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "node_modules/@tapjs/fixture/node_modules/rimraf": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.1.3.tgz", + "integrity": "sha512-LKg+Cr2ZF61fkcaK1UdkH2yEBBKnYjTyWzTJT6KNPcSPaiT7HSdhtMXQuN5wkTX0Xu72KQ1l8S42rlmexS2hSA==", "dev": true, - "license": "Apache-2.0", + "license": "BlueOak-1.0.0", "dependencies": { - "deep-equal": "^2.0.5" + "glob": "^13.0.3", + "package-json-from-dist": "^1.0.1" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@testing-library/user-event": { - "version": "14.6.1", - "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.1.tgz", - "integrity": "sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==", - "license": "MIT", + "node_modules/@tapjs/intercept": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@tapjs/intercept/-/intercept-4.3.4.tgz", + "integrity": "sha512-7ifEMPmp4yKHQ7PqdPwCetipFLvCegbIyKigEDds/p03ZNFJjgF06D9T4vc/m0sA5SKkPrHVTOU0UzaSrliP7w==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@tapjs/after": "3.3.4", + "@tapjs/stack": "4.3.0" + }, "engines": { - "node": ">=12", - "npm": ">=6" + "node": "20 || >=22" }, "peerDependencies": { - "@testing-library/dom": ">=7.21.4" + "@tapjs/core": "4.5.2" } }, - "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==", + "node_modules/@tapjs/mock": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@tapjs/mock/-/mock-4.4.2.tgz", + "integrity": "sha512-B6SfNWjWCPvjN9CaHe45lEcl2ZFDkQIUoF5jPthwi2mYxHLfyFFEqorZJhguoTs7ToeXvIqquqE/Luk9IeuKBQ==", "dev": true, - "license": "MIT", + "license": "BlueOak-1.0.0", + "dependencies": { + "@tapjs/after": "3.3.4", + "@tapjs/stack": "4.3.0", + "resolve-import": "^2.4.0", + "walk-up-path": "^4.0.0" + }, "engines": { - "node": ">= 10" + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "peerDependencies": { + "@tapjs/core": "4.5.2" } }, - "node_modules/@transifex/api": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/@transifex/api/-/api-7.1.5.tgz", - "integrity": "sha512-YJPJBD6sZ1ax1MGzv2Nta3W5lES2If8qSExlyshHSx85S8Hs3MglWHKjJcaUmbXsdGzscJ1qQYJaXAZq12zWvg==", - "license": "Apache-2.0", + "node_modules/@tapjs/node-serialize": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@tapjs/node-serialize/-/node-serialize-4.3.4.tgz", + "integrity": "sha512-SECDvjBS7NVCiCZ6vEtMwtxxSuR61NHBva+PlIQ1mU0asoTYxV9lpRNEAb9UHFKpquEDlk+bLg2iN01a2nfMuw==", + "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { - "core-js": "^3.35.0" + "@tapjs/error-serdes": "4.3.0", + "@tapjs/stack": "4.3.0", + "tap-parser": "18.3.0" }, "engines": { - "node": ">=16.0.0" + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "peerDependencies": { + "@tapjs/core": "4.5.2" } }, - "node_modules/@transifex/api/node_modules/core-js": { - "version": "3.46.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.46.0.tgz", - "integrity": "sha512-vDMm9B0xnqqZ8uSBpZ8sNtRtOdmfShrvT6h2TuQGLs0Is+cR0DYbj/KWP6ALVNbWPpqA/qPLoOuppJN07humpA==", - "hasInstallScript": true, - "license": "MIT", + "node_modules/@tapjs/processinfo": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@tapjs/processinfo/-/processinfo-3.1.9.tgz", + "integrity": "sha512-yIbYH9ROI5m5F2B5Hpk6t89OkHBrDbL3qncPO9OfPuSvJsvAIDG91I0hxGQNohdaxmqz5L4QiIYc5Y0KmtLzCQ==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "node-options-to-argv": "^1.0.0", + "pirates": "^4.0.5", + "process-on-spawn": "^1.0.0", + "signal-exit": "^4.0.2", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=16.17" + } + }, + "node_modules/@tapjs/processinfo/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": "ISC", + "engines": { + "node": ">=14" + }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@trivago/prettier-plugin-sort-imports": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/@trivago/prettier-plugin-sort-imports/-/prettier-plugin-sort-imports-5.2.2.tgz", - "integrity": "sha512-fYDQA9e6yTNmA13TLVSA+WMQRc5Bn/c0EUBditUHNfMMxN7M82c38b1kEggVE3pLpZ0FwkwJkUEKMiOi52JXFA==", + "node_modules/@tapjs/reporter": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/@tapjs/reporter/-/reporter-4.4.4.tgz", + "integrity": "sha512-svWmpJgMQxe4iiKOVr/Hi5kGHJNBDp2Nr8gD0aQuAQ4fp9gOh2LFQXa2Jv7LBKhMjC7UaiW/X7k1qEVk2nOfvg==", "dev": true, - "license": "Apache-2.0", + "license": "BlueOak-1.0.0", "dependencies": { - "@babel/generator": "^7.26.5", - "@babel/parser": "^7.26.7", - "@babel/traverse": "^7.26.7", - "@babel/types": "^7.26.7", - "javascript-natural-sort": "^0.7.1", - "lodash": "^4.17.21" + "@tapjs/config": "5.5.2", + "@tapjs/stack": "4.3.0", + "chalk": "^5.6.2", + "ink": "^5.2.1", + "minipass": "^7.0.4", + "ms": "^2.1.3", + "patch-console": "^2.0.0", + "prismjs-terminal": "^1.2.3", + "react": "^18.2.0", + "string-length": "^6.0.0", + "tap-parser": "18.3.0", + "tap-yaml": "4.3.0", + "tcompare": "9.3.0" }, "engines": { - "node": ">18.12" + "node": "20 || >=22" }, - "peerDependencies": { - "@vue/compiler-sfc": "3.x", - "prettier": "2.x - 3.x", - "prettier-plugin-svelte": "3.x", - "svelte": "4.x || 5.x" + "funding": { + "url": "https://github.com/sponsors/isaacs" }, - "peerDependenciesMeta": { - "@vue/compiler-sfc": { - "optional": true - }, - "prettier-plugin-svelte": { - "optional": true - }, - "svelte": { - "optional": true - } + "peerDependencies": { + "@tapjs/core": "4.5.2" } }, - "node_modules/@tsconfig/node10": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", - "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node18": { - "version": "18.2.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node18/-/node18-18.2.4.tgz", - "integrity": "sha512-5xxU8vVs9/FNcvm3gE07fPbn9tl6tqGGWA9tSlwsUEkBxtRnTsNmwrV8gasZ9F/EobaSv9+nu8AxUKccw77JpQ==", + "node_modules/@tapjs/reporter/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } }, - "node_modules/@tsconfig/node20": { - "version": "20.1.6", - "resolved": "https://registry.npmjs.org/@tsconfig/node20/-/node20-20.1.6.tgz", - "integrity": "sha512-sz+Hqx9zwZDpZIV871WSbUzSqNIsXzghZydypnfgzPKLltVJfkINfUeTct31n/tTSa9ZE1ZOfKdRre1uHHquYQ==", + "node_modules/@tapjs/reporter/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" + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } }, - "node_modules/@tufjs/canonical-json": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz", - "integrity": "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==", + "node_modules/@tapjs/reporter/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": "^16.14.0 || >=18.0.0" + "node": ">=16 || 14 >=14.17" } }, - "node_modules/@tufjs/models": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-4.0.0.tgz", - "integrity": "sha512-h5x5ga/hh82COe+GoD4+gKUeV4T3iaYOxqLt41GRKApinPI7DMidhCmNVTjKfhCWFJIGXaFJee07XczdT4jdZQ==", + "node_modules/@tapjs/reporter/node_modules/string-length": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-6.0.0.tgz", + "integrity": "sha512-1U361pxZHEQ+FeSjzqRpV+cu2vTzYeWeafXFLykiFlv4Vc0n3njgU8HrMbyik5uwm77naWMuVG8fhEF+Ovb1Kg==", "dev": true, "license": "MIT", "dependencies": { - "@tufjs/canonical-json": "2.0.0", - "minimatch": "^9.0.5" + "strip-ansi": "^7.1.0" }, "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@tufjs/models/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "node_modules/@tapjs/reporter/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/@tufjs/models/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "node_modules/@tapjs/run": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/@tapjs/run/-/run-4.5.2.tgz", + "integrity": "sha512-Oq5YZvoGxEohRWK8P1wHPIAnudEOHPd/bIWawFtRn0ZGvF7bRduZlHpf4eEIrRHKY84G/I3fmC354604cejxiQ==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^2.0.1" + "@isaacs/which": "^7.0.4", + "@tapjs/after": "3.3.4", + "@tapjs/before": "4.3.4", + "@tapjs/config": "5.5.2", + "@tapjs/processinfo": "^3.1.9", + "@tapjs/reporter": "4.4.4", + "@tapjs/spawn": "4.3.4", + "@tapjs/stdin": "4.3.4", + "@tapjs/test": "4.4.2", + "c8": "^10.1.3", + "chalk": "^5.6.2", + "chokidar": "^4.0.2", + "foreground-child": "^4.0.0", + "glob": "^13.0.2", + "minipass": "^7.0.4", + "mkdirp": "^3.0.1", + "node-options-to-argv": "^1.0.0", + "opener": "^1.5.2", + "pacote": "^21.0.4", + "path-scurry": "^2.0.0", + "resolve-import": "^2.4.0", + "rimraf": "^6.0.0", + "semver": "^7.7.2", + "signal-exit": "^4.1.0", + "tap-parser": "18.3.0", + "tap-yaml": "4.3.0", + "tcompare": "9.3.0", + "trivial-deferred": "^2.0.0" + }, + "bin": { + "tap-run": "dist/esm/index.js" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" + }, + "peerDependencies": { + "@tapjs/core": "4.5.2" } }, - "node_modules/@tybys/wasm-util": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", - "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "node_modules/@tapjs/run/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", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" + "engines": { + "node": "18 || 20 || >=22" } }, - "node_modules/@types/aria-query": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", - "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", - "license": "MIT" - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "node_modules/@tapjs/run/node_modules/brace-expansion": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz", + "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" } }, - "node_modules/@types/babel__generator": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", - "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "node_modules/@tapjs/run/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", - "dependencies": { - "@babel/types": "^7.0.0" + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "node_modules/@tapjs/run/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": "MIT", "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@types/babel__traverse": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", - "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "node_modules/@tapjs/run/node_modules/foreground-child": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-4.0.3.tgz", + "integrity": "sha512-yeXZaNbCBGaT9giTpLPBdtedzjwhlJBUoL/R4BVQU5mn0TQXOHwVIl1Q2DMuBIdNno4ktA1abZ7dQFVxD6uHxw==", "dev": true, - "license": "MIT", + "license": "BlueOak-1.0.0", "dependencies": { - "@babel/types": "^7.28.2" + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@types/body-parser": { - "version": "1.19.6", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", - "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "node_modules/@tapjs/run/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": "MIT", + "license": "BlueOak-1.0.0", "dependencies": { - "@types/connect": "*", - "@types/node": "*" + "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/@types/bonjour": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", - "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", + "node_modules/@tapjs/run/node_modules/minimatch": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.2.tgz", + "integrity": "sha512-+G4CpNBxa5MprY+04MbgOw1v7So6n5JY166pFi9KfYwT78fxScCeSNQSNzp6dpPSW2rONOps6Ocam1wFhCgoVw==", "dev": true, - "license": "MIT", + "license": "BlueOak-1.0.0", "dependencies": { - "@types/node": "*" + "brace-expansion": "^5.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@types/chai": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", - "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", + "node_modules/@tapjs/run/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", - "dependencies": { - "@types/deep-eql": "*", - "assertion-error": "^2.0.1" + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" } }, - "node_modules/@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "node_modules/@tapjs/run/node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", "dev": true, "license": "MIT", - "dependencies": { - "@types/node": "*" + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@types/connect-history-api-fallback": { - "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==", + "node_modules/@tapjs/run/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": { - "@types/express-serve-static-core": "*", - "@types/node": "*" + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@types/debug": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", - "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "node_modules/@tapjs/run/node_modules/rimraf": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.1.3.tgz", + "integrity": "sha512-LKg+Cr2ZF61fkcaK1UdkH2yEBBKnYjTyWzTJT6KNPcSPaiT7HSdhtMXQuN5wkTX0Xu72KQ1l8S42rlmexS2hSA==", "dev": true, - "license": "MIT", + "license": "BlueOak-1.0.0", "dependencies": { - "@types/ms": "*" + "glob": "^13.0.3", + "package-json-from-dist": "^1.0.1" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@types/deep-eql": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", - "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "node_modules/@tapjs/run/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "dev": true, - "license": "MIT" - }, - "node_modules/@types/eslint": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", - "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", - "license": "MIT", - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "node_modules/@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "license": "MIT", - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" + "node_modules/@tapjs/run/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": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "license": "MIT" - }, - "node_modules/@types/express": { - "version": "4.17.25", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.25.tgz", - "integrity": "sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==", + "node_modules/@tapjs/snapshot": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@tapjs/snapshot/-/snapshot-4.3.4.tgz", + "integrity": "sha512-2sJXaGLJUMakkdJd5iDWRucgyHX7f5eP05m4weqWq9dLzX7p1JFOrWXUwns8RCIY7VX9Vx+4jENlxJOywYjyqg==", "dev": true, - "license": "MIT", + "license": "BlueOak-1.0.0", "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "^1" + "is-actual-promise": "^1.0.1", + "tcompare": "9.3.0", + "trivial-deferred": "^2.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "peerDependencies": { + "@tapjs/core": "4.5.2" } }, - "node_modules/@types/express-serve-static-core": { - "version": "4.19.7", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.7.tgz", - "integrity": "sha512-FvPtiIf1LfhzsaIXhv/PHan/2FeQBbtBDtfX2QfvPxdUelMDEckK08SM6nqo1MIZY3RUlfA+HV8+hFUSio78qg==", + "node_modules/@tapjs/spawn": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@tapjs/spawn/-/spawn-4.3.4.tgz", + "integrity": "sha512-qQY2SSLkXknpL1kndLS1bCPo9vYKV8Ka93UPIllvDEwaY3oUMghh++EOE4dyUxQPgMFpmoUoj8kSbm2hotevbQ==", "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + }, + "peerDependencies": { + "@tapjs/core": "4.5.2" } }, - "node_modules/@types/graceful-fs": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", - "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "node_modules/@tapjs/stack": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tapjs/stack/-/stack-4.3.0.tgz", + "integrity": "sha512-SFASe4YaVBzMr/FXTm/QsSzbzXZOmgDNpmY3EU0JNiDCN4izHMUnoXY+Kh0EY35hx9C4JDvRjgv2MSIM7bBygg==", "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@types/hast": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", - "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "node_modules/@tapjs/stdin": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@tapjs/stdin/-/stdin-4.3.4.tgz", + "integrity": "sha512-0kFeaPEGwNWx8R0z9Uq93/CNhAg+9NbTPZW+GXsjuHQSG125g7VZBNBAg2IMeQmVQ9bUWa3+f5TNp/JnLVvJmg==", "dev": true, - "dependencies": { - "@types/unist": "*" + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + }, + "peerDependencies": { + "@tapjs/core": "4.5.2" } }, - "node_modules/@types/hoist-non-react-statics": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.7.tgz", - "integrity": "sha512-PQTyIulDkIDro8P+IHbKCsw7U2xxBYflVzW/FgWdCAePD9xGSidgA76/GeJ6lBKoblyhf9pBY763gbrN+1dI8g==", - "license": "MIT", + "node_modules/@tapjs/test": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@tapjs/test/-/test-4.4.2.tgz", + "integrity": "sha512-YuUgTffPNGzodjeHOsaF/j0/5B/bAqtfgwqUkqa3mWdwqzlmB2AcIA6lBtLaQfbjG8wgGNwYfs3McgxkGRqxfA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/ts-node-temp-fork-for-pr-2009": "^10.9.7", + "@tapjs/after": "3.3.4", + "@tapjs/after-each": "4.3.4", + "@tapjs/asserts": "4.3.4", + "@tapjs/before": "4.3.4", + "@tapjs/before-each": "4.3.4", + "@tapjs/chdir": "3.3.4", + "@tapjs/filter": "4.3.4", + "@tapjs/fixture": "4.3.4", + "@tapjs/intercept": "4.3.4", + "@tapjs/mock": "4.4.2", + "@tapjs/node-serialize": "4.3.4", + "@tapjs/snapshot": "4.3.4", + "@tapjs/spawn": "4.3.4", + "@tapjs/stdin": "4.3.4", + "@tapjs/typescript": "3.5.4", + "@tapjs/worker": "4.3.4", + "glob": "^13.0.2", + "jackspeak": "^4.2.3", + "mkdirp": "^3.0.0", + "package-json-from-dist": "^1.0.0", + "resolve-import": "^2.4.0", + "rimraf": "^6.0.0", + "sync-content": "^2.0.4", + "tap-parser": "18.3.0", + "tshy": "^3.3.2", + "typescript": "5.9", + "walk-up-path": "^4.0.0" + }, + "bin": { + "generate-tap-test-class": "dist/esm/build.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "peerDependencies": { + "@tapjs/core": "4.5.2" + } + }, + "node_modules/@tapjs/test/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/@tapjs/test/node_modules/brace-expansion": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz", + "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@tapjs/test/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/@tapjs/test/node_modules/minimatch": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.2.tgz", + "integrity": "sha512-+G4CpNBxa5MprY+04MbgOw1v7So6n5JY166pFi9KfYwT78fxScCeSNQSNzp6dpPSW2rONOps6Ocam1wFhCgoVw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@tapjs/test/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/@tapjs/test/node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@tapjs/test/node_modules/rimraf": { + "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", + "package-json-from-dist": "^1.0.1" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@tapjs/typescript": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/@tapjs/typescript/-/typescript-3.5.4.tgz", + "integrity": "sha512-z8O10CpbPYoHA876Dlg40qXtM058akP76HNQy+EdNE+AhFo7kold4YBgyjYRU7WDWNlp2B/MPgsy/OZ4PRXQWw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/ts-node-temp-fork-for-pr-2009": "^10.9.7" + }, + "engines": { + "node": "20 || >=22" + }, + "peerDependencies": { + "@tapjs/core": "4.5.2" + } + }, + "node_modules/@tapjs/worker": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@tapjs/worker/-/worker-4.3.4.tgz", + "integrity": "sha512-AvmfwMgJXB/eOwIti/rOvw1l1eHsxUex3lyrhiC6uK5iOmbHWBOFsGHwEfc7Z4eertPM6FUqnZxkxkTEVGueig==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + }, + "peerDependencies": { + "@tapjs/core": "4.5.2" + } + }, + "node_modules/@tensorflow-models/face-detection": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tensorflow-models/face-detection/-/face-detection-1.0.3.tgz", + "integrity": "sha512-4Ld/vFF8MrdFdrMWhlLKZD4hMW0PNY9OkYeqoCPNZ+LwFyenxAqVaNaWrR8JKp37vw9Nuzp4ILbkal5zPUnA0g==", + "license": "Apache-2.0", + "dependencies": { + "rimraf": "^3.0.2", + "tslib": "2.4.0" + }, + "peerDependencies": { + "@mediapipe/face_detection": "~0.4.0", + "@tensorflow/tfjs-backend-webgl": "^4.21.0", + "@tensorflow/tfjs-converter": "^4.21.0", + "@tensorflow/tfjs-core": "^4.21.0" + } + }, + "node_modules/@tensorflow-models/face-detection/node_modules/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", + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@tensorflow-models/face-detection/node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "license": "0BSD" + }, + "node_modules/@tensorflow/tfjs": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@tensorflow/tfjs/-/tfjs-4.22.0.tgz", + "integrity": "sha512-0TrIrXs6/b7FLhLVNmfh8Sah6JgjBPH4mZ8JGb7NU6WW+cx00qK5BcAZxw7NCzxj6N8MRAIfHq+oNbPUNG5VAg==", + "license": "Apache-2.0", + "dependencies": { + "@tensorflow/tfjs-backend-cpu": "4.22.0", + "@tensorflow/tfjs-backend-webgl": "4.22.0", + "@tensorflow/tfjs-converter": "4.22.0", + "@tensorflow/tfjs-core": "4.22.0", + "@tensorflow/tfjs-data": "4.22.0", + "@tensorflow/tfjs-layers": "4.22.0", + "argparse": "^1.0.10", + "chalk": "^4.1.0", + "core-js": "3.29.1", + "regenerator-runtime": "^0.13.5", + "yargs": "^16.0.3" + }, + "bin": { + "tfjs-custom-module": "dist/tools/custom_module/cli.js" + } + }, + "node_modules/@tensorflow/tfjs-backend-cpu": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-backend-cpu/-/tfjs-backend-cpu-4.22.0.tgz", + "integrity": "sha512-1u0FmuLGuRAi8D2c3cocHTASGXOmHc/4OvoVDENJayjYkS119fcTcQf4iHrtLthWyDIPy3JiPhRrZQC9EwnhLw==", + "license": "Apache-2.0", + "dependencies": { + "@types/seedrandom": "^2.4.28", + "seedrandom": "^3.0.5" + }, + "engines": { + "yarn": ">= 1.3.2" + }, + "peerDependencies": { + "@tensorflow/tfjs-core": "4.22.0" + } + }, + "node_modules/@tensorflow/tfjs-backend-webgl": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-backend-webgl/-/tfjs-backend-webgl-4.22.0.tgz", + "integrity": "sha512-H535XtZWnWgNwSzv538czjVlbJebDl5QTMOth4RXr2p/kJ1qSIXE0vZvEtO+5EC9b00SvhplECny2yDewQb/Yg==", + "license": "Apache-2.0", + "dependencies": { + "@tensorflow/tfjs-backend-cpu": "4.22.0", + "@types/offscreencanvas": "~2019.3.0", + "@types/seedrandom": "^2.4.28", + "seedrandom": "^3.0.5" + }, + "engines": { + "yarn": ">= 1.3.2" + }, + "peerDependencies": { + "@tensorflow/tfjs-core": "4.22.0" + } + }, + "node_modules/@tensorflow/tfjs-converter": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-converter/-/tfjs-converter-4.22.0.tgz", + "integrity": "sha512-PT43MGlnzIo+YfbsjM79Lxk9lOq6uUwZuCc8rrp0hfpLjF6Jv8jS84u2jFb+WpUeuF4K33ZDNx8CjiYrGQ2trQ==", + "license": "Apache-2.0", + "peerDependencies": { + "@tensorflow/tfjs-core": "4.22.0" + } + }, + "node_modules/@tensorflow/tfjs-core": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-core/-/tfjs-core-4.22.0.tgz", + "integrity": "sha512-LEkOyzbknKFoWUwfkr59vSB68DMJ4cjwwHgicXN0DUi3a0Vh1Er3JQqCI1Hl86GGZQvY8ezVrtDIvqR1ZFW55A==", + "license": "Apache-2.0", + "dependencies": { + "@types/long": "^4.0.1", + "@types/offscreencanvas": "~2019.7.0", + "@types/seedrandom": "^2.4.28", + "@webgpu/types": "0.1.38", + "long": "4.0.0", + "node-fetch": "~2.6.1", + "seedrandom": "^3.0.5" + }, + "engines": { + "yarn": ">= 1.3.2" + } + }, + "node_modules/@tensorflow/tfjs-core/node_modules/@types/offscreencanvas": { + "version": "2019.7.3", + "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.7.3.tgz", + "integrity": "sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==", + "license": "MIT" + }, + "node_modules/@tensorflow/tfjs-data": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-data/-/tfjs-data-4.22.0.tgz", + "integrity": "sha512-dYmF3LihQIGvtgJrt382hSRH4S0QuAp2w1hXJI2+kOaEqo5HnUPG0k5KA6va+S1yUhx7UBToUKCBHeLHFQRV4w==", + "license": "Apache-2.0", + "dependencies": { + "@types/node-fetch": "^2.1.2", + "node-fetch": "~2.6.1", + "string_decoder": "^1.3.0" + }, + "peerDependencies": { + "@tensorflow/tfjs-core": "4.22.0", + "seedrandom": "^3.0.5" + } + }, + "node_modules/@tensorflow/tfjs-layers": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-layers/-/tfjs-layers-4.22.0.tgz", + "integrity": "sha512-lybPj4ZNj9iIAPUj7a8ZW1hg8KQGfqWLlCZDi9eM/oNKCCAgchiyzx8OrYoWmRrB+AM6VNEeIT+2gZKg5ReihA==", + "license": "Apache-2.0 AND MIT", + "peerDependencies": { + "@tensorflow/tfjs-core": "4.22.0" + } + }, + "node_modules/@tensorflow/tfjs/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@tensorflow/tfjs/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==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/@tensorflow/tfjs/node_modules/core-js": { + "version": "3.29.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.29.1.tgz", + "integrity": "sha512-+jwgnhg6cQxKYIIjGtAHq2nwUOolo9eoFZ4sHfUH09BLXBgxnH4gA0zEd+t+BO2cNB8idaBtZFcFTRjQJRJmAw==", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/@tensorflow/tfjs/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "license": "MIT", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@testing-library/dom": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz", + "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.3.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "picocolors": "1.1.1", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@testing-library/jest-dom": { + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.17.0.tgz", + "integrity": "sha512-ynmNeT7asXyH3aSVv4vvX4Rb+0qjOhdNHnO/3vuZNqPmhDpV/+rCSGwQ7bLcmU2cJ4dvoheIO85LQj0IbJHEtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@adobe/css-tools": "^4.0.1", + "@babel/runtime": "^7.9.2", + "@types/testing-library__jest-dom": "^5.9.1", + "aria-query": "^5.0.0", + "chalk": "^3.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.5.6", + "lodash": "^4.17.15", + "redent": "^3.0.0" + }, + "engines": { + "node": ">=8", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/@testing-library/jest-dom/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@testing-library/react": { + "version": "14.3.1", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-14.3.1.tgz", + "integrity": "sha512-H99XjUhWQw0lTgyMN05W3xQG1Nh4lq574D8keFf1dDoNTJgp66VbJozRaczoF+wsiaPJNt/TcnfpLGufGxSrZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5", + "@testing-library/dom": "^9.0.0", + "@types/react-dom": "^18.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@testing-library/react/node_modules/@testing-library/dom": { + "version": "9.3.4", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.4.tgz", + "integrity": "sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.1.3", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@testing-library/react/node_modules/aria-query": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", + "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "deep-equal": "^2.0.5" + } + }, + "node_modules/@testing-library/user-event": { + "version": "14.6.1", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.1.tgz", + "integrity": "sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==", + "license": "MIT", + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "peerDependencies": { + "@testing-library/dom": ">=7.21.4" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/@transifex/api": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/@transifex/api/-/api-7.1.5.tgz", + "integrity": "sha512-YJPJBD6sZ1ax1MGzv2Nta3W5lES2If8qSExlyshHSx85S8Hs3MglWHKjJcaUmbXsdGzscJ1qQYJaXAZq12zWvg==", + "license": "Apache-2.0", + "dependencies": { + "core-js": "^3.35.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@transifex/api/node_modules/core-js": { + "version": "3.46.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.46.0.tgz", + "integrity": "sha512-vDMm9B0xnqqZ8uSBpZ8sNtRtOdmfShrvT6h2TuQGLs0Is+cR0DYbj/KWP6ALVNbWPpqA/qPLoOuppJN07humpA==", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/@trivago/prettier-plugin-sort-imports": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/@trivago/prettier-plugin-sort-imports/-/prettier-plugin-sort-imports-5.2.2.tgz", + "integrity": "sha512-fYDQA9e6yTNmA13TLVSA+WMQRc5Bn/c0EUBditUHNfMMxN7M82c38b1kEggVE3pLpZ0FwkwJkUEKMiOi52JXFA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@babel/generator": "^7.26.5", + "@babel/parser": "^7.26.7", + "@babel/traverse": "^7.26.7", + "@babel/types": "^7.26.7", + "javascript-natural-sort": "^0.7.1", + "lodash": "^4.17.21" + }, + "engines": { + "node": ">18.12" + }, + "peerDependencies": { + "@vue/compiler-sfc": "3.x", + "prettier": "2.x - 3.x", + "prettier-plugin-svelte": "3.x", + "svelte": "4.x || 5.x" + }, + "peerDependenciesMeta": { + "@vue/compiler-sfc": { + "optional": true + }, + "prettier-plugin-svelte": { + "optional": true + }, + "svelte": { + "optional": true + } + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node18": { + "version": "18.2.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node18/-/node18-18.2.4.tgz", + "integrity": "sha512-5xxU8vVs9/FNcvm3gE07fPbn9tl6tqGGWA9tSlwsUEkBxtRnTsNmwrV8gasZ9F/EobaSv9+nu8AxUKccw77JpQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node20": { + "version": "20.1.6", + "resolved": "https://registry.npmjs.org/@tsconfig/node20/-/node20-20.1.6.tgz", + "integrity": "sha512-sz+Hqx9zwZDpZIV871WSbUzSqNIsXzghZydypnfgzPKLltVJfkINfUeTct31n/tTSa9ZE1ZOfKdRre1uHHquYQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tufjs/canonical-json": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz", + "integrity": "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@tufjs/models": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-4.0.0.tgz", + "integrity": "sha512-h5x5ga/hh82COe+GoD4+gKUeV4T3iaYOxqLt41GRKApinPI7DMidhCmNVTjKfhCWFJIGXaFJee07XczdT4jdZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tufjs/canonical-json": "2.0.0", + "minimatch": "^9.0.5" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@tufjs/models/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@tufjs/models/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/aria-query": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + "license": "MIT" + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/body-parser": { + "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": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "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/chai": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" + } + }, + "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": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "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": "*", + "@types/node": "*" + } + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/eslint": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", + "license": "MIT", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "license": "MIT", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "license": "MIT" + }, + "node_modules/@types/express": { + "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": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "^1" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.19.7", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.7.tgz", + "integrity": "sha512-FvPtiIf1LfhzsaIXhv/PHan/2FeQBbtBDtfX2QfvPxdUelMDEckK08SM6nqo1MIZY3RUlfA+HV8+hFUSio78qg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dev": true, + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/hoist-non-react-statics": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.7.tgz", + "integrity": "sha512-PQTyIulDkIDro8P+IHbKCsw7U2xxBYflVzW/FgWdCAePD9xGSidgA76/GeJ6lBKoblyhf9pBY763gbrN+1dI8g==", + "license": "MIT", "dependencies": { "hoist-non-react-statics": "^3.3.0" }, @@ -32298,2624 +33253,1998 @@ "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", - "license": "MIT", - "dependencies": { - "pinkie": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pirates": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", - "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-conf": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz", - "integrity": "sha512-C+VUP+8jis7EsQZIhDYmS5qlNtjv2yP4SNtjXK9AP1ZcTRlnSfuumaTnRfYZnYgUUYVIKqL0fRvmUGDV2fmp6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^2.0.0", - "load-json-file": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf/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": "MIT", - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf/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", - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf/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/pkg-conf/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/pkg-conf/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/pkg-conf/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/pkg-dir": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", - "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^6.3.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^6.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/pkg-dir/node_modules/yocto-queue": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.1.tgz", - "integrity": "sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-types": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.0.tgz", - "integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==", - "dev": true, - "license": "MIT", - "dependencies": { - "confbox": "^0.2.2", - "exsolve": "^1.0.7", - "pathe": "^2.0.3" - } - }, - "node_modules/pkijs": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/pkijs/-/pkijs-3.3.3.tgz", - "integrity": "sha512-+KD8hJtqQMYoTuL1bbGOqxb4z+nZkTAwVdNtWwe8Tc2xNbEmdJYIYoc6Qt0uF55e6YW6KuTHw1DjQ18gMhzepw==", - "dev": true, - "license": "BSD-3-Clause", - "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" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/playwright-chromium": { - "version": "1.58.2", - "resolved": "https://registry.npmjs.org/playwright-chromium/-/playwright-chromium-1.58.2.tgz", - "integrity": "sha512-SCoQ3hjBs7FfO46CoOtgAUg77BuYwCni1bzQgm47IUyLBTipnGkLxLnaUNRKXvPYO4hAyt8++Z6wVShVnhrzmw==", - "dev": true, - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "playwright-core": "1.58.2" - }, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/playwright-core": { - "version": "1.58.2", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.58.2.tgz", - "integrity": "sha512-yZkEtftgwS8CsfYo7nm0KE8jsvm6i/PTgVtB8DL726wNf6H2IMsDuxCpJj59KDaxCtSnrWan2AeDqM7JBaultg==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "playwright-core": "cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/pn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", - "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", - "dev": true, - "license": "MIT" - }, - "node_modules/pngjs": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", - "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/polite-json": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/polite-json/-/polite-json-5.0.0.tgz", - "integrity": "sha512-OLS/0XeUAcE8a2fdwemNja+udKgXNnY6yKVIXqAD2zVRx1KvY6Ato/rZ2vdzbxqYwPW0u6SCNC/bAMPNzpzxbw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/possible-typed-array-names": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", - "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-import": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-12.0.1.tgz", - "integrity": "sha512-3Gti33dmCjyKBgimqGxL3vcV8w9+bsHwO5UrBawp796+jdardbcFl4RP5w/76BwNL7aGzpKstIfF9I+kdE8pTw==", - "license": "MIT", - "dependencies": { - "postcss": "^7.0.1", - "postcss-value-parser": "^3.2.3", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-import/node_modules/picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "license": "ISC" - }, - "node_modules/postcss-import/node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "license": "MIT", - "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/postcss-import/node_modules/postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "license": "MIT" - }, - "node_modules/postcss-loader": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-4.3.0.tgz", - "integrity": "sha512-M/dSoIiNDOo8Rk0mUqoj4kpGq91gcxCfb9PoyZVdZ76/AuhxylHDYZblNE8o+EQ9AMSASeMFEKxZf5aU6wlx1Q==", - "license": "MIT", - "dependencies": { - "cosmiconfig": "^7.0.0", - "klona": "^2.0.4", - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0", - "semver": "^7.3.4" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "postcss": "^7.0.0 || ^8.0.1", - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/postcss-loader/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "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" - } + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" }, - "node_modules/postcss-loader/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==", + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "license": "MIT", - "peerDependencies": { - "ajv": "^6.9.1" + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/postcss-loader/node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "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" - }, "engines": { - "node": ">=10" + "node": ">=6" } }, - "node_modules/postcss-loader/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/postcss-loader/node_modules/loader-utils": { + "node_modules/pinkie": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", "license": "MIT", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, "engines": { - "node": ">=8.9.0" + "node": ">=0.10.0" } }, - "node_modules/postcss-loader/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/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" + "pinkie": "^2.0.0" }, "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "node": ">=0.10.0" } }, - "node_modules/postcss-loader/node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "license": "ISC", + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true, + "license": "MIT", "engines": { "node": ">= 6" } }, - "node_modules/postcss-modules-extract-imports": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", - "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", - "license": "ISC", - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-local-by-default": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", - "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", + "node_modules/pkg-conf": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz", + "integrity": "sha512-C+VUP+8jis7EsQZIhDYmS5qlNtjv2yP4SNtjXK9AP1ZcTRlnSfuumaTnRfYZnYgUUYVIKqL0fRvmUGDV2fmp6g==", + "dev": true, "license": "MIT", "dependencies": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^7.0.0", - "postcss-value-parser": "^4.1.0" + "find-up": "^2.0.0", + "load-json-file": "^4.0.0" }, "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" + "node": ">=4" } }, - "node_modules/postcss-modules-scope": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", - "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", - "license": "ISC", + "node_modules/pkg-conf/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": "MIT", "dependencies": { - "postcss-selector-parser": "^7.0.0" + "locate-path": "^2.0.0" }, "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" + "node": ">=4" } }, - "node_modules/postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "license": "ISC", + "node_modules/pkg-conf/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", "dependencies": { - "icss-utils": "^5.0.0" + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" }, "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" + "node": ">=4" } }, - "node_modules/postcss-selector-parser": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", - "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "node_modules/pkg-conf/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": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" + "p-try": "^1.0.0" }, "engines": { "node": ">=4" } }, - "node_modules/postcss-simple-vars": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-simple-vars/-/postcss-simple-vars-5.0.2.tgz", - "integrity": "sha512-xWIufxBoINJv6JiLb7jl5oElgp+6puJwvT5zZHliUSydoLz4DADRB3NDDsYgfKVwojn4TDLiseoC65MuS8oGGg==", - "license": "MIT", - "dependencies": { - "postcss": "^7.0.14" - } - }, - "node_modules/postcss-simple-vars/node_modules/picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "license": "ISC" - }, - "node_modules/postcss-simple-vars/node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "node_modules/pkg-conf/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": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" + "p-limit": "^1.1.0" }, "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" + "node": ">=4" } }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "license": "MIT" - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "node_modules/pkg-conf/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": ">= 0.8.0" + "node": ">=4" } }, - "node_modules/prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==", + "node_modules/pkg-conf/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": ">=0.10.0" + "node": ">=4" } }, - "node_modules/prettier": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz", - "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", + "node_modules/pkg-dir": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", "dev": true, "license": "MIT", - "bin": { - "prettier": "bin/prettier.cjs" + "dependencies": { + "find-up": "^6.3.0" }, "engines": { - "node": ">=14" + "node": ">=14.16" }, "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pretty-error": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", - "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "node_modules/pkg-dir/node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", "dev": true, "license": "MIT", "dependencies": { - "lodash": "^4.17.20", - "renderkid": "^3.0.0" - } - }, - "node_modules/pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "license": "MIT", - "engines": { - "node": ">=10" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pretty-ms": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.3.0.tgz", - "integrity": "sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==", + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", "dev": true, "license": "MIT", "dependencies": { - "parse-ms": "^4.0.0" + "p-locate": "^6.0.0" }, "engines": { - "node": ">=18" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/prismjs": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", - "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", "dev": true, "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/prismjs-terminal": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/prismjs-terminal/-/prismjs-terminal-1.2.3.tgz", - "integrity": "sha512-xc0zuJ5FMqvW+DpiRkvxURlz98DdfDsZcFHdO699+oL+ykbFfgI7O4VDEgUyc07BSL2NHl3zdb8m/tZ/aaqUrw==", - "dev": true, - "license": "BlueOak-1.0.0", "dependencies": { - "chalk": "^5.2.0", - "prismjs": "^1.29.0", - "string-length": "^6.0.0" + "yocto-queue": "^1.0.0" }, "engines": { - "node": ">=16" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/prismjs-terminal/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", "dev": true, "license": "MIT", + "dependencies": { + "p-limit": "^4.0.0" + }, "engines": { - "node": ">=12" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/prismjs-terminal/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==", + "node_modules/pkg-dir/node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", "dev": true, "license": "MIT", "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, - "node_modules/prismjs-terminal/node_modules/string-length": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-6.0.0.tgz", - "integrity": "sha512-1U361pxZHEQ+FeSjzqRpV+cu2vTzYeWeafXFLykiFlv4Vc0n3njgU8HrMbyik5uwm77naWMuVG8fhEF+Ovb1Kg==", + "node_modules/pkg-dir/node_modules/yocto-queue": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.1.tgz", + "integrity": "sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==", "dev": true, "license": "MIT", - "dependencies": { - "strip-ansi": "^7.1.0" - }, "engines": { - "node": ">=16" + "node": ">=12.20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/prismjs-terminal/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "node_modules/pkg-types": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.0.tgz", + "integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "confbox": "^0.2.2", + "exsolve": "^1.0.7", + "pathe": "^2.0.3" + } + }, + "node_modules/pkijs": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/pkijs/-/pkijs-3.3.3.tgz", + "integrity": "sha512-+KD8hJtqQMYoTuL1bbGOqxb4z+nZkTAwVdNtWwe8Tc2xNbEmdJYIYoc6Qt0uF55e6YW6KuTHw1DjQ18gMhzepw==", + "dev": true, + "license": "BSD-3-Clause", + "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" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "node": ">=16.0.0" } }, - "node_modules/proc-log": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz", - "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==", + "node_modules/playwright-chromium": { + "version": "1.58.2", + "resolved": "https://registry.npmjs.org/playwright-chromium/-/playwright-chromium-1.58.2.tgz", + "integrity": "sha512-SCoQ3hjBs7FfO46CoOtgAUg77BuYwCni1bzQgm47IUyLBTipnGkLxLnaUNRKXvPYO4hAyt8++Z6wVShVnhrzmw==", "dev": true, - "license": "ISC", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.58.2" + }, + "bin": { + "playwright": "cli.js" + }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": ">=18" } }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "license": "MIT", + "node_modules/playwright-core": { + "version": "1.58.2", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.58.2.tgz", + "integrity": "sha512-yZkEtftgwS8CsfYo7nm0KE8jsvm6i/PTgVtB8DL726wNf6H2IMsDuxCpJj59KDaxCtSnrWan2AeDqM7JBaultg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, "engines": { - "node": ">= 0.6.0" + "node": ">=18" } }, - "node_modules/process-nextick-args": { - "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==", + "node_modules/pn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", + "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", + "dev": true, "license": "MIT" }, - "node_modules/process-on-spawn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.1.0.tgz", - "integrity": "sha512-JOnOPQ/8TZgjs1JIH/m9ni7FfimjNa/PRx7y/Wb5qdItsnhO0jE4AT7fC0HjC28DUQWDr50dwSYZLdRMlqDq3Q==", + "node_modules/pngjs": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", + "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", "dev": true, "license": "MIT", - "dependencies": { - "fromentries": "^1.2.0" - }, "engines": { - "node": ">=8" + "node": ">=4.0.0" } }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "node_modules/polite-json": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/polite-json/-/polite-json-5.0.0.tgz", + "integrity": "sha512-OLS/0XeUAcE8a2fdwemNja+udKgXNnY6yKVIXqAD2zVRx1KvY6Ato/rZ2vdzbxqYwPW0u6SCNC/bAMPNzpzxbw==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.4.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", - "license": "ISC" - }, - "node_modules/promise-retry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", - "dev": true, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", "license": "MIT", - "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, "engines": { - "node": ">=10" + "node": ">= 0.4" } }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, "engines": { - "node": ">= 6" + "node": "^10 || ^12 || >=14" } }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "node_modules/postcss-import": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-12.0.1.tgz", + "integrity": "sha512-3Gti33dmCjyKBgimqGxL3vcV8w9+bsHwO5UrBawp796+jdardbcFl4RP5w/76BwNL7aGzpKstIfF9I+kdE8pTw==", "license": "MIT", "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" + "postcss": "^7.0.1", + "postcss-value-parser": "^3.2.3", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=6.0.0" } }, - "node_modules/prop-types/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "license": "MIT" - }, - "node_modules/proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", - "dev": true, + "node_modules/postcss-import/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", "license": "ISC" }, - "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==", - "dev": true, + "node_modules/postcss-import/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", "license": "MIT", "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" + "picocolors": "^0.2.1", + "source-map": "^0.6.1" }, "engines": { - "node": ">= 0.10" + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" } }, - "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" - } + "node_modules/postcss-import/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "license": "MIT" }, - "node_modules/psl": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", - "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", + "node_modules/postcss-loader": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-4.3.0.tgz", + "integrity": "sha512-M/dSoIiNDOo8Rk0mUqoj4kpGq91gcxCfb9PoyZVdZ76/AuhxylHDYZblNE8o+EQ9AMSASeMFEKxZf5aU6wlx1Q==", "license": "MIT", "dependencies": { - "punycode": "^2.3.1" + "cosmiconfig": "^7.0.0", + "klona": "^2.0.4", + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0", + "semver": "^7.3.4" + }, + "engines": { + "node": ">= 10.13.0" }, "funding": { - "url": "https://github.com/sponsors/lupomontero" + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^4.0.0 || ^5.0.0" } }, - "node_modules/pump": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", - "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", + "node_modules/postcss-loader/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "license": "MIT", "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "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/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "node_modules/postcss-loader/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", - "engines": { - "node": ">=6" + "peerDependencies": { + "ajv": "^6.9.1" } }, - "node_modules/punycode.js": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", - "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", - "dev": true, + "node_modules/postcss-loader/node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "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" + }, "engines": { - "node": ">=6" + "node": ">=10" } }, - "node_modules/pure-rand": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", - "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/dubzzz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - ], + "node_modules/postcss-loader/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/pvtsutils": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.6.tgz", - "integrity": "sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==", - "dev": true, + "node_modules/postcss-loader/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==", "license": "MIT", "dependencies": { - "tslib": "^2.8.1" + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" } }, - "node_modules/pvutils": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.1.5.tgz", - "integrity": "sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA==", - "dev": true, + "node_modules/postcss-loader/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": ">=16.0.0" + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "node_modules/qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "license": "BSD-3-Clause", + "node_modules/postcss-loader/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "license": "ISC", "engines": { - "node": ">=0.6" + "node": ">= 6" } }, - "node_modules/quansync": { - "version": "0.2.11", - "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz", - "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/antfu" - }, - { - "type": "individual", - "url": "https://github.com/sponsors/sxzz" - } - ], - "license": "MIT" + "node_modules/postcss-modules-extract-imports": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } }, - "node_modules/query-string": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", - "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", + "node_modules/postcss-modules-local-by-default": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", + "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", "license": "MIT", "dependencies": { - "decode-uri-component": "^0.2.0", - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.1.0" }, "engines": { - "node": ">=0.10.0" + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "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/quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", - "dev": true, - "license": "MIT", + "node_modules/postcss-modules-scope": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", + "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, "engines": { - "node": ">=8" + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "node_modules/quote-stream": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/quote-stream/-/quote-stream-1.0.2.tgz", - "integrity": "sha512-kKr2uQ2AokadPjvTyKJQad9xELbZwYzWlNfI3Uz2j/ib5u6H9lDP7fUUR//rMycd0gv4Z5P1qXMfXR8YpIxrjQ==", - "license": "MIT", + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "license": "ISC", "dependencies": { - "buffer-equal": "0.0.1", - "minimist": "^1.1.3", - "through2": "^2.0.0" + "icss-utils": "^5.0.0" }, - "bin": { - "quote-stream": "bin/cmd.js" + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "node_modules/quote-stream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT" - }, - "node_modules/quote-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==", + "node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "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" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" } }, - "node_modules/quote-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, - "node_modules/quote-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==", + "node_modules/postcss-simple-vars": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-simple-vars/-/postcss-simple-vars-5.0.2.tgz", + "integrity": "sha512-xWIufxBoINJv6JiLb7jl5oElgp+6puJwvT5zZHliUSydoLz4DADRB3NDDsYgfKVwojn4TDLiseoC65MuS8oGGg==", "license": "MIT", "dependencies": { - "safe-buffer": "~5.1.0" + "postcss": "^7.0.14" } }, - "node_modules/quote-stream/node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "license": "MIT", - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } + "node_modules/postcss-simple-vars/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "license": "ISC" }, - "node_modules/raf": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", - "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", - "dev": true, + "node_modules/postcss-simple-vars/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", "license": "MIT", "dependencies": { - "performance-now": "^2.1.0" + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" } }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "license": "MIT", - "dependencies": { - "safe-buffer": "^5.1.0" - } + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "license": "MIT" }, - "node_modules/range-parser": { + "node_modules/prelude-ls": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">= 0.8.0" } }, - "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "node_modules/prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==", "dev": true, "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, "engines": { - "node": ">= 0.8" + "node": ">=0.10.0" } }, - "node_modules/raw-body/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "node_modules/prettier": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz", + "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", "dev": true, "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "bin": { + "prettier": "bin/prettier.cjs" }, "engines": { - "node": ">=0.10.0" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "node_modules/raw-loader": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.2.tgz", - "integrity": "sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==", + "node_modules/pretty-error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "dev": true, "license": "MIT", "dependencies": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" + "lodash": "^4.17.20", + "renderkid": "^3.0.0" } }, - "node_modules/raw-loader/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", "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" + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/raw-loader/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==", + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "license": "MIT", - "peerDependencies": { - "ajv": "^6.9.1" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/raw-loader/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/raw-loader/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/pretty-ms": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.3.0.tgz", + "integrity": "sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==", + "dev": true, "license": "MIT", "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" + "parse-ms": "^4.0.0" }, "engines": { - "node": ">=8.9.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/raw-loader/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/prismjs": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", + "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", + "dev": true, "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/prismjs-terminal": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/prismjs-terminal/-/prismjs-terminal-1.2.3.tgz", + "integrity": "sha512-xc0zuJ5FMqvW+DpiRkvxURlz98DdfDsZcFHdO699+oL+ykbFfgI7O4VDEgUyc07BSL2NHl3zdb8m/tZ/aaqUrw==", + "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" + "chalk": "^5.2.0", + "prismjs": "^1.29.0", + "string-length": "^6.0.0" }, "engines": { - "node": ">= 10.13.0" + "node": ">=16" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "node_modules/prismjs-terminal/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, - "license": "(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" + "license": "MIT", + "engines": { + "node": ">=12" }, - "bin": { - "rc": "cli.js" + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "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==", + "node_modules/prismjs-terminal/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": ">=0.10.0" + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/react": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "node_modules/prismjs-terminal/node_modules/string-length": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-6.0.0.tgz", + "integrity": "sha512-1U361pxZHEQ+FeSjzqRpV+cu2vTzYeWeafXFLykiFlv4Vc0n3njgU8HrMbyik5uwm77naWMuVG8fhEF+Ovb1Kg==", + "dev": true, "license": "MIT", "dependencies": { - "loose-envify": "^1.1.0" + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "node_modules/prismjs-terminal/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" + "ansi-regex": "^6.0.1" }, - "peerDependencies": { - "react": "^18.3.1" + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/react-draggable": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/react-draggable/-/react-draggable-3.3.2.tgz", - "integrity": "sha512-oaz8a6enjbPtx5qb0oDWxtDNuybOylvto1QLydsXgKmwT7e3GXC2eMVDwEMIUYJIFqVG72XpOv673UuuAq6LhA==", + "node_modules/proc-log": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz", + "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", "license": "MIT", - "dependencies": { - "classnames": "^2.2.5", - "prop-types": "^15.6.0" + "engines": { + "node": ">= 0.6.0" } }, - "node_modules/react-element-to-jsx-string": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/react-element-to-jsx-string/-/react-element-to-jsx-string-15.0.0.tgz", - "integrity": "sha512-UDg4lXB6BzlobN60P8fHWVPX3Kyw8ORrTeBtClmIlGdkOOE+GYQSFvmEU5iLLpwp/6v42DINwNcwOhOLfQ//FQ==", + "node_modules/process-nextick-args": { + "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==", + "license": "MIT" + }, + "node_modules/process-on-spawn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.1.0.tgz", + "integrity": "sha512-JOnOPQ/8TZgjs1JIH/m9ni7FfimjNa/PRx7y/Wb5qdItsnhO0jE4AT7fC0HjC28DUQWDr50dwSYZLdRMlqDq3Q==", "dev": true, "license": "MIT", "dependencies": { - "@base2/pretty-print-object": "1.0.1", - "is-plain-object": "5.0.0", - "react-is": "18.1.0" + "fromentries": "^1.2.0" }, - "peerDependencies": { - "react": "^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0", - "react-dom": "^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0" + "engines": { + "node": ">=8" } }, - "node_modules/react-element-to-jsx-string/node_modules/react-is": { - "version": "18.1.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.1.0.tgz", - "integrity": "sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg==", + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true, - "license": "MIT" - }, - "node_modules/react-ga": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/react-ga/-/react-ga-3.3.1.tgz", - "integrity": "sha512-4Vc0W5EvXAXUN/wWyxvsAKDLLgtJ3oLmhYYssx+YzphJpejtOst6cbIHCIyF50Fdxuf5DDKqRYny24yJ2y7GFQ==", - "license": "Apache-2.0", - "peerDependencies": { - "prop-types": "^15.6.0", - "react": "^15.6.2 || ^16.0 || ^17 || ^18" + "license": "MIT", + "engines": { + "node": ">=0.4.0" } }, - "node_modules/react-intl": { - "version": "6.8.9", - "resolved": "https://registry.npmjs.org/react-intl/-/react-intl-6.8.9.tgz", - "integrity": "sha512-TUfj5E7lyUDvz/GtovC9OMh441kBr08rtIbgh3p0R8iF3hVY+V2W9Am7rb8BpJ/29BH1utJOqOOhmvEVh3GfZg==", - "license": "BSD-3-Clause", + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "license": "ISC" + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "license": "MIT", "dependencies": { - "@formatjs/ecma402-abstract": "2.2.4", - "@formatjs/icu-messageformat-parser": "2.9.4", - "@formatjs/intl": "2.10.15", - "@formatjs/intl-displaynames": "6.8.5", - "@formatjs/intl-listformat": "7.7.5", - "@types/hoist-non-react-statics": "3", - "@types/react": "16 || 17 || 18", - "hoist-non-react-statics": "3", - "intl-messageformat": "10.7.7", - "tslib": "2" - }, - "peerDependencies": { - "react": "^16.6.0 || 17 || 18", - "typescript": "^4.7 || 5" + "err-code": "^2.0.2", + "retry": "^0.12.0" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "engines": { + "node": ">=10" } }, - "node_modules/react-intl-redux": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/react-intl-redux/-/react-intl-redux-2.4.1.tgz", - "integrity": "sha512-EYTNmHJTnTam4phQj1nTdJvcdVjz+F56nLl6JtpqWsKzG5ZnQh/hoqLLJUjP0dgeNKSESIcjhYsTyBWDUwjo0A==", + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@babel/runtime": "^7.17.9", - "prop-types": "^15.8.1" + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" }, - "peerDependencies": { - "@babel/runtime": "^7.17.9", - "prop-types": "^15.8.1", - "react": "^16.12.0 || ^17.0.2 || ^18.0.0", - "react-intl": "^2.2.2 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0", - "react-redux": "^5.0.1 || ^6.0.0 || ^7.0.0 || ^8.0.0" + "engines": { + "node": ">= 6" } }, - "node_modules/react-intl/node_modules/@formatjs/ecma402-abstract": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-2.2.4.tgz", - "integrity": "sha512-lFyiQDVvSbQOpU+WFd//ILolGj4UgA/qXrKeZxdV14uKiAUiPAtX6XAn7WBCRi7Mx6I7EybM9E5yYn4BIpZWYg==", + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", "license": "MIT", "dependencies": { - "@formatjs/fast-memoize": "2.2.3", - "@formatjs/intl-localematcher": "0.5.8", - "tslib": "2" + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" } }, - "node_modules/react-intl/node_modules/@formatjs/fast-memoize": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-2.2.3.tgz", - "integrity": "sha512-3jeJ+HyOfu8osl3GNSL4vVHUuWFXR03Iz9jjgI7RwjG6ysu/Ymdr0JRCPHfF5yGbTE6JCrd63EpvX1/WybYRbA==", + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", + "dev": true, + "license": "ISC" + }, + "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==", + "dev": true, "license": "MIT", "dependencies": { - "tslib": "2" + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" } }, - "node_modules/react-intl/node_modules/@formatjs/icu-messageformat-parser": { - "version": "2.9.4", - "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.9.4.tgz", - "integrity": "sha512-Tbvp5a9IWuxUcpWNIW6GlMQYEc4rwNHR259uUFoKWNN1jM9obf9Ul0e+7r7MvFOBNcN+13K7NuKCKqQiAn1QEg==", + "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", - "dependencies": { - "@formatjs/ecma402-abstract": "2.2.4", - "@formatjs/icu-skeleton-parser": "1.8.8", - "tslib": "2" + "engines": { + "node": ">= 0.10" } }, - "node_modules/react-intl/node_modules/@formatjs/icu-skeleton-parser": { - "version": "1.8.8", - "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.8.tgz", - "integrity": "sha512-vHwK3piXwamFcx5YQdCdJxUQ1WdTl6ANclt5xba5zLGDv5Bsur7qz8AD7BevaKxITwpgDeU0u8My3AIibW9ywA==", + "node_modules/psl": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", + "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", "license": "MIT", "dependencies": { - "@formatjs/ecma402-abstract": "2.2.4", - "tslib": "2" + "punycode": "^2.3.1" + }, + "funding": { + "url": "https://github.com/sponsors/lupomontero" } }, - "node_modules/react-intl/node_modules/@formatjs/intl-localematcher": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.5.8.tgz", - "integrity": "sha512-I+WDNWWJFZie+jkfkiK5Mp4hEDyRSEvmyfYadflOno/mmKJKcB17fEpEH0oJu/OWhhCJ8kJBDz2YMd/6cDl7Mg==", + "node_modules/pump": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", + "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", "license": "MIT", "dependencies": { - "tslib": "2" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, - "node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "license": "MIT" - }, - "node_modules/react-lifecycles-compat": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", - "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==", - "license": "MIT" - }, - "node_modules/react-modal": { - "version": "3.16.3", - "resolved": "https://registry.npmjs.org/react-modal/-/react-modal-3.16.3.tgz", - "integrity": "sha512-yCYRJB5YkeQDQlTt17WGAgFJ7jr2QYcWa1SHqZ3PluDmnKJ/7+tVU+E6uKyZ0nODaeEj+xCpK4LcSnKXLMC0Nw==", + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "license": "MIT", - "dependencies": { - "exenv": "^1.2.0", - "prop-types": "^15.7.2", - "react-lifecycles-compat": "^3.0.0", - "warning": "^4.0.3" - }, - "peerDependencies": { - "react": "^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18 || ^19", - "react-dom": "^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18 || ^19" + "engines": { + "node": ">=6" } }, - "node_modules/react-popover": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/react-popover/-/react-popover-0.5.10.tgz", - "integrity": "sha512-5SYDTfncywSH00I70oHd4gFRUR8V0rJ4sRADSI/P6G0RVXp9jUgaWloJ0Bk+SFnjpLPuipTKuzQNNd2CTs5Hrw==", - "license": "MIT", - "dependencies": { - "css-vendor": "^0.3.1", - "debug": "^2.6.8", - "lodash.throttle": "^3.0.3", - "prop-types": "^15.5.10" + "node_modules/punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "dev": true, + "engines": { + "node": ">=6" } }, - "node_modules/react-popover/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, + "node_modules/pvtsutils": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.6.tgz", + "integrity": "sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==", + "dev": true, "license": "MIT", "dependencies": { - "ms": "2.0.0" + "tslib": "^2.8.1" } }, - "node_modules/react-popover/node_modules/lodash.debounce": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-3.1.1.tgz", - "integrity": "sha512-lcmJwMpdPAtChA4hfiwxTtgFeNAaow701wWUgVUqeD0XJF7vMXIN+bu/2FJSGxT0NUbZy9g9VFrlOFfPjl+0Ew==", + "node_modules/pvutils": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.1.5.tgz", + "integrity": "sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA==", + "dev": true, "license": "MIT", - "dependencies": { - "lodash._getnative": "^3.0.0" + "engines": { + "node": ">=16.0.0" } }, - "node_modules/react-popover/node_modules/lodash.throttle": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-3.0.4.tgz", - "integrity": "sha512-dRU/xiF4W8a521NYnQosG5drDqv4+hp3ND6yWNJUMnwO1E87Q/A7oc9M/g6pk29K9U3j/ZWhM3BAQZyr/P6TTQ==", - "license": "MIT", - "dependencies": { - "lodash.debounce": "^3.0.0" + "node_modules/qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.6" } }, - "node_modules/react-popover/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "node_modules/quansync": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz", + "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], "license": "MIT" }, - "node_modules/react-reconciler": { - "version": "0.29.2", - "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.29.2.tgz", - "integrity": "sha512-zZQqIiYgDCTP/f1N/mAR10nJGrPD2ZR+jDSEsKWJHYC7Cm2wodlwbR3upZRdC3cjIjSlTLNVyO7Iu0Yy7t2AYg==", - "dev": true, + "node_modules/query-string": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", + "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", "license": "MIT", "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" + "decode-uri-component": "^0.2.0", + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" }, "engines": { "node": ">=0.10.0" - }, - "peerDependencies": { - "react": "^18.3.1" } }, - "node_modules/react-redux": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-8.1.3.tgz", - "integrity": "sha512-n0ZrutD7DaX/j9VscF+uTALI3oUPa/pO4Z3soOBIjuRn/FzVu6aehhysxZCLi6y7duMf52WNZGMl7CtuK5EnRw==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.1", - "@types/hoist-non-react-statics": "^3.3.1", - "@types/use-sync-external-store": "^0.0.3", - "hoist-non-react-statics": "^3.3.2", - "react-is": "^18.0.0", - "use-sync-external-store": "^1.0.0" - }, - "peerDependencies": { - "@types/react": "^16.8 || ^17.0 || ^18.0", - "@types/react-dom": "^16.8 || ^17.0 || ^18.0", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0", - "react-native": ">=0.59", - "redux": "^4 || ^5.0.0-beta.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - }, - "react-dom": { - "optional": true + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" }, - "react-native": { - "optional": true + { + "type": "patreon", + "url": "https://www.patreon.com/feross" }, - "redux": { - "optional": true + { + "type": "consulting", + "url": "https://feross.org/support" } - } - }, - "node_modules/react-redux/node_modules/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==", + ], "license": "MIT" }, - "node_modules/react-remove-scroll": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.1.tgz", - "integrity": "sha512-HpMh8+oahmIdOuS5aFKKY6Pyog+FNaZV/XyJOq7b4YFwsFHe5yYfdbIalI4k3vU2nSDql7YskmUseHsRrJqIPA==", + "node_modules/quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true, "license": "MIT", - "dependencies": { - "react-remove-scroll-bar": "^2.3.7", - "react-style-singleton": "^2.2.3", - "tslib": "^2.1.0", - "use-callback-ref": "^1.3.3", - "use-sidecar": "^1.1.3" - }, "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "node": ">=8" } }, - "node_modules/react-remove-scroll-bar": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", - "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", + "node_modules/quote-stream": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/quote-stream/-/quote-stream-1.0.2.tgz", + "integrity": "sha512-kKr2uQ2AokadPjvTyKJQad9xELbZwYzWlNfI3Uz2j/ib5u6H9lDP7fUUR//rMycd0gv4Z5P1qXMfXR8YpIxrjQ==", "license": "MIT", "dependencies": { - "react-style-singleton": "^2.2.2", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + "buffer-equal": "0.0.1", + "minimist": "^1.1.3", + "through2": "^2.0.0" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "bin": { + "quote-stream": "bin/cmd.js" } }, - "node_modules/react-responsive": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/react-responsive/-/react-responsive-9.0.2.tgz", - "integrity": "sha512-+4CCab7z8G8glgJoRjAwocsgsv6VA2w7JPxFWHRc7kvz8mec1/K5LutNC2MG28Mn8mu6+bu04XZxHv5gyfT7xQ==", + "node_modules/quote-stream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/quote-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==", "license": "MIT", "dependencies": { - "hyphenate-style-name": "^1.0.0", - "matchmediaquery": "^0.3.0", - "prop-types": "^15.6.1", - "shallow-equal": "^1.2.1" - }, - "engines": { - "node": ">=0.10" - }, - "peerDependencies": { - "react": ">=16.8.0" + "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/react-shallow-renderer": { - "version": "16.15.0", - "resolved": "https://registry.npmjs.org/react-shallow-renderer/-/react-shallow-renderer-16.15.0.tgz", - "integrity": "sha512-oScf2FqQ9LFVQgA73vr86xl2NaOIX73rh+YFqcOp68CWj56tSfgtGKrEbyhCj0rSijyG9M1CYprTh39fBi5hzA==", - "dev": true, + "node_modules/quote-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/quote-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==", "license": "MIT", "dependencies": { - "object-assign": "^4.1.1", - "react-is": "^16.12.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependencies": { - "react": "^16.0.0 || ^17.0.0 || ^18.0.0" + "safe-buffer": "~5.1.0" } }, - "node_modules/react-style-proptype": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/react-style-proptype/-/react-style-proptype-3.2.2.tgz", - "integrity": "sha512-ywYLSjNkxKHiZOqNlso9PZByNEY+FTyh3C+7uuziK0xFXu9xzdyfHwg4S9iyiRRoPCR4k2LqaBBsWVmSBwCWYQ==", + "node_modules/quote-stream/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "license": "MIT", "dependencies": { - "prop-types": "^15.5.4" + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" } }, - "node_modules/react-style-singleton": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", - "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", + "node_modules/raf": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", + "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", + "dev": true, "license": "MIT", "dependencies": { - "get-nonce": "^1.0.0", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "performance-now": "^2.1.0" } }, - "node_modules/react-tabs": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/react-tabs/-/react-tabs-5.2.0.tgz", - "integrity": "sha512-F/mf56bKOySTESKNEJVcc/KrJioA+nXIc2r8AiBU9ty08AI5ZmX3Qs67D29nq6OV04SqvB7kRumTzUspfoZ4+w==", + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "license": "MIT", "dependencies": { - "clsx": "^1.1.0", - "prop-types": "^15.5.0" - }, - "peerDependencies": { - "react": "^18.0.0" + "safe-buffer": "^5.1.0" } }, - "node_modules/react-test-renderer": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-18.3.1.tgz", - "integrity": "sha512-KkAgygexHUkQqtvvx/otwxtuFu5cVjfzTCtjXLH9boS19/Nbtg84zS7wIQn39G8IlrhThBpQsMKkq5ZHZIYFXA==", + "node_modules/range-parser": { + "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", - "dependencies": { - "react-is": "^18.3.1", - "react-shallow-renderer": "^16.15.0", - "scheduler": "^0.23.2" - }, - "peerDependencies": { - "react": "^18.3.1" + "engines": { + "node": ">= 0.6" } }, - "node_modules/react-test-renderer/node_modules/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==", + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "dev": true, - "license": "MIT" - }, - "node_modules/react-tooltip": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/react-tooltip/-/react-tooltip-4.5.1.tgz", - "integrity": "sha512-Zo+CSFUGXar1uV+bgXFFDe7VeS2iByeIp5rTgTcc2HqtuOS5D76QapejNNfx320MCY91TlhTQat36KGFTqgcvw==", "license": "MIT", "dependencies": { - "prop-types": "^15.8.1", - "uuid": "^7.0.3" + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" }, "engines": { - "npm": ">=6.13" - }, - "peerDependencies": { - "react": ">=16.0.0", - "react-dom": ">=16.0.0" - } - }, - "node_modules/react-tooltip/node_modules/uuid": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz", - "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==", - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" + "node": ">= 0.8" } }, - "node_modules/react-virtualized": { - "version": "9.22.6", - "resolved": "https://registry.npmjs.org/react-virtualized/-/react-virtualized-9.22.6.tgz", - "integrity": "sha512-U5j7KuUQt3AaMatlMJ0UJddqSiX+Km0YJxSqbAzIiGw5EmNz0khMyqP2hzgu4+QUtm+QPIrxzUX4raJxmVJnHg==", + "node_modules/raw-body/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/runtime": "^7.7.2", - "clsx": "^1.0.4", - "dom-helpers": "^5.1.3", - "loose-envify": "^1.4.0", - "prop-types": "^15.7.2", - "react-lifecycles-compat": "^3.0.4" + "safer-buffer": ">= 2.1.2 < 3" }, - "peerDependencies": { - "react": "^16.3.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^16.3.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/react-visibility-sensor": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/react-visibility-sensor/-/react-visibility-sensor-5.1.1.tgz", - "integrity": "sha512-cTUHqIK+zDYpeK19rzW6zF9YfT4486TIgizZW53wEZ+/GPBbK7cNS0EHyJVyHYacwFEvvHLEKfgJndbemWhB/w==", + "node_modules/raw-loader": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.2.tgz", + "integrity": "sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==", "license": "MIT", "dependencies": { - "prop-types": "^15.7.2" + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "react": ">=16.0.0", - "react-dom": ">=16.0.0" + "webpack": "^4.0.0 || ^5.0.0" } }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "node_modules/raw-loader/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "license": "MIT", "dependencies": { - "pify": "^2.3.0" + "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/read-cache/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "node_modules/raw-loader/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", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/read-package-json": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.1.2.tgz", - "integrity": "sha512-D1KmuLQr6ZSJS0tW8hf3WGpRlwszJOXZ3E8Yd/DNRaM5d+1wVRZdHlpGBLAuovjr28LbWvjpWkBHMxpRGGjzNA==", - "deprecated": "This package is no longer supported. Please use @npmcli/package-json instead.", - "license": "ISC", - "dependencies": { - "glob": "^7.1.1", - "json-parse-even-better-errors": "^2.3.0", - "normalize-package-data": "^2.0.0", - "npm-normalize-package-bin": "^1.0.0" + "peerDependencies": { + "ajv": "^6.9.1" } }, - "node_modules/read-package-json/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==", - "license": "ISC" + "node_modules/raw-loader/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/read-package-json/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==", - "license": "BSD-2-Clause", + "node_modules/raw-loader/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==", + "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" - } - }, - "node_modules/read-package-json/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "license": "ISC", - "bin": { - "semver": "bin/semver" + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" } }, - "node_modules/read-package-up": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/read-package-up/-/read-package-up-11.0.0.tgz", - "integrity": "sha512-MbgfoNPANMdb4oRBNg5eqLbB2t2r+o5Ua1pNt8BqGp4I0FJZhuVSOj3PaBPni4azWuSzEdNn2evevzVmEk1ohQ==", - "dev": true, + "node_modules/raw-loader/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": { - "find-up-simple": "^1.0.0", - "read-pkg": "^9.0.0", - "type-fest": "^4.6.0" + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" }, "engines": { - "node": ">=18" + "node": ">= 10.13.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "node_modules/read-package-up/node_modules/hosted-git-info": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", - "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", + "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": "ISC", + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", "dependencies": { - "lru-cache": "^10.0.1" + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" }, - "engines": { - "node": "^16.14.0 || >=18.0.0" + "bin": { + "rc": "cli.js" } }, - "node_modules/read-package-up/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-up/node_modules/normalize-package-data": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz", - "integrity": "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==", + "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": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^7.0.0", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, + "license": "MIT", "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": ">=0.10.0" } }, - "node_modules/read-package-up/node_modules/parse-json": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.3.0.tgz", - "integrity": "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==", - "dev": true, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.26.2", - "index-to-position": "^1.1.0", - "type-fest": "^4.39.1" + "loose-envify": "^1.1.0" }, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "node_modules/read-package-up/node_modules/read-pkg": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-9.0.1.tgz", - "integrity": "sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==", - "dev": true, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "license": "MIT", + "peer": true, "dependencies": { - "@types/normalize-package-data": "^2.4.3", - "normalize-package-data": "^6.0.0", - "parse-json": "^8.0.0", - "type-fest": "^4.6.0", - "unicorn-magic": "^0.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-package-up/node_modules/type-fest": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", - "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=16" + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "react": "^18.3.1" } }, - "node_modules/read-package-up/node_modules/unicorn-magic": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", - "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", - "dev": true, + "node_modules/react-draggable": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/react-draggable/-/react-draggable-3.3.2.tgz", + "integrity": "sha512-oaz8a6enjbPtx5qb0oDWxtDNuybOylvto1QLydsXgKmwT7e3GXC2eMVDwEMIUYJIFqVG72XpOv673UuuAq6LhA==", "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "dependencies": { + "classnames": "^2.2.5", + "prop-types": "^15.6.0" } }, - "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/react-element-to-jsx-string": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/react-element-to-jsx-string/-/react-element-to-jsx-string-15.0.0.tgz", + "integrity": "sha512-UDg4lXB6BzlobN60P8fHWVPX3Kyw8ORrTeBtClmIlGdkOOE+GYQSFvmEU5iLLpwp/6v42DINwNcwOhOLfQ//FQ==", "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" + "@base2/pretty-print-object": "1.0.1", + "is-plain-object": "5.0.0", + "react-is": "18.1.0" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "react": "^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0", + "react-dom": "^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0" } }, - "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_modules/react-element-to-jsx-string/node_modules/react-is": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.1.0.tgz", + "integrity": "sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg==", "dev": true, - "license": "MIT", + "license": "MIT" + }, + "node_modules/react-ga": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/react-ga/-/react-ga-3.3.1.tgz", + "integrity": "sha512-4Vc0W5EvXAXUN/wWyxvsAKDLLgtJ3oLmhYYssx+YzphJpejtOst6cbIHCIyF50Fdxuf5DDKqRYny24yJ2y7GFQ==", + "license": "Apache-2.0", + "peerDependencies": { + "prop-types": "^15.6.0", + "react": "^15.6.2 || ^16.0 || ^17 || ^18" + } + }, + "node_modules/react-intl": { + "version": "6.8.9", + "resolved": "https://registry.npmjs.org/react-intl/-/react-intl-6.8.9.tgz", + "integrity": "sha512-TUfj5E7lyUDvz/GtovC9OMh441kBr08rtIbgh3p0R8iF3hVY+V2W9Am7rb8BpJ/29BH1utJOqOOhmvEVh3GfZg==", + "license": "BSD-3-Clause", "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" + "@formatjs/ecma402-abstract": "2.2.4", + "@formatjs/icu-messageformat-parser": "2.9.4", + "@formatjs/intl": "2.10.15", + "@formatjs/intl-displaynames": "6.8.5", + "@formatjs/intl-listformat": "7.7.5", + "@types/hoist-non-react-statics": "3", + "@types/react": "16 || 17 || 18", + "hoist-non-react-statics": "3", + "intl-messageformat": "10.7.7", + "tslib": "2" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "react": "^16.6.0 || 17 || 18", + "typescript": "^4.7 || 5" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/read-pkg-up/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, + "node_modules/react-intl-redux": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/react-intl-redux/-/react-intl-redux-2.4.1.tgz", + "integrity": "sha512-EYTNmHJTnTam4phQj1nTdJvcdVjz+F56nLl6JtpqWsKzG5ZnQh/hoqLLJUjP0dgeNKSESIcjhYsTyBWDUwjo0A==", "license": "MIT", + "peer": true, "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "@babel/runtime": "^7.17.9", + "prop-types": "^15.8.1" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "@babel/runtime": "^7.17.9", + "prop-types": "^15.8.1", + "react": "^16.12.0 || ^17.0.2 || ^18.0.0", + "react-intl": "^2.2.2 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0", + "react-redux": "^5.0.1 || ^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/read-pkg-up/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, + "node_modules/react-intl/node_modules/@formatjs/ecma402-abstract": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-2.2.4.tgz", + "integrity": "sha512-lFyiQDVvSbQOpU+WFd//ILolGj4UgA/qXrKeZxdV14uKiAUiPAtX6XAn7WBCRi7Mx6I7EybM9E5yYn4BIpZWYg==", "license": "MIT", "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" + "@formatjs/fast-memoize": "2.2.3", + "@formatjs/intl-localematcher": "0.5.8", + "tslib": "2" } }, - "node_modules/read-pkg-up/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, + "node_modules/react-intl/node_modules/@formatjs/fast-memoize": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-2.2.3.tgz", + "integrity": "sha512-3jeJ+HyOfu8osl3GNSL4vVHUuWFXR03Iz9jjgI7RwjG6ysu/Ymdr0JRCPHfF5yGbTE6JCrd63EpvX1/WybYRbA==", "license": "MIT", "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "tslib": "2" } }, - "node_modules/read-pkg-up/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, + "node_modules/react-intl/node_modules/@formatjs/icu-messageformat-parser": { + "version": "2.9.4", + "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.9.4.tgz", + "integrity": "sha512-Tbvp5a9IWuxUcpWNIW6GlMQYEc4rwNHR259uUFoKWNN1jM9obf9Ul0e+7r7MvFOBNcN+13K7NuKCKqQiAn1QEg==", "license": "MIT", "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" + "@formatjs/ecma402-abstract": "2.2.4", + "@formatjs/icu-skeleton-parser": "1.8.8", + "tslib": "2" } }, - "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/react-intl/node_modules/@formatjs/icu-skeleton-parser": { + "version": "1.8.8", + "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.8.tgz", + "integrity": "sha512-vHwK3piXwamFcx5YQdCdJxUQ1WdTl6ANclt5xba5zLGDv5Bsur7qz8AD7BevaKxITwpgDeU0u8My3AIibW9ywA==", + "license": "MIT", + "dependencies": { + "@formatjs/ecma402-abstract": "2.2.4", + "tslib": "2" } }, - "node_modules/read-pkg/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/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": "BSD-2-Clause", + "node_modules/react-intl/node_modules/@formatjs/intl-localematcher": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.5.8.tgz", + "integrity": "sha512-I+WDNWWJFZie+jkfkiK5Mp4hEDyRSEvmyfYadflOno/mmKJKcB17fEpEH0oJu/OWhhCJ8kJBDz2YMd/6cDl7Mg==", + "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" + "tslib": "2" } }, - "node_modules/read-pkg/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/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "license": "MIT" }, - "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 OR CC0-1.0)", - "engines": { - "node": ">=8" - } + "node_modules/react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==", + "license": "MIT" }, - "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/react-modal": { + "version": "3.16.3", + "resolved": "https://registry.npmjs.org/react-modal/-/react-modal-3.16.3.tgz", + "integrity": "sha512-yCYRJB5YkeQDQlTt17WGAgFJ7jr2QYcWa1SHqZ3PluDmnKJ/7+tVU+E6uKyZ0nODaeEj+xCpK4LcSnKXLMC0Nw==", "license": "MIT", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "exenv": "^1.2.0", + "prop-types": "^15.7.2", + "react-lifecycles-compat": "^3.0.0", + "warning": "^4.0.3" }, - "engines": { - "node": ">= 6" + "peerDependencies": { + "react": "^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18 || ^19", + "react-dom": "^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18 || ^19" } }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, + "node_modules/react-popover": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/react-popover/-/react-popover-0.5.10.tgz", + "integrity": "sha512-5SYDTfncywSH00I70oHd4gFRUR8V0rJ4sRADSI/P6G0RVXp9jUgaWloJ0Bk+SFnjpLPuipTKuzQNNd2CTs5Hrw==", "license": "MIT", "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" + "css-vendor": "^0.3.1", + "debug": "^2.6.8", + "lodash.throttle": "^3.0.3", + "prop-types": "^15.5.10" } }, - "node_modules/rechoir": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", - "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", - "dev": true, + "node_modules/react-popover/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", "dependencies": { - "resolve": "^1.20.0" - }, - "engines": { - "node": ">= 10.13.0" + "ms": "2.0.0" } }, - "node_modules/redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, + "node_modules/react-popover/node_modules/lodash.debounce": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-3.1.1.tgz", + "integrity": "sha512-lcmJwMpdPAtChA4hfiwxTtgFeNAaow701wWUgVUqeD0XJF7vMXIN+bu/2FJSGxT0NUbZy9g9VFrlOFfPjl+0Ew==", "license": "MIT", "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - }, - "engines": { - "node": ">=8" + "lodash._getnative": "^3.0.0" } }, - "node_modules/redux": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", - "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", + "node_modules/react-popover/node_modules/lodash.throttle": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-3.0.4.tgz", + "integrity": "sha512-dRU/xiF4W8a521NYnQosG5drDqv4+hp3ND6yWNJUMnwO1E87Q/A7oc9M/g6pk29K9U3j/ZWhM3BAQZyr/P6TTQ==", "license": "MIT", - "peer": true, "dependencies": { - "@babel/runtime": "^7.9.2" + "lodash.debounce": "^3.0.0" } }, - "node_modules/redux-mock-store": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/redux-mock-store/-/redux-mock-store-1.5.5.tgz", - "integrity": "sha512-YxX+ofKUTQkZE4HbhYG4kKGr7oCTJfB0GLy7bSeqx86GLpGirrbUWstMnqXkqHNaQpcnbMGbof2dYs5KsPE6Zg==", + "node_modules/react-popover/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/react-reconciler": { + "version": "0.29.2", + "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.29.2.tgz", + "integrity": "sha512-zZQqIiYgDCTP/f1N/mAR10nJGrPD2ZR+jDSEsKWJHYC7Cm2wodlwbR3upZRdC3cjIjSlTLNVyO7Iu0Yy7t2AYg==", "dev": true, "license": "MIT", "dependencies": { - "lodash.isplainobject": "^4.0.6" + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "engines": { + "node": ">=0.10.0" }, "peerDependencies": { - "redux": "*" + "react": "^18.3.1" } }, - "node_modules/redux-throttle": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/redux-throttle/-/redux-throttle-0.1.1.tgz", - "integrity": "sha512-24stzg4+1xtlO8ubP4HKudpBdPsG4qvbn0Z9hv8tz6fM6ZcQJe2dKEwYIqTl8+yPMGgjNKHp1lzTwRqjWCxj/Q==", + "node_modules/react-redux": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-8.1.3.tgz", + "integrity": "sha512-n0ZrutD7DaX/j9VscF+uTALI3oUPa/pO4Z3soOBIjuRn/FzVu6aehhysxZCLi6y7duMf52WNZGMl7CtuK5EnRw==", "license": "MIT", "dependencies": { - "lodash.throttle": "4.0.1" + "@babel/runtime": "^7.12.1", + "@types/hoist-non-react-statics": "^3.3.1", + "@types/use-sync-external-store": "^0.0.3", + "hoist-non-react-statics": "^3.3.2", + "react-is": "^18.0.0", + "use-sync-external-store": "^1.0.0" + }, + "peerDependencies": { + "@types/react": "^16.8 || ^17.0 || ^18.0", + "@types/react-dom": "^16.8 || ^17.0 || ^18.0", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0", + "react-native": ">=0.59", + "redux": "^4 || ^5.0.0-beta.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + }, + "redux": { + "optional": true + } } }, - "node_modules/redux-throttle/node_modules/lodash.throttle": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.0.1.tgz", - "integrity": "sha512-vEeVrketgBFJ268V478NKyLk142uvnlFHuRHUUcu5NhsMQQpTs5EIGZduGNqdJOOhnb+Rwkz0XvfQuwOYzRo1Q==", + "node_modules/react-redux/node_modules/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==", + "license": "MIT" + }, + "node_modules/react-remove-scroll": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.1.tgz", + "integrity": "sha512-HpMh8+oahmIdOuS5aFKKY6Pyog+FNaZV/XyJOq7b4YFwsFHe5yYfdbIalI4k3vU2nSDql7YskmUseHsRrJqIPA==", "license": "MIT", "dependencies": { - "lodash.debounce": "^4.0.0" + "react-remove-scroll-bar": "^2.3.7", + "react-style-singleton": "^2.2.3", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.3", + "use-sidecar": "^1.1.3" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/reflect-metadata": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", - "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/reflect.getprototypeof": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", - "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", - "dev": true, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", + "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.9", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.7", - "get-proto": "^1.0.1", - "which-builtin-type": "^1.2.1" + "react-style-singleton": "^2.2.2", + "tslib": "^2.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=10" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true, - "license": "MIT" - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", - "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", - "dev": true, + "node_modules/react-responsive": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/react-responsive/-/react-responsive-9.0.2.tgz", + "integrity": "sha512-+4CCab7z8G8glgJoRjAwocsgsv6VA2w7JPxFWHRc7kvz8mec1/K5LutNC2MG28Mn8mu6+bu04XZxHv5gyfT7xQ==", "license": "MIT", "dependencies": { - "regenerate": "^1.4.2" + "hyphenate-style-name": "^1.0.0", + "matchmediaquery": "^0.3.0", + "prop-types": "^15.6.1", + "shallow-equal": "^1.2.1" }, "engines": { - "node": ">=4" + "node": ">=0.10" + }, + "peerDependencies": { + "react": ">=16.8.0" } }, - "node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "license": "MIT" - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", - "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "node_modules/react-shallow-renderer": { + "version": "16.15.0", + "resolved": "https://registry.npmjs.org/react-shallow-renderer/-/react-shallow-renderer-16.15.0.tgz", + "integrity": "sha512-oScf2FqQ9LFVQgA73vr86xl2NaOIX73rh+YFqcOp68CWj56tSfgtGKrEbyhCj0rSijyG9M1CYprTh39fBi5hzA==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "set-function-name": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" + "object-assign": "^4.1.1", + "react-is": "^16.12.0 || ^17.0.0 || ^18.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "react": "^16.0.0 || ^17.0.0 || ^18.0.0" } }, - "node_modules/regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", - "dev": true, + "node_modules/react-style-proptype": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/react-style-proptype/-/react-style-proptype-3.2.2.tgz", + "integrity": "sha512-ywYLSjNkxKHiZOqNlso9PZByNEY+FTyh3C+7uuziK0xFXu9xzdyfHwg4S9iyiRRoPCR4k2LqaBBsWVmSBwCWYQ==", "license": "MIT", - "engines": { - "node": ">=6.5.0" + "dependencies": { + "prop-types": "^15.5.4" } }, - "node_modules/regexpu-core": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz", - "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", - "dev": true, + "node_modules/react-style-singleton": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", + "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", "license": "MIT", "dependencies": { - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.2.2", - "regjsgen": "^0.8.0", - "regjsparser": "^0.13.0", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.2.1" + "get-nonce": "^1.0.0", + "tslib": "^2.0.0" }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/reghex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/reghex/-/reghex-3.0.2.tgz", - "integrity": "sha512-Zb9DJ5u6GhgqRSBnxV2QSnLqEwcKxHWFA1N2yUa4ZUAO1P8jlWKYtWZ6/ooV6yylspGXJX0O/uNzEv0xrCtwaA==", - "dev": true, - "license": "MIT" - }, - "node_modules/registry-auth-token": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.1.1.tgz", - "integrity": "sha512-P7B4+jq8DeD2nMsAcdfaqHbssgHtZ7Z5+++a5ask90fvmJ8p5je4mOa+wzu+DB4vQ5tdJV/xywY+UnVFeQLV5Q==", - "dev": true, + "node_modules/react-tabs": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/react-tabs/-/react-tabs-5.2.0.tgz", + "integrity": "sha512-F/mf56bKOySTESKNEJVcc/KrJioA+nXIc2r8AiBU9ty08AI5ZmX3Qs67D29nq6OV04SqvB7kRumTzUspfoZ4+w==", "license": "MIT", "dependencies": { - "@pnpm/npm-conf": "^3.0.2" + "clsx": "^1.1.0", + "prop-types": "^15.5.0" }, - "engines": { - "node": ">=14" + "peerDependencies": { + "react": "^18.0.0" } }, - "node_modules/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/regjsparser": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.0.tgz", - "integrity": "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==", + "node_modules/react-test-renderer": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-18.3.1.tgz", + "integrity": "sha512-KkAgygexHUkQqtvvx/otwxtuFu5cVjfzTCtjXLH9boS19/Nbtg84zS7wIQn39G8IlrhThBpQsMKkq5ZHZIYFXA==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "jsesc": "~3.1.0" + "react-is": "^18.3.1", + "react-shallow-renderer": "^16.15.0", + "scheduler": "^0.23.2" }, - "bin": { - "regjsparser": "bin/parser" + "peerDependencies": { + "react": "^18.3.1" } }, - "node_modules/relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "node_modules/react-test-renderer/node_modules/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-tooltip": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/react-tooltip/-/react-tooltip-4.5.1.tgz", + "integrity": "sha512-Zo+CSFUGXar1uV+bgXFFDe7VeS2iByeIp5rTgTcc2HqtuOS5D76QapejNNfx320MCY91TlhTQat36KGFTqgcvw==", "license": "MIT", + "dependencies": { + "prop-types": "^15.8.1", + "uuid": "^7.0.3" + }, "engines": { - "node": ">= 0.10" + "npm": ">=6.13" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" } }, - "node_modules/renderkid": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", - "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", - "dev": true, + "node_modules/react-tooltip/node_modules/uuid": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz", + "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==", "license": "MIT", - "dependencies": { - "css-select": "^4.1.3", - "dom-converter": "^0.2.0", - "htmlparser2": "^6.1.0", - "lodash": "^4.17.21", - "strip-ansi": "^6.0.1" + "bin": { + "uuid": "dist/bin/uuid" } }, - "node_modules/renderkid/node_modules/css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "dev": true, - "license": "BSD-2-Clause", + "node_modules/react-virtualized": { + "version": "9.22.6", + "resolved": "https://registry.npmjs.org/react-virtualized/-/react-virtualized-9.22.6.tgz", + "integrity": "sha512-U5j7KuUQt3AaMatlMJ0UJddqSiX+Km0YJxSqbAzIiGw5EmNz0khMyqP2hzgu4+QUtm+QPIrxzUX4raJxmVJnHg==", + "license": "MIT", "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" + "@babel/runtime": "^7.7.2", + "clsx": "^1.0.4", + "dom-helpers": "^5.1.3", + "loose-envify": "^1.4.0", + "prop-types": "^15.7.2", + "react-lifecycles-compat": "^3.0.4" }, - "funding": { - "url": "https://github.com/sponsors/fb55" + "peerDependencies": { + "react": "^16.3.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.3.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, - "node_modules/renderkid/node_modules/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "dev": true, + "node_modules/react-visibility-sensor": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/react-visibility-sensor/-/react-visibility-sensor-5.1.1.tgz", + "integrity": "sha512-cTUHqIK+zDYpeK19rzW6zF9YfT4486TIgizZW53wEZ+/GPBbK7cNS0EHyJVyHYacwFEvvHLEKfgJndbemWhB/w==", "license": "MIT", "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" + "prop-types": "^15.7.2" }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" } }, - "node_modules/renderkid/node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dev": true, - "license": "BSD-2-Clause", + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "license": "MIT", "dependencies": { - "domelementtype": "^2.2.0" - }, + "pify": "^2.3.0" + } + }, + "node_modules/read-cache/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "license": "MIT", "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" + "node": ">=0.10.0" } }, - "node_modules/renderkid/node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dev": true, - "license": "BSD-2-Clause", + "node_modules/read-package-json": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.1.2.tgz", + "integrity": "sha512-D1KmuLQr6ZSJS0tW8hf3WGpRlwszJOXZ3E8Yd/DNRaM5d+1wVRZdHlpGBLAuovjr28LbWvjpWkBHMxpRGGjzNA==", + "deprecated": "This package is no longer supported. Please use @npmcli/package-json instead.", + "license": "ISC", "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" + "glob": "^7.1.1", + "json-parse-even-better-errors": "^2.3.0", + "normalize-package-data": "^2.0.0", + "npm-normalize-package-bin": "^1.0.0" } }, - "node_modules/renderkid/node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true, + "node_modules/read-package-json/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==", + "license": "ISC" + }, + "node_modules/read-package-json/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==", "license": "BSD-2-Clause", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "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/renderkid/node_modules/htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "dev": true, - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "MIT", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" + "node_modules/read-package-json/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "license": "ISC", + "bin": { + "semver": "bin/semver" } }, - "node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "license": "Apache-2.0", + "node_modules/read-package-up": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/read-package-up/-/read-package-up-11.0.0.tgz", + "integrity": "sha512-MbgfoNPANMdb4oRBNg5eqLbB2t2r+o5Ua1pNt8BqGp4I0FJZhuVSOj3PaBPni4azWuSzEdNn2evevzVmEk1ohQ==", + "dev": true, + "license": "MIT", "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" + "find-up-simple": "^1.0.0", + "read-pkg": "^9.0.0", + "type-fest": "^4.6.0" }, "engines": { - "node": ">= 6" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/request-promise-core": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", - "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", + "node_modules/read-package-up/node_modules/hosted-git-info": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", + "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", "dev": true, "license": "ISC", "dependencies": { - "lodash": "^4.17.19" + "lru-cache": "^10.0.1" }, "engines": { - "node": ">=0.10.0" - }, - "peerDependencies": { - "request": "^2.34" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/request-promise-native": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", - "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", - "deprecated": "request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142", + "node_modules/read-package-up/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", + "license": "ISC" + }, + "node_modules/read-package-up/node_modules/normalize-package-data": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz", + "integrity": "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==", + "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "request-promise-core": "1.1.4", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" + "hosted-git-info": "^7.0.0", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" }, "engines": { - "node": ">=0.12.0" - }, - "peerDependencies": { - "request": "^2.34" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/request/node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "node_modules/read-package-up/node_modules/parse-json": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.3.0.tgz", + "integrity": "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==", + "dev": true, "license": "MIT", "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" + "@babel/code-frame": "^7.26.2", + "index-to-position": "^1.1.0", + "type-fest": "^4.39.1" }, "engines": { - "node": ">= 0.12" - } - }, - "node_modules/request/node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "license": "MIT", - "bin": { - "uuid": "bin/uuid" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "node_modules/read-package-up/node_modules/read-pkg": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-9.0.1.tgz", + "integrity": "sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==", + "dev": true, "license": "MIT", + "dependencies": { + "@types/normalize-package-data": "^2.4.3", + "normalize-package-data": "^6.0.0", + "parse-json": "^8.0.0", + "type-fest": "^4.6.0", + "unicorn-magic": "^0.1.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/require-from-string": { - "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==", - "license": "MIT", + "node_modules/read-package-up/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=0.10.0" + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/requires-port": { - "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": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/reserved-identifiers/-/reserved-identifiers-1.2.0.tgz", - "integrity": "sha512-yE7KUfFvaBFzGPs5H3Ops1RevfUEsDc5Iz65rOwWg4lE8HJSYtle77uul3+573457oHvBKuHYDl/xqUkKpEEdw==", + "node_modules/read-package-up/node_modules/unicorn-magic": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", + "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", "dev": true, "license": "MIT", "engines": { @@ -34925,349 +35254,310 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/resolve": { - "version": "1.22.11", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", - "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "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": { - "is-core-module": "^2.16.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" + "@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": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, - "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==", + "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": { - "resolve-from": "^5.0.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/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "node_modules/read-pkg-up/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": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, "engines": { "node": ">=8" } }, - "node_modules/resolve-global": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz", - "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", + "node_modules/read-pkg-up/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": { - "global-dirs": "^0.1.1" + "p-locate": "^4.1.0" }, "engines": { "node": ">=8" } }, - "node_modules/resolve-import": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/resolve-import/-/resolve-import-2.4.0.tgz", - "integrity": "sha512-gLWKdA5tiv5j/D7ipR47u3ovbVfzFPrctTdw2Ulnpmr6PPVVSvPKGNWu09jXVNlOSLLAeD6CA13bjIelpWttSw==", + "node_modules/read-pkg-up/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": "BlueOak-1.0.0", + "license": "MIT", "dependencies": { - "glob": "^13.0.0", - "walk-up-path": "^4.0.0" + "p-try": "^2.0.0" }, "engines": { - "node": "20 || >=22" + "node": ">=6" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/resolve-import/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==", + "node_modules/read-pkg-up/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": "BlueOak-1.0.0", + "license": "MIT", "dependencies": { - "minimatch": "^10.1.1", - "minipass": "^7.1.2", - "path-scurry": "^2.0.0" + "p-limit": "^2.2.0" }, "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=8" } }, - "node_modules/resolve-import/node_modules/minimatch": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", - "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", + "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": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/brace-expansion": "^5.0.0" - }, + "license": "(MIT OR CC0-1.0)", "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=8" } }, - "node_modules/resolve-import/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "node_modules/read-pkg/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": ">=16 || 14 >=14.17" + "license": "ISC" + }, + "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": "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/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "license": "MIT", - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + "node_modules/read-pkg/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/resolve.exports": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", - "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", + "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", + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", + "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": { - "lowercase-keys": "^1.0.0" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" } }, - "node_modules/restore-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", - "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, "license": "MIT", "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" + "picomatch": "^2.2.1" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8.10.0" } }, - "node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "node_modules/rechoir": { + "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" + }, "engines": { - "node": ">= 4" - } - }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" + "node": ">= 10.13.0" } }, - "node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "glob": "^7.1.3" + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" }, - "bin": { - "rimraf": "bin.js" + "engines": { + "node": ">=8" } }, - "node_modules/rolldown": { - "version": "1.0.0-beta.53", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-beta.53.tgz", - "integrity": "sha512-Qd9c2p0XKZdgT5AYd+KgAMggJ8ZmCs3JnS9PTMWkyUfteKlfmKtxJbWTHkVakxwXs1Ub7jrRYVeFeF7N0sQxyw==", - "dev": true, + "node_modules/redux": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", + "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", "license": "MIT", + "peer": true, "dependencies": { - "@oxc-project/types": "=0.101.0", - "@rolldown/pluginutils": "1.0.0-beta.53" - }, - "bin": { - "rolldown": "bin/cli.mjs" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "optionalDependencies": { - "@rolldown/binding-android-arm64": "1.0.0-beta.53", - "@rolldown/binding-darwin-arm64": "1.0.0-beta.53", - "@rolldown/binding-darwin-x64": "1.0.0-beta.53", - "@rolldown/binding-freebsd-x64": "1.0.0-beta.53", - "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-beta.53", - "@rolldown/binding-linux-arm64-gnu": "1.0.0-beta.53", - "@rolldown/binding-linux-arm64-musl": "1.0.0-beta.53", - "@rolldown/binding-linux-x64-gnu": "1.0.0-beta.53", - "@rolldown/binding-linux-x64-musl": "1.0.0-beta.53", - "@rolldown/binding-openharmony-arm64": "1.0.0-beta.53", - "@rolldown/binding-wasm32-wasi": "1.0.0-beta.53", - "@rolldown/binding-win32-arm64-msvc": "1.0.0-beta.53", - "@rolldown/binding-win32-x64-msvc": "1.0.0-beta.53" + "@babel/runtime": "^7.9.2" } }, - "node_modules/run-applescript": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", - "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", + "node_modules/redux-mock-store": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/redux-mock-store/-/redux-mock-store-1.5.5.tgz", + "integrity": "sha512-YxX+ofKUTQkZE4HbhYG4kKGr7oCTJfB0GLy7bSeqx86GLpGirrbUWstMnqXkqHNaQpcnbMGbof2dYs5KsPE6Zg==", "dev": true, "license": "MIT", - "engines": { - "node": ">=18" + "dependencies": { + "lodash.isplainobject": "^4.0.6" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "redux": "*" } }, - "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, + "node_modules/redux-throttle": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/redux-throttle/-/redux-throttle-0.1.1.tgz", + "integrity": "sha512-24stzg4+1xtlO8ubP4HKudpBdPsG4qvbn0Z9hv8tz6fM6ZcQJe2dKEwYIqTl8+yPMGgjNKHp1lzTwRqjWCxj/Q==", "license": "MIT", - "engines": { - "node": ">=0.12.0" + "dependencies": { + "lodash.throttle": "4.0.1" } }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "node_modules/redux-throttle/node_modules/lodash.throttle": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.0.1.tgz", + "integrity": "sha512-vEeVrketgBFJ268V478NKyLk142uvnlFHuRHUUcu5NhsMQQpTs5EIGZduGNqdJOOhnb+Rwkz0XvfQuwOYzRo1Q==", "license": "MIT", "dependencies": { - "queue-microtask": "^1.2.2" + "lodash.debounce": "^4.0.0" } }, - "node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "node_modules/reflect-metadata": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", + "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", "dev": true, - "license": "Apache-2.0", + "license": "Apache-2.0" + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dev": true, + "license": "MIT", "dependencies": { - "tslib": "^1.9.0" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" }, "engines": { - "npm": ">=2.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/rxjs/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", "dev": true, - "license": "0BSD" + "license": "MIT" }, - "node_modules/safe-array-concat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", - "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "node_modules/regenerate-unicode-properties": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", + "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "has-symbols": "^1.1.0", - "isarray": "^2.0.5" + "regenerate": "^1.4.2" }, "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=4" } }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", "license": "MIT" }, - "node_modules/safe-push-apply": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", - "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", "dev": true, "license": "MIT", "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", "es-errors": "^1.3.0", - "isarray": "^2.0.5" + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -35276,3602 +35566,3604 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/safe-regex-test": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", - "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "node_modules/regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.5.0" + } + }, + "node_modules/regexpu-core": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz", + "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-regex": "^1.2.1" + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.2", + "regjsgen": "^0.8.0", + "regjsparser": "^0.13.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.2.1" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=4" } }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "node_modules/reghex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/reghex/-/reghex-3.0.2.tgz", + "integrity": "sha512-Zb9DJ5u6GhgqRSBnxV2QSnLqEwcKxHWFA1N2yUa4ZUAO1P8jlWKYtWZ6/ooV6yylspGXJX0O/uNzEv0xrCtwaA==", + "dev": true, "license": "MIT" }, - "node_modules/sax": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.3.tgz", - "integrity": "sha512-yqYn1JhPczigF94DMS+shiDMjDowYO6y9+wB/4WgO0Y19jWYk0lQ4tuG5KI7kj4FTp1wxPj5IFfcrz/s1c3jjQ==", + "node_modules/registry-auth-token": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.1.1.tgz", + "integrity": "sha512-P7B4+jq8DeD2nMsAcdfaqHbssgHtZ7Z5+++a5ask90fvmJ8p5je4mOa+wzu+DB4vQ5tdJV/xywY+UnVFeQLV5Q==", "dev": true, - "license": "BlueOak-1.0.0" + "license": "MIT", + "dependencies": { + "@pnpm/npm-conf": "^3.0.2" + }, + "engines": { + "node": ">=14" + } }, - "node_modules/saxes": { - "version": "3.1.11", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.11.tgz", - "integrity": "sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==", + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", "dev": true, - "license": "ISC", + "license": "MIT" + }, + "node_modules/regjsparser": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.0.tgz", + "integrity": "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==", + "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "xmlchars": "^2.1.1" + "jsesc": "~3.1.0" }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 0.10" } }, - "node_modules/scheduler": { - "version": "0.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "node_modules/renderkid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "dev": true, "license": "MIT", "dependencies": { - "loose-envify": "^1.1.0" + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" } }, - "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==", - "license": "MIT", + "node_modules/renderkid/node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 10.13.0" + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "url": "https://github.com/sponsors/fb55" } }, - "node_modules/scratch-audio": { - "version": "2.0.268", - "resolved": "https://registry.npmjs.org/scratch-audio/-/scratch-audio-2.0.268.tgz", - "integrity": "sha512-arkmLfsA7IxSniSWfTQWImYE0yTZQIGUg4i+phFb5mk3D95XXHSd/9nVzIzD9lzfQntnm4Gd9VY7S8qYuGINxQ==", - "license": "AGPL-3.0-only", + "node_modules/renderkid/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "license": "MIT", "dependencies": { - "audio-context": "^1.0.1", - "minilog": "^3.0.1", - "startaudiocontext": "^1.2.1" + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" } }, - "node_modules/scratch-blocks": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/scratch-blocks/-/scratch-blocks-1.3.0.tgz", - "integrity": "sha512-RvTTClge6htuEml1nt77lh6VxLPkXK/GIeOPgeOzV6qyLquarsisIy+17F79CW/1E3rc8myE9JwC3iwKMcENgw==", - "license": "Apache-2.0", + "node_modules/renderkid/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "exports-loader": "^0.7.0", - "google-closure-library": "^20190301.0.0", - "imports-loader": "^0.8.0", - "scratch-l10n": "^3.18.3" + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" } }, - "node_modules/scratch-blocks/node_modules/@transifex/api": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@transifex/api/-/api-4.3.0.tgz", - "integrity": "sha512-RCpqAqxZlrHDo7rfam8tLSoT02wvF8LQeNRC0VZG5IGrH+wv+G6fB8PWLLHrvUuaqO6XCwkMmYlJ/X9U9TLTHw==", - "license": "Apache-2.0", + "node_modules/renderkid/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "core-js": "^3.22.4" + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" }, - "engines": { - "node": ">=14.0.0" + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" } }, - "node_modules/scratch-blocks/node_modules/core-js": { - "version": "3.47.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.47.0.tgz", - "integrity": "sha512-c3Q2VVkGAUyupsjRnaNX6u8Dq2vAdzm9iuPj5FW0fRxzlxgq9Q39MDq10IvmQSpLgHQNyQzQmOo6bgGHmH3NNg==", - "hasInstallScript": true, - "license": "MIT", + "node_modules/renderkid/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": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "license": "Apache-2.0", + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" } }, - "node_modules/scratch-blocks/node_modules/exports-loader": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/exports-loader/-/exports-loader-0.7.0.tgz", - "integrity": "sha512-RKwCrO4A6IiKm0pG3c9V46JxIHcDplwwGJn6+JJ1RcVnh/WSGJa0xkmk5cRVtgOPzCAtTMGj2F7nluh9L0vpSA==", - "license": "MIT", + "node_modules/request-promise-core": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", + "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", + "dev": true, + "license": "ISC", "dependencies": { - "loader-utils": "^1.1.0", - "source-map": "0.5.0" + "lodash": "^4.17.19" }, "engines": { - "node": ">= 4" + "node": ">=0.10.0" + }, + "peerDependencies": { + "request": "^2.34" } }, - "node_modules/scratch-blocks/node_modules/exports-loader/node_modules/source-map": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.0.tgz", - "integrity": "sha512-gjGnxNN0K+/Pr4Mi4fs/pOtda10dKB6Wn9QvjOrH6v5TWsI7ghHuJUHoIgyM6DkUL5kr2GtPFGererzKpMBWfA==", - "license": "BSD-3-Clause", + "node_modules/request-promise-native": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", + "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", + "deprecated": "request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142", + "dev": true, + "license": "ISC", + "dependencies": { + "request-promise-core": "1.1.4", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + }, "engines": { - "node": ">=0.10.0" + "node": ">=0.12.0" + }, + "peerDependencies": { + "request": "^2.34" } }, - "node_modules/scratch-blocks/node_modules/imports-loader": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/imports-loader/-/imports-loader-0.8.0.tgz", - "integrity": "sha512-kXWL7Scp8KQ4552ZcdVTeaQCZSLW+e6nJfp3cwUMB673T7Hr98Xjx5JK+ql7ADlJUvj1JS5O01RLbKoutN5QDQ==", + "node_modules/request/node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "license": "MIT", "dependencies": { - "loader-utils": "^1.0.2", - "source-map": "^0.6.1" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" }, "engines": { - "node": ">= 4" + "node": ">= 0.12" } }, - "node_modules/scratch-blocks/node_modules/scratch-l10n": { - "version": "3.18.357", - "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-3.18.357.tgz", - "integrity": "sha512-Rs3YmUa2dzpYqT1O/YT15g99sIwnC7j9TOOmOhUphVKLeiYUvJWiRPKZCugA7/hbIMYZV5VLkmuDgGXhgfSOBw==", - "license": "BSD-3-Clause", - "dependencies": { - "@transifex/api": "4.3.0", - "download": "8.0.0", - "transifex": "1.6.6" - }, + "node_modules/request/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "license": "MIT", "bin": { - "build-i18n-src": "scripts/build-i18n-src.js", - "tx-push-src": "scripts/tx-push-src.js" + "uuid": "bin/uuid" } }, - "node_modules/scratch-l10n": { - "version": "6.1.60", - "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-6.1.60.tgz", - "integrity": "sha512-oRNtvEc9XD0I4fBVi1Rl5OdTW6cciZ7Yvd8h/I9GmMiwTXzFeXt5rlynWTtAHBzb/qzVCzPOr39oeoOlYVkQpw==", - "license": "AGPL-3.0-only", - "dependencies": { - "@transifex/api": "7.1.5", - "async": "3.2.6", - "format-message-parse": "6.2.4", - "glob": "7.2.3", - "lodash.defaultsdeep": "4.6.1", - "mkdirp": "3.0.1", - "transifex": "1.6.6", - "tsx": "4.21.0" - }, - "bin": { - "build-i18n-src": "scripts/build-i18n-src.mts", - "tx-push-src": "scripts/tx-push-src.mts" + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/scratch-l10n/node_modules/async": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "node_modules/require-from-string": { + "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==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "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/scratch-l10n/node_modules/mkdirp": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", - "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "node_modules/reserved-identifiers": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/reserved-identifiers/-/reserved-identifiers-1.2.0.tgz", + "integrity": "sha512-yE7KUfFvaBFzGPs5H3Ops1RevfUEsDc5Iz65rOwWg4lE8HJSYtle77uul3+573457oHvBKuHYDl/xqUkKpEEdw==", + "dev": true, "license": "MIT", - "bin": { - "mkdirp": "dist/cjs/src/bin.js" - }, "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/scratch-paint": { - "version": "4.1.50", - "resolved": "https://registry.npmjs.org/scratch-paint/-/scratch-paint-4.1.50.tgz", - "integrity": "sha512-K9kYFxGWYI2VF8+ACrUih6iEu8C3T++JHo8YhDqw84VfoN/h3W/Z+fGk8/kyrCUuutOr3u6VZY/w4CbjDBGCAw==", - "license": "AGPL-3.0-only", + "node_modules/resolve": { + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "license": "MIT", "dependencies": { - "@scratch/paper": "^0.11.20221201200345", - "classnames": "^2.2.5", - "keymirror": "^0.1.1", - "lodash.bindall": "^4.4.0", - "lodash.omit": "^4.5.0", - "minilog": "^3.1.0", - "parse-color": "^1.0.0", - "prop-types": "^15.5.10" + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" }, - "peerDependencies": { - "react": "^18", - "react-dom": "^18", - "react-intl": "^6", - "react-intl-redux": "^0.7 || ^2.0.0", - "react-popover": "^0.5", - "react-redux": "^8", - "react-responsive": "^9", - "react-style-proptype": "^3", - "react-tooltip": "^4", - "redux": "^4", - "scratch-render-fonts": "^1.0.0" - } - }, - "node_modules/scratch-parser": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/scratch-parser/-/scratch-parser-6.0.0.tgz", - "integrity": "sha512-LXcKxJIupqBtXSe2+SXkQxwdMWg4JCdZfoSdPYj1ZtV/UhejyUYju6ptYUrr98RsLFT5UyCmmUaev8gA1SNvhQ==", - "license": "AGPL-3.0-only", - "dependencies": { - "ajv": "^6.3.0", - "jszip": "^3.1.5", - "pify": "^4.0.1" + "bin": { + "resolve": "bin/resolve" }, "engines": { - "node": ">=8.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/scratch-parser/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "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": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "resolve-from": "^5.0.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "engines": { + "node": ">=8" } }, - "node_modules/scratch-parser/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/scratch-render-fonts": { - "version": "1.0.252", - "resolved": "https://registry.npmjs.org/scratch-render-fonts/-/scratch-render-fonts-1.0.252.tgz", - "integrity": "sha512-leYCgtHMIqy36KqjraAiwaPYc9Bjy2L8J+vZ/CEnUE2PVP3z0dDoA4akz42/hk44kpVDzD574Th3SANt+PlLVA==", - "dependencies": { - "base64-loader": "^1.0.0" + "node_modules/resolve-from": { + "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" } }, - "node_modules/scratch-sb1-converter": { - "version": "2.0.279", - "resolved": "https://registry.npmjs.org/scratch-sb1-converter/-/scratch-sb1-converter-2.0.279.tgz", - "integrity": "sha512-C0yN1Ete4GukNBVvnRkJNW2fjV0l+N2qaTDM6Xmoo5nCvtw0GoWdKs7AB7OtKSVA1a7GDSvssArwqoP/Lp8Bww==", - "license": "AGPL-3.0-only", + "node_modules/resolve-global": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz", + "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", + "dev": true, + "license": "MIT", "dependencies": { - "js-md5": "^0.7.3", - "minilog": "^3.1.0", - "text-encoding": "^0.7.0" + "global-dirs": "^0.1.1" + }, + "engines": { + "node": ">=8" } }, - "node_modules/scratch-semantic-release-config": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/scratch-semantic-release-config/-/scratch-semantic-release-config-4.0.1.tgz", - "integrity": "sha512-GnYr/0ThoFdE4w4vYV2J9NQlAXqC7kxfQUqzmtoeJeAP6H1wTDFZ6cB318Xzbkprl+efUMyFM/mMb8NoDvR6PQ==", + "node_modules/resolve-import": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/resolve-import/-/resolve-import-2.4.0.tgz", + "integrity": "sha512-gLWKdA5tiv5j/D7ipR47u3ovbVfzFPrctTdw2Ulnpmr6PPVVSvPKGNWu09jXVNlOSLLAeD6CA13bjIelpWttSw==", "dev": true, - "license": "BSD-3-Clause", + "license": "BlueOak-1.0.0", "dependencies": { - "@semantic-release/commit-analyzer": "^13.0.0", - "@semantic-release/git": "^10.0.1", - "@semantic-release/github": "^12.0.0", - "@semantic-release/npm": "^13.0.0", - "@semantic-release/release-notes-generator": "^14.0.0" + "glob": "^13.0.0", + "walk-up-path": "^4.0.0" }, - "peerDependencies": { - "semantic-release": ">=19.0.2" + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/scratch-storage": { - "version": "6.1.8", - "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-6.1.8.tgz", - "integrity": "sha512-uDkSNIY7yLalsynLmcGRs6TfF9C9UlCw+OYP0Tr++gjuSJTjOMm/Ve6y5kpxtjYWOAxgzOQgu+QcNz07vELXHg==", - "license": "AGPL-3.0-only", + "node_modules/resolve-import/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": { - "@babel/runtime": "^7.21.0", - "@scratch/task-herder": "12.6.2", - "arraybuffer-loader": "^1.0.3", - "base64-js": "^1.3.0", - "buffer": "6.0.3", - "fastestsmallesttextencoderdecoder": "^1.0.7", - "js-md5": "^0.7.3", - "minilog": "^3.1.0" + "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/scratch-translate-extension-languages": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/scratch-translate-extension-languages/-/scratch-translate-extension-languages-1.0.7.tgz", - "integrity": "sha512-6+bQU9iVYv23T8J0SjpV6MTugm0y8myh/4DPgu1BGfccysdkaWzu3MkNGQyQRUlbqAiW9wM7ctfv3USPEkzTgg==", - "license": "BSD-3-Clause" - }, - "node_modules/scratch-webpack-configuration": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/scratch-webpack-configuration/-/scratch-webpack-configuration-3.1.1.tgz", - "integrity": "sha512-rMaxuC7+507rbMaFcpZQ5BJPevq+/EKwGzT458G2mo90ZIHXOnzkjDmANvNFnfjjWcuQzp595rm/UrUg9CvBVg==", + "node_modules/resolve-import/node_modules/minimatch": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", + "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", "dev": true, - "license": "BSD-3-Clause", + "license": "BlueOak-1.0.0", "dependencies": { - "lodash.merge": "^4.6.2", - "webpack-node-externals": "^3.0.0" + "@isaacs/brace-expansion": "^5.0.0" }, - "peerDependencies": { - "@babel/preset-env": "^7.24.0", - "arraybuffer-loader": "^1.0.8", - "autoprefixer": "^9.0.1", - "babel-loader": "^9.1.3", - "css-loader": "5.2.7", - "postcss-import": "^12.0.0", - "postcss-loader": "4.3.0", - "postcss-simple-vars": "^5.0.1", - "style-loader": "4.0.0", - "ts-loader": "^9.5.1", - "url-loader": "4.1.1", - "webpack": "^5.90.3" + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/script-loader": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/script-loader/-/script-loader-0.7.2.tgz", - "integrity": "sha512-UMNLEvgOAQuzK8ji8qIscM3GIrRCWN6MmMXGD4SD5l6cSycgGsCo0tX5xRnfQcoghqct0tjHjcykgI1PyBE2aA==", + "node_modules/resolve-import/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": "MIT", - "dependencies": { - "raw-loader": "~0.5.1" + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" } }, - "node_modules/script-loader/node_modules/raw-loader": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-0.5.1.tgz", - "integrity": "sha512-sf7oGoLuaYAScB4VGr0tzetsYlS8EJH6qnTCfQ/WVEa89hALQ4RQfCKt5xCyPQKPDUbVUAIP1QsxAwfAjlDp7Q==", - "dev": true - }, - "node_modules/seedrandom": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz", - "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==", - "license": "MIT" - }, - "node_modules/seek-bzip": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.6.tgz", - "integrity": "sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==", + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", "license": "MIT", - "dependencies": { - "commander": "^2.8.1" - }, - "bin": { - "seek-bunzip": "bin/seek-bunzip", - "seek-table": "bin/seek-bzip-table" + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, - "node_modules/seek-bzip/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==", - "license": "MIT" - }, - "node_modules/select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "node_modules/resolve.exports": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", + "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=10" + } }, - "node_modules/selenium-webdriver": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-3.6.0.tgz", - "integrity": "sha512-WH7Aldse+2P5bbFBO4Gle/nuQOdVwpHMTL6raL3uuBj/vPG07k6uzt3aiahu352ONBr5xXh0hDlM3LhtXPOC4Q==", - "dev": true, - "license": "Apache-2.0", + "node_modules/responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", + "license": "MIT", "dependencies": { - "jszip": "^3.1.3", - "rimraf": "^2.5.4", - "tmp": "0.0.30", - "xml2js": "^0.4.17" - }, - "engines": { - "node": ">= 6.9.0" + "lowercase-keys": "^1.0.0" } }, - "node_modules/selfsigned": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-5.5.0.tgz", - "integrity": "sha512-ftnu3TW4+3eBfLRFnDEkzGxSF/10BJBkaLJuBHZX0kiPS7bRdlpZGu6YGt4KngMkdTwJE6MbjavFpqHvqVt+Ew==", + "node_modules/restore-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", "dev": true, "license": "MIT", "dependencies": { - "@peculiar/x509": "^1.14.2", - "pkijs": "^3.3.3" + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" }, "engines": { - "node": ">=18" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/semantic-release": { - "version": "25.0.3", - "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-25.0.3.tgz", - "integrity": "sha512-WRgl5GcypwramYX4HV+eQGzUbD7UUbljVmS+5G1uMwX/wLgYuJAxGeerXJDMO2xshng4+FXqCgyB5QfClV6WjA==", + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", "dev": true, "license": "MIT", - "dependencies": { - "@semantic-release/commit-analyzer": "^13.0.1", - "@semantic-release/error": "^4.0.0", - "@semantic-release/github": "^12.0.0", - "@semantic-release/npm": "^13.1.1", - "@semantic-release/release-notes-generator": "^14.1.0", - "aggregate-error": "^5.0.0", - "cosmiconfig": "^9.0.0", - "debug": "^4.0.0", - "env-ci": "^11.0.0", - "execa": "^9.0.0", - "figures": "^6.0.0", - "find-versions": "^6.0.0", - "get-stream": "^6.0.0", - "git-log-parser": "^1.2.0", - "hook-std": "^4.0.0", - "hosted-git-info": "^9.0.0", - "import-from-esm": "^2.0.0", - "lodash-es": "^4.17.21", - "marked": "^15.0.0", - "marked-terminal": "^7.3.0", - "micromatch": "^4.0.2", - "p-each-series": "^3.0.0", - "p-reduce": "^3.0.0", - "read-package-up": "^12.0.0", - "resolve-from": "^5.0.0", - "semver": "^7.3.2", - "signale": "^1.2.1", - "yargs": "^18.0.0" - }, - "bin": { - "semantic-release": "bin/semantic-release.js" - }, "engines": { - "node": "^22.14.0 || >= 24.10.0" + "node": ">= 4" } }, - "node_modules/semantic-release/node_modules/@semantic-release/error": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-4.0.0.tgz", - "integrity": "sha512-mgdxrHTLOjOddRVYIYDo0fR3/v61GNN1YGkfbrjuIKg/uMgCd+Qzo3UAXJ+woLQQpos4pl5Esuw5A7AoNlzjUQ==", - "dev": true, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", "license": "MIT", "engines": { - "node": ">=18" + "iojs": ">=1.0.0", + "node": ">=0.10.0" } }, - "node_modules/semantic-release/node_modules/aggregate-error": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-5.0.0.tgz", - "integrity": "sha512-gOsf2YwSlleG6IjRYG2A7k0HmBMEo6qVNk9Bp/EaLgAJT5ngH6PXbqa4ItvnEwCm/velL5jAnQgsHsWnjhGmvw==", + "node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/rolldown": { + "version": "1.0.0-beta.53", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-beta.53.tgz", + "integrity": "sha512-Qd9c2p0XKZdgT5AYd+KgAMggJ8ZmCs3JnS9PTMWkyUfteKlfmKtxJbWTHkVakxwXs1Ub7jrRYVeFeF7N0sQxyw==", "dev": true, "license": "MIT", "dependencies": { - "clean-stack": "^5.2.0", - "indent-string": "^5.0.0" + "@oxc-project/types": "=0.101.0", + "@rolldown/pluginutils": "1.0.0-beta.53" + }, + "bin": { + "rolldown": "bin/cli.mjs" }, "engines": { - "node": ">=18" + "node": "^20.19.0 || >=22.12.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.0.0-beta.53", + "@rolldown/binding-darwin-arm64": "1.0.0-beta.53", + "@rolldown/binding-darwin-x64": "1.0.0-beta.53", + "@rolldown/binding-freebsd-x64": "1.0.0-beta.53", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-beta.53", + "@rolldown/binding-linux-arm64-gnu": "1.0.0-beta.53", + "@rolldown/binding-linux-arm64-musl": "1.0.0-beta.53", + "@rolldown/binding-linux-x64-gnu": "1.0.0-beta.53", + "@rolldown/binding-linux-x64-musl": "1.0.0-beta.53", + "@rolldown/binding-openharmony-arm64": "1.0.0-beta.53", + "@rolldown/binding-wasm32-wasi": "1.0.0-beta.53", + "@rolldown/binding-win32-arm64-msvc": "1.0.0-beta.53", + "@rolldown/binding-win32-x64-msvc": "1.0.0-beta.53" } }, - "node_modules/semantic-release/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "node_modules/run-applescript": { + "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": ">=12" + "node": ">=18" }, "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/semantic-release/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==", + "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": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=0.12.0" } }, - "node_modules/semantic-release/node_modules/clean-stack": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-5.3.0.tgz", - "integrity": "sha512-9ngPTOhYGQqNVSfeJkYXHmF7AGWp4/nN5D/QqNQs3Dvxd1Kk/WpjHfNujKHYUQ/5CoGyOyFNoWSPk5afzP0QVg==", - "dev": true, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "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", "dependencies": { - "escape-string-regexp": "5.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "queue-microtask": "^1.2.2" } }, - "node_modules/semantic-release/node_modules/cliui": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", - "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", + "node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", "dev": true, - "license": "ISC", + "license": "Apache-2.0", "dependencies": { - "string-width": "^7.2.0", - "strip-ansi": "^7.1.0", - "wrap-ansi": "^9.0.0" + "tslib": "^1.9.0" }, "engines": { - "node": ">=20" + "npm": ">=2.0.0" } }, - "node_modules/semantic-release/node_modules/cosmiconfig": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", - "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "node_modules/rxjs/node_modules/tslib": { + "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/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", "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" + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" }, "engines": { - "node": ">=14" + "node": ">=0.4" }, "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/semantic-release/node_modules/emoji-regex": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", - "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", - "dev": true, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "license": "MIT" }, - "node_modules/semantic-release/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", "dev": true, "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, "engines": { - "node": ">=12" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/semantic-release/node_modules/execa": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-9.6.1.tgz", - "integrity": "sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==", + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", "dev": true, "license": "MIT", "dependencies": { - "@sindresorhus/merge-streams": "^4.0.0", - "cross-spawn": "^7.0.6", - "figures": "^6.1.0", - "get-stream": "^9.0.0", - "human-signals": "^8.0.1", - "is-plain-obj": "^4.1.0", - "is-stream": "^4.0.1", - "npm-run-path": "^6.0.0", - "pretty-ms": "^9.2.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^4.0.0", - "yoctocolors": "^2.1.1" + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" }, "engines": { - "node": "^18.19.0 || >=20.5.0" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/semantic-release/node_modules/execa/node_modules/get-stream": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", - "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/sax": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.3.tgz", + "integrity": "sha512-yqYn1JhPczigF94DMS+shiDMjDowYO6y9+wB/4WgO0Y19jWYk0lQ4tuG5KI7kj4FTp1wxPj5IFfcrz/s1c3jjQ==", "dev": true, - "license": "MIT", + "license": "BlueOak-1.0.0" + }, + "node_modules/saxes": { + "version": "3.1.11", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.11.tgz", + "integrity": "sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==", + "dev": true, + "license": "ISC", "dependencies": { - "@sec-ant/readable-stream": "^0.4.1", - "is-stream": "^4.0.1" + "xmlchars": "^2.1.1" }, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/semantic-release/node_modules/figures": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz", - "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==", - "dev": true, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", "license": "MIT", "dependencies": { - "is-unicode-supported": "^2.0.0" + "loose-envify": "^1.1.0" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" }, "engines": { - "node": ">=18" + "node": ">= 10.13.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "node_modules/semantic-release/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==", - "dev": true, - "license": "ISC", + "node_modules/scratch-audio": { + "version": "2.0.268", + "resolved": "https://registry.npmjs.org/scratch-audio/-/scratch-audio-2.0.268.tgz", + "integrity": "sha512-arkmLfsA7IxSniSWfTQWImYE0yTZQIGUg4i+phFb5mk3D95XXHSd/9nVzIzD9lzfQntnm4Gd9VY7S8qYuGINxQ==", + "license": "AGPL-3.0-only", "dependencies": { - "lru-cache": "^11.1.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" + "audio-context": "^1.0.1", + "minilog": "^3.0.1", + "startaudiocontext": "^1.2.1" } }, - "node_modules/semantic-release/node_modules/human-signals": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-8.0.1.tgz", - "integrity": "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==", - "dev": true, + "node_modules/scratch-blocks": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/scratch-blocks/-/scratch-blocks-1.3.0.tgz", + "integrity": "sha512-RvTTClge6htuEml1nt77lh6VxLPkXK/GIeOPgeOzV6qyLquarsisIy+17F79CW/1E3rc8myE9JwC3iwKMcENgw==", "license": "Apache-2.0", - "engines": { - "node": ">=18.18.0" + "dependencies": { + "exports-loader": "^0.7.0", + "google-closure-library": "^20190301.0.0", + "imports-loader": "^0.8.0", + "scratch-l10n": "^3.18.3" } }, - "node_modules/semantic-release/node_modules/indent-string": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", - "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" + "node_modules/scratch-blocks/node_modules/@transifex/api": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@transifex/api/-/api-4.3.0.tgz", + "integrity": "sha512-RCpqAqxZlrHDo7rfam8tLSoT02wvF8LQeNRC0VZG5IGrH+wv+G6fB8PWLLHrvUuaqO6XCwkMmYlJ/X9U9TLTHw==", + "license": "Apache-2.0", + "dependencies": { + "core-js": "^3.22.4" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=14.0.0" } }, - "node_modules/semantic-release/node_modules/is-plain-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", - "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", - "dev": true, + "node_modules/scratch-blocks/node_modules/core-js": { + "version": "3.47.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.47.0.tgz", + "integrity": "sha512-c3Q2VVkGAUyupsjRnaNX6u8Dq2vAdzm9iuPj5FW0fRxzlxgq9Q39MDq10IvmQSpLgHQNyQzQmOo6bgGHmH3NNg==", + "hasInstallScript": true, "license": "MIT", - "engines": { - "node": ">=12" - }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/core-js" } }, - "node_modules/semantic-release/node_modules/is-stream": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", - "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", - "dev": true, + "node_modules/scratch-blocks/node_modules/exports-loader": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/exports-loader/-/exports-loader-0.7.0.tgz", + "integrity": "sha512-RKwCrO4A6IiKm0pG3c9V46JxIHcDplwwGJn6+JJ1RcVnh/WSGJa0xkmk5cRVtgOPzCAtTMGj2F7nluh9L0vpSA==", "license": "MIT", - "engines": { - "node": ">=18" + "dependencies": { + "loader-utils": "^1.1.0", + "source-map": "0.5.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">= 4" } }, - "node_modules/semantic-release/node_modules/lru-cache": { - "version": "11.2.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.5.tgz", - "integrity": "sha512-vFrFJkWtJvJnD5hg+hJvVE8Lh/TcMzKnTgCWmtBipwI5yLX/iX+5UB2tfuyODF5E7k9xEzMdYgGqaSb1c0c5Yw==", - "dev": true, - "license": "BlueOak-1.0.0", + "node_modules/scratch-blocks/node_modules/exports-loader/node_modules/source-map": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.0.tgz", + "integrity": "sha512-gjGnxNN0K+/Pr4Mi4fs/pOtda10dKB6Wn9QvjOrH6v5TWsI7ghHuJUHoIgyM6DkUL5kr2GtPFGererzKpMBWfA==", + "license": "BSD-3-Clause", "engines": { - "node": "20 || >=22" + "node": ">=0.10.0" } }, - "node_modules/semantic-release/node_modules/normalize-package-data": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-8.0.0.tgz", - "integrity": "sha512-RWk+PI433eESQ7ounYxIp67CYuVsS1uYSonX3kA6ps/3LWfjVQa/ptEg6Y3T6uAMq1mWpX9PQ+qx+QaHpsc7gQ==", - "dev": true, - "license": "BSD-2-Clause", + "node_modules/scratch-blocks/node_modules/imports-loader": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/imports-loader/-/imports-loader-0.8.0.tgz", + "integrity": "sha512-kXWL7Scp8KQ4552ZcdVTeaQCZSLW+e6nJfp3cwUMB673T7Hr98Xjx5JK+ql7ADlJUvj1JS5O01RLbKoutN5QDQ==", + "license": "MIT", "dependencies": { - "hosted-git-info": "^9.0.0", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" + "loader-utils": "^1.0.2", + "source-map": "^0.6.1" }, "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">= 4" } }, - "node_modules/semantic-release/node_modules/npm-run-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz", - "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", - "dev": true, - "license": "MIT", + "node_modules/scratch-blocks/node_modules/scratch-l10n": { + "version": "3.18.357", + "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-3.18.357.tgz", + "integrity": "sha512-Rs3YmUa2dzpYqT1O/YT15g99sIwnC7j9TOOmOhUphVKLeiYUvJWiRPKZCugA7/hbIMYZV5VLkmuDgGXhgfSOBw==", + "license": "BSD-3-Clause", "dependencies": { - "path-key": "^4.0.0", - "unicorn-magic": "^0.3.0" - }, - "engines": { - "node": ">=18" + "@transifex/api": "4.3.0", + "download": "8.0.0", + "transifex": "1.6.6" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "bin": { + "build-i18n-src": "scripts/build-i18n-src.js", + "tx-push-src": "scripts/tx-push-src.js" } }, - "node_modules/semantic-release/node_modules/p-reduce": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-3.0.0.tgz", - "integrity": "sha512-xsrIUgI0Kn6iyDYm9StOpOeK29XM1aboGji26+QEortiFST1hGZaUQOLhtEbqHErPpGW/aSz6allwK2qcptp0Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" + "node_modules/scratch-l10n": { + "version": "6.1.60", + "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-6.1.60.tgz", + "integrity": "sha512-oRNtvEc9XD0I4fBVi1Rl5OdTW6cciZ7Yvd8h/I9GmMiwTXzFeXt5rlynWTtAHBzb/qzVCzPOr39oeoOlYVkQpw==", + "license": "AGPL-3.0-only", + "dependencies": { + "@transifex/api": "7.1.5", + "async": "3.2.6", + "format-message-parse": "6.2.4", + "glob": "7.2.3", + "lodash.defaultsdeep": "4.6.1", + "mkdirp": "3.0.1", + "transifex": "1.6.6", + "tsx": "4.21.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "bin": { + "build-i18n-src": "scripts/build-i18n-src.mts", + "tx-push-src": "scripts/tx-push-src.mts" } }, - "node_modules/semantic-release/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true, + "node_modules/scratch-l10n/node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "license": "MIT" + }, + "node_modules/scratch-l10n/node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", "license": "MIT", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, "engines": { - "node": ">=12" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/semantic-release/node_modules/read-package-up": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/read-package-up/-/read-package-up-12.0.0.tgz", - "integrity": "sha512-Q5hMVBYur/eQNWDdbF4/Wqqr9Bjvtrw2kjGxxBbKLbx8bVCL8gcArjTy8zDUuLGQicftpMuU0riQNcAsbtOVsw==", - "dev": true, - "license": "MIT", + "node_modules/scratch-paint": { + "version": "4.1.50", + "resolved": "https://registry.npmjs.org/scratch-paint/-/scratch-paint-4.1.50.tgz", + "integrity": "sha512-K9kYFxGWYI2VF8+ACrUih6iEu8C3T++JHo8YhDqw84VfoN/h3W/Z+fGk8/kyrCUuutOr3u6VZY/w4CbjDBGCAw==", + "license": "AGPL-3.0-only", "dependencies": { - "find-up-simple": "^1.0.1", - "read-pkg": "^10.0.0", - "type-fest": "^5.2.0" - }, - "engines": { - "node": ">=20" + "@scratch/paper": "^0.11.20221201200345", + "classnames": "^2.2.5", + "keymirror": "^0.1.1", + "lodash.bindall": "^4.4.0", + "lodash.omit": "^4.5.0", + "minilog": "^3.1.0", + "parse-color": "^1.0.0", + "prop-types": "^15.5.10" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "react": "^18", + "react-dom": "^18", + "react-intl": "^6", + "react-intl-redux": "^0.7 || ^2.0.0", + "react-popover": "^0.5", + "react-redux": "^8", + "react-responsive": "^9", + "react-style-proptype": "^3", + "react-tooltip": "^4", + "redux": "^4", + "scratch-render-fonts": "^1.0.0" } }, - "node_modules/semantic-release/node_modules/read-pkg": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-10.0.0.tgz", - "integrity": "sha512-A70UlgfNdKI5NSvTTfHzLQj7NJRpJ4mT5tGafkllJ4wh71oYuGm/pzphHcmW4s35iox56KSK721AihodoXSc/A==", - "dev": true, - "license": "MIT", + "node_modules/scratch-parser": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/scratch-parser/-/scratch-parser-6.0.0.tgz", + "integrity": "sha512-LXcKxJIupqBtXSe2+SXkQxwdMWg4JCdZfoSdPYj1ZtV/UhejyUYju6ptYUrr98RsLFT5UyCmmUaev8gA1SNvhQ==", + "license": "AGPL-3.0-only", "dependencies": { - "@types/normalize-package-data": "^2.4.4", - "normalize-package-data": "^8.0.0", - "parse-json": "^8.3.0", - "type-fest": "^5.2.0", - "unicorn-magic": "^0.3.0" + "ajv": "^6.3.0", + "jszip": "^3.1.5", + "pify": "^4.0.1" }, "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8.0" } }, - "node_modules/semantic-release/node_modules/read-pkg/node_modules/parse-json": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.3.0.tgz", - "integrity": "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==", - "dev": true, + "node_modules/scratch-parser/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.26.2", - "index-to-position": "^1.1.0", - "type-fest": "^4.39.1" - }, - "engines": { - "node": ">=18" + "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": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/semantic-release/node_modules/read-pkg/node_modules/parse-json/node_modules/type-fest": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", - "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node_modules/scratch-parser/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/scratch-render-fonts": { + "version": "1.0.252", + "resolved": "https://registry.npmjs.org/scratch-render-fonts/-/scratch-render-fonts-1.0.252.tgz", + "integrity": "sha512-leYCgtHMIqy36KqjraAiwaPYc9Bjy2L8J+vZ/CEnUE2PVP3z0dDoA4akz42/hk44kpVDzD574Th3SANt+PlLVA==", + "dependencies": { + "base64-loader": "^1.0.0" } }, - "node_modules/semantic-release/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": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node_modules/scratch-sb1-converter": { + "version": "2.0.279", + "resolved": "https://registry.npmjs.org/scratch-sb1-converter/-/scratch-sb1-converter-2.0.279.tgz", + "integrity": "sha512-C0yN1Ete4GukNBVvnRkJNW2fjV0l+N2qaTDM6Xmoo5nCvtw0GoWdKs7AB7OtKSVA1a7GDSvssArwqoP/Lp8Bww==", + "license": "AGPL-3.0-only", + "dependencies": { + "js-md5": "^0.7.3", + "minilog": "^3.1.0", + "text-encoding": "^0.7.0" } }, - "node_modules/semantic-release/node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "node_modules/scratch-semantic-release-config": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/scratch-semantic-release-config/-/scratch-semantic-release-config-4.0.1.tgz", + "integrity": "sha512-GnYr/0ThoFdE4w4vYV2J9NQlAXqC7kxfQUqzmtoeJeAP6H1wTDFZ6cB318Xzbkprl+efUMyFM/mMb8NoDvR6PQ==", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" + "@semantic-release/commit-analyzer": "^13.0.0", + "@semantic-release/git": "^10.0.1", + "@semantic-release/github": "^12.0.0", + "@semantic-release/npm": "^13.0.0", + "@semantic-release/release-notes-generator": "^14.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "semantic-release": ">=19.0.2" } }, - "node_modules/semantic-release/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "node_modules/scratch-storage": { + "version": "6.1.8", + "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-6.1.8.tgz", + "integrity": "sha512-uDkSNIY7yLalsynLmcGRs6TfF9C9UlCw+OYP0Tr++gjuSJTjOMm/Ve6y5kpxtjYWOAxgzOQgu+QcNz07vELXHg==", + "license": "AGPL-3.0-only", + "dependencies": { + "@babel/runtime": "^7.21.0", + "@scratch/task-herder": "12.6.2", + "arraybuffer-loader": "^1.0.3", + "base64-js": "^1.3.0", + "buffer": "6.0.3", + "fastestsmallesttextencoderdecoder": "^1.0.7", + "js-md5": "^0.7.3", + "minilog": "^3.1.0" + } + }, + "node_modules/scratch-translate-extension-languages": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/scratch-translate-extension-languages/-/scratch-translate-extension-languages-1.0.7.tgz", + "integrity": "sha512-6+bQU9iVYv23T8J0SjpV6MTugm0y8myh/4DPgu1BGfccysdkaWzu3MkNGQyQRUlbqAiW9wM7ctfv3USPEkzTgg==", + "license": "BSD-3-Clause" + }, + "node_modules/scratch-webpack-configuration": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/scratch-webpack-configuration/-/scratch-webpack-configuration-3.1.1.tgz", + "integrity": "sha512-rMaxuC7+507rbMaFcpZQ5BJPevq+/EKwGzT458G2mo90ZIHXOnzkjDmANvNFnfjjWcuQzp595rm/UrUg9CvBVg==", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" + "lodash.merge": "^4.6.2", + "webpack-node-externals": "^3.0.0" }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "peerDependencies": { + "@babel/preset-env": "^7.24.0", + "arraybuffer-loader": "^1.0.8", + "autoprefixer": "^9.0.1", + "babel-loader": "^9.1.3", + "css-loader": "5.2.7", + "postcss-import": "^12.0.0", + "postcss-loader": "4.3.0", + "postcss-simple-vars": "^5.0.1", + "style-loader": "4.0.0", + "ts-loader": "^9.5.1", + "url-loader": "4.1.1", + "webpack": "^5.90.3" } }, - "node_modules/semantic-release/node_modules/strip-final-newline": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-4.0.0.tgz", - "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==", + "node_modules/script-loader": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/script-loader/-/script-loader-0.7.2.tgz", + "integrity": "sha512-UMNLEvgOAQuzK8ji8qIscM3GIrRCWN6MmMXGD4SD5l6cSycgGsCo0tX5xRnfQcoghqct0tjHjcykgI1PyBE2aA==", "dev": true, "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "dependencies": { + "raw-loader": "~0.5.1" } }, - "node_modules/semantic-release/node_modules/type-fest": { - "version": "5.4.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.4.3.tgz", - "integrity": "sha512-AXSAQJu79WGc79/3e9/CR77I/KQgeY1AhNvcShIH4PTcGYyC4xv6H4R4AUOwkPS5799KlVDAu8zExeCrkGquiA==", - "dev": true, - "license": "(MIT OR CC0-1.0)", + "node_modules/script-loader/node_modules/raw-loader": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-0.5.1.tgz", + "integrity": "sha512-sf7oGoLuaYAScB4VGr0tzetsYlS8EJH6qnTCfQ/WVEa89hALQ4RQfCKt5xCyPQKPDUbVUAIP1QsxAwfAjlDp7Q==", + "dev": true + }, + "node_modules/seedrandom": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz", + "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==", + "license": "MIT" + }, + "node_modules/seek-bzip": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.6.tgz", + "integrity": "sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==", + "license": "MIT", "dependencies": { - "tagged-tag": "^1.0.0" - }, - "engines": { - "node": ">=20" + "commander": "^2.8.1" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "bin": { + "seek-bunzip": "bin/seek-bunzip", + "seek-table": "bin/seek-bzip-table" } }, - "node_modules/semantic-release/node_modules/wrap-ansi": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", - "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "node_modules/seek-bzip/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==", + "license": "MIT" + }, + "node_modules/select-hose": { + "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", + "license": "MIT" + }, + "node_modules/selenium-webdriver": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-3.6.0.tgz", + "integrity": "sha512-WH7Aldse+2P5bbFBO4Gle/nuQOdVwpHMTL6raL3uuBj/vPG07k6uzt3aiahu352ONBr5xXh0hDlM3LhtXPOC4Q==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "ansi-styles": "^6.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" + "jszip": "^3.1.3", + "rimraf": "^2.5.4", + "tmp": "0.0.30", + "xml2js": "^0.4.17" }, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "node": ">= 6.9.0" } }, - "node_modules/semantic-release/node_modules/yargs": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", - "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", + "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": { - "cliui": "^9.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "string-width": "^7.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^22.0.0" + "@peculiar/x509": "^1.14.2", + "pkijs": "^3.3.3" }, "engines": { - "node": "^20.19.0 || ^22.12.0 || >=23" + "node": ">=18" } }, - "node_modules/semantic-release/node_modules/yargs-parser": { - "version": "22.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", - "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", + "node_modules/semantic-release": { + "version": "25.0.3", + "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-25.0.3.tgz", + "integrity": "sha512-WRgl5GcypwramYX4HV+eQGzUbD7UUbljVmS+5G1uMwX/wLgYuJAxGeerXJDMO2xshng4+FXqCgyB5QfClV6WjA==", "dev": true, - "license": "ISC", - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=23" - } - }, - "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "license": "ISC", + "license": "MIT", "dependencies": { - "lru-cache": "^6.0.0" + "@semantic-release/commit-analyzer": "^13.0.1", + "@semantic-release/error": "^4.0.0", + "@semantic-release/github": "^12.0.0", + "@semantic-release/npm": "^13.1.1", + "@semantic-release/release-notes-generator": "^14.1.0", + "aggregate-error": "^5.0.0", + "cosmiconfig": "^9.0.0", + "debug": "^4.0.0", + "env-ci": "^11.0.0", + "execa": "^9.0.0", + "figures": "^6.0.0", + "find-versions": "^6.0.0", + "get-stream": "^6.0.0", + "git-log-parser": "^1.2.0", + "hook-std": "^4.0.0", + "hosted-git-info": "^9.0.0", + "import-from-esm": "^2.0.0", + "lodash-es": "^4.17.21", + "marked": "^15.0.0", + "marked-terminal": "^7.3.0", + "micromatch": "^4.0.2", + "p-each-series": "^3.0.0", + "p-reduce": "^3.0.0", + "read-package-up": "^12.0.0", + "resolve-from": "^5.0.0", + "semver": "^7.3.2", + "signale": "^1.2.1", + "yargs": "^18.0.0" }, "bin": { - "semver": "bin/semver.js" + "semantic-release": "bin/semantic-release.js" }, "engines": { - "node": ">=10" + "node": "^22.14.0 || >= 24.10.0" } }, - "node_modules/semver-regex": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-4.0.5.tgz", - "integrity": "sha512-hunMQrEy1T6Jr2uEVjrAIqjwWcQTgOAcIM52C8MY1EZSD3DDNft04XzvYKPqjED65bNVVko0YI38nYeEHCX3yw==", + "node_modules/semantic-release/node_modules/@semantic-release/error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-4.0.0.tgz", + "integrity": "sha512-mgdxrHTLOjOddRVYIYDo0fR3/v61GNN1YGkfbrjuIKg/uMgCd+Qzo3UAXJ+woLQQpos4pl5Esuw5A7AoNlzjUQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=18" } }, - "node_modules/send": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "node_modules/semantic-release/node_modules/aggregate-error": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-5.0.0.tgz", + "integrity": "sha512-gOsf2YwSlleG6IjRYG2A7k0HmBMEo6qVNk9Bp/EaLgAJT5ngH6PXbqa4ItvnEwCm/velL5jAnQgsHsWnjhGmvw==", "dev": true, "license": "MIT", "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" + "clean-stack": "^5.2.0", + "indent-string": "^5.0.0" }, "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/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" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/send/node_modules/debug/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/send/node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "node_modules/semantic-release/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/send/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/semantic-release/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", - "bin": { - "mime": "cli.js" - }, "engines": { - "node": ">=4" - } - }, - "node_modules/serialize-javascript": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", - "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", - "license": "BSD-3-Clause", - "dependencies": { - "randombytes": "^2.1.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "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==", + "node_modules/semantic-release/node_modules/clean-stack": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-5.3.0.tgz", + "integrity": "sha512-9ngPTOhYGQqNVSfeJkYXHmF7AGWp4/nN5D/QqNQs3Dvxd1Kk/WpjHfNujKHYUQ/5CoGyOyFNoWSPk5afzP0QVg==", "dev": true, "license": "MIT", "dependencies": { - "accepts": "~1.3.4", - "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" + "escape-string-regexp": "5.0.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "node_modules/semantic-release/node_modules/cliui": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", + "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/serve-index/node_modules/depd": { - "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", + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, "engines": { - "node": ">= 0.6" + "node": ">=20" } }, - "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==", + "node_modules/semantic-release/node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", "dev": true, "license": "MIT", "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" }, "engines": { - "node": ">= 0.6" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "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==", - "dev": true, - "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==", + "node_modules/semantic-release/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", "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==", - "dev": true, - "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.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "node_modules/semantic-release/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "dev": true, "license": "MIT", - "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" - }, "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" + "node": ">=12" }, - "engines": { - "node": ">= 0.4" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "node_modules/semantic-release/node_modules/execa": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-9.6.1.tgz", + "integrity": "sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==", "dev": true, "license": "MIT", "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" + "@sindresorhus/merge-streams": "^4.0.0", + "cross-spawn": "^7.0.6", + "figures": "^6.1.0", + "get-stream": "^9.0.0", + "human-signals": "^8.0.1", + "is-plain-obj": "^4.1.0", + "is-stream": "^4.0.1", + "npm-run-path": "^6.0.0", + "pretty-ms": "^9.2.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^4.0.0", + "yoctocolors": "^2.1.1" }, "engines": { - "node": ">= 0.4" + "node": "^18.19.0 || >=20.5.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/set-proto": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", - "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "node_modules/semantic-release/node_modules/execa/node_modules/get-stream": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", + "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", "dev": true, "license": "MIT", "dependencies": { - "dunder-proto": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0" + "@sec-ant/readable-stream": "^0.4.1", + "is-stream": "^4.0.1" }, "engines": { - "node": ">= 0.4" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", - "license": "MIT" - }, - "node_modules/setprototypeof": { - "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==", + "node_modules/semantic-release/node_modules/figures": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz", + "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==", "dev": true, "license": "MIT", "dependencies": { - "kind-of": "^6.0.2" + "is-unicode-supported": "^2.0.0" }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/shallow-copy": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz", - "integrity": "sha512-b6i4ZpVuUxB9h5gfCxPiusKYkqTMOjEbBs4wMaFbkfia4yFv92UKZ6Df8WXcKbn08JNL/abvg3FnMAOfakDvUw==", - "license": "MIT" - }, - "node_modules/shallow-equal": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/shallow-equal/-/shallow-equal-1.2.1.tgz", - "integrity": "sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==", - "license": "MIT" - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "node_modules/semantic-release/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==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "shebang-regex": "^3.0.0" + "lru-cache": "^11.1.0" }, "engines": { - "node": ">=8" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "node_modules/semantic-release/node_modules/human-signals": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-8.0.1.tgz", + "integrity": "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "engines": { - "node": ">=8" + "node": ">=18.18.0" } }, - "node_modules/shell-quote": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", - "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", + "node_modules/semantic-release/node_modules/indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/should": { - "version": "13.2.3", - "resolved": "https://registry.npmjs.org/should/-/should-13.2.3.tgz", - "integrity": "sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ==", + "node_modules/semantic-release/node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "dev": true, "license": "MIT", - "dependencies": { - "should-equal": "^2.0.0", - "should-format": "^3.0.3", - "should-type": "^1.4.0", - "should-type-adaptors": "^1.0.1", - "should-util": "^1.0.0" + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/should-equal": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/should-equal/-/should-equal-2.0.0.tgz", - "integrity": "sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==", + "node_modules/semantic-release/node_modules/is-stream": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", + "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", + "dev": true, "license": "MIT", - "dependencies": { - "should-type": "^1.4.0" + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/should-format": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/should-format/-/should-format-3.0.3.tgz", - "integrity": "sha512-hZ58adtulAk0gKtua7QxevgUaXTTXxIi8t41L3zo9AHvjXO1/7sdLECuHeIN2SRtYXpNkmhoUP2pdeWgricQ+Q==", - "license": "MIT", - "dependencies": { - "should-type": "^1.3.0", - "should-type-adaptors": "^1.0.1" + "node_modules/semantic-release/node_modules/lru-cache": { + "version": "11.2.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.5.tgz", + "integrity": "sha512-vFrFJkWtJvJnD5hg+hJvVE8Lh/TcMzKnTgCWmtBipwI5yLX/iX+5UB2tfuyODF5E7k9xEzMdYgGqaSb1c0c5Yw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" } }, - "node_modules/should-type": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/should-type/-/should-type-1.4.0.tgz", - "integrity": "sha512-MdAsTu3n25yDbIe1NeN69G4n6mUnJGtSJHygX3+oN0ZbO3DTiATnf7XnYJdGT42JCXurTb1JI0qOBR65shvhPQ==", - "license": "MIT" - }, - "node_modules/should-type-adaptors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz", - "integrity": "sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA==", - "license": "MIT", + "node_modules/semantic-release/node_modules/normalize-package-data": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-8.0.0.tgz", + "integrity": "sha512-RWk+PI433eESQ7ounYxIp67CYuVsS1uYSonX3kA6ps/3LWfjVQa/ptEg6Y3T6uAMq1mWpX9PQ+qx+QaHpsc7gQ==", + "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "should-type": "^1.3.0", - "should-util": "^1.0.0" + "hosted-git-info": "^9.0.0", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/should-util": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/should-util/-/should-util-1.0.1.tgz", - "integrity": "sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g==", - "license": "MIT" - }, - "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "node_modules/semantic-release/node_modules/npm-run-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz", + "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", "dev": true, "license": "MIT", "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" + "path-key": "^4.0.0", + "unicorn-magic": "^0.3.0" }, "engines": { - "node": ">= 0.4" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "node_modules/semantic-release/node_modules/p-reduce": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-3.0.0.tgz", + "integrity": "sha512-xsrIUgI0Kn6iyDYm9StOpOeK29XM1aboGji26+QEortiFST1hGZaUQOLhtEbqHErPpGW/aSz6allwK2qcptp0Q==", "dev": true, "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - }, "engines": { - "node": ">= 0.4" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/side-channel-map": { - "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==", + "node_modules/semantic-release/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", "dev": true, "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, "engines": { - "node": ">= 0.4" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "node_modules/semantic-release/node_modules/read-package-up": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/read-package-up/-/read-package-up-12.0.0.tgz", + "integrity": "sha512-Q5hMVBYur/eQNWDdbF4/Wqqr9Bjvtrw2kjGxxBbKLbx8bVCL8gcArjTy8zDUuLGQicftpMuU0riQNcAsbtOVsw==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" + "find-up-simple": "^1.0.1", + "read-pkg": "^10.0.0", + "type-fest": "^5.2.0" }, "engines": { - "node": ">= 0.4" + "node": ">=20" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/siginfo": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "dev": true, - "license": "ISC" - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/signale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/signale/-/signale-1.4.0.tgz", - "integrity": "sha512-iuh+gPf28RkltuJC7W5MRi6XAjTDCAPC/prJUpQoG4vIP3MJZ+GTydVnodXA7pwvTKb2cA0m9OFZW/cdWy/I/w==", + "node_modules/semantic-release/node_modules/read-pkg": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-10.0.0.tgz", + "integrity": "sha512-A70UlgfNdKI5NSvTTfHzLQj7NJRpJ4mT5tGafkllJ4wh71oYuGm/pzphHcmW4s35iox56KSK721AihodoXSc/A==", "dev": true, "license": "MIT", "dependencies": { - "chalk": "^2.3.2", - "figures": "^2.0.0", - "pkg-conf": "^2.1.0" + "@types/normalize-package-data": "^2.4.4", + "normalize-package-data": "^8.0.0", + "parse-json": "^8.3.0", + "type-fest": "^5.2.0", + "unicorn-magic": "^0.3.0" }, "engines": { - "node": ">=6" + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/signale/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/semantic-release/node_modules/read-pkg/node_modules/parse-json": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.3.0.tgz", + "integrity": "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==", "dev": true, "license": "MIT", "dependencies": { - "color-convert": "^1.9.0" + "@babel/code-frame": "^7.26.2", + "index-to-position": "^1.1.0", + "type-fest": "^4.39.1" }, "engines": { - "node": ">=4" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/signale/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/semantic-release/node_modules/read-pkg/node_modules/parse-json/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=4" + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/signale/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "node_modules/semantic-release/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", - "dependencies": { - "color-name": "1.1.3" + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/signale/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "license": "MIT" - }, - "node_modules/signale/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==", + "node_modules/semantic-release/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, "engines": { - "node": ">=0.8.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/signale/node_modules/figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", + "node_modules/semantic-release/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", "dev": true, "license": "MIT", "dependencies": { - "escape-string-regexp": "^1.0.5" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=4" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/signale/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "node_modules/semantic-release/node_modules/strip-final-newline": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-4.0.0.tgz", + "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==", "dev": true, "license": "MIT", "engines": { - "node": ">=4" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/signale/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/semantic-release/node_modules/type-fest": { + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.4.3.tgz", + "integrity": "sha512-AXSAQJu79WGc79/3e9/CR77I/KQgeY1AhNvcShIH4PTcGYyC4xv6H4R4AUOwkPS5799KlVDAu8zExeCrkGquiA==", "dev": true, - "license": "MIT", + "license": "(MIT OR CC0-1.0)", "dependencies": { - "has-flag": "^3.0.0" + "tagged-tag": "^1.0.0" }, "engines": { - "node": ">=4" + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/sigstore": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-4.0.0.tgz", - "integrity": "sha512-Gw/FgHtrLM9WP8P5lLcSGh9OQcrTruWCELAiS48ik1QbL0cH+dfjomiRTUE9zzz+D1N6rOLkwXUvVmXZAsNE0Q==", + "node_modules/semantic-release/node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "@sigstore/bundle": "^4.0.0", - "@sigstore/core": "^3.0.0", - "@sigstore/protobuf-specs": "^0.5.0", - "@sigstore/sign": "^4.0.0", - "@sigstore/tuf": "^4.0.0", - "@sigstore/verify": "^3.0.0" + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true, - "license": "MIT" - }, - "node_modules/skin-tone": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz", - "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==", + "node_modules/semantic-release/node_modules/yargs": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", + "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", "dev": true, "license": "MIT", "dependencies": { - "unicode-emoji-modifier-base": "^1.0.0" + "cliui": "^9.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "string-width": "^7.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^22.0.0" }, "engines": { - "node": ">=8" + "node": "^20.19.0 || ^22.12.0 || >=23" } }, - "node_modules/slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "node_modules/semantic-release/node_modules/yargs-parser": { + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", + "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", "dev": true, - "license": "MIT", + "license": "ISC", "engines": { - "node": ">=6" + "node": "^20.19.0 || ^22.12.0 || >=23" } }, - "node_modules/slice-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", - "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", - "dev": true, - "license": "MIT", + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "license": "ISC", "dependencies": { - "ansi-styles": "^6.2.1", - "is-fullwidth-code-point": "^5.0.0" + "lru-cache": "^6.0.0" }, - "engines": { - "node": ">=18" + "bin": { + "semver": "bin/semver.js" }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" + "engines": { + "node": ">=10" } }, - "node_modules/slice-ansi/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==", + "node_modules/semver-regex": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-4.0.5.tgz", + "integrity": "sha512-hunMQrEy1T6Jr2uEVjrAIqjwWcQTgOAcIM52C8MY1EZSD3DDNft04XzvYKPqjED65bNVVko0YI38nYeEHCX3yw==", "dev": true, "license": "MIT", "engines": { "node": ">=12" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", - "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", + "node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", "dev": true, "license": "MIT", "dependencies": { - "get-east-asian-width": "^1.3.1" + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" }, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.8.0" } }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "node_modules/send/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", - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" + "dependencies": { + "ms": "2.0.0" } }, - "node_modules/sockjs": { - "version": "0.3.24", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", - "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "node_modules/send/node_modules/debug/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", - "dependencies": { - "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", - "websocket-driver": "^0.7.4" - } + "license": "MIT" }, - "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==", + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "dev": true, "license": "MIT", - "dependencies": { - "ip-address": "^10.0.1", - "smart-buffer": "^4.2.0" - }, "engines": { - "node": ">= 10.0.0", - "npm": ">= 3.0.0" + "node": ">= 0.8" } }, - "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==", + "node_modules/send/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": { - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "socks": "^2.8.3" + "bin": { + "mime": "cli.js" }, "engines": { - "node": ">= 14" + "node": ">=4" } }, - "node_modules/sort-keys": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", - "integrity": "sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg==", - "license": "MIT", + "node_modules/serialize-javascript": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "license": "BSD-3-Clause", "dependencies": { - "is-plain-obj": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" + "randombytes": "^2.1.0" } }, - "node_modules/sort-keys-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sort-keys-length/-/sort-keys-length-1.0.1.tgz", - "integrity": "sha512-GRbEOUqCxemTAk/b32F2xa8wDTs+Z1QHOkbhJDQTvv/6G3ZkbJ+frYWsTcc7cBB3Fu4wy4XlLCuNtJuMn7Gsvw==", + "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==", + "dev": true, "license": "MIT", "dependencies": { - "sort-keys": "^1.0.0" + "accepts": "~1.3.4", + "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" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.8.0" } }, - "node_modules/source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", - "license": "MIT" - }, - "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/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" } }, - "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==", - "license": "BSD-3-Clause", + "node_modules/serve-index/node_modules/depd": { + "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.10.0" + "node": ">= 0.6" } }, - "node_modules/source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "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==", "dev": true, "license": "MIT", "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" } }, - "node_modules/spawn-error-forwarder": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/spawn-error-forwarder/-/spawn-error-forwarder-1.0.0.tgz", - "integrity": "sha512-gRjMgK5uFjbCvdibeGJuy3I5OYz6VLoVdsOJdA6wV0WlfQVLFueoqMxwwYD9RODdgb6oUIvlRlsyFSiQkMKu0g==", + "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==", "dev": true, - "license": "MIT" + "license": "ISC" }, - "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==", - "license": "Apache-2.0", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } + "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/spdx-exceptions": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "license": "CC-BY-3.0" + "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==", + "dev": true, + "license": "ISC" }, - "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==", + "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", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" + "engines": { + "node": ">= 0.6" } }, - "node_modules/spdx-license-ids": { - "version": "3.0.22", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz", - "integrity": "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==", - "license": "CC0-1.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==", + "node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", "dev": true, "license": "MIT", "dependencies": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" }, "engines": { - "node": ">=6.0.0" + "node": ">= 0.8.0" } }, - "node_modules/spdy-transport": { - "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, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "license": "MIT", "dependencies": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" } }, - "node_modules/split2": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", - "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "readable-stream": "^3.0.0" + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" } }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "license": "BSD-3-Clause" - }, - "node_modules/sshpk": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", - "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, "license": "MIT", "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" } }, - "node_modules/ssri": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", - "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", - "license": "ISC", + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "license": "MIT" + }, + "node_modules/setprototypeof": { + "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": { - "minipass": "^3.1.1" + "kind-of": "^6.0.2" }, "engines": { - "node": ">= 8" + "node": ">=8" } }, - "node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "node_modules/shallow-copy": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz", + "integrity": "sha512-b6i4ZpVuUxB9h5gfCxPiusKYkqTMOjEbBs4wMaFbkfia4yFv92UKZ6Df8WXcKbn08JNL/abvg3FnMAOfakDvUw==", + "license": "MIT" + }, + "node_modules/shallow-equal": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/shallow-equal/-/shallow-equal-1.2.1.tgz", + "integrity": "sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==", + "license": "MIT" + }, + "node_modules/shebang-command": { + "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": { - "escape-string-regexp": "^2.0.0" + "shebang-regex": "^3.0.0" }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "node_modules/shebang-regex": { + "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/stackback": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "node_modules/shell-quote": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", "dev": true, - "license": "MIT" - }, - "node_modules/startaudiocontext": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/startaudiocontext/-/startaudiocontext-1.2.1.tgz", - "integrity": "sha512-ooOQhOAoCwzMIRwWd9j7xF8kAMo1Wv7Zfw+q6dWDW5gxJUKx15HJXWDg89GMDqfdle9xsqPv+uioneX+bI643g==", - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/static-eval": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.1.1.tgz", - "integrity": "sha512-MgWpQ/ZjGieSVB3eOJVs4OA2LT/q1vx98KPCTTQPzq/aLr0YUXTsgryTXr4SLfR0ZfUUCiedM9n/ABeDIyy4mA==", + "node_modules/should": { + "version": "13.2.3", + "resolved": "https://registry.npmjs.org/should/-/should-13.2.3.tgz", + "integrity": "sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ==", "license": "MIT", "dependencies": { - "escodegen": "^2.1.0" + "should-equal": "^2.0.0", + "should-format": "^3.0.3", + "should-type": "^1.4.0", + "should-type-adaptors": "^1.0.1", + "should-util": "^1.0.0" } }, - "node_modules/static-eval/node_modules/escodegen": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", - "license": "BSD-2-Clause", + "node_modules/should-equal": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/should-equal/-/should-equal-2.0.0.tgz", + "integrity": "sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==", + "license": "MIT", "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" + "should-type": "^1.4.0" } }, - "node_modules/static-module": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/static-module/-/static-module-2.2.5.tgz", - "integrity": "sha512-D8vv82E/Kpmz3TXHKG8PPsCPg+RAX6cbCOyvjM6x04qZtQ47EtJFVwRsdov3n5d6/6ynrOY9XB4JkaZwB2xoRQ==", + "node_modules/should-format": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/should-format/-/should-format-3.0.3.tgz", + "integrity": "sha512-hZ58adtulAk0gKtua7QxevgUaXTTXxIi8t41L3zo9AHvjXO1/7sdLECuHeIN2SRtYXpNkmhoUP2pdeWgricQ+Q==", "license": "MIT", "dependencies": { - "concat-stream": "~1.6.0", - "convert-source-map": "^1.5.1", - "duplexer2": "~0.1.4", - "escodegen": "~1.9.0", - "falafel": "^2.1.0", - "has": "^1.0.1", - "magic-string": "^0.22.4", - "merge-source-map": "1.0.4", - "object-inspect": "~1.4.0", - "quote-stream": "~1.0.2", - "readable-stream": "~2.3.3", - "shallow-copy": "~0.0.1", - "static-eval": "^2.0.0", - "through2": "~2.0.3" + "should-type": "^1.3.0", + "should-type-adaptors": "^1.0.1" } }, - "node_modules/static-module/node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "node_modules/should-type": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/should-type/-/should-type-1.4.0.tgz", + "integrity": "sha512-MdAsTu3n25yDbIe1NeN69G4n6mUnJGtSJHygX3+oN0ZbO3DTiATnf7XnYJdGT42JCXurTb1JI0qOBR65shvhPQ==", "license": "MIT" }, - "node_modules/static-module/node_modules/escodegen": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz", - "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==", - "license": "BSD-2-Clause", + "node_modules/should-type-adaptors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz", + "integrity": "sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA==", + "license": "MIT", "dependencies": { - "esprima": "^3.1.3", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=4.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" + "should-type": "^1.3.0", + "should-util": "^1.0.0" } }, - "node_modules/static-module/node_modules/esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha512-AWwVMNxwhN8+NIPQzAQZCm7RkLC4RbM3B1OobMuyp3i+w73X57KCKaVIxaRZb+DYCojq7rspo+fmuQfAboyhFg==", - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } + "node_modules/should-util": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/should-util/-/should-util-1.0.1.tgz", + "integrity": "sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g==", + "license": "MIT" }, - "node_modules/static-module/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", + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, "engines": { - "node": ">=4.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/static-module/node_modules/isarray": { + "node_modules/side-channel-list": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT" - }, - "node_modules/static-module/node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, "license": "MIT", "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" }, "engines": { - "node": ">= 0.8.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/static-module/node_modules/magic-string": { - "version": "0.22.5", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz", - "integrity": "sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==", + "node_modules/side-channel-map": { + "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": { - "vlq": "^0.2.2" + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/static-module/node_modules/object-inspect": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.4.1.tgz", - "integrity": "sha512-wqdhLpfCUbEsoEwl3FXwGyv8ief1k/1aUdIPCqVnupM6e8l63BEJdiF/0swtn04/8p05tG/T0FrpTlfwvljOdw==", - "license": "MIT" - }, - "node_modules/static-module/node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "node_modules/side-channel-weakmap": { + "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": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" }, "engines": { - "node": ">= 0.8.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/static-module/node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", - "engines": { - "node": ">= 0.8.0" - } + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" }, - "node_modules/static-module/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==", + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/signale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/signale/-/signale-1.4.0.tgz", + "integrity": "sha512-iuh+gPf28RkltuJC7W5MRi6XAjTDCAPC/prJUpQoG4vIP3MJZ+GTydVnodXA7pwvTKb2cA0m9OFZW/cdWy/I/w==", + "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" + "chalk": "^2.3.2", + "figures": "^2.0.0", + "pkg-conf": "^2.1.0" + }, + "engines": { + "node": ">=6" } }, - "node_modules/static-module/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, - "node_modules/static-module/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "node_modules/signale/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, "license": "MIT", "dependencies": { - "safe-buffer": "~5.1.0" + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/static-module/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/signale/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, "license": "MIT", "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/static-module/node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "node_modules/signale/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, "license": "MIT", "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" + "color-name": "1.1.3" } }, - "node_modules/stats.js": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/stats.js/-/stats.js-0.17.0.tgz", - "integrity": "sha512-hNKz8phvYLPEcRkeG1rsGmV5ChMjKDAWU7/OJJdDErPBNChQXxCo3WZurGpnWc6gZhAzEPFad1aVgyOANH1sMw==", + "node_modules/signale/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true, "license": "MIT" }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "node_modules/signale/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" + "node": ">=0.8.0" } }, - "node_modules/std-env": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", - "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", + "node_modules/signale/node_modules/figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=4" + } }, - "node_modules/stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==", + "node_modules/signale/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, - "license": "ISC", + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/stop-iteration-iterator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", - "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "node_modules/signale/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "license": "MIT", "dependencies": { - "es-errors": "^1.3.0", - "internal-slot": "^1.1.0" + "has-flag": "^3.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=4" } }, - "node_modules/stream-browserify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", - "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", + "node_modules/sigstore": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-4.0.0.tgz", + "integrity": "sha512-Gw/FgHtrLM9WP8P5lLcSGh9OQcrTruWCELAiS48ik1QbL0cH+dfjomiRTUE9zzz+D1N6rOLkwXUvVmXZAsNE0Q==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "inherits": "~2.0.4", - "readable-stream": "^3.5.0" + "@sigstore/bundle": "^4.0.0", + "@sigstore/core": "^3.0.0", + "@sigstore/protobuf-specs": "^0.5.0", + "@sigstore/sign": "^4.0.0", + "@sigstore/tuf": "^4.0.0", + "@sigstore/verify": "^3.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/stream-combiner2": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", - "integrity": "sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==", + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/skin-tone": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz", + "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==", "dev": true, "license": "MIT", "dependencies": { - "duplexer2": "~0.1.0", - "readable-stream": "^2.0.2" + "unicode-emoji-modifier-base": "^1.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/stream-combiner2/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "node_modules/slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=6" + } }, - "node_modules/stream-combiner2/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==", + "node_modules/slice-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", + "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", "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" + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/stream-combiner2/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "node_modules/slice-ansi/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" + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } }, - "node_modules/stream-combiner2/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", + "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", "dev": true, "license": "MIT", "dependencies": { - "safe-buffer": "~5.1.0" + "get-east-asian-width": "^1.3.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==", + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">= 6.0.0", + "npm": ">= 3.0.0" } }, - "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/sockjs": { + "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": { - "safe-buffer": "~5.2.0" + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" } }, - "node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "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==", "dev": true, "license": "MIT", "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" + "ip-address": "^10.0.1", + "smart-buffer": "^4.2.0" }, "engines": { - "node": ">=10" + "node": ">= 10.0.0", + "npm": ">= 3.0.0" } }, - "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==", + "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": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "socks": "^2.8.3" }, "engines": { - "node": ">=8" + "node": ">= 14" } }, - "node_modules/string-width-cjs": { - "name": "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, + "node_modules/sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg==", "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "is-plain-obj": "^1.0.0" }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/string.prototype.includes": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", - "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", - "dev": true, + "node_modules/sort-keys-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sort-keys-length/-/sort-keys-length-1.0.1.tgz", + "integrity": "sha512-GRbEOUqCxemTAk/b32F2xa8wDTs+Z1QHOkbhJDQTvv/6G3ZkbJ+frYWsTcc7cBB3Fu4wy4XlLCuNtJuMn7Gsvw==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.3" + "sort-keys": "^1.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=0.10.0" + } + }, + "node_modules/source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "license": "MIT" + }, + "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/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==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/string.prototype.matchall": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", - "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.6", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.6", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "internal-slot": "^1.1.0", - "regexp.prototype.flags": "^1.5.3", - "set-function-name": "^2.0.2", - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } }, - "node_modules/string.prototype.repeat": { + "node_modules/spawn-error-forwarder": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", - "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "resolved": "https://registry.npmjs.org/spawn-error-forwarder/-/spawn-error-forwarder-1.0.0.tgz", + "integrity": "sha512-gRjMgK5uFjbCvdibeGJuy3I5OYz6VLoVdsOJdA6wV0WlfQVLFueoqMxwwYD9RODdgb6oUIvlRlsyFSiQkMKu0g==", "dev": true, + "license": "MIT" + }, + "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==", + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "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==", "license": "MIT", "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" } }, - "node_modules/string.prototype.trim": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", - "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "node_modules/spdx-license-ids": { + "version": "3.0.22", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz", + "integrity": "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==", + "license": "CC0-1.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": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-data-property": "^1.1.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-object-atoms": "^1.0.0", - "has-property-descriptors": "^1.0.2" + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=6.0.0" } }, - "node_modules/string.prototype.trimend": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", - "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "node_modules/spdy-transport": { + "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": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" } }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "node_modules/split2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", "dev": true, + "license": "ISC", + "dependencies": { + "readable-stream": "^3.0.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "license": "BSD-3-Clause" + }, + "node_modules/sshpk": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", + "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" }, - "engines": { - "node": ">= 0.4" + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", + "node_modules/ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "license": "ISC", "dependencies": { - "ansi-regex": "^5.0.1" + "minipass": "^3.1.1" }, "engines": { - "node": ">=8" + "node": ">= 8" } }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" + "escape-string-regexp": "^2.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/strip-dirs": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz", - "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==", - "license": "MIT", - "dependencies": { - "is-natural-number": "^4.0.1" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", "dev": true, + "license": "MIT" + }, + "node_modules/startaudiocontext": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/startaudiocontext/-/startaudiocontext-1.2.1.tgz", + "integrity": "sha512-ooOQhOAoCwzMIRwWd9j7xF8kAMo1Wv7Zfw+q6dWDW5gxJUKx15HJXWDg89GMDqfdle9xsqPv+uioneX+bI643g==", + "license": "MIT" + }, + "node_modules/static-eval": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.1.1.tgz", + "integrity": "sha512-MgWpQ/ZjGieSVB3eOJVs4OA2LT/q1vx98KPCTTQPzq/aLr0YUXTsgryTXr4SLfR0ZfUUCiedM9n/ABeDIyy4mA==", "license": "MIT", - "engines": { - "node": ">=6" + "dependencies": { + "escodegen": "^2.1.0" } }, - "node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, - "license": "MIT", + "node_modules/static-eval/node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "license": "BSD-2-Clause", "dependencies": { - "min-indent": "^1.0.0" + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" }, "engines": { - "node": ">=8" + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" } }, - "node_modules/strip-json-comments": { - "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, + "node_modules/static-module": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/static-module/-/static-module-2.2.5.tgz", + "integrity": "sha512-D8vv82E/Kpmz3TXHKG8PPsCPg+RAX6cbCOyvjM6x04qZtQ47EtJFVwRsdov3n5d6/6ynrOY9XB4JkaZwB2xoRQ==", "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "dependencies": { + "concat-stream": "~1.6.0", + "convert-source-map": "^1.5.1", + "duplexer2": "~0.1.4", + "escodegen": "~1.9.0", + "falafel": "^2.1.0", + "has": "^1.0.1", + "magic-string": "^0.22.4", + "merge-source-map": "1.0.4", + "object-inspect": "~1.4.0", + "quote-stream": "~1.0.2", + "readable-stream": "~2.3.3", + "shallow-copy": "~0.0.1", + "static-eval": "^2.0.0", + "through2": "~2.0.3" } }, - "node_modules/strip-outer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", - "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", - "license": "MIT", + "node_modules/static-module/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "license": "MIT" + }, + "node_modules/static-module/node_modules/escodegen": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz", + "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==", + "license": "BSD-2-Clause", "dependencies": { - "escape-string-regexp": "^1.0.2" + "esprima": "^3.1.3", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" }, "engines": { - "node": ">=0.10.0" + "node": ">=4.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" } }, - "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==", - "license": "MIT", + "node_modules/static-module/node_modules/esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha512-AWwVMNxwhN8+NIPQzAQZCm7RkLC4RbM3B1OobMuyp3i+w73X57KCKaVIxaRZb+DYCojq7rspo+fmuQfAboyhFg==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, "engines": { - "node": ">=0.8.0" + "node": ">=4" } }, - "node_modules/strip-url-auth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-url-auth/-/strip-url-auth-1.0.1.tgz", - "integrity": "sha512-++41PnXftlL3pvI6lpvhSEO+89g1kIJC4MYB5E6yH+WHa5InIqz51yGd1YOGd7VNSNdoEOfzTMqbAM/2PbgaHQ==", - "dev": true, - "license": "MIT", + "node_modules/static-module/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": ">=0.10.0" + "node": ">=4.0" } }, - "node_modules/style-loader": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-4.0.0.tgz", - "integrity": "sha512-1V4WqhhZZgjVAVJyt7TdDPZoPBPNHbekX4fWnCJL1yQukhCeZhJySUL+gL9y6sNdN95uEOS83Y55SqHcP7MzLA==", - "license": "MIT", - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.27.0" - } + "node_modules/static-module/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" }, - "node_modules/super-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/super-regex/-/super-regex-1.1.0.tgz", - "integrity": "sha512-WHkws2ZflZe41zj6AolvvmaTrWds/VuyeYr9iPVv/oQeaIoVxMKaushfFWpOGDT+GuBrM/sVqF8KUCYQlSSTdQ==", - "dev": true, + "node_modules/static-module/node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", "license": "MIT", "dependencies": { - "function-timeout": "^1.0.1", - "make-asynchronous": "^1.0.1", - "time-span": "^5.1.0" + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" }, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.8.0" } }, - "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/static-module/node_modules/magic-string": { + "version": "0.22.5", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz", + "integrity": "sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==", "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" + "vlq": "^0.2.2" } }, - "node_modules/supports-hyperlinks": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.2.0.tgz", - "integrity": "sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==", - "dev": true, + "node_modules/static-module/node_modules/object-inspect": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.4.1.tgz", + "integrity": "sha512-wqdhLpfCUbEsoEwl3FXwGyv8ief1k/1aUdIPCqVnupM6e8l63BEJdiF/0swtn04/8p05tG/T0FrpTlfwvljOdw==", + "license": "MIT" + }, + "node_modules/static-module/node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", "license": "MIT", "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" }, "engines": { - "node": ">=14.18" - }, - "funding": { - "url": "https://github.com/chalk/supports-hyperlinks?sponsor=1" + "node": ">= 0.8.0" } }, - "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==", - "license": "MIT", + "node_modules/static-module/node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 0.8.0" } }, - "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==", + "node_modules/static-module/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/static-module/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "license": "MIT" }, - "node_modules/sync-content": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/sync-content/-/sync-content-2.0.4.tgz", - "integrity": "sha512-w3ioiBmbaogob33WdLnuwFk+8tpePI58CTWKqtdAgEqc2hfGuSwP02gPETqNX/3PLS5skv5a1wQR0gbaa2W0XQ==", - "dev": true, - "license": "BlueOak-1.0.0", + "node_modules/static-module/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", "dependencies": { - "glob": "^13.0.1", - "mkdirp": "^3.0.1", - "path-scurry": "^2.0.0", - "rimraf": "^6.0.0" - }, - "bin": { - "sync-content": "dist/esm/bin.mjs" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "safe-buffer": "~5.1.0" } }, - "node_modules/sync-content/node_modules/glob": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.1.tgz", - "integrity": "sha512-B7U/vJpE3DkJ5WXTgTpTRN63uV42DseiXXKMwG14LQBXmsdeIoHAPbU/MEo6II0k5ED74uc2ZGTC6MwHFQhF6w==", - "dev": true, - "license": "BlueOak-1.0.0", + "node_modules/static-module/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "license": "MIT", "dependencies": { - "minimatch": "^10.1.2", - "minipass": "^7.1.2", - "path-scurry": "^2.0.0" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" } }, - "node_modules/sync-content/node_modules/minimatch": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.2.tgz", - "integrity": "sha512-fu656aJ0n2kcXwsnwnv9g24tkU5uSmOlTjd6WyyaKm2Z+h1qmY6bAjrcaIxF/BslFqbZ8UBtbJi7KgQOZD2PTw==", - "dev": true, - "license": "BlueOak-1.0.0", + "node_modules/static-module/node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "license": "MIT", "dependencies": { - "@isaacs/brace-expansion": "^5.0.1" + "prelude-ls": "~1.1.2" }, "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">= 0.8.0" } }, - "node_modules/sync-content/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "node_modules/stats.js": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/stats.js/-/stats.js-0.17.0.tgz", + "integrity": "sha512-hNKz8phvYLPEcRkeG1rsGmV5ChMjKDAWU7/OJJdDErPBNChQXxCo3WZurGpnWc6gZhAzEPFad1aVgyOANH1sMw==", "dev": true, - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } + "license": "MIT" }, - "node_modules/sync-content/node_modules/mkdirp": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", - "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true, "license": "MIT", - "bin": { - "mkdirp": "dist/cjs/src/bin.js" - }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">= 0.8" } }, - "node_modules/sync-content/node_modules/rimraf": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.1.0.tgz", - "integrity": "sha512-DxdlA1bdNzkZK7JiNWH+BAx1x4tEJWoTofIopFo6qWUU94jYrFZ0ubY05TqH3nWPJ1nKa1JWVFDINZ3fnrle/A==", + "node_modules/std-env": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", + "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "glob": "^11.0.3", - "package-json-from-dist": "^1.0.1" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } + "license": "MIT" }, - "node_modules/sync-content/node_modules/rimraf/node_modules/glob": { - "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", + "node_modules/stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==", "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "foreground-child": "^3.3.1", - "jackspeak": "^4.1.1", - "minimatch": "^10.1.1", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^2.0.0" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, + "license": "ISC", "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=0.10.0" } }, - "node_modules/table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" }, "engines": { - "node": ">=6.0.0" + "node": ">= 0.4" } }, - "node_modules/table/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "node_modules/stream-browserify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", + "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", "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" + "inherits": "~2.0.4", + "readable-stream": "^3.5.0" } }, - "node_modules/table/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "node_modules/stream-combiner2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", + "integrity": "sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==", "dev": true, "license": "MIT", - "engines": { - "node": ">=6" + "dependencies": { + "duplexer2": "~0.1.0", + "readable-stream": "^2.0.2" } }, - "node_modules/table/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/stream-combiner2/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } + "license": "MIT" }, - "node_modules/table/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "node_modules/stream-combiner2/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": { - "color-name": "1.1.3" + "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/table/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "node_modules/stream-combiner2/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true, "license": "MIT" }, - "node_modules/table/node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "node_modules/stream-combiner2/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" + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } }, - "node_modules/table/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true, + "node_modules/strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==", "license": "MIT", "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/table/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/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==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } }, - "node_modules/table/node_modules/slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=6" + "node": ">=10" } }, - "node_modules/table/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, + "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==", "license": "MIT", "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/table/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "node_modules/string-width-cjs": { + "name": "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": { - "ansi-regex": "^4.1.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/tagged-tag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz", - "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==", + "node_modules/string.prototype.includes": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", + "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", "dev": true, "license": "MIT", - "engines": { - "node": ">=20" + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">= 0.4" } }, - "node_modules/tap": { - "version": "21.6.1", - "resolved": "https://registry.npmjs.org/tap/-/tap-21.6.1.tgz", - "integrity": "sha512-QKKZg/2oWGCMRRCBq4AVeaJSNwxZqIkasNMdKQLge3CR5hRbRMEN3Hh8qN+V9EoHKOS8OBMabM9pPCqtLKyTjg==", + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", "dev": true, - "license": "BlueOak-1.0.0", + "license": "MIT", "dependencies": { - "@tapjs/after": "3.3.3", - "@tapjs/after-each": "4.3.3", - "@tapjs/asserts": "4.3.3", - "@tapjs/before": "4.3.3", - "@tapjs/before-each": "4.3.3", - "@tapjs/chdir": "3.3.3", - "@tapjs/core": "4.5.1", - "@tapjs/filter": "4.3.3", - "@tapjs/fixture": "4.3.3", - "@tapjs/intercept": "4.3.3", - "@tapjs/mock": "4.4.1", - "@tapjs/node-serialize": "4.3.3", - "@tapjs/run": "4.5.1", - "@tapjs/snapshot": "4.3.3", - "@tapjs/spawn": "4.3.3", - "@tapjs/stdin": "4.3.3", - "@tapjs/test": "4.4.1", - "@tapjs/typescript": "3.5.3", - "@tapjs/worker": "4.3.3", - "resolve-import": "^2.4.0" - }, - "bin": { - "tap": "dist/esm/run.mjs" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" }, "engines": { - "node": "20 || >=22" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/tap-parser": { - "version": "18.3.0", - "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-18.3.0.tgz", - "integrity": "sha512-sa0M18e6RARfO0Lrm1zbQvb+7G4G/ThkFIJFvjeH1DKenl4xwyUgpRUCb5Jq64Xe086p4auiLvRzfpRjGd3Zow==", + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", "dev": true, - "license": "BlueOak-1.0.0", + "license": "MIT", "dependencies": { - "events-to-array": "^2.0.3", - "tap-yaml": "4.3.0" - }, - "bin": { - "tap-parser": "bin/cmd.cjs" - }, - "engines": { - "node": "20 || >=22" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" } }, - "node_modules/tap-yaml": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/tap-yaml/-/tap-yaml-4.3.0.tgz", - "integrity": "sha512-48BiwXj3cUa1Lt6BLzfawJGZVihfRCY19gyjaHftQpe8ulEmB9gZW9kChQkdb0+L4YUlGWUJMpWRAJ/9bPSgVA==", + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", "dev": true, - "license": "BlueOak-1.0.0", + "license": "MIT", "dependencies": { - "yaml": "^2.8.1", - "yaml-types": "^0.4.0" + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" }, "engines": { - "node": "20 || >=22" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/tap/node_modules/@tapjs/after": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/@tapjs/after/-/after-3.3.3.tgz", - "integrity": "sha512-kGG4zOM1LXfWr1+MvBfzLHUm/azBC1YGQxS7eFNPe67cQjJFG/GcwnRXTqZWEhRv/g0M9IERE8YIEuta9owFpw==", + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", "dev": true, - "license": "BlueOak-1.0.0", + "license": "MIT", "dependencies": { - "is-actual-promise": "^1.0.1" + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { - "node": "20 || >=22" + "node": ">= 0.4" }, - "peerDependencies": { - "@tapjs/core": "4.5.1" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/tap/node_modules/@tapjs/after-each": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@tapjs/after-each/-/after-each-4.3.3.tgz", - "integrity": "sha512-68IPZPVjgMId5LU3Uuo0Kr1MGRPTYffx4gSWkwEIiNc20+j0z5BkPeyq08xm8vQykO/hDxZqX2FoOdGCWtbb0g==", + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, - "license": "BlueOak-1.0.0", + "license": "MIT", "dependencies": { - "function-loop": "^4.0.0" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { - "node": "20 || >=22" + "node": ">= 0.4" }, - "peerDependencies": { - "@tapjs/core": "4.5.1" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/tap/node_modules/@tapjs/asserts": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@tapjs/asserts/-/asserts-4.3.3.tgz", - "integrity": "sha512-ZrKW94qQlUcRs+zmSuuxgoTjkSgXvq1G3Qv/4dD0gUatTckCRM+rQIBsPcgAC5jMyBAgQJ+q8U2Wo3h+r9Jrog==", - "dev": true, - "license": "BlueOak-1.0.0", + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", "dependencies": { - "@tapjs/stack": "4.3.0", - "is-actual-promise": "^1.0.1", - "tcompare": "9.3.0", - "trivial-deferred": "^2.0.0" + "ansi-regex": "^5.0.1" }, "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "peerDependencies": { - "@tapjs/core": "4.5.1" + "node": ">=8" } }, - "node_modules/tap/node_modules/@tapjs/before": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@tapjs/before/-/before-4.3.3.tgz", - "integrity": "sha512-tVFrSmlN6nCYgNkkzqLQ/DFrI9b2AsJ5Aka1wa1wQJAy+F0QOmLkAH44wnqkE2pKjEWHSkdYdFUlixyfs8lDRw==", + "node_modules/strip-ansi-cjs": { + "name": "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": "BlueOak-1.0.0", + "license": "MIT", "dependencies": { - "is-actual-promise": "^1.0.1" + "ansi-regex": "^5.0.1" }, "engines": { - "node": "20 || >=22" - }, - "peerDependencies": { - "@tapjs/core": "4.5.1" + "node": ">=8" } }, - "node_modules/tap/node_modules/@tapjs/before-each": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@tapjs/before-each/-/before-each-4.3.3.tgz", - "integrity": "sha512-wEvwHCHdCwZZCPHSMJ3kIE/bqrzdSKI/p5PswSAPm+KQmtnhyXjau1bBfz9aK9S/Pwez+NCwJKn5+POVTeUXKw==", + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "function-loop": "^4.0.0" - }, + "license": "MIT", "engines": { - "node": "20 || >=22" - }, - "peerDependencies": { - "@tapjs/core": "4.5.1" + "node": ">=8" } }, - "node_modules/tap/node_modules/@tapjs/chdir": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/@tapjs/chdir/-/chdir-3.3.3.tgz", - "integrity": "sha512-METLxtROGpmvGjfT9XZV/qu1q8BjxSAcWsyr8wTvCfDcv0eMi1odvlPpBfUU+WhKGXzVTYCz1go0S1tLaNbQDQ==", + "node_modules/strip-dirs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz", + "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==", + "license": "MIT", + "dependencies": { + "is-natural-number": "^4.0.1" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true, - "license": "BlueOak-1.0.0", + "license": "MIT", "engines": { - "node": "20 || >=22" - }, - "peerDependencies": { - "@tapjs/core": "4.5.1" + "node": ">=6" } }, - "node_modules/tap/node_modules/@tapjs/config": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@tapjs/config/-/config-5.5.1.tgz", - "integrity": "sha512-j2pg8+MMlTLX0FKU9cHqc4HkauV0c/ClfMYqkIriOWsibhuFJ0hdoP5b+MQSHgbENctgeI7gVBIW4aaHPa9/bA==", + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", "dev": true, - "license": "BlueOak-1.0.0", + "license": "MIT", "dependencies": { - "@tapjs/core": "4.5.1", - "@tapjs/test": "4.4.1", - "chalk": "^5.6.2", - "jackspeak": "^4.2.3", - "polite-json": "^5.0.0", - "tap-yaml": "4.3.0", - "walk-up-path": "^4.0.0" + "min-indent": "^1.0.0" }, "engines": { - "node": "20 || >=22" + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "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" }, "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "peerDependencies": { - "@tapjs/core": "4.5.1", - "@tapjs/test": "4.4.1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/tap/node_modules/@tapjs/core": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/@tapjs/core/-/core-4.5.1.tgz", - "integrity": "sha512-fDZ3iwmXkjv+QuMYMmKnqFhIib2hspTfmBieCbMM6YcTL3FJWGebj0+nA0X43EMOgNlLrvCY6X/KolqEeu/+TA==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@tapjs/processinfo": "^3.1.9", - "@tapjs/stack": "4.3.0", - "@tapjs/test": "4.4.1", - "async-hook-domain": "^4.0.1", - "diff": "^8.0.2", - "is-actual-promise": "^1.0.1", - "minipass": "^7.0.4", - "signal-exit": "4.1", - "tap-parser": "18.3.0", - "tap-yaml": "4.3.0", - "tcompare": "9.3.0", - "trivial-deferred": "^2.0.0" + "node_modules/strip-outer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", + "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.2" }, "engines": { - "node": "20 || >=22" + "node": ">=0.10.0" } }, - "node_modules/tap/node_modules/@tapjs/filter": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@tapjs/filter/-/filter-4.3.3.tgz", - "integrity": "sha512-qohTjnMtLjU8/VIe24FjvNmZ55NRV/wK/rvI0D4tuPGlcJwe99tDs5hZ/uWGYzZ5jneqqH2s9EoH6j1bxZ74WA==", + "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==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/strip-url-auth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-url-auth/-/strip-url-auth-1.0.1.tgz", + "integrity": "sha512-++41PnXftlL3pvI6lpvhSEO+89g1kIJC4MYB5E6yH+WHa5InIqz51yGd1YOGd7VNSNdoEOfzTMqbAM/2PbgaHQ==", "dev": true, - "license": "BlueOak-1.0.0", + "license": "MIT", "engines": { - "node": "20 || >=22" + "node": ">=0.10.0" + } + }, + "node_modules/style-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-4.0.0.tgz", + "integrity": "sha512-1V4WqhhZZgjVAVJyt7TdDPZoPBPNHbekX4fWnCJL1yQukhCeZhJySUL+gL9y6sNdN95uEOS83Y55SqHcP7MzLA==", + "license": "MIT", + "engines": { + "node": ">= 18.12.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "type": "opencollective", + "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "@tapjs/core": "4.5.1" + "webpack": "^5.27.0" } }, - "node_modules/tap/node_modules/@tapjs/fixture": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@tapjs/fixture/-/fixture-4.3.3.tgz", - "integrity": "sha512-uMySXLR1JC/lQp/nxbYTY6wn3ziuS/lkvw/7Ob7/sa47jUHDzGNQuLYN2/Q2Xw+R6xIW061LfxtHBEP6/PRdpA==", + "node_modules/super-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/super-regex/-/super-regex-1.1.0.tgz", + "integrity": "sha512-WHkws2ZflZe41zj6AolvvmaTrWds/VuyeYr9iPVv/oQeaIoVxMKaushfFWpOGDT+GuBrM/sVqF8KUCYQlSSTdQ==", "dev": true, - "license": "BlueOak-1.0.0", + "license": "MIT", "dependencies": { - "mkdirp": "^3.0.0", - "rimraf": "^6.0.0" + "function-timeout": "^1.0.1", + "make-asynchronous": "^1.0.1", + "time-span": "^5.1.0" }, "engines": { - "node": "20 || >=22" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "peerDependencies": { - "@tapjs/core": "4.5.1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/tap/node_modules/@tapjs/intercept": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@tapjs/intercept/-/intercept-4.3.3.tgz", - "integrity": "sha512-0uxtyL/PuvjbrnTTJnCektTrVQjdN96luR+1iuWd4uFKMMQEyJz/qCx2Pqh3yIWSLjFSNsuStPvZ2DFIVHrvSA==", - "dev": true, - "license": "BlueOak-1.0.0", + "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": { - "@tapjs/after": "3.3.3", - "@tapjs/stack": "4.3.0" + "has-flag": "^4.0.0" }, "engines": { - "node": "20 || >=22" - }, - "peerDependencies": { - "@tapjs/core": "4.5.1" + "node": ">=8" } }, - "node_modules/tap/node_modules/@tapjs/mock": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@tapjs/mock/-/mock-4.4.1.tgz", - "integrity": "sha512-jdn5FE/kgsTWabe8VegnAv4LMYxEKfhvK/9QCLirngjleWLFSZNVhEv0eawpNwnnjKuXbxj1t2j6Q6DblYKi4A==", + "node_modules/supports-hyperlinks": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.2.0.tgz", + "integrity": "sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==", "dev": true, - "license": "BlueOak-1.0.0", + "license": "MIT", "dependencies": { - "@tapjs/after": "3.3.3", - "@tapjs/stack": "4.3.0", - "resolve-import": "^2.4.0", - "walk-up-path": "^4.0.0" + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" }, "engines": { - "node": "20 || >=22" + "node": ">=14.18" }, "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "peerDependencies": { - "@tapjs/core": "4.5.1" + "url": "https://github.com/chalk/supports-hyperlinks?sponsor=1" } }, - "node_modules/tap/node_modules/@tapjs/node-serialize": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@tapjs/node-serialize/-/node-serialize-4.3.3.tgz", - "integrity": "sha512-PuXE4xiXjmUIM99z4h+QDyQI8vFZoEvxtFF1vZExE6up7Ab6T+a4g0nGjSbfMSanIgVjbQPr/S0LW4KH6zqcJw==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@tapjs/error-serdes": "4.3.0", - "@tapjs/stack": "4.3.0", - "tap-parser": "18.3.0" - }, + "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==", + "license": "MIT", "engines": { - "node": "20 || >=22" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "peerDependencies": { - "@tapjs/core": "4.5.1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/tap/node_modules/@tapjs/reporter": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/@tapjs/reporter/-/reporter-4.4.3.tgz", - "integrity": "sha512-+4TC4w7yGLwGOKf/tDe+4C+Ancs+9bsnMxdqsGT5SPPCdxqB64EgOPUu6dGBA/miAEr6VVyCIxErriW/KFTVBA==", + "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==", + "license": "MIT" + }, + "node_modules/sync-content": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/sync-content/-/sync-content-2.0.4.tgz", + "integrity": "sha512-w3ioiBmbaogob33WdLnuwFk+8tpePI58CTWKqtdAgEqc2hfGuSwP02gPETqNX/3PLS5skv5a1wQR0gbaa2W0XQ==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { - "@tapjs/config": "5.5.1", - "@tapjs/stack": "4.3.0", - "chalk": "^5.6.2", - "ink": "^5.2.1", - "minipass": "^7.0.4", - "ms": "^2.1.3", - "patch-console": "^2.0.0", - "prismjs-terminal": "^1.2.3", - "react": "^18.2.0", - "string-length": "^6.0.0", - "tap-parser": "18.3.0", - "tap-yaml": "4.3.0", - "tcompare": "9.3.0" + "glob": "^13.0.1", + "mkdirp": "^3.0.1", + "path-scurry": "^2.0.0", + "rimraf": "^6.0.0" + }, + "bin": { + "sync-content": "dist/esm/bin.mjs" }, "engines": { "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" - }, - "peerDependencies": { - "@tapjs/core": "4.5.1" } }, - "node_modules/tap/node_modules/@tapjs/run": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/@tapjs/run/-/run-4.5.1.tgz", - "integrity": "sha512-quUh0PUv8gKX9bVL9hiUrI1B2dMj2sybsnRnXyfQ+tnG0zV/nK5rosXQ13J8FyTufsKh5Jwp+2FGAH7+CT3X/A==", + "node_modules/sync-content/node_modules/glob": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.1.tgz", + "integrity": "sha512-B7U/vJpE3DkJ5WXTgTpTRN63uV42DseiXXKMwG14LQBXmsdeIoHAPbU/MEo6II0k5ED74uc2ZGTC6MwHFQhF6w==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { - "@isaacs/which": "^7.0.4", - "@tapjs/after": "3.3.3", - "@tapjs/before": "4.3.3", - "@tapjs/config": "5.5.1", - "@tapjs/processinfo": "^3.1.9", - "@tapjs/reporter": "4.4.3", - "@tapjs/spawn": "4.3.3", - "@tapjs/stdin": "4.3.3", - "@tapjs/test": "4.4.1", - "c8": "^10.1.3", - "chalk": "^5.6.2", - "chokidar": "^4.0.2", - "foreground-child": "^4.0.0", - "glob": "^13.0.2", - "minipass": "^7.0.4", - "mkdirp": "^3.0.1", - "node-options-to-argv": "^1.0.0", - "opener": "^1.5.2", - "pacote": "^21.0.4", - "path-scurry": "^2.0.0", - "resolve-import": "^2.4.0", - "rimraf": "^6.0.0", - "semver": "^7.7.2", - "signal-exit": "^4.1.0", - "tap-parser": "18.3.0", - "tap-yaml": "4.3.0", - "tcompare": "9.3.0", - "trivial-deferred": "^2.0.0" - }, - "bin": { - "tap-run": "dist/esm/index.js" + "minimatch": "^10.1.2", + "minipass": "^7.1.2", + "path-scurry": "^2.0.0" }, "engines": { "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" - }, - "peerDependencies": { - "@tapjs/core": "4.5.1" } }, - "node_modules/tap/node_modules/@tapjs/snapshot": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@tapjs/snapshot/-/snapshot-4.3.3.tgz", - "integrity": "sha512-l8cFbXc97GvL1qjnhdvbsDQZ4ze1CT+vfr3gJdXB4ZhBAKRBmfnXrmFcuyTRANWwb27GOTOISP8fc33bNX7bSA==", + "node_modules/sync-content/node_modules/minimatch": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.2.tgz", + "integrity": "sha512-fu656aJ0n2kcXwsnwnv9g24tkU5uSmOlTjd6WyyaKm2Z+h1qmY6bAjrcaIxF/BslFqbZ8UBtbJi7KgQOZD2PTw==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { - "is-actual-promise": "^1.0.1", - "tcompare": "9.3.0", - "trivial-deferred": "^2.0.0" + "@isaacs/brace-expansion": "^5.0.1" }, "engines": { "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" - }, - "peerDependencies": { - "@tapjs/core": "4.5.1" } }, - "node_modules/tap/node_modules/@tapjs/spawn": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@tapjs/spawn/-/spawn-4.3.3.tgz", - "integrity": "sha512-YSwCN+7sooEvICF3T3eB6mJy9kEn7AFDyCVH3M6uHiKNUXKj834nrHfKMZbaRydVFTOTGYupqOdLXsr7Czcljg==", + "node_modules/sync-content/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": "BlueOak-1.0.0", + "license": "ISC", "engines": { - "node": "20 || >=22" - }, - "peerDependencies": { - "@tapjs/core": "4.5.1" + "node": ">=16 || 14 >=14.17" } }, - "node_modules/tap/node_modules/@tapjs/stdin": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@tapjs/stdin/-/stdin-4.3.3.tgz", - "integrity": "sha512-8cAD0h7llgVVeavPUCtentKSzwLeLKDYfF5v6huPEArl6yTqXuj2zTI2VWyYDOEdQl/afkjxagGsGmzWk3K38g==", + "node_modules/sync-content/node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", "dev": true, - "license": "BlueOak-1.0.0", + "license": "MIT", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, "engines": { - "node": "20 || >=22" + "node": ">=10" }, - "peerDependencies": { - "@tapjs/core": "4.5.1" + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/tap/node_modules/@tapjs/test": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@tapjs/test/-/test-4.4.1.tgz", - "integrity": "sha512-yn5eFeg0zzw11Q14Fhwy0WFwEata5ez/LEC33NPOhpPxeqWzhaqjXXNKk+/qaydF8CbEclDUNIILeu605pjI3A==", + "node_modules/sync-content/node_modules/rimraf": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.1.0.tgz", + "integrity": "sha512-DxdlA1bdNzkZK7JiNWH+BAx1x4tEJWoTofIopFo6qWUU94jYrFZ0ubY05TqH3nWPJ1nKa1JWVFDINZ3fnrle/A==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { - "@isaacs/ts-node-temp-fork-for-pr-2009": "^10.9.7", - "@tapjs/after": "3.3.3", - "@tapjs/after-each": "4.3.3", - "@tapjs/asserts": "4.3.3", - "@tapjs/before": "4.3.3", - "@tapjs/before-each": "4.3.3", - "@tapjs/chdir": "3.3.3", - "@tapjs/filter": "4.3.3", - "@tapjs/fixture": "4.3.3", - "@tapjs/intercept": "4.3.3", - "@tapjs/mock": "4.4.1", - "@tapjs/node-serialize": "4.3.3", - "@tapjs/snapshot": "4.3.3", - "@tapjs/spawn": "4.3.3", - "@tapjs/stdin": "4.3.3", - "@tapjs/typescript": "3.5.3", - "@tapjs/worker": "4.3.3", - "glob": "^13.0.2", - "jackspeak": "^4.2.3", - "mkdirp": "^3.0.0", - "package-json-from-dist": "^1.0.0", - "resolve-import": "^2.4.0", - "rimraf": "^6.0.0", - "sync-content": "^2.0.4", - "tap-parser": "18.3.0", - "tshy": "^3.3.2", - "typescript": "5.9", - "walk-up-path": "^4.0.0" + "glob": "^11.0.3", + "package-json-from-dist": "^1.0.1" }, "bin": { - "generate-tap-test-class": "dist/esm/build.mjs" + "rimraf": "dist/esm/bin.mjs" }, "engines": { "node": "20 || >=22" }, - "peerDependencies": { - "@tapjs/core": "4.5.1" + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/tap/node_modules/@tapjs/typescript": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/@tapjs/typescript/-/typescript-3.5.3.tgz", - "integrity": "sha512-YrDlDxESUMioAlx5ddfrnnTKCXAe+prX+iKF/sVaSDSzkxQh9eKB1zvFaP3W/CTb+gTR8vp2UeYF3JtApBae8A==", + "node_modules/sync-content/node_modules/rimraf/node_modules/glob": { + "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": { - "@isaacs/ts-node-temp-fork-for-pr-2009": "^10.9.7" + "foreground-child": "^3.3.1", + "jackspeak": "^4.1.1", + "minimatch": "^10.1.1", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^2.0.0" + }, + "bin": { + "glob": "dist/esm/bin.mjs" }, "engines": { "node": "20 || >=22" }, - "peerDependencies": { - "@tapjs/core": "4.5.1" + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/tap/node_modules/@tapjs/worker": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@tapjs/worker/-/worker-4.3.3.tgz", - "integrity": "sha512-bQvpqdSJlklfYqxANLvdwU9M2rLu5eSv4x65pSZxWIW3K/oz/8SN+/JG0i8qixioQWZz/QVV82EpfZIgDE1J3g==", + "node_modules/table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": "20 || >=22" + "license": "BSD-3-Clause", + "dependencies": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" }, - "peerDependencies": { - "@tapjs/core": "4.5.1" + "engines": { + "node": ">=6.0.0" } }, - "node_modules/tap/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "node_modules/table/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "license": "MIT", - "engines": { - "node": ">=12" + "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": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/tap/node_modules/balanced-match": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.3.tgz", - "integrity": "sha512-1pHv8LX9CpKut1Zp4EXey7Z8OfH11ONNH6Dhi2WDUt31VVZFXZzKwXcysBgqSumFCmR+0dqjMK5v5JiFHzi0+g==", + "node_modules/table/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "dev": true, "license": "MIT", "engines": { - "node": "20 || >=22" + "node": ">=6" } }, - "node_modules/tap/node_modules/brace-expansion": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.2.tgz", - "integrity": "sha512-Pdk8c9poy+YhOgVWw1JNN22/HcivgKWwpxKq04M/jTmHyCZn12WPJebZxdjSa5TmBqISrUSgNYU3eRORljfCCw==", + "node_modules/table/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^4.0.2" + "color-convert": "^1.9.0" }, "engines": { - "node": "20 || >=22" + "node": ">=4" } }, - "node_modules/tap/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==", + "node_modules/table/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "dependencies": { + "color-name": "1.1.3" } }, - "node_modules/tap/node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "node_modules/table/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true, - "license": "MIT", - "dependencies": { - "readdirp": "^4.0.1" - }, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } + "license": "MIT" }, - "node_modules/tap/node_modules/diff": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.3.tgz", - "integrity": "sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ==", + "node_modules/table/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } + "license": "MIT" }, - "node_modules/tap/node_modules/foreground-child": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-4.0.3.tgz", - "integrity": "sha512-yeXZaNbCBGaT9giTpLPBdtedzjwhlJBUoL/R4BVQU5mn0TQXOHwVIl1Q2DMuBIdNno4ktA1abZ7dQFVxD6uHxw==", + "node_modules/table/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "signal-exit": "^4.0.1" - }, + "license": "MIT", "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=4" } }, - "node_modules/tap/node_modules/glob": { - "version": "13.0.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", - "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", + "node_modules/table/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": "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" - } + "license": "MIT" }, - "node_modules/tap/node_modules/minimatch": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.2.tgz", - "integrity": "sha512-+G4CpNBxa5MprY+04MbgOw1v7So6n5JY166pFi9KfYwT78fxScCeSNQSNzp6dpPSW2rONOps6Ocam1wFhCgoVw==", + "node_modules/table/node_modules/slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", "dev": true, - "license": "BlueOak-1.0.0", + "license": "MIT", "dependencies": { - "brace-expansion": "^5.0.2" + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" }, "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=6" } }, - "node_modules/tap/node_modules/minipass": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", - "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "node_modules/table/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, - "license": "BlueOak-1.0.0", + "license": "MIT", + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=6" } }, - "node_modules/tap/node_modules/mkdirp": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", - "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "node_modules/table/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "license": "MIT", - "bin": { - "mkdirp": "dist/cjs/src/bin.js" + "dependencies": { + "ansi-regex": "^4.1.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=6" } }, - "node_modules/tap/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==", + "node_modules/tagged-tag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz", + "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==", "dev": true, "license": "MIT", "engines": { - "node": ">= 14.18.0" + "node": ">=20" }, "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/tap/node_modules/rimraf": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.1.3.tgz", - "integrity": "sha512-LKg+Cr2ZF61fkcaK1UdkH2yEBBKnYjTyWzTJT6KNPcSPaiT7HSdhtMXQuN5wkTX0Xu72KQ1l8S42rlmexS2hSA==", + "node_modules/tap": { + "version": "21.6.2", + "resolved": "https://registry.npmjs.org/tap/-/tap-21.6.2.tgz", + "integrity": "sha512-rEuxX+EVGQ6JOEyRnLQ80fa7v5s8yutpRA11LAjP6t/B6I0/mTWkaW0NfVoX5XDX3z5x9HVEt2dojSrJLcyp9A==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { - "glob": "^13.0.3", - "package-json-from-dist": "^1.0.1" + "@tapjs/after": "3.3.4", + "@tapjs/after-each": "4.3.4", + "@tapjs/asserts": "4.3.4", + "@tapjs/before": "4.3.4", + "@tapjs/before-each": "4.3.4", + "@tapjs/chdir": "3.3.4", + "@tapjs/core": "4.5.2", + "@tapjs/filter": "4.3.4", + "@tapjs/fixture": "4.3.4", + "@tapjs/intercept": "4.3.4", + "@tapjs/mock": "4.4.2", + "@tapjs/node-serialize": "4.3.4", + "@tapjs/run": "4.5.2", + "@tapjs/snapshot": "4.3.4", + "@tapjs/spawn": "4.3.4", + "@tapjs/stdin": "4.3.4", + "@tapjs/test": "4.4.2", + "@tapjs/typescript": "3.5.4", + "@tapjs/worker": "4.3.4", + "resolve-import": "^2.4.0" }, "bin": { - "rimraf": "dist/esm/bin.mjs" + "tap": "dist/esm/run.mjs" }, "engines": { "node": "20 || >=22" @@ -38880,62 +39172,35 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/tap/node_modules/semver": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/tap/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": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/tap/node_modules/string-length": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-6.0.0.tgz", - "integrity": "sha512-1U361pxZHEQ+FeSjzqRpV+cu2vTzYeWeafXFLykiFlv4Vc0n3njgU8HrMbyik5uwm77naWMuVG8fhEF+Ovb1Kg==", + "node_modules/tap-parser": { + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-18.3.0.tgz", + "integrity": "sha512-sa0M18e6RARfO0Lrm1zbQvb+7G4G/ThkFIJFvjeH1DKenl4xwyUgpRUCb5Jq64Xe086p4auiLvRzfpRjGd3Zow==", "dev": true, - "license": "MIT", + "license": "BlueOak-1.0.0", "dependencies": { - "strip-ansi": "^7.1.0" + "events-to-array": "^2.0.3", + "tap-yaml": "4.3.0" }, - "engines": { - "node": ">=16" + "bin": { + "tap-parser": "bin/cmd.cjs" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": "20 || >=22" } }, - "node_modules/tap/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "node_modules/tap-yaml": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/tap-yaml/-/tap-yaml-4.3.0.tgz", + "integrity": "sha512-48BiwXj3cUa1Lt6BLzfawJGZVihfRCY19gyjaHftQpe8ulEmB9gZW9kChQkdb0+L4YUlGWUJMpWRAJ/9bPSgVA==", "dev": true, - "license": "MIT", + "license": "BlueOak-1.0.0", "dependencies": { - "ansi-regex": "^6.0.1" + "yaml": "^2.8.1", + "yaml-types": "^0.4.0" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "node": "20 || >=22" } }, "node_modules/tapable": { @@ -42896,7 +43161,7 @@ "scratch-storage": "6.1.8", "scratch-webpack-configuration": "3.1.1", "semantic-release": "25.0.3", - "tap": "21.6.1", + "tap": "21.6.2", "terser-webpack-plugin": "5.3.16", "typedoc": "0.28.16", "webpack": "5.105.2", @@ -43062,7 +43327,7 @@ "scratch-semantic-release-config": "4.0.1", "scratch-webpack-configuration": "3.1.1", "semantic-release": "25.0.3", - "tap": "21.6.1", + "tap": "21.6.2", "webpack": "5.105.2", "webpack-cli": "5.1.4", "webpack-dev-server": "5.2.3", @@ -43157,7 +43422,7 @@ "script-loader": "0.7.2", "semantic-release": "25.0.3", "stats.js": "0.17.0", - "tap": "21.6.1", + "tap": "21.6.2", "tiny-worker": "2.3.0", "typedoc": "0.28.16", "webpack": "5.105.2", diff --git a/packages/scratch-render/package.json b/packages/scratch-render/package.json index 870db6494dd..dd6acc1bd50 100644 --- a/packages/scratch-render/package.json +++ b/packages/scratch-render/package.json @@ -82,7 +82,7 @@ "scratch-storage": "6.1.8", "scratch-webpack-configuration": "3.1.1", "semantic-release": "25.0.3", - "tap": "21.6.1", + "tap": "21.6.2", "terser-webpack-plugin": "5.3.16", "typedoc": "0.28.16", "webpack": "5.105.2", diff --git a/packages/scratch-svg-renderer/package.json b/packages/scratch-svg-renderer/package.json index 5aaa3e28d61..7497f5c5590 100644 --- a/packages/scratch-svg-renderer/package.json +++ b/packages/scratch-svg-renderer/package.json @@ -72,7 +72,7 @@ "scratch-semantic-release-config": "4.0.1", "scratch-webpack-configuration": "3.1.1", "semantic-release": "25.0.3", - "tap": "21.6.1", + "tap": "21.6.2", "webpack": "5.105.2", "webpack-cli": "5.1.4", "webpack-dev-server": "5.2.3", diff --git a/packages/scratch-vm/package.json b/packages/scratch-vm/package.json index 9a91b82dc3b..3c38f582118 100644 --- a/packages/scratch-vm/package.json +++ b/packages/scratch-vm/package.json @@ -107,7 +107,7 @@ "script-loader": "0.7.2", "semantic-release": "25.0.3", "stats.js": "0.17.0", - "tap": "21.6.1", + "tap": "21.6.2", "tiny-worker": "2.3.0", "typedoc": "0.28.16", "webpack": "5.105.2", From 37568e003ace77206009160a14a5c35be34ede46 Mon Sep 17 00:00:00 2001 From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com> Date: Fri, 20 Feb 2026 14:09:55 -0800 Subject: [PATCH 261/521] fix: resolve oops on dragging code to backpack --- .../scratch-gui/src/containers/backpack.jsx | 25 +++++++++++++------ .../src/lib/backpack/block-to-image.js | 14 ++++++++--- 2 files changed, 29 insertions(+), 10 deletions(-) diff --git a/packages/scratch-gui/src/containers/backpack.jsx b/packages/scratch-gui/src/containers/backpack.jsx index aef0afe1632..f9a0936b274 100644 --- a/packages/scratch-gui/src/containers/backpack.jsx +++ b/packages/scratch-gui/src/containers/backpack.jsx @@ -97,6 +97,11 @@ class Backpack extends React.Component { // Creating the payload is async, so set loading before starting this.setState({loading: true}, () => { + // If there's a failure before the backpack state changes, then we don't need to set the backpack into an + // error state. The operation failed, but the backpack is still potentially usable and consistent. If the + // backpack state might have changed on the server OR client by the time of the failure, then we should + // set the backpack into an error state. + let backpackMightHaveChanged = false; payloader(dragInfo.payload, this.props.vm) .then(payload => { // Force the asset to save to the asset server before storing in backpack @@ -111,12 +116,18 @@ class Backpack extends React.Component { } return payload; }) - .then(payload => saveBackpackObject({ - host: this.props.host, - token: this.props.token, - username: this.props.username, - ...payload - })) + .then(payload => { + // If the backpack save fails, the local and server backpack may or may not be out of sync. + // The editor might be able to function, but that might lead to lost work. + // In other words, a failure here or later should set the backpack into an error state. + backpackMightHaveChanged = true; + return saveBackpackObject({ + host: this.props.host, + token: this.props.token, + username: this.props.username, + ...payload + }); + }) .then(item => { this.setState({ loading: false, @@ -124,7 +135,7 @@ class Backpack extends React.Component { }); }) .catch(error => { - this.setState({error: true, loading: false}); + this.setState({error: backpackMightHaveChanged, loading: false}); throw error; }); }); diff --git a/packages/scratch-gui/src/lib/backpack/block-to-image.js b/packages/scratch-gui/src/lib/backpack/block-to-image.js index ef67f82adfb..d74557864b4 100644 --- a/packages/scratch-gui/src/lib/backpack/block-to-image.js +++ b/packages/scratch-gui/src/lib/backpack/block-to-image.js @@ -1,14 +1,22 @@ import computedStyleToInlineStyle from 'computed-style-to-inline-style'; -import ScratchBlocks from 'scratch-blocks'; +import {ScratchBlocks} from 'scratch-blocks'; + +/** + * @import {WorkspaceSvg} from 'blockly/core' + */ /** * Given a blockId, return a data-uri image that can be used to create a thumbnail. * @param {string} blockId the ID of the block to imagify - * @returns {Promise} resolves to a data-url of a picture of the blocks + * @returns {Promise} resolves to a data-url of a picture of the blocks */ export default function (blockId) { // Not sure any better way to access the scratch-blocks workspace than this... - const block = ScratchBlocks.getMainWorkspace().getBlockById(blockId); + const workspace = /** @type {WorkspaceSvg} */ (ScratchBlocks.getMainWorkspace()); + const block = workspace.getBlockById(blockId); + if (!block) { + return Promise.reject(new Error(`No block found with id ${blockId} in workspace ${workspace.id}`)); + } const blockSvg = block.getSvgRoot().cloneNode(true /* deep */); // Once we have the cloned SVG, do the rest in a setTimeout to prevent From ef586ff9c29f40d919ea0f21ab601bc5f37c439b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 23 Feb 2026 23:09:44 +0000 Subject: [PATCH 262/521] style(deps): update dependency eslint-config-scratch to v12.0.50 --- package-lock.json | 37 +++++++--------------- packages/scratch-gui/package.json | 2 +- packages/scratch-render/package.json | 2 +- packages/scratch-svg-renderer/package.json | 2 +- packages/scratch-vm/package.json | 2 +- packages/task-herder/package.json | 2 +- 6 files changed, 17 insertions(+), 30 deletions(-) diff --git a/package-lock.json b/package-lock.json index 61b5c46c5da..183af0ed523 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3316,9 +3316,9 @@ "license": "MIT" }, "node_modules/@eslint/js": { - "version": "9.39.2", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz", - "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==", + "version": "9.39.3", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.3.tgz", + "integrity": "sha512-1B1VkCq6FuUNlQvlBYb+1jDu/gV297TIs/OeiaSR9l1H27SVW55ONE1e1Vp16NqP683+xEGzxYtv4XCiDPaQiw==", "dev": true, "license": "MIT", "engines": { @@ -18056,16 +18056,16 @@ } }, "node_modules/eslint-config-scratch": { - "version": "12.0.49", - "resolved": "https://registry.npmjs.org/eslint-config-scratch/-/eslint-config-scratch-12.0.49.tgz", - "integrity": "sha512-ush96swq/qBlbK5Ej8TREgVMQIozpTlKQZECFWV5s+thu2zWFB+jSgLMXorjaAx+6CbCRf+sI4SiGBdlCl2UxQ==", + "version": "12.0.50", + "resolved": "https://registry.npmjs.org/eslint-config-scratch/-/eslint-config-scratch-12.0.50.tgz", + "integrity": "sha512-R6YaWlZJRE0BxPnzaqN6LuF9HG96o7Gq0fMFcp+Z1u/sysfdrBZXKv5z5ub1TaOSJLnKBK7FX6K3l4bOCJ7gEg==", "dev": true, "license": "BSD-3-Clause", "dependencies": { "@babel/eslint-parser": "7.28.6", "@eslint-community/eslint-plugin-eslint-comments": "4.6.0", "@eslint/eslintrc": "3.3.3", - "@eslint/js": "9.39.2", + "@eslint/js": "9.39.3", "@eslint/markdown": "7.5.1", "@stylistic/eslint-plugin": "^5.3.1", "@trivago/prettier-plugin-sort-imports": "5.2.2", @@ -18602,19 +18602,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/@eslint/js": { - "version": "9.39.3", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.3.tgz", - "integrity": "sha512-1B1VkCq6FuUNlQvlBYb+1jDu/gV297TIs/OeiaSR9l1H27SVW55ONE1e1Vp16NqP683+xEGzxYtv4XCiDPaQiw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - } - }, "node_modules/eslint/node_modules/ajv": { "version": "6.14.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", @@ -43069,7 +43056,7 @@ "cheerio": "1.2.0", "cross-env": "7.0.3", "eslint": "9.39.3", - "eslint-config-scratch": "12.0.49", + "eslint-config-scratch": "12.0.50", "eslint-import-resolver-webpack": "0.13.10", "eslint-plugin-import": "2.32.0", "eslint-plugin-react": "7.37.5", @@ -43151,7 +43138,7 @@ "copy-webpack-plugin": "6.4.1", "docdash": "0.4.0", "eslint": "9.39.3", - "eslint-config-scratch": "12.0.49", + "eslint-config-scratch": "12.0.50", "gh-pages": "1.2.0", "globals": "16.5.0", "html-webpack-plugin": "5.6.6", @@ -43318,7 +43305,7 @@ "babel-loader": "9.2.1", "copy-webpack-plugin": "6.4.1", "eslint": "9.39.3", - "eslint-config-scratch": "12.0.49", + "eslint-config-scratch": "12.0.50", "globals": "16.5.0", "jsdom": "13.2.0", "mkdirp": "2.1.6", @@ -43406,7 +43393,7 @@ "copy-webpack-plugin": "6.4.1", "docdash": "1.2.0", "eslint": "9.39.3", - "eslint-config-scratch": "12.0.49", + "eslint-config-scratch": "12.0.50", "expose-loader": "1.0.3", "file-loader": "6.2.0", "format-message-cli": "6.2.4", @@ -43564,7 +43551,7 @@ "devDependencies": { "@vitest/coverage-v8": "4.0.18", "eslint": "9.39.3", - "eslint-config-scratch": "12.0.49", + "eslint-config-scratch": "12.0.50", "prettier": "3.8.1", "rimraf": "6.1.2", "typescript": "5.9.3", diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index 4e4e74bf703..b282cba26da 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -196,7 +196,7 @@ "cheerio": "1.2.0", "cross-env": "7.0.3", "eslint": "9.39.3", - "eslint-config-scratch": "12.0.49", + "eslint-config-scratch": "12.0.50", "eslint-import-resolver-webpack": "0.13.10", "eslint-plugin-import": "2.32.0", "eslint-plugin-react": "7.37.5", diff --git a/packages/scratch-render/package.json b/packages/scratch-render/package.json index dd6acc1bd50..53fd979eb40 100644 --- a/packages/scratch-render/package.json +++ b/packages/scratch-render/package.json @@ -72,7 +72,7 @@ "copy-webpack-plugin": "6.4.1", "docdash": "0.4.0", "eslint": "9.39.3", - "eslint-config-scratch": "12.0.49", + "eslint-config-scratch": "12.0.50", "gh-pages": "1.2.0", "globals": "16.5.0", "html-webpack-plugin": "5.6.6", diff --git a/packages/scratch-svg-renderer/package.json b/packages/scratch-svg-renderer/package.json index 7497f5c5590..96f82a5b37a 100644 --- a/packages/scratch-svg-renderer/package.json +++ b/packages/scratch-svg-renderer/package.json @@ -63,7 +63,7 @@ "babel-loader": "9.2.1", "copy-webpack-plugin": "6.4.1", "eslint": "9.39.3", - "eslint-config-scratch": "12.0.49", + "eslint-config-scratch": "12.0.50", "globals": "16.5.0", "jsdom": "13.2.0", "mkdirp": "2.1.6", diff --git a/packages/scratch-vm/package.json b/packages/scratch-vm/package.json index 3c38f582118..ca883194f9c 100644 --- a/packages/scratch-vm/package.json +++ b/packages/scratch-vm/package.json @@ -91,7 +91,7 @@ "copy-webpack-plugin": "6.4.1", "docdash": "1.2.0", "eslint": "9.39.3", - "eslint-config-scratch": "12.0.49", + "eslint-config-scratch": "12.0.50", "expose-loader": "1.0.3", "file-loader": "6.2.0", "format-message-cli": "6.2.4", diff --git a/packages/task-herder/package.json b/packages/task-herder/package.json index 4f0e1076781..e057408a9c5 100644 --- a/packages/task-herder/package.json +++ b/packages/task-herder/package.json @@ -45,7 +45,7 @@ "devDependencies": { "@vitest/coverage-v8": "4.0.18", "eslint": "9.39.3", - "eslint-config-scratch": "12.0.49", + "eslint-config-scratch": "12.0.50", "prettier": "3.8.1", "rimraf": "6.1.2", "typescript": "5.9.3", From 6b872e5ecfed32bad60106ba73fb9f8975f94dd9 Mon Sep 17 00:00:00 2001 From: Krum Angelov Date: Tue, 24 Feb 2026 09:10:15 +0200 Subject: [PATCH 263/521] chore: changed fallback to untranslated words instead of empty string --- packages/scratch-vm/src/extensions/scratch3_translate/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/scratch-vm/src/extensions/scratch3_translate/index.js b/packages/scratch-vm/src/extensions/scratch3_translate/index.js index b70d9e2748a..4141ed88900 100644 --- a/packages/scratch-vm/src/extensions/scratch3_translate/index.js +++ b/packages/scratch-vm/src/extensions/scratch3_translate/index.js @@ -278,7 +278,7 @@ class Scratch3TranslateBlocks { }) .catch(err => { log.warn(`error fetching translate result! ${err}`); - return ''; + return args.WORDS; }); return translatePromise; } From dcca1ddb5efaba502c5506c7fc76a54243bc9f62 Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Wed, 25 Feb 2026 15:31:42 +0000 Subject: [PATCH 264/521] chore(release): 12.7.0 [skip ci] --- package-lock.json | 40 +++++++++++++--------- package.json | 2 +- packages/scratch-gui/package.json | 8 ++--- packages/scratch-render/package.json | 6 ++-- packages/scratch-svg-renderer/package.json | 2 +- packages/scratch-vm/package.json | 6 ++-- packages/task-herder/package.json | 2 +- 7 files changed, 36 insertions(+), 30 deletions(-) diff --git a/package-lock.json b/package-lock.json index 183af0ed523..a59744f2ba9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "scratch-editor", - "version": "12.6.2", + "version": "12.7.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "scratch-editor", - "version": "12.6.2", + "version": "12.7.0", "license": "AGPL-3.0-only", "workspaces": [ "packages/task-herder", @@ -36544,6 +36544,12 @@ "minilog": "^3.1.0" } }, + "node_modules/scratch-storage/node_modules/@scratch/task-herder": { + "version": "12.6.2", + "resolved": "https://registry.npmjs.org/@scratch/task-herder/-/task-herder-12.6.2.tgz", + "integrity": "sha512-x3R/+ttXOqKCfS25YVkuyhFX5CZ1+wTNDELsYhvmayXcOhuQwZFTnQWt2RtrYzTJnZ6iNVT6KgvQyEIyTKBmUQ==", + "license": "AGPL-3.0-only" + }, "node_modules/scratch-translate-extension-languages": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/scratch-translate-extension-languages/-/scratch-translate-extension-languages-1.0.7.tgz", @@ -42966,15 +42972,15 @@ }, "packages/scratch-gui": { "name": "@scratch/scratch-gui", - "version": "12.6.2", + "version": "12.7.0", "license": "AGPL-3.0-only", "dependencies": { "@mediapipe/face_detection": "0.4.1646425229", "@microbit/microbit-universal-hex": "0.2.2", "@radix-ui/react-context-menu": "2.2.16", - "@scratch/scratch-render": "12.6.2", - "@scratch/scratch-svg-renderer": "12.6.2", - "@scratch/scratch-vm": "12.6.2", + "@scratch/scratch-render": "12.7.0", + "@scratch/scratch-svg-renderer": "12.7.0", + "@scratch/scratch-vm": "12.7.0", "@tensorflow-models/face-detection": "1.0.3", "@tensorflow/tfjs": "4.22.0", "@testing-library/user-event": "14.6.1", @@ -43099,9 +43105,9 @@ "extraneous": true }, "packages/scratch-gui/node_modules/@scratch/scratch-vm/node_modules/scratch-storage": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-6.1.3.tgz", - "integrity": "sha512-xoUIB7/MNF2864lz6mfwGxKwlp7LdpvM4k+amzp3RwtYlQIjca9t/U8dngKKS0zEz4Fc1fuykYRqRPchVnE+Fg==", + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-6.1.5.tgz", + "integrity": "sha512-Q1rUjvvRW/TmhgEZX9g/yGwVr3t2+Q/0GYe+/ggRJolfwgLluvcZLAJHQYYYnXBca8Aoux5LxnuCuEssoizbrw==", "extraneous": true, "license": "AGPL-3.0-only", "dependencies": { @@ -43117,10 +43123,10 @@ }, "packages/scratch-render": { "name": "@scratch/scratch-render", - "version": "12.6.2", + "version": "12.7.0", "license": "AGPL-3.0-only", "dependencies": { - "@scratch/scratch-svg-renderer": "12.6.2", + "@scratch/scratch-svg-renderer": "12.7.0", "grapheme-breaker": "0.3.2", "hull.js": "0.2.10", "ify-loader": "1.1.0", @@ -43133,7 +43139,7 @@ "@babel/core": "7.29.0", "@babel/polyfill": "7.12.1", "@babel/preset-env": "7.29.0", - "@scratch/scratch-vm": "12.6.2", + "@scratch/scratch-vm": "12.7.0", "babel-loader": "9.2.1", "copy-webpack-plugin": "6.4.1", "docdash": "0.4.0", @@ -43288,7 +43294,7 @@ }, "packages/scratch-svg-renderer": { "name": "@scratch/scratch-svg-renderer", - "version": "12.6.2", + "version": "12.7.0", "license": "AGPL-3.0-only", "dependencies": { "base64-js": "1.5.1", @@ -43359,11 +43365,11 @@ }, "packages/scratch-vm": { "name": "@scratch/scratch-vm", - "version": "12.6.2", + "version": "12.7.0", "license": "AGPL-3.0-only", "dependencies": { - "@scratch/scratch-render": "12.6.2", - "@scratch/scratch-svg-renderer": "12.6.2", + "@scratch/scratch-render": "12.7.0", + "@scratch/scratch-svg-renderer": "12.7.0", "@vernier/godirect": "1.8.3", "arraybuffer-loader": "1.0.8", "atob": "2.1.2", @@ -43546,7 +43552,7 @@ }, "packages/task-herder": { "name": "@scratch/task-herder", - "version": "12.6.2", + "version": "12.7.0", "license": "AGPL-3.0-only", "devDependencies": { "@vitest/coverage-v8": "4.0.18", diff --git a/package.json b/package.json index d6289da7d7e..9fc573eb056 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "scratch-editor", - "version": "12.6.2", + "version": "12.7.0", "private": "true", "description": "Scratch editor mono-repository", "keywords": [], diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index b282cba26da..bfec00f7161 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -1,6 +1,6 @@ { "name": "@scratch/scratch-gui", - "version": "12.6.2", + "version": "12.7.0", "description": "Graphical User Interface for creating and running Scratch 3.0 projects", "keywords": [], "homepage": "https://github.com/scratchfoundation/scratch-gui#readme", @@ -112,9 +112,9 @@ "@mediapipe/face_detection": "0.4.1646425229", "@microbit/microbit-universal-hex": "0.2.2", "@radix-ui/react-context-menu": "2.2.16", - "@scratch/scratch-render": "12.6.2", - "@scratch/scratch-svg-renderer": "12.6.2", - "@scratch/scratch-vm": "12.6.2", + "@scratch/scratch-render": "12.7.0", + "@scratch/scratch-svg-renderer": "12.7.0", + "@scratch/scratch-vm": "12.7.0", "@tensorflow-models/face-detection": "1.0.3", "@tensorflow/tfjs": "4.22.0", "@testing-library/user-event": "14.6.1", diff --git a/packages/scratch-render/package.json b/packages/scratch-render/package.json index 53fd979eb40..d852ac3255b 100644 --- a/packages/scratch-render/package.json +++ b/packages/scratch-render/package.json @@ -1,6 +1,6 @@ { "name": "@scratch/scratch-render", - "version": "12.6.2", + "version": "12.7.0", "description": "WebGL Renderer for Scratch 3.0", "keywords": [], "homepage": "https://github.com/scratchfoundation/scratch-render#readme", @@ -54,7 +54,7 @@ "allow-incomplete-coverage": true }, "dependencies": { - "@scratch/scratch-svg-renderer": "12.6.2", + "@scratch/scratch-svg-renderer": "12.7.0", "grapheme-breaker": "0.3.2", "hull.js": "0.2.10", "ify-loader": "1.1.0", @@ -67,7 +67,7 @@ "@babel/core": "7.29.0", "@babel/polyfill": "7.12.1", "@babel/preset-env": "7.29.0", - "@scratch/scratch-vm": "12.6.2", + "@scratch/scratch-vm": "12.7.0", "babel-loader": "9.2.1", "copy-webpack-plugin": "6.4.1", "docdash": "0.4.0", diff --git a/packages/scratch-svg-renderer/package.json b/packages/scratch-svg-renderer/package.json index 96f82a5b37a..cf31781433b 100644 --- a/packages/scratch-svg-renderer/package.json +++ b/packages/scratch-svg-renderer/package.json @@ -1,6 +1,6 @@ { "name": "@scratch/scratch-svg-renderer", - "version": "12.6.2", + "version": "12.7.0", "description": "SVG renderer for Scratch", "keywords": [], "homepage": "https://github.com/scratchfoundation/scratch-svg-renderer#readme", diff --git a/packages/scratch-vm/package.json b/packages/scratch-vm/package.json index ca883194f9c..8d00d88b762 100644 --- a/packages/scratch-vm/package.json +++ b/packages/scratch-vm/package.json @@ -1,6 +1,6 @@ { "name": "@scratch/scratch-vm", - "version": "12.6.2", + "version": "12.7.0", "description": "Virtual Machine for Scratch 3.0", "keywords": [], "homepage": "https://github.com/scratchfoundation/scratch-vm#readme", @@ -60,8 +60,8 @@ "allow-incomplete-coverage": true }, "dependencies": { - "@scratch/scratch-render": "12.6.2", - "@scratch/scratch-svg-renderer": "12.6.2", + "@scratch/scratch-render": "12.7.0", + "@scratch/scratch-svg-renderer": "12.7.0", "@vernier/godirect": "1.8.3", "arraybuffer-loader": "1.0.8", "atob": "2.1.2", diff --git a/packages/task-herder/package.json b/packages/task-herder/package.json index e057408a9c5..dd56b8b8a1e 100644 --- a/packages/task-herder/package.json +++ b/packages/task-herder/package.json @@ -1,6 +1,6 @@ { "name": "@scratch/task-herder", - "version": "12.6.2", + "version": "12.7.0", "description": "An asynchronous task runner with configurable rate limiting / throttling and concurrency control.", "keywords": [ "rate limit", From c5d1bb255f6a7f88fc491b5f01fa59ae2f2da532 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 25 Feb 2026 21:27:16 +0000 Subject: [PATCH 265/521] fix(deps): update dependency scratch-storage to v6.1.9 --- package-lock.json | 20 ++++++++++---------- packages/scratch-gui/package.json | 2 +- packages/scratch-render/package.json | 2 +- packages/scratch-vm/package.json | 2 +- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/package-lock.json b/package-lock.json index a59744f2ba9..a19b7b77cd9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -36529,13 +36529,13 @@ } }, "node_modules/scratch-storage": { - "version": "6.1.8", - "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-6.1.8.tgz", - "integrity": "sha512-uDkSNIY7yLalsynLmcGRs6TfF9C9UlCw+OYP0Tr++gjuSJTjOMm/Ve6y5kpxtjYWOAxgzOQgu+QcNz07vELXHg==", + "version": "6.1.9", + "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-6.1.9.tgz", + "integrity": "sha512-yCXQqNShskA8KE5pnA+ommoE/bUiomzGivyHgVBQfhiOlfgXBdfLOeouD6IfV5YqvaKQkoQFb7fBoMG6f0IVLg==", "license": "AGPL-3.0-only", "dependencies": { "@babel/runtime": "^7.21.0", - "@scratch/task-herder": "12.6.2", + "@scratch/task-herder": "12.6.4", "arraybuffer-loader": "^1.0.3", "base64-js": "^1.3.0", "buffer": "6.0.3", @@ -36545,9 +36545,9 @@ } }, "node_modules/scratch-storage/node_modules/@scratch/task-herder": { - "version": "12.6.2", - "resolved": "https://registry.npmjs.org/@scratch/task-herder/-/task-herder-12.6.2.tgz", - "integrity": "sha512-x3R/+ttXOqKCfS25YVkuyhFX5CZ1+wTNDELsYhvmayXcOhuQwZFTnQWt2RtrYzTJnZ6iNVT6KgvQyEIyTKBmUQ==", + "version": "12.6.4", + "resolved": "https://registry.npmjs.org/@scratch/task-herder/-/task-herder-12.6.4.tgz", + "integrity": "sha512-fpxGdqpu7zxO1uQJxPALjkX2YS49Hpf3dTKYaJZgrykqz+HQ3/pimkxrOHaCVhnFK2aAi/9VoHJetcq2KfGzkA==", "license": "AGPL-3.0-only" }, "node_modules/scratch-translate-extension-languages": { @@ -43036,7 +43036,7 @@ "scratch-l10n": "6.1.60", "scratch-paint": "4.1.50", "scratch-render-fonts": "1.0.252", - "scratch-storage": "6.1.8", + "scratch-storage": "6.1.9", "startaudiocontext": "1.2.1", "style-loader": "4.0.0", "text-encoding": "0.7.0", @@ -43151,7 +43151,7 @@ "playwright-chromium": "1.58.2", "scratch-render-fonts": "1.0.252", "scratch-semantic-release-config": "4.0.1", - "scratch-storage": "6.1.8", + "scratch-storage": "6.1.9", "scratch-webpack-configuration": "3.1.1", "semantic-release": "25.0.3", "tap": "21.6.2", @@ -43384,7 +43384,7 @@ "scratch-audio": "2.0.268", "scratch-parser": "6.0.0", "scratch-sb1-converter": "2.0.279", - "scratch-storage": "6.1.8", + "scratch-storage": "6.1.9", "scratch-translate-extension-languages": "1.0.7", "text-encoding": "0.7.0", "tslog": "4.10.2", diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index bfec00f7161..18a2c181283 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -170,7 +170,7 @@ "scratch-l10n": "6.1.60", "scratch-paint": "4.1.50", "scratch-render-fonts": "1.0.252", - "scratch-storage": "6.1.8", + "scratch-storage": "6.1.9", "startaudiocontext": "1.2.1", "style-loader": "4.0.0", "text-encoding": "0.7.0", diff --git a/packages/scratch-render/package.json b/packages/scratch-render/package.json index d852ac3255b..5e0a36fe6a4 100644 --- a/packages/scratch-render/package.json +++ b/packages/scratch-render/package.json @@ -79,7 +79,7 @@ "playwright-chromium": "1.58.2", "scratch-render-fonts": "1.0.252", "scratch-semantic-release-config": "4.0.1", - "scratch-storage": "6.1.8", + "scratch-storage": "6.1.9", "scratch-webpack-configuration": "3.1.1", "semantic-release": "25.0.3", "tap": "21.6.2", diff --git a/packages/scratch-vm/package.json b/packages/scratch-vm/package.json index 8d00d88b762..2872f50132b 100644 --- a/packages/scratch-vm/package.json +++ b/packages/scratch-vm/package.json @@ -76,7 +76,7 @@ "scratch-audio": "2.0.268", "scratch-parser": "6.0.0", "scratch-sb1-converter": "2.0.279", - "scratch-storage": "6.1.8", + "scratch-storage": "6.1.9", "scratch-translate-extension-languages": "1.0.7", "text-encoding": "0.7.0", "tslog": "4.10.2", From ced8f78912ba07b1fb4e9322d2c5467ffa4ba89d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 27 Feb 2026 01:39:16 +0000 Subject: [PATCH 266/521] chore(deps): update node.js to v24.14.0 --- .nvmrc | 2 +- packages/scratch-gui/.nvmrc | 2 +- packages/scratch-render/.nvmrc | 2 +- packages/scratch-svg-renderer/.nvmrc | 2 +- packages/scratch-vm/.nvmrc | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.nvmrc b/.nvmrc index 32f8c50de0c..d845d9d88db 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -24.13.1 +24.14.0 diff --git a/packages/scratch-gui/.nvmrc b/packages/scratch-gui/.nvmrc index 32f8c50de0c..d845d9d88db 100644 --- a/packages/scratch-gui/.nvmrc +++ b/packages/scratch-gui/.nvmrc @@ -1 +1 @@ -24.13.1 +24.14.0 diff --git a/packages/scratch-render/.nvmrc b/packages/scratch-render/.nvmrc index 32f8c50de0c..d845d9d88db 100644 --- a/packages/scratch-render/.nvmrc +++ b/packages/scratch-render/.nvmrc @@ -1 +1 @@ -24.13.1 +24.14.0 diff --git a/packages/scratch-svg-renderer/.nvmrc b/packages/scratch-svg-renderer/.nvmrc index 32f8c50de0c..d845d9d88db 100644 --- a/packages/scratch-svg-renderer/.nvmrc +++ b/packages/scratch-svg-renderer/.nvmrc @@ -1 +1 @@ -24.13.1 +24.14.0 diff --git a/packages/scratch-vm/.nvmrc b/packages/scratch-vm/.nvmrc index 32f8c50de0c..d845d9d88db 100644 --- a/packages/scratch-vm/.nvmrc +++ b/packages/scratch-vm/.nvmrc @@ -1 +1 @@ -24.13.1 +24.14.0 From 2e0b2a1132333342d1b7ca650615cd0ce7c2dd95 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 27 Feb 2026 05:54:15 +0000 Subject: [PATCH 267/521] style(deps): update dependency eslint-config-scratch to v12.0.51 --- package-lock.json | 40 +++++++++++----------- packages/scratch-gui/package.json | 2 +- packages/scratch-render/package.json | 2 +- packages/scratch-svg-renderer/package.json | 2 +- packages/scratch-vm/package.json | 2 +- packages/task-herder/package.json | 2 +- 6 files changed, 25 insertions(+), 25 deletions(-) diff --git a/package-lock.json b/package-lock.json index a19b7b77cd9..8afed18d9c3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3255,20 +3255,20 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz", - "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.4.tgz", + "integrity": "sha512-4h4MVF8pmBsncB60r0wSJiIeUKTSD4m7FmTFThG8RHlsg9ajqckLm9OraguFGZE4vVdpiI1Q4+hFnisopmG6gQ==", "dev": true, "license": "MIT", "dependencies": { - "ajv": "^6.12.4", + "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.2", + "minimatch": "^3.1.3", "strip-json-comments": "^3.1.1" }, "engines": { @@ -3279,9 +3279,9 @@ } }, "node_modules/@eslint/eslintrc/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "dev": true, "license": "MIT", "dependencies": { @@ -18056,15 +18056,15 @@ } }, "node_modules/eslint-config-scratch": { - "version": "12.0.50", - "resolved": "https://registry.npmjs.org/eslint-config-scratch/-/eslint-config-scratch-12.0.50.tgz", - "integrity": "sha512-R6YaWlZJRE0BxPnzaqN6LuF9HG96o7Gq0fMFcp+Z1u/sysfdrBZXKv5z5ub1TaOSJLnKBK7FX6K3l4bOCJ7gEg==", + "version": "12.0.51", + "resolved": "https://registry.npmjs.org/eslint-config-scratch/-/eslint-config-scratch-12.0.51.tgz", + "integrity": "sha512-Y/BVXcGBNHJ3qmhOmAAeXgFdCvOQfPlCuGnLwq3EfJUJbRpjSmK1s/vKNBycf7PKM4W/O2kf5w+KFPahWWgGUA==", "dev": true, "license": "BSD-3-Clause", "dependencies": { "@babel/eslint-parser": "7.28.6", "@eslint-community/eslint-plugin-eslint-comments": "4.6.0", - "@eslint/eslintrc": "3.3.3", + "@eslint/eslintrc": "3.3.4", "@eslint/js": "9.39.3", "@eslint/markdown": "7.5.1", "@stylistic/eslint-plugin": "^5.3.1", @@ -28355,9 +28355,9 @@ "license": "ISC" }, "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "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" @@ -43062,7 +43062,7 @@ "cheerio": "1.2.0", "cross-env": "7.0.3", "eslint": "9.39.3", - "eslint-config-scratch": "12.0.50", + "eslint-config-scratch": "12.0.51", "eslint-import-resolver-webpack": "0.13.10", "eslint-plugin-import": "2.32.0", "eslint-plugin-react": "7.37.5", @@ -43144,7 +43144,7 @@ "copy-webpack-plugin": "6.4.1", "docdash": "0.4.0", "eslint": "9.39.3", - "eslint-config-scratch": "12.0.50", + "eslint-config-scratch": "12.0.51", "gh-pages": "1.2.0", "globals": "16.5.0", "html-webpack-plugin": "5.6.6", @@ -43311,7 +43311,7 @@ "babel-loader": "9.2.1", "copy-webpack-plugin": "6.4.1", "eslint": "9.39.3", - "eslint-config-scratch": "12.0.50", + "eslint-config-scratch": "12.0.51", "globals": "16.5.0", "jsdom": "13.2.0", "mkdirp": "2.1.6", @@ -43399,7 +43399,7 @@ "copy-webpack-plugin": "6.4.1", "docdash": "1.2.0", "eslint": "9.39.3", - "eslint-config-scratch": "12.0.50", + "eslint-config-scratch": "12.0.51", "expose-loader": "1.0.3", "file-loader": "6.2.0", "format-message-cli": "6.2.4", @@ -43557,7 +43557,7 @@ "devDependencies": { "@vitest/coverage-v8": "4.0.18", "eslint": "9.39.3", - "eslint-config-scratch": "12.0.50", + "eslint-config-scratch": "12.0.51", "prettier": "3.8.1", "rimraf": "6.1.2", "typescript": "5.9.3", diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index 18a2c181283..2f3b32a33b5 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -196,7 +196,7 @@ "cheerio": "1.2.0", "cross-env": "7.0.3", "eslint": "9.39.3", - "eslint-config-scratch": "12.0.50", + "eslint-config-scratch": "12.0.51", "eslint-import-resolver-webpack": "0.13.10", "eslint-plugin-import": "2.32.0", "eslint-plugin-react": "7.37.5", diff --git a/packages/scratch-render/package.json b/packages/scratch-render/package.json index 5e0a36fe6a4..dfa097c4889 100644 --- a/packages/scratch-render/package.json +++ b/packages/scratch-render/package.json @@ -72,7 +72,7 @@ "copy-webpack-plugin": "6.4.1", "docdash": "0.4.0", "eslint": "9.39.3", - "eslint-config-scratch": "12.0.50", + "eslint-config-scratch": "12.0.51", "gh-pages": "1.2.0", "globals": "16.5.0", "html-webpack-plugin": "5.6.6", diff --git a/packages/scratch-svg-renderer/package.json b/packages/scratch-svg-renderer/package.json index cf31781433b..b8444704b75 100644 --- a/packages/scratch-svg-renderer/package.json +++ b/packages/scratch-svg-renderer/package.json @@ -63,7 +63,7 @@ "babel-loader": "9.2.1", "copy-webpack-plugin": "6.4.1", "eslint": "9.39.3", - "eslint-config-scratch": "12.0.50", + "eslint-config-scratch": "12.0.51", "globals": "16.5.0", "jsdom": "13.2.0", "mkdirp": "2.1.6", diff --git a/packages/scratch-vm/package.json b/packages/scratch-vm/package.json index 2872f50132b..8c05ee4ed28 100644 --- a/packages/scratch-vm/package.json +++ b/packages/scratch-vm/package.json @@ -91,7 +91,7 @@ "copy-webpack-plugin": "6.4.1", "docdash": "1.2.0", "eslint": "9.39.3", - "eslint-config-scratch": "12.0.50", + "eslint-config-scratch": "12.0.51", "expose-loader": "1.0.3", "file-loader": "6.2.0", "format-message-cli": "6.2.4", diff --git a/packages/task-herder/package.json b/packages/task-herder/package.json index dd56b8b8a1e..9b16bf84746 100644 --- a/packages/task-herder/package.json +++ b/packages/task-herder/package.json @@ -45,7 +45,7 @@ "devDependencies": { "@vitest/coverage-v8": "4.0.18", "eslint": "9.39.3", - "eslint-config-scratch": "12.0.50", + "eslint-config-scratch": "12.0.51", "prettier": "3.8.1", "rimraf": "6.1.2", "typescript": "5.9.3", From a8dd014556d13efc3ec5231114734db787122841 Mon Sep 17 00:00:00 2001 From: Krum Angelov Date: Fri, 27 Feb 2026 11:21:00 +0200 Subject: [PATCH 268/521] chore: initial changes --- .../scratch-gui/src/components/gui/gui.jsx | 2 + .../src/components/menu-bar/menu-bar.jsx | 57 ++++++++++++++++++- .../src/components/menu-bar/save-status.jsx | 10 ++-- .../scratch-gui/src/lib/project-saver-hoc.jsx | 38 ++++++++----- 4 files changed, 86 insertions(+), 21 deletions(-) diff --git a/packages/scratch-gui/src/components/gui/gui.jsx b/packages/scratch-gui/src/components/gui/gui.jsx index 0452e9ba4cf..2270917bd2d 100644 --- a/packages/scratch-gui/src/components/gui/gui.jsx +++ b/packages/scratch-gui/src/components/gui/gui.jsx @@ -348,6 +348,7 @@ const GUIComponent = props => { canManageFiles={canManageFiles} canRemix={canRemix} canSave={canSave} + canUpdateThumbnail={userOwnsProject && manuallySaveThumbnails && !isPlayerOnly} canShare={canShare} className={styles.menuBarPosition} enableCommunity={enableCommunity} @@ -368,6 +369,7 @@ const GUIComponent = props => { onShare={onShare} onStartSelectingFileUpload={onStartSelectingFileUpload} onToggleLoginOpen={onToggleLoginOpen} + onUpdateProjectThumbnail={onUpdateProjectThumbnail} userOwnsProject={userOwnsProject} username={username} accountMenuOptions={accountMenuOptions} diff --git a/packages/scratch-gui/src/components/menu-bar/menu-bar.jsx b/packages/scratch-gui/src/components/menu-bar/menu-bar.jsx index 79b865abb47..d5a09bf4455 100644 --- a/packages/scratch-gui/src/components/menu-bar/menu-bar.jsx +++ b/packages/scratch-gui/src/components/menu-bar/menu-bar.jsx @@ -30,6 +30,10 @@ import TurboMode from '../../containers/turbo-mode.jsx'; import MenuBarHOC from '../../containers/menu-bar-hoc.jsx'; import SettingsMenu from './settings-menu.jsx'; + +import {GUIStoragePropType} from '../../gui-config'; +import {storeProjectThumbnail} from '../../lib/store-project-thumbnail'; +import dataURItoBlob from '../../lib/data-uri-to-blob'; import {openTipsLibrary, openDebugModal} from '../../reducers/modals'; import {setPlayer} from '../../reducers/mode'; import { @@ -189,6 +193,7 @@ class MenuBar extends React.Component { 'handleClickRemix', 'handleClickSave', 'handleClickSaveAsCopy', + 'handleClickUpdateThumbnail', 'handleClickSeeCommunity', 'handleClickShare', 'handleSetMode', @@ -231,6 +236,26 @@ class MenuBar extends React.Component { this.props.onClickSaveAsCopy(); this.props.onRequestCloseFile(); } + handleClickUpdateThumbnail () { + const projectId = this.props.projectId?.toString(); + console.log(`Project saved with id ${projectId}`); + console.log(this.props.onUpdateProjectThumbnail); + console.log(this.props.vm); + if (this.props.storage?.internalApiHost) { + console.log('Storage host:', this.props.storage.internalApiHost); + } else if (this.props.storage) { + console.log('Storage object keys:', Object.keys(this.props.storage)); + } + if (!this.props.onUpdateProjectThumbnail) return; + storeProjectThumbnail(this.props.vm, dataURI => { + console.log('Updating thumbnail...'); + this.props.onUpdateProjectThumbnail( + projectId, + dataURItoBlob(dataURI) + ); + console.log('After dispatch'); + }); + } handleClickSeeCommunity (waitForUpdate) { if (this.props.shouldSaveBeforeTransition()) { this.props.autoUpdateProject(); // save before transitioning to project page @@ -385,6 +410,13 @@ class MenuBar extends React.Component { }; } render () { + const updateThumbnailMessage = ( + + ); const saveNowMessage = ( - {(this.props.canSave || this.props.canCreateCopy || this.props.canRemix) && ( + {(this.props.canSave || this.props.canCreateCopy || + this.props.canRemix || this.props.canUpdateThumbnail) && ( {this.props.canSave && ( @@ -513,6 +546,11 @@ class MenuBar extends React.Component { {remixMessage} )} + {this.props.canUpdateThumbnail && ( + + {updateThumbnailMessage} + + )} )} @@ -920,6 +958,7 @@ MenuBar.propTypes = { canManageFiles: PropTypes.bool, canRemix: PropTypes.bool, canSave: PropTypes.bool, + canUpdateThumbnail: PropTypes.bool, canShare: PropTypes.bool, className: PropTypes.string, confirmReadyToReplaceProject: PropTypes.func, @@ -943,6 +982,7 @@ MenuBar.propTypes = { mode220022BC: PropTypes.bool, modeMenuOpen: PropTypes.bool, modeNow: PropTypes.bool, + projectId: PropTypes.number.isRequired, onClickAbout: PropTypes.oneOfType([ PropTypes.func, // button mode: call this callback when the About button is clicked PropTypes.arrayOf( // menu mode: list of items in the About menu @@ -981,6 +1021,7 @@ MenuBar.propTypes = { onShare: PropTypes.func, onStartSelectingFileUpload: PropTypes.func, onToggleLoginOpen: PropTypes.func, + onUpdateProjectThumbnail: PropTypes.func, platform: PropTypes.oneOf(Object.keys(PLATFORM)), projectTitle: PropTypes.string, renderLogin: PropTypes.func, @@ -993,7 +1034,10 @@ MenuBar.propTypes = { accountMenuOptions: AccountMenuOptionsPropTypes, - vm: PropTypes.instanceOf(VM).isRequired + vm: PropTypes.instanceOf(VM).isRequired, + + + storage: GUIStoragePropType, }; MenuBar.defaultProps = { @@ -1006,6 +1050,7 @@ const mapStateToProps = (state, ownProps) => { const user = state.session && state.session.session && state.session.session.user; const permissions = state.session && state.session.permissions; const sessionExists = state.session && typeof state.session.session !== 'undefined'; + const storage = state.scratchGui.config.storage; return { aboutMenuOpen: aboutMenuOpen(state), @@ -1030,6 +1075,10 @@ const mapStateToProps = (state, ownProps) => { mode1990: isTimeTravel1990(state), mode2020: isTimeTravel2020(state), modeNow: isTimeTravelNow(state), + projectId: state.scratchGui.projectState.projectId, + onUpdateProjectThumbnail: + ownProps.onUpdateProjectThumbnail ?? + storage.saveProjectThumbnail?.bind(storage), platform: state.scratchGui.platform.platform, @@ -1050,7 +1099,9 @@ const mapStateToProps = (state, ownProps) => { myClassesUrl: permissions?.educator ? '/educators/classes/' : null, myClassUrl: user && permissions?.student ? `/classes/${user.classroomId}/` : null, accountSettingsUrl: '/accounts/settings/' - } + }, + + storage }; }; diff --git a/packages/scratch-gui/src/components/menu-bar/save-status.jsx b/packages/scratch-gui/src/components/menu-bar/save-status.jsx index 9f83f6274de..68c3e149d58 100644 --- a/packages/scratch-gui/src/components/menu-bar/save-status.jsx +++ b/packages/scratch-gui/src/components/menu-bar/save-status.jsx @@ -23,7 +23,8 @@ import styles from './save-status.css'; const SaveStatus = ({ alertsList, projectChanged, - onClickSave + onClickSave, + formattedMessage }) => ( filterInlineAlerts(alertsList).length > 0 ? ( @@ -32,18 +33,19 @@ const SaveStatus = ({ className={styles.saveNow} onClick={onClickSave} > - + />}
)); SaveStatus.propTypes = { alertsList: PropTypes.arrayOf(PropTypes.object), onClickSave: PropTypes.func, - projectChanged: PropTypes.bool + projectChanged: PropTypes.bool, + formattedMessage: PropTypes.string }; const mapStateToProps = state => ({ diff --git a/packages/scratch-gui/src/lib/project-saver-hoc.jsx b/packages/scratch-gui/src/lib/project-saver-hoc.jsx index a753b4291ea..b224cda7426 100644 --- a/packages/scratch-gui/src/lib/project-saver-hoc.jsx +++ b/packages/scratch-gui/src/lib/project-saver-hoc.jsx @@ -230,9 +230,8 @@ const ProjectSaverHOC = function (WrappedComponent) { * @param {number|string|undefined} projectId - defined value will PUT/update; undefined/null will POST/create * @returns {Promise} - resolves with json object containing project's existing or new id * @param {?object} requestParams - object of params to add to request body - * @param {?object} options - additional options for the store operation */ - storeProject (projectId, requestParams, options) { + storeProject (projectId, requestParams) { requestParams = requestParams || {}; this.clearAutoSaveTimeout(); // Serialize VM state now before embarking on @@ -268,18 +267,9 @@ const ProjectSaverHOC = function (WrappedComponent) { .then(() => saveProject(projectId, savedVMState, requestParams)) .then(response => { this.props.onSetProjectUnchanged(); - const id = response.id.toString(); - if (this.props.onUpdateProjectThumbnail && id && ( - !this.props.manuallySaveThumbnails || - // Always save thumbnail on project creation - options?.isCreatingProject)) { - storeProjectThumbnail(this.props.vm, dataURI => { - this.props.onUpdateProjectThumbnail( - id, - dataURItoBlob(dataURI) - ); - }); - } + // Thumbnails are now manual only + // Do not update thumbnail on save + this.reportTelemetryEvent('projectDidSave'); return response; }) @@ -289,6 +279,26 @@ const ProjectSaverHOC = function (WrappedComponent) { }); } + updateThumbnail (projectId, requestParams, options) { + try { + if (this.props.onUpdateProjectThumbnail && projectId && ( + !this.props.manuallySaveThumbnails || + // Always save thumbnail on project creation + options?.isCreatingProject)) { + storeProjectThumbnail(this.props.vm, dataURI => { + this.props.onUpdateProjectThumbnail( + projectId, + dataURItoBlob(dataURI), + requestParams + ); + }); + } + } catch (err) { + log.error(err); + throw err; + } + } + /** * Report a telemetry event. * @param {string} event - one of `projectWasCreated`, `projectDidLoad`, `projectDidSave`, `projectWasUploaded` From 8d97d5f6ed5e179f8351468929cca45e51b77814 Mon Sep 17 00:00:00 2001 From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com> Date: Fri, 27 Feb 2026 15:07:14 -0800 Subject: [PATCH 269/521] fix(deps): update dependency scratch-blocks to v2.0.0-spork.8 --- package-lock.json | 49 +++++++++++++------------------ packages/scratch-gui/package.json | 2 +- packages/scratch-vm/package.json | 2 +- 3 files changed, 23 insertions(+), 30 deletions(-) diff --git a/package-lock.json b/package-lock.json index 04e5f27d973..d24e7a25f08 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2057,7 +2057,9 @@ } }, "node_modules/@blockly/continuous-toolbox": { - "version": "7.0.3", + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/@blockly/continuous-toolbox/-/continuous-toolbox-7.0.8.tgz", + "integrity": "sha512-6GnheXs+FWlLu44dvelKrDWDh913sTNAstCfLVl/bnvS/zSEaLyIthDyN6gZ2yizDWJnLdYAGfoGib2AW6uTJQ==", "license": "Apache-2.0", "engines": { "node": ">=8.17.0" @@ -2067,10 +2069,12 @@ } }, "node_modules/@blockly/field-colour": { - "version": "6.0.6", + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/@blockly/field-colour/-/field-colour-6.0.11.tgz", + "integrity": "sha512-UUTwH3DMt1RslKWQIGAlN5cvGynoQ9mpWPKJGI4erG92wAQWKsLAh5ldVsv9TxO2EfNwpSmQ0/5JqTdSMMqdfA==", "license": "Apache-2.0", "dependencies": { - "@blockly/field-grid-dropdown": "^6.0.4" + "@blockly/field-grid-dropdown": "^6.0.9" }, "engines": { "node": ">=8.0.0" @@ -2080,7 +2084,9 @@ } }, "node_modules/@blockly/field-grid-dropdown": { - "version": "6.0.4", + "version": "6.0.9", + "resolved": "https://registry.npmjs.org/@blockly/field-grid-dropdown/-/field-grid-dropdown-6.0.9.tgz", + "integrity": "sha512-YuPdS7ZhJKoVagPxbEwUPr5Gq14SnqNk6XD064mYGiH1OYO7LrtljESXG6cnnvQjhKkitiRjZ1ye20MzG3I6FQ==", "license": "Apache 2.0", "engines": { "node": ">=8.17.0" @@ -2572,21 +2578,6 @@ "node": ">=10" } }, - "node_modules/@esbuild/linux-x64": { - "version": "0.25.12", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, "node_modules/@eslint-community/eslint-plugin-eslint-comments": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-4.6.0.tgz", @@ -12347,7 +12338,9 @@ } }, "node_modules/blockly": { - "version": "12.3.1", + "version": "12.4.1", + "resolved": "https://registry.npmjs.org/blockly/-/blockly-12.4.1.tgz", + "integrity": "sha512-OEF0r8cFMGDkQbX+PWTjifWTe9xi2QzpZS4rO2lYeQhZDWW3/eInklLSdoxAyEQCdfJhQqMTpBct13oDoc0GVQ==", "license": "Apache-2.0", "peer": true, "dependencies": { @@ -31647,14 +31640,14 @@ } }, "node_modules/scratch-blocks": { - "version": "2.0.0-spork.7", - "resolved": "https://registry.npmjs.org/scratch-blocks/-/scratch-blocks-2.0.0-spork.7.tgz", - "integrity": "sha512-sVmxd8hozcaV/S5ZfKB6o7XgWjD7lVP4Np8KqY0BqqG5WFhLfo18lV/j/gttWsX7Yl0NxpNHCyhMeZNfYJ/edA==", + "version": "2.0.0-spork.8", + "resolved": "https://registry.npmjs.org/scratch-blocks/-/scratch-blocks-2.0.0-spork.8.tgz", + "integrity": "sha512-gDHDaZAIXreSqDECiWuq2V1qnGLYUS3eia5SQPlmp3G57lqDeePUSc2HP/L9a6oJfqaa3g9n2E6+SUSYbgOLcw==", "license": "Apache-2.0", "dependencies": { - "@blockly/continuous-toolbox": "^7.0.1", - "@blockly/field-colour": "^6.0.3", - "blockly": "^12.3.0-beta.0" + "@blockly/continuous-toolbox": "^7.0.8", + "@blockly/field-colour": "^6.0.11", + "blockly": "^12.4.1" } }, "node_modules/scratch-l10n": { @@ -37830,7 +37823,7 @@ "react-visibility-sensor": "5.1.1", "redux-throttle": "0.1.1", "scratch-audio": "2.0.268", - "scratch-blocks": "2.0.0-spork.7", + "scratch-blocks": "2.0.0-spork.8", "scratch-l10n": "6.1.60", "scratch-paint": "4.1.50", "scratch-render-fonts": "1.0.252", @@ -38499,7 +38492,7 @@ "in-publish": "2.0.1", "js-md5": "0.7.3", "pngjs": "3.4.0", - "scratch-blocks": "2.0.0-spork.7", + "scratch-blocks": "2.0.0-spork.8", "scratch-l10n": "6.1.60", "scratch-render-fonts": "1.0.252", "scratch-semantic-release-config": "4.0.1", diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index 006e2eafe57..d34d008d431 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -166,7 +166,7 @@ "react-visibility-sensor": "5.1.1", "redux-throttle": "0.1.1", "scratch-audio": "2.0.268", - "scratch-blocks": "2.0.0-spork.7", + "scratch-blocks": "2.0.0-spork.8", "scratch-l10n": "6.1.60", "scratch-paint": "4.1.50", "scratch-render-fonts": "1.0.252", diff --git a/packages/scratch-vm/package.json b/packages/scratch-vm/package.json index 248352bf754..4bc22b683e1 100644 --- a/packages/scratch-vm/package.json +++ b/packages/scratch-vm/package.json @@ -99,7 +99,7 @@ "in-publish": "2.0.1", "js-md5": "0.7.3", "pngjs": "3.4.0", - "scratch-blocks": "2.0.0-spork.7", + "scratch-blocks": "2.0.0-spork.8", "scratch-l10n": "6.1.60", "scratch-render-fonts": "1.0.252", "scratch-semantic-release-config": "4.0.1", From 4a4dbb24d4431758561394d5a7e332cb08e8e708 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 28 Feb 2026 22:06:03 +0000 Subject: [PATCH 270/521] fix(deps): update dependency scratch-storage to v6.1.10 --- package-lock.json | 20 +++++++------------- packages/scratch-gui/package.json | 2 +- packages/scratch-render/package.json | 2 +- packages/scratch-vm/package.json | 2 +- 4 files changed, 10 insertions(+), 16 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8afed18d9c3..a56c71fce86 100644 --- a/package-lock.json +++ b/package-lock.json @@ -36529,13 +36529,13 @@ } }, "node_modules/scratch-storage": { - "version": "6.1.9", - "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-6.1.9.tgz", - "integrity": "sha512-yCXQqNShskA8KE5pnA+ommoE/bUiomzGivyHgVBQfhiOlfgXBdfLOeouD6IfV5YqvaKQkoQFb7fBoMG6f0IVLg==", + "version": "6.1.10", + "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-6.1.10.tgz", + "integrity": "sha512-3+Bb4gJ6g1udGHPgI2dXSNJOK1vXw5g+hrByKr8XWCXgxw5MgNnubpQ2v0CS0N/3YpiwO8UF22rMdRcqq3WRgg==", "license": "AGPL-3.0-only", "dependencies": { "@babel/runtime": "^7.21.0", - "@scratch/task-herder": "12.6.4", + "@scratch/task-herder": "12.7.0", "arraybuffer-loader": "^1.0.3", "base64-js": "^1.3.0", "buffer": "6.0.3", @@ -36544,12 +36544,6 @@ "minilog": "^3.1.0" } }, - "node_modules/scratch-storage/node_modules/@scratch/task-herder": { - "version": "12.6.4", - "resolved": "https://registry.npmjs.org/@scratch/task-herder/-/task-herder-12.6.4.tgz", - "integrity": "sha512-fpxGdqpu7zxO1uQJxPALjkX2YS49Hpf3dTKYaJZgrykqz+HQ3/pimkxrOHaCVhnFK2aAi/9VoHJetcq2KfGzkA==", - "license": "AGPL-3.0-only" - }, "node_modules/scratch-translate-extension-languages": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/scratch-translate-extension-languages/-/scratch-translate-extension-languages-1.0.7.tgz", @@ -43036,7 +43030,7 @@ "scratch-l10n": "6.1.60", "scratch-paint": "4.1.50", "scratch-render-fonts": "1.0.252", - "scratch-storage": "6.1.9", + "scratch-storage": "6.1.10", "startaudiocontext": "1.2.1", "style-loader": "4.0.0", "text-encoding": "0.7.0", @@ -43151,7 +43145,7 @@ "playwright-chromium": "1.58.2", "scratch-render-fonts": "1.0.252", "scratch-semantic-release-config": "4.0.1", - "scratch-storage": "6.1.9", + "scratch-storage": "6.1.10", "scratch-webpack-configuration": "3.1.1", "semantic-release": "25.0.3", "tap": "21.6.2", @@ -43384,7 +43378,7 @@ "scratch-audio": "2.0.268", "scratch-parser": "6.0.0", "scratch-sb1-converter": "2.0.279", - "scratch-storage": "6.1.9", + "scratch-storage": "6.1.10", "scratch-translate-extension-languages": "1.0.7", "text-encoding": "0.7.0", "tslog": "4.10.2", diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index 2f3b32a33b5..7889d1bf371 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -170,7 +170,7 @@ "scratch-l10n": "6.1.60", "scratch-paint": "4.1.50", "scratch-render-fonts": "1.0.252", - "scratch-storage": "6.1.9", + "scratch-storage": "6.1.10", "startaudiocontext": "1.2.1", "style-loader": "4.0.0", "text-encoding": "0.7.0", diff --git a/packages/scratch-render/package.json b/packages/scratch-render/package.json index dfa097c4889..81415b16a05 100644 --- a/packages/scratch-render/package.json +++ b/packages/scratch-render/package.json @@ -79,7 +79,7 @@ "playwright-chromium": "1.58.2", "scratch-render-fonts": "1.0.252", "scratch-semantic-release-config": "4.0.1", - "scratch-storage": "6.1.9", + "scratch-storage": "6.1.10", "scratch-webpack-configuration": "3.1.1", "semantic-release": "25.0.3", "tap": "21.6.2", diff --git a/packages/scratch-vm/package.json b/packages/scratch-vm/package.json index 8c05ee4ed28..9745ffd7edf 100644 --- a/packages/scratch-vm/package.json +++ b/packages/scratch-vm/package.json @@ -76,7 +76,7 @@ "scratch-audio": "2.0.268", "scratch-parser": "6.0.0", "scratch-sb1-converter": "2.0.279", - "scratch-storage": "6.1.9", + "scratch-storage": "6.1.10", "scratch-translate-extension-languages": "1.0.7", "text-encoding": "0.7.0", "tslog": "4.10.2", From 3ac8a9b8244cebc567183c0fcb8d16ebeaccfb60 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 1 Mar 2026 21:24:20 +0000 Subject: [PATCH 271/521] chore(deps): update dependency webpack to v5.105.3 --- package-lock.json | 30 +++++++++++----------- packages/scratch-gui/package.json | 2 +- packages/scratch-render/package.json | 2 +- packages/scratch-svg-renderer/package.json | 2 +- packages/scratch-vm/package.json | 2 +- 5 files changed, 19 insertions(+), 19 deletions(-) diff --git a/package-lock.json b/package-lock.json index a56c71fce86..20ff5db81f2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12659,9 +12659,9 @@ } }, "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -41985,9 +41985,9 @@ "license": "BSD-2-Clause" }, "node_modules/webpack": { - "version": "5.105.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.105.2.tgz", - "integrity": "sha512-dRXm0a2qcHPUBEzVk8uph0xWSjV/xZxenQQbLwnwP7caQCYpqG1qddwlyEkIDkYn0K8tvmcrZ+bOrzoQ3HxCDw==", + "version": "5.105.3", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.105.3.tgz", + "integrity": "sha512-LLBBA4oLmT7sZdHiYE/PeVuifOxYyE2uL/V+9VQP7YSYdJU7bSf7H8bZRRxW8kEPMkmVjnrXmoR3oejIdX0xbg==", "license": "MIT", "dependencies": { "@types/eslint-scope": "^3.7.7", @@ -41996,7 +41996,7 @@ "@webassemblyjs/ast": "^1.14.1", "@webassemblyjs/wasm-edit": "^1.14.1", "@webassemblyjs/wasm-parser": "^1.14.1", - "acorn": "^8.15.0", + "acorn": "^8.16.0", "acorn-import-phases": "^1.0.3", "browserslist": "^4.28.1", "chrome-trace-event": "^1.0.2", @@ -42014,7 +42014,7 @@ "tapable": "^2.3.0", "terser-webpack-plugin": "^5.3.16", "watchpack": "^2.5.1", - "webpack-sources": "^3.3.3" + "webpack-sources": "^3.3.4" }, "bin": { "webpack": "bin/webpack.js" @@ -42274,9 +42274,9 @@ "license": "MIT" }, "node_modules/webpack/node_modules/enhanced-resolve": { - "version": "5.19.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.19.0.tgz", - "integrity": "sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg==", + "version": "5.20.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.0.tgz", + "integrity": "sha512-/ce7+jQ1PQ6rVXwe+jKEg5hW5ciicHwIQUagZkp6IufBoY3YDgdTTY1azVs0qoRgVmvsNB+rbjLJxDAeHHtwsQ==", "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", @@ -43080,7 +43080,7 @@ "ts-loader": "9.5.4", "url-loader": "4.1.1", "web-audio-test-api": "0.5.2", - "webpack": "5.105.2", + "webpack": "5.105.3", "webpack-cli": "5.1.4", "webpack-dev-server": "5.2.3", "yauzl": "3.2.0" @@ -43151,7 +43151,7 @@ "tap": "21.6.2", "terser-webpack-plugin": "5.3.16", "typedoc": "0.28.16", - "webpack": "5.105.2", + "webpack": "5.105.3", "webpack-cli": "5.1.4", "webpack-dev-server": "5.2.3" }, @@ -43315,7 +43315,7 @@ "scratch-webpack-configuration": "3.1.1", "semantic-release": "25.0.3", "tap": "21.6.2", - "webpack": "5.105.2", + "webpack": "5.105.3", "webpack-cli": "5.1.4", "webpack-dev-server": "5.2.3", "xmldom": "0.1.31" @@ -43412,7 +43412,7 @@ "tap": "21.6.2", "tiny-worker": "2.3.0", "typedoc": "0.28.16", - "webpack": "5.105.2", + "webpack": "5.105.3", "webpack-cli": "4.10.0", "webpack-dev-server": "5.2.3" } diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index 7889d1bf371..b06d6c47a12 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -220,7 +220,7 @@ "ts-loader": "9.5.4", "url-loader": "4.1.1", "web-audio-test-api": "0.5.2", - "webpack": "5.105.2", + "webpack": "5.105.3", "webpack-cli": "5.1.4", "webpack-dev-server": "5.2.3", "yauzl": "3.2.0" diff --git a/packages/scratch-render/package.json b/packages/scratch-render/package.json index 81415b16a05..d06030198f1 100644 --- a/packages/scratch-render/package.json +++ b/packages/scratch-render/package.json @@ -85,7 +85,7 @@ "tap": "21.6.2", "terser-webpack-plugin": "5.3.16", "typedoc": "0.28.16", - "webpack": "5.105.2", + "webpack": "5.105.3", "webpack-cli": "5.1.4", "webpack-dev-server": "5.2.3" }, diff --git a/packages/scratch-svg-renderer/package.json b/packages/scratch-svg-renderer/package.json index b8444704b75..a0f45fe182c 100644 --- a/packages/scratch-svg-renderer/package.json +++ b/packages/scratch-svg-renderer/package.json @@ -73,7 +73,7 @@ "scratch-webpack-configuration": "3.1.1", "semantic-release": "25.0.3", "tap": "21.6.2", - "webpack": "5.105.2", + "webpack": "5.105.3", "webpack-cli": "5.1.4", "webpack-dev-server": "5.2.3", "xmldom": "0.1.31" diff --git a/packages/scratch-vm/package.json b/packages/scratch-vm/package.json index 9745ffd7edf..da53192a0ca 100644 --- a/packages/scratch-vm/package.json +++ b/packages/scratch-vm/package.json @@ -110,7 +110,7 @@ "tap": "21.6.2", "tiny-worker": "2.3.0", "typedoc": "0.28.16", - "webpack": "5.105.2", + "webpack": "5.105.3", "webpack-cli": "4.10.0", "webpack-dev-server": "5.2.3" } From 1981a6d3132891e913698bebae333bdb5bfdeb04 Mon Sep 17 00:00:00 2001 From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com> Date: Mon, 2 Mar 2026 13:43:59 -0800 Subject: [PATCH 272/521] fix(deps): update dependency scratch-blocks to v2.0.0-spork.9 --- package-lock.json | 10 +++++----- packages/scratch-gui/package.json | 2 +- packages/scratch-vm/package.json | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index d24e7a25f08..da36981a5a4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -31640,9 +31640,9 @@ } }, "node_modules/scratch-blocks": { - "version": "2.0.0-spork.8", - "resolved": "https://registry.npmjs.org/scratch-blocks/-/scratch-blocks-2.0.0-spork.8.tgz", - "integrity": "sha512-gDHDaZAIXreSqDECiWuq2V1qnGLYUS3eia5SQPlmp3G57lqDeePUSc2HP/L9a6oJfqaa3g9n2E6+SUSYbgOLcw==", + "version": "2.0.0-spork.9", + "resolved": "https://registry.npmjs.org/scratch-blocks/-/scratch-blocks-2.0.0-spork.9.tgz", + "integrity": "sha512-Byt0ZeeS2CG8MHtC2Fk4kDeCVg2pU5/BHVvEjXHRcucUlOpZcbh7cB4LhUX0YsYwPXxsIH+lrgZmQaO+UCVMQA==", "license": "Apache-2.0", "dependencies": { "@blockly/continuous-toolbox": "^7.0.8", @@ -37823,7 +37823,7 @@ "react-visibility-sensor": "5.1.1", "redux-throttle": "0.1.1", "scratch-audio": "2.0.268", - "scratch-blocks": "2.0.0-spork.8", + "scratch-blocks": "2.0.0-spork.9", "scratch-l10n": "6.1.60", "scratch-paint": "4.1.50", "scratch-render-fonts": "1.0.252", @@ -38492,7 +38492,7 @@ "in-publish": "2.0.1", "js-md5": "0.7.3", "pngjs": "3.4.0", - "scratch-blocks": "2.0.0-spork.8", + "scratch-blocks": "2.0.0-spork.9", "scratch-l10n": "6.1.60", "scratch-render-fonts": "1.0.252", "scratch-semantic-release-config": "4.0.1", diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index d34d008d431..dbadf27adbf 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -166,7 +166,7 @@ "react-visibility-sensor": "5.1.1", "redux-throttle": "0.1.1", "scratch-audio": "2.0.268", - "scratch-blocks": "2.0.0-spork.8", + "scratch-blocks": "2.0.0-spork.9", "scratch-l10n": "6.1.60", "scratch-paint": "4.1.50", "scratch-render-fonts": "1.0.252", diff --git a/packages/scratch-vm/package.json b/packages/scratch-vm/package.json index 4bc22b683e1..3a25e67dbd8 100644 --- a/packages/scratch-vm/package.json +++ b/packages/scratch-vm/package.json @@ -99,7 +99,7 @@ "in-publish": "2.0.1", "js-md5": "0.7.3", "pngjs": "3.4.0", - "scratch-blocks": "2.0.0-spork.8", + "scratch-blocks": "2.0.0-spork.9", "scratch-l10n": "6.1.60", "scratch-render-fonts": "1.0.252", "scratch-semantic-release-config": "4.0.1", From bc1efd8b6189fc43455a5dba9efeece73b49ba2d Mon Sep 17 00:00:00 2001 From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com> Date: Tue, 3 Mar 2026 07:40:41 -0800 Subject: [PATCH 273/521] fix(deps): adapt to modernized scratch-blocks spork build output Specifics: - update linting to handle indirect TS imports (`export * from ...`) - update to `eslint-config-scratch@^13` - use `eslint-plugin-import-x` instead of `eslint-plugin-import` - remove workarounds for issues resolved by the above - add a rule to ignore webpack inline loader syntax - update to `scratch-blocks@2.0.0-spork.10` - import `* as ScratchBlocks` instead of `{ScratchBlocks}` - improves tree-shaking support - don't hard-code `scratch-blocks` output path in `scratch-vm`'s wepack configuration --- package-lock.json | 716 +++++++++++++++--- packages/scratch-gui/eslint.config.mjs | 37 +- packages/scratch-gui/package.json | 8 +- .../components/context-menu/context-menu.jsx | 2 +- .../src/components/monitor/monitor.jsx | 2 +- .../sprite-selector-item.jsx | 6 +- .../src/containers/custom-procedures.jsx | 2 +- .../src/lib/backpack/block-to-image.js | 2 +- packages/scratch-gui/src/lib/blocks.js | 2 +- .../scratch-gui/src/lib/make-toolbox-xml.js | 2 +- .../src/lib/radix-ui-context-menu.js | 10 - packages/scratch-gui/tsconfig.eslint.json | 2 + packages/scratch-vm/package.json | 2 +- packages/scratch-vm/webpack.config.js | 2 +- 14 files changed, 646 insertions(+), 149 deletions(-) delete mode 100644 packages/scratch-gui/src/lib/radix-ui-context-menu.js diff --git a/package-lock.json b/package-lock.json index da36981a5a4..7ee680ab6fe 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11100,6 +11100,288 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@unrs/resolver-binding-android-arm-eabi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz", + "integrity": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-android-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz", + "integrity": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz", + "integrity": "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz", + "integrity": "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-freebsd-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz", + "integrity": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz", + "integrity": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz", + "integrity": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz", + "integrity": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz", + "integrity": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz", + "integrity": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz", + "integrity": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz", + "integrity": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz", + "integrity": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz", + "integrity": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz", + "integrity": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-wasm32-wasi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz", + "integrity": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^0.2.11" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@unrs/resolver-binding-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", + "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@tybys/wasm-util": "^0.10.0" + } + }, + "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz", + "integrity": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz", + "integrity": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-x64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz", + "integrity": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@vernier/godirect": { "version": "1.8.3", "license": "BSD-3-Clause" @@ -15212,18 +15494,6 @@ "url": "https://github.com/fb55/encoding-sniffer?sponsor=1" } }, - "node_modules/enhanced-resolve": { - "version": "0.9.1", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.2.0", - "tapable": "^0.1.8" - }, - "engines": { - "node": ">=0.6" - } - }, "node_modules/entities": { "version": "4.5.0", "dev": true, @@ -15840,6 +16110,31 @@ "eslint": "^9.23.0" } }, + "node_modules/eslint-import-context": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/eslint-import-context/-/eslint-import-context-0.1.9.tgz", + "integrity": "sha512-K9Hb+yRaGAGUbwjhFNHvSmmkZs9+zbuoe3kFQ4V1wYjrepUFYM2dZAfNtjbbj3qsPfUfsA68Bx/ICWQMi+C8Eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-tsconfig": "^4.10.1", + "stable-hash-x": "^0.2.0" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-import-context" + }, + "peerDependencies": { + "unrs-resolver": "^1.0.0" + }, + "peerDependenciesMeta": { + "unrs-resolver": { + "optional": true + } + } + }, "node_modules/eslint-import-resolver-node": { "version": "0.3.9", "dev": true, @@ -15858,60 +16153,39 @@ "ms": "^2.1.1" } }, - "node_modules/eslint-import-resolver-webpack": { - "version": "0.13.10", + "node_modules/eslint-import-resolver-typescript": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-4.4.4.tgz", + "integrity": "sha512-1iM2zeBvrYmUNTj2vSC/90JTHDth+dfOfiNKkxApWRsTJYNrc8rOdxxIf5vazX+BiAXTeOT0UvWpGI/7qIWQOw==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "debug": "^3.2.7", - "enhanced-resolve": "^0.9.1", - "find-root": "^1.1.0", - "hasown": "^2.0.2", - "interpret": "^1.4.0", - "is-core-module": "^2.15.1", - "is-regex": "^1.2.0", - "lodash": "^4.17.21", - "resolve": "^2.0.0-next.5", - "semver": "^5.7.2" + "debug": "^4.4.1", + "eslint-import-context": "^0.1.8", + "get-tsconfig": "^4.10.1", + "is-bun-module": "^2.0.0", + "stable-hash-x": "^0.2.0", + "tinyglobby": "^0.2.14", + "unrs-resolver": "^1.7.11" }, "engines": { - "node": ">= 6" + "node": "^16.17.0 || >=18.6.0" }, - "peerDependencies": { - "eslint-plugin-import": ">=1.4.0", - "webpack": ">=1.11.0" - } - }, - "node_modules/eslint-import-resolver-webpack/node_modules/debug": { - "version": "3.2.7", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-import-resolver-webpack/node_modules/resolve": { - "version": "2.0.0-next.5", - "dev": true, - "license": "MIT", - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" + "funding": { + "url": "https://opencollective.com/eslint-import-resolver-typescript" }, - "bin": { - "resolve": "bin/resolve" + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*", + "eslint-plugin-import-x": "*" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/eslint-import-resolver-webpack/node_modules/semver": { - "version": "5.7.2", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" + "peerDependenciesMeta": { + "eslint-plugin-import": { + "optional": true + }, + "eslint-plugin-import-x": { + "optional": true + } } }, "node_modules/eslint-module-utils": { @@ -15989,7 +16263,6 @@ "version": "2.32.0", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.9", @@ -16018,6 +16291,95 @@ "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, + "node_modules/eslint-plugin-import-x": { + "version": "4.16.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import-x/-/eslint-plugin-import-x-4.16.1.tgz", + "integrity": "sha512-vPZZsiOKaBAIATpFE2uMI4w5IRwdv/FpQ+qZZMR4E+PeOcM4OeoEbqxRMnywdxP19TyB/3h6QBB0EWon7letSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "^8.35.0", + "comment-parser": "^1.4.1", + "debug": "^4.4.1", + "eslint-import-context": "^0.1.9", + "is-glob": "^4.0.3", + "minimatch": "^9.0.3 || ^10.0.1", + "semver": "^7.7.2", + "stable-hash-x": "^0.2.0", + "unrs-resolver": "^1.9.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-import-x" + }, + "peerDependencies": { + "@typescript-eslint/utils": "^8.0.0", + "eslint": "^8.57.0 || ^9.0.0", + "eslint-import-resolver-node": "*" + }, + "peerDependenciesMeta": { + "@typescript-eslint/utils": { + "optional": true + }, + "eslint-import-resolver-node": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-import-x/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/eslint-plugin-import-x/node_modules/brace-expansion": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", + "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/eslint-plugin-import-x/node_modules/minimatch": { + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/eslint-plugin-import-x/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/eslint-plugin-import/node_modules/debug": { "version": "3.2.7", "dev": true, @@ -17042,11 +17404,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/find-root": { - "version": "1.1.0", - "dev": true, - "license": "MIT" - }, "node_modules/find-up": { "version": "5.0.0", "dev": true, @@ -19605,14 +19962,6 @@ "node": ">= 0.4" } }, - "node_modules/interpret": { - "version": "1.4.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, "node_modules/intl": { "version": "1.2.5", "license": "MIT" @@ -19807,6 +20156,29 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-bun-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz", + "integrity": "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.7.1" + } + }, + "node_modules/is-bun-module/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/is-callable": { "version": "1.2.7", "dev": true, @@ -23640,11 +24012,6 @@ "url": "https://github.com/sponsors/streamich" } }, - "node_modules/memory-fs": { - "version": "0.2.0", - "dev": true, - "license": "MIT" - }, "node_modules/meow": { "version": "8.1.2", "dev": true, @@ -24354,7 +24721,9 @@ "license": "ISC" }, "node_modules/minimatch": { - "version": "3.1.2", + "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" @@ -24698,6 +25067,22 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/napi-postinstall": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz", + "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==", + "dev": true, + "license": "MIT", + "bin": { + "napi-postinstall": "lib/cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/napi-postinstall" + } + }, "node_modules/natural-compare": { "version": "1.4.0", "dev": true, @@ -31640,9 +32025,9 @@ } }, "node_modules/scratch-blocks": { - "version": "2.0.0-spork.9", - "resolved": "https://registry.npmjs.org/scratch-blocks/-/scratch-blocks-2.0.0-spork.9.tgz", - "integrity": "sha512-Byt0ZeeS2CG8MHtC2Fk4kDeCVg2pU5/BHVvEjXHRcucUlOpZcbh7cB4LhUX0YsYwPXxsIH+lrgZmQaO+UCVMQA==", + "version": "2.0.0-spork.10", + "resolved": "https://registry.npmjs.org/scratch-blocks/-/scratch-blocks-2.0.0-spork.10.tgz", + "integrity": "sha512-1UHYbbt6JoDV4LVB1VHdJW/OXUqWkJT4nAZZsS1g/oWUBdu0UFVTuGc1SrFc47Cowjkp/RWr15k4iNvMSomVrQ==", "license": "Apache-2.0", "dependencies": { "@blockly/continuous-toolbox": "^7.0.8", @@ -33317,6 +33702,16 @@ "node": ">= 8" } }, + "node_modules/stable-hash-x": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/stable-hash-x/-/stable-hash-x-0.2.0.tgz", + "integrity": "sha512-o3yWv49B/o4QZk5ZcsALc6t0+eCelPc44zZsLtCQnZPDwFpDYSWcDnrv2TtMmMbQ7uKo3J0HTURCqckw23czNQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/stack-utils": { "version": "2.0.6", "dev": true, @@ -34215,14 +34610,6 @@ "node": "20 || >=22" } }, - "node_modules/tapable": { - "version": "0.1.10", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, "node_modules/tar": { "version": "6.2.1", "license": "ISC", @@ -36440,6 +36827,41 @@ } } }, + "node_modules/unrs-resolver": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz", + "integrity": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "napi-postinstall": "^0.3.0" + }, + "funding": { + "url": "https://opencollective.com/unrs-resolver" + }, + "optionalDependencies": { + "@unrs/resolver-binding-android-arm-eabi": "1.11.1", + "@unrs/resolver-binding-android-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-x64": "1.11.1", + "@unrs/resolver-binding-freebsd-x64": "1.11.1", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", + "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-musl": "1.11.1", + "@unrs/resolver-binding-wasm32-wasi": "1.11.1", + "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", + "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", + "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" + } + }, "node_modules/update-browserslist-db": { "version": "1.2.2", "funding": [ @@ -37823,7 +38245,7 @@ "react-visibility-sensor": "5.1.1", "redux-throttle": "0.1.1", "scratch-audio": "2.0.268", - "scratch-blocks": "2.0.0-spork.9", + "scratch-blocks": "2.0.0-spork.10", "scratch-l10n": "6.1.60", "scratch-paint": "4.1.50", "scratch-render-fonts": "1.0.252", @@ -37853,9 +38275,9 @@ "cheerio": "1.2.0", "cross-env": "7.0.3", "eslint": "9.39.2", - "eslint-config-scratch": "12.0.49", - "eslint-import-resolver-webpack": "0.13.10", - "eslint-plugin-import": "2.32.0", + "eslint-config-scratch": "13.0.0", + "eslint-import-resolver-typescript": "4.4.4", + "eslint-plugin-import-x": "^4.16.1", "eslint-plugin-react": "7.37.5", "file-loader": "6.2.0", "gh-pages": "3.2.3", @@ -37889,6 +38311,56 @@ "redux": "^4.0.0" } }, + "packages/scratch-gui/node_modules/@eslint/eslintrc": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.4.tgz", + "integrity": "sha512-4h4MVF8pmBsncB60r0wSJiIeUKTSD4m7FmTFThG8RHlsg9ajqckLm9OraguFGZE4vVdpiI1Q4+hFnisopmG6gQ==", + "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.3", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "packages/scratch-gui/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, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/scratch-gui/node_modules/@eslint/js": { + "version": "9.39.3", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.3.tgz", + "integrity": "sha512-1B1VkCq6FuUNlQvlBYb+1jDu/gV297TIs/OeiaSR9l1H27SVW55ONE1e1Vp16NqP683+xEGzxYtv4XCiDPaQiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, "packages/scratch-gui/node_modules/@webpack-cli/configtest": { "version": "2.1.1", "dev": true, @@ -37930,6 +38402,23 @@ } } }, + "packages/scratch-gui/node_modules/ajv": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "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" + } + }, "packages/scratch-gui/node_modules/commander": { "version": "10.0.1", "dev": true, @@ -37938,6 +38427,36 @@ "node": ">=14" } }, + "packages/scratch-gui/node_modules/eslint-config-scratch": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-scratch/-/eslint-config-scratch-13.0.0.tgz", + "integrity": "sha512-Iyp8DDHACNBjgdN918Uz4uiiWb2sVyvmhbgMGIx8fC/yCmoh/mwjxd4P8t3o/kJgYcf4eQpe5FatkeMRAYEcHg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/eslint-parser": "7.28.6", + "@eslint-community/eslint-plugin-eslint-comments": "4.6.0", + "@eslint/eslintrc": "3.3.4", + "@eslint/js": "9.39.3", + "@eslint/markdown": "7.5.1", + "@stylistic/eslint-plugin": "^5.3.1", + "@trivago/prettier-plugin-sort-imports": "5.2.2", + "eslint-config-prettier": "10.1.8", + "eslint-plugin-formatjs": "5.4.2", + "eslint-plugin-html": "8.1.4", + "eslint-plugin-import-x": "4.16.1", + "eslint-plugin-jsdoc": "61.7.1", + "eslint-plugin-jsx-a11y": "6.10.2", + "eslint-plugin-react": "7.37.5", + "eslint-plugin-react-hooks": "7.0.1", + "globals": "16.5.0", + "prettier": "3.8.1", + "typescript-eslint": "8.46.3" + }, + "peerDependencies": { + "eslint": "^9.23.0" + } + }, "packages/scratch-gui/node_modules/interpret": { "version": "3.1.1", "dev": true, @@ -37946,6 +38465,13 @@ "node": ">=10.13.0" } }, + "packages/scratch-gui/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" + }, "packages/scratch-gui/node_modules/rechoir": { "version": "0.8.0", "dev": true, @@ -38492,7 +39018,7 @@ "in-publish": "2.0.1", "js-md5": "0.7.3", "pngjs": "3.4.0", - "scratch-blocks": "2.0.0-spork.9", + "scratch-blocks": "2.0.0-spork.10", "scratch-l10n": "6.1.60", "scratch-render-fonts": "1.0.252", "scratch-semantic-release-config": "4.0.1", diff --git a/packages/scratch-gui/eslint.config.mjs b/packages/scratch-gui/eslint.config.mjs index bb92d708a24..268ceb3a66c 100644 --- a/packages/scratch-gui/eslint.config.mjs +++ b/packages/scratch-gui/eslint.config.mjs @@ -1,8 +1,7 @@ import {eslintConfigScratch} from 'eslint-config-scratch'; import {globalIgnores} from 'eslint/config'; import globals from 'globals'; -import importPlugin from 'eslint-plugin-import'; -import path from 'path'; +import importPlugin from 'eslint-plugin-import-x'; export default eslintConfigScratch.defineConfig( eslintConfigScratch.legacy.base, @@ -15,13 +14,6 @@ export default eslintConfigScratch.defineConfig( }, rules: { 'no-console': 'off' - }, - settings: { - // TODO: figure out why this is needed... - // probably something with eslint-plugin-import's parser or resolver - 'import/core-modules': [ - 'eslint/config' - ] } }, { @@ -49,13 +41,17 @@ export default eslintConfigScratch.defineConfig( 'react': { version: 'detect' }, - 'import/resolver': { - webpack: { - config: path.resolve(import.meta.dirname, 'webpack.config.js') + 'import-x/resolver': { + typescript: { + project: 'tsconfig.eslint.json' } } }, rules: { + // webpack inline loader syntax (e.g. `!raw-loader!./file.svg`) is not resolvable by the + // TypeScript resolver; these are valid at runtime via webpack's loader pipeline + 'import-x/no-unresolved': ['error', {ignore: ['^!']}], + // BEGIN: these caused trouble after upgrading eslint-plugin-react from 7.24.0 to 7.33.2 'react/forbid-prop-types': 'warn', 'react/no-unknown-property': 'warn', @@ -95,13 +91,6 @@ export default eslintConfigScratch.defineConfig( 'react/prop-types': 'off' // don't worry about prop types in tests } }, - { - files: ['{src,test}/**/*.{ts,tsx}'], - rules: { - // TODO: get TS parsing to work with eslint-plugin-import - 'import/named': 'off' - } - }, { // disable some checks for these generated files files: ['{src,test}/**/types.d.ts'], @@ -119,16 +108,6 @@ export default eslintConfigScratch.defineConfig( 'no-duplicate-imports': 'off' } }, - { - files: ['test/unit/util/define-dynamic-block.test.js'], - settings: { - // TODO: figure out why this is needed... - // probably something with eslint-plugin-import's parser or resolver - 'import/core-modules': [ - '@scratch/scratch-vm/src/extension-support/block-type' - ] - } - }, globalIgnores([ 'build/**/*', 'dist/**/*', diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index dbadf27adbf..c37901cacfa 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -166,7 +166,7 @@ "react-visibility-sensor": "5.1.1", "redux-throttle": "0.1.1", "scratch-audio": "2.0.268", - "scratch-blocks": "2.0.0-spork.9", + "scratch-blocks": "2.0.0-spork.10", "scratch-l10n": "6.1.60", "scratch-paint": "4.1.50", "scratch-render-fonts": "1.0.252", @@ -196,9 +196,9 @@ "cheerio": "1.2.0", "cross-env": "7.0.3", "eslint": "9.39.2", - "eslint-config-scratch": "12.0.49", - "eslint-import-resolver-webpack": "0.13.10", - "eslint-plugin-import": "2.32.0", + "eslint-config-scratch": "13.0.0", + "eslint-import-resolver-typescript": "4.4.4", + "eslint-plugin-import-x": "^4.16.1", "eslint-plugin-react": "7.37.5", "file-loader": "6.2.0", "gh-pages": "3.2.3", diff --git a/packages/scratch-gui/src/components/context-menu/context-menu.jsx b/packages/scratch-gui/src/components/context-menu/context-menu.jsx index 1a6c8491520..708bd6ec5fd 100644 --- a/packages/scratch-gui/src/components/context-menu/context-menu.jsx +++ b/packages/scratch-gui/src/components/context-menu/context-menu.jsx @@ -1,6 +1,6 @@ import React from 'react'; import PropTypes from 'prop-types'; -import ContextMenu from '../../lib/radix-ui-context-menu.js'; +import * as ContextMenu from '@radix-ui/react-context-menu'; import classNames from 'classnames'; import styles from './context-menu.css'; diff --git a/packages/scratch-gui/src/components/monitor/monitor.jsx b/packages/scratch-gui/src/components/monitor/monitor.jsx index d939f779422..7413527a4da 100644 --- a/packages/scratch-gui/src/components/monitor/monitor.jsx +++ b/packages/scratch-gui/src/components/monitor/monitor.jsx @@ -2,7 +2,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import Draggable from 'react-draggable'; import {FormattedMessage} from 'react-intl'; -import ContextMenu from '../../lib/radix-ui-context-menu.js'; +import * as ContextMenu from '@radix-ui/react-context-menu'; import Box from '../box/box.jsx'; import DefaultMonitor from './default-monitor.jsx'; import LargeMonitor from './large-monitor.jsx'; diff --git a/packages/scratch-gui/src/components/sprite-selector-item/sprite-selector-item.jsx b/packages/scratch-gui/src/components/sprite-selector-item/sprite-selector-item.jsx index 7f1d91b44ad..935e4ab49c8 100644 --- a/packages/scratch-gui/src/components/sprite-selector-item/sprite-selector-item.jsx +++ b/packages/scratch-gui/src/components/sprite-selector-item/sprite-selector-item.jsx @@ -6,7 +6,7 @@ import styles from './sprite-selector-item.css'; import contextMenuStyles from '../context-menu/context-menu.css'; import {DangerousMenuItem, MenuItem} from '../context-menu/context-menu.jsx'; import {FormattedMessage} from 'react-intl'; -import ContextMenu from '../../lib/radix-ui-context-menu.js'; +import * as ContextMenu from '@radix-ui/react-context-menu'; const SpriteSelectorItem = props => { useEffect(() => { @@ -16,11 +16,11 @@ const SpriteSelectorItem = props => { contextMenu.dispatchEvent(new KeyboardEvent('keydown', {key: 'Escape'})); } }; - + window.addEventListener('resize', handleResize); return () => window.removeEventListener('resize', handleResize); }, []); - + return ( diff --git a/packages/scratch-gui/src/containers/custom-procedures.jsx b/packages/scratch-gui/src/containers/custom-procedures.jsx index 292b2c319da..ca5f83551b9 100644 --- a/packages/scratch-gui/src/containers/custom-procedures.jsx +++ b/packages/scratch-gui/src/containers/custom-procedures.jsx @@ -4,7 +4,7 @@ import PropTypes from 'prop-types'; import React from 'react'; import CustomProceduresComponent from '../components/custom-procedures/custom-procedures.jsx'; import {getColorsForMode, colorModeMap} from '../lib/settings/color-mode'; -import {ScratchBlocks} from 'scratch-blocks'; +import * as ScratchBlocks from 'scratch-blocks'; import {connect} from 'react-redux'; class CustomProcedures extends React.Component { diff --git a/packages/scratch-gui/src/lib/backpack/block-to-image.js b/packages/scratch-gui/src/lib/backpack/block-to-image.js index d74557864b4..ccb183b2848 100644 --- a/packages/scratch-gui/src/lib/backpack/block-to-image.js +++ b/packages/scratch-gui/src/lib/backpack/block-to-image.js @@ -1,5 +1,5 @@ import computedStyleToInlineStyle from 'computed-style-to-inline-style'; -import {ScratchBlocks} from 'scratch-blocks'; +import * as ScratchBlocks from 'scratch-blocks'; /** * @import {WorkspaceSvg} from 'blockly/core' diff --git a/packages/scratch-gui/src/lib/blocks.js b/packages/scratch-gui/src/lib/blocks.js index 0b5787547da..f0b48341bc7 100644 --- a/packages/scratch-gui/src/lib/blocks.js +++ b/packages/scratch-gui/src/lib/blocks.js @@ -4,7 +4,7 @@ * @returns {ScratchBlocks} ScratchBlocks connected with the vm */ export default function (vm) { - const {ScratchBlocks} = require('scratch-blocks'); + const ScratchBlocks = require('scratch-blocks'); const jsonForMenuBlock = function (name, menuOptionsFn, category, start) { return { diff --git a/packages/scratch-gui/src/lib/make-toolbox-xml.js b/packages/scratch-gui/src/lib/make-toolbox-xml.js index 7bb7ce18e59..f0886e97218 100644 --- a/packages/scratch-gui/src/lib/make-toolbox-xml.js +++ b/packages/scratch-gui/src/lib/make-toolbox-xml.js @@ -1,4 +1,4 @@ -import {ScratchBlocks} from 'scratch-blocks'; +import * as ScratchBlocks from 'scratch-blocks'; import {defaultColors} from './settings/color-mode'; const categorySeparator = ''; diff --git a/packages/scratch-gui/src/lib/radix-ui-context-menu.js b/packages/scratch-gui/src/lib/radix-ui-context-menu.js deleted file mode 100644 index 3f3327eb7bf..00000000000 --- a/packages/scratch-gui/src/lib/radix-ui-context-menu.js +++ /dev/null @@ -1,10 +0,0 @@ -/* eslint-disable import/no-unresolved */ -/* - https://github.com/import-js/eslint-plugin-import/issues/1810 - eslint-plugin-import is not aware of exports definition in package.json - meaning we should disable linting for this import or use require instead - moved the import in a separate file so that the disabling happens in one place only -*/ -import * as ContextMenu from '@radix-ui/react-context-menu'; - -export default ContextMenu; diff --git a/packages/scratch-gui/tsconfig.eslint.json b/packages/scratch-gui/tsconfig.eslint.json index 02d3fa9e9de..3c1ae092f05 100644 --- a/packages/scratch-gui/tsconfig.eslint.json +++ b/packages/scratch-gui/tsconfig.eslint.json @@ -3,5 +3,7 @@ "extends": "./tsconfig.json", "compilerOptions": { "allowJs": true, + "module": "esnext", + "moduleResolution": "bundler" } } diff --git a/packages/scratch-vm/package.json b/packages/scratch-vm/package.json index 3a25e67dbd8..3cbdb455743 100644 --- a/packages/scratch-vm/package.json +++ b/packages/scratch-vm/package.json @@ -99,7 +99,7 @@ "in-publish": "2.0.1", "js-md5": "0.7.3", "pngjs": "3.4.0", - "scratch-blocks": "2.0.0-spork.9", + "scratch-blocks": "2.0.0-spork.10", "scratch-l10n": "6.1.60", "scratch-render-fonts": "1.0.252", "scratch-semantic-release-config": "4.0.1", diff --git a/packages/scratch-vm/webpack.config.js b/packages/scratch-vm/webpack.config.js index feb59bff651..a9e6973851b 100644 --- a/packages/scratch-vm/webpack.config.js +++ b/packages/scratch-vm/webpack.config.js @@ -88,7 +88,7 @@ const playgroundBuilder = webBuilder } }) .addModuleRule({ - test: require.resolve('scratch-blocks/dist/main.js'), + test: require.resolve('scratch-blocks'), loader: 'expose-loader', options: { exposes: 'Blockly' From aa682e5d716539d999d29a2f37e9b4db93ac4c79 Mon Sep 17 00:00:00 2001 From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com> Date: Tue, 3 Mar 2026 09:14:52 -0800 Subject: [PATCH 274/521] fix(deps): fix build with scratch-blocks@2.0.0-spork.11 Give up (for now) on externalized Blockly --- package-lock.json | 10 +++++----- packages/scratch-gui/package.json | 2 +- packages/scratch-vm/package.json | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7ee680ab6fe..40f4368e19c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -32025,9 +32025,9 @@ } }, "node_modules/scratch-blocks": { - "version": "2.0.0-spork.10", - "resolved": "https://registry.npmjs.org/scratch-blocks/-/scratch-blocks-2.0.0-spork.10.tgz", - "integrity": "sha512-1UHYbbt6JoDV4LVB1VHdJW/OXUqWkJT4nAZZsS1g/oWUBdu0UFVTuGc1SrFc47Cowjkp/RWr15k4iNvMSomVrQ==", + "version": "2.0.0-spork.11", + "resolved": "https://registry.npmjs.org/scratch-blocks/-/scratch-blocks-2.0.0-spork.11.tgz", + "integrity": "sha512-XFTAVYYLXqqi6nplfw8CwAhixpID5lZvsQiCATwLMgVRczwIIYka+XKUDtWsQWO45oa1+2vx93mlI6oVuHTxEg==", "license": "Apache-2.0", "dependencies": { "@blockly/continuous-toolbox": "^7.0.8", @@ -38245,7 +38245,7 @@ "react-visibility-sensor": "5.1.1", "redux-throttle": "0.1.1", "scratch-audio": "2.0.268", - "scratch-blocks": "2.0.0-spork.10", + "scratch-blocks": "2.0.0-spork.11", "scratch-l10n": "6.1.60", "scratch-paint": "4.1.50", "scratch-render-fonts": "1.0.252", @@ -39018,7 +39018,7 @@ "in-publish": "2.0.1", "js-md5": "0.7.3", "pngjs": "3.4.0", - "scratch-blocks": "2.0.0-spork.10", + "scratch-blocks": "2.0.0-spork.11", "scratch-l10n": "6.1.60", "scratch-render-fonts": "1.0.252", "scratch-semantic-release-config": "4.0.1", diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index c37901cacfa..413093414b9 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -166,7 +166,7 @@ "react-visibility-sensor": "5.1.1", "redux-throttle": "0.1.1", "scratch-audio": "2.0.268", - "scratch-blocks": "2.0.0-spork.10", + "scratch-blocks": "2.0.0-spork.11", "scratch-l10n": "6.1.60", "scratch-paint": "4.1.50", "scratch-render-fonts": "1.0.252", diff --git a/packages/scratch-vm/package.json b/packages/scratch-vm/package.json index 3cbdb455743..150b26767ac 100644 --- a/packages/scratch-vm/package.json +++ b/packages/scratch-vm/package.json @@ -99,7 +99,7 @@ "in-publish": "2.0.1", "js-md5": "0.7.3", "pngjs": "3.4.0", - "scratch-blocks": "2.0.0-spork.10", + "scratch-blocks": "2.0.0-spork.11", "scratch-l10n": "6.1.60", "scratch-render-fonts": "1.0.252", "scratch-semantic-release-config": "4.0.1", From fb81be3fc174ceee0616888296e560784059b1b3 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 3 Mar 2026 17:16:33 +0000 Subject: [PATCH 275/521] fix(deps): update dependency scratch-webpack-configuration to v3.1.2 --- package-lock.json | 14 +++++++------- packages/scratch-gui/package.json | 2 +- packages/scratch-render/package.json | 2 +- packages/scratch-svg-renderer/package.json | 2 +- packages/scratch-vm/package.json | 2 +- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/package-lock.json b/package-lock.json index 20ff5db81f2..c04649b0cad 100644 --- a/package-lock.json +++ b/package-lock.json @@ -36551,9 +36551,9 @@ "license": "BSD-3-Clause" }, "node_modules/scratch-webpack-configuration": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/scratch-webpack-configuration/-/scratch-webpack-configuration-3.1.1.tgz", - "integrity": "sha512-rMaxuC7+507rbMaFcpZQ5BJPevq+/EKwGzT458G2mo90ZIHXOnzkjDmANvNFnfjjWcuQzp595rm/UrUg9CvBVg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/scratch-webpack-configuration/-/scratch-webpack-configuration-3.1.2.tgz", + "integrity": "sha512-bkvX4r9lq+qjE+2njV7fTOEWGjsVfJke8VibjZjnuHDntAsTq/V47/MYTzfbKomLZcDA+QXDuwS33nGtihiT9w==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -43072,7 +43072,7 @@ "redux-mock-store": "1.5.5", "rimraf": "2.7.1", "scratch-semantic-release-config": "4.0.1", - "scratch-webpack-configuration": "3.1.1", + "scratch-webpack-configuration": "3.1.2", "selenium-webdriver": "3.6.0", "semantic-release": "25.0.3", "stream-browserify": "3.0.0", @@ -43146,7 +43146,7 @@ "scratch-render-fonts": "1.0.252", "scratch-semantic-release-config": "4.0.1", "scratch-storage": "6.1.10", - "scratch-webpack-configuration": "3.1.1", + "scratch-webpack-configuration": "3.1.2", "semantic-release": "25.0.3", "tap": "21.6.2", "terser-webpack-plugin": "5.3.16", @@ -43312,7 +43312,7 @@ "rimraf": "3.0.2", "scratch-render-fonts": "1.0.252", "scratch-semantic-release-config": "4.0.1", - "scratch-webpack-configuration": "3.1.1", + "scratch-webpack-configuration": "3.1.2", "semantic-release": "25.0.3", "tap": "21.6.2", "webpack": "5.105.3", @@ -43405,7 +43405,7 @@ "scratch-l10n": "6.1.60", "scratch-render-fonts": "1.0.252", "scratch-semantic-release-config": "4.0.1", - "scratch-webpack-configuration": "3.1.1", + "scratch-webpack-configuration": "3.1.2", "script-loader": "0.7.2", "semantic-release": "25.0.3", "stats.js": "0.17.0", diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index b06d6c47a12..adad1c85b06 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -212,7 +212,7 @@ "redux-mock-store": "1.5.5", "rimraf": "2.7.1", "scratch-semantic-release-config": "4.0.1", - "scratch-webpack-configuration": "3.1.1", + "scratch-webpack-configuration": "3.1.2", "selenium-webdriver": "3.6.0", "semantic-release": "25.0.3", "stream-browserify": "3.0.0", diff --git a/packages/scratch-render/package.json b/packages/scratch-render/package.json index d06030198f1..7a21aae8023 100644 --- a/packages/scratch-render/package.json +++ b/packages/scratch-render/package.json @@ -80,7 +80,7 @@ "scratch-render-fonts": "1.0.252", "scratch-semantic-release-config": "4.0.1", "scratch-storage": "6.1.10", - "scratch-webpack-configuration": "3.1.1", + "scratch-webpack-configuration": "3.1.2", "semantic-release": "25.0.3", "tap": "21.6.2", "terser-webpack-plugin": "5.3.16", diff --git a/packages/scratch-svg-renderer/package.json b/packages/scratch-svg-renderer/package.json index a0f45fe182c..e9649b011ca 100644 --- a/packages/scratch-svg-renderer/package.json +++ b/packages/scratch-svg-renderer/package.json @@ -70,7 +70,7 @@ "rimraf": "3.0.2", "scratch-render-fonts": "1.0.252", "scratch-semantic-release-config": "4.0.1", - "scratch-webpack-configuration": "3.1.1", + "scratch-webpack-configuration": "3.1.2", "semantic-release": "25.0.3", "tap": "21.6.2", "webpack": "5.105.3", diff --git a/packages/scratch-vm/package.json b/packages/scratch-vm/package.json index da53192a0ca..527db269917 100644 --- a/packages/scratch-vm/package.json +++ b/packages/scratch-vm/package.json @@ -103,7 +103,7 @@ "scratch-l10n": "6.1.60", "scratch-render-fonts": "1.0.252", "scratch-semantic-release-config": "4.0.1", - "scratch-webpack-configuration": "3.1.1", + "scratch-webpack-configuration": "3.1.2", "script-loader": "0.7.2", "semantic-release": "25.0.3", "stats.js": "0.17.0", From 84d290b2163d6f262ed369b47abc2c6cb642a1d9 Mon Sep 17 00:00:00 2001 From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com> Date: Tue, 3 Mar 2026 09:26:36 -0800 Subject: [PATCH 276/521] fix: don't try to load sounds in 'Make a Block' dialog --- packages/scratch-gui/src/containers/custom-procedures.jsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/scratch-gui/src/containers/custom-procedures.jsx b/packages/scratch-gui/src/containers/custom-procedures.jsx index ca5f83551b9..5936788fd4f 100644 --- a/packages/scratch-gui/src/containers/custom-procedures.jsx +++ b/packages/scratch-gui/src/containers/custom-procedures.jsx @@ -182,7 +182,8 @@ CustomProcedures.defaultOptions = { comments: false, collapse: false, scrollbars: true, - modalInputs: false + modalInputs: false, + sounds: false }; CustomProcedures.defaultProps = { From 70b1982b2ec8edfc7e87097c80e016deea93ef12 Mon Sep 17 00:00:00 2001 From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com> Date: Tue, 3 Mar 2026 11:23:40 -0800 Subject: [PATCH 277/521] test: fix flyout block scopes --- .../test/helpers/selenium-helper.js | 43 +++++++++++++------ .../integration/blocks-standalone.test.js | 19 ++++---- .../test/integration/blocks.test.js | 18 ++++---- 3 files changed, 47 insertions(+), 33 deletions(-) diff --git a/packages/scratch-gui/test/helpers/selenium-helper.js b/packages/scratch-gui/test/helpers/selenium-helper.js index 50e40292e28..2c648446249 100644 --- a/packages/scratch-gui/test/helpers/selenium-helper.js +++ b/packages/scratch-gui/test/helpers/selenium-helper.js @@ -92,6 +92,21 @@ const enhanceError = async (outerError, cause, driver) => { return outerError; }; +const scopes = { + blocklyFlyoutScope: '*[contains(concat(" ", @class, " "), " blocklyFlyout ")]', + blocksTab: "*[@id='panel:r0:0']", + categoryContainer: '*[contains(concat(" ", @class, " "), " blocklyToolboxCategoryContainer ")]', + costumesTab: "*[@id='panel:r0:1']", + modal: '*[contains(concat(" ", @class, " "), " ReactModalPortal ")]', + reportedValue: '*[contains(concat(" ", @class, " "), " blocklyDropDownContent ")]', + soundsTab: "*[@id='panel:r0:2']", + spriteTile: '*[contains(concat(" ", @class), " sprite-selector-item")]', + menuBar: '*[contains(concat(" ", @class), " menu-bar_menu-bar_")]', + monitors: '*[contains(concat(" ", @class), " stage_monitor-wrapper_")]', + contextMenu: '*[contains(concat(" ", @class), " context-menu")]' +}; + + class SeleniumHelper { constructor () { bindAll(this, [ @@ -102,6 +117,7 @@ class SeleniumHelper { 'scopeForBlockText', 'scopeForCategoryId', 'scopeForCategoryText', + 'scopeForFlyoutBlock', 'clickBlocksCategory', 'elementIsVisible', 'findByText', @@ -156,18 +172,7 @@ class SeleniumHelper { * work if the whole "class" attribute starts with "foo" -- it will fail if another class is listed first. */ get scope () { - return { - blocksTab: "*[@id='panel:r0:0']", - categoryContainer: '*[contains(concat(" ", @class, " "), " blocklyToolboxCategoryContainer ")]', - costumesTab: "*[@id='panel:r0:1']", - modal: '*[contains(concat(" ", @class, " "), " ReactModalPortal ")]', - reportedValue: '*[contains(concat(" ", @class, " "), " blocklyDropDownContent ")]', - soundsTab: "*[@id='panel:r0:2']", - spriteTile: '*[contains(concat(" ", @class), " sprite-selector-item")]', - menuBar: '*[contains(concat(" ", @class), " menu-bar_menu-bar_")]', - monitors: '*[contains(concat(" ", @class), " stage_monitor-wrapper_")]', - contextMenu: '*[contains(concat(" ", @class), " context-menu")]' - }; + return scopes; } /** @@ -352,6 +357,16 @@ class SeleniumHelper { blockId} ")]`; } + /** + * Calculate an XPath expression to find a block in the flyout. + * Clicking this the element at this XPath should run the block. + * @param {string} blockId The identifier (opcode) of the block to find. Example: 'motion_movesteps'. + * @returns {string} An XPath expression that finds the block in the flyout. + */ + scopeForFlyoutBlock (blockId) { + return `${scopes.blocklyFlyoutScope}//${this.scopeForBlockId(blockId)}`; + } + /** * Calculate an XPath expression to find a block in the blocks panel. * Clicking this the element at this XPath should run the block. @@ -369,7 +384,7 @@ class SeleniumHelper { * @returns {string} An XPath expression that finds the category. */ scopeForCategoryId (categoryId) { - return `*[@id="${categoryId}"]/ancestor::${this.scope.categoryContainer}`; + return `*[@id="${categoryId}"]/ancestor::${scopes.categoryContainer}`; } /** @@ -379,7 +394,7 @@ class SeleniumHelper { * @returns {string} An XPath expression that finds the category. */ scopeForCategoryText (categoryText) { - return `*[contains(text(), "${categoryText}")]/ancestor::${this.scope.categoryContainer}`; + return `*[contains(text(), "${categoryText}")]/ancestor::${scopes.categoryContainer}`; } /** diff --git a/packages/scratch-gui/test/integration/blocks-standalone.test.js b/packages/scratch-gui/test/integration/blocks-standalone.test.js index 4a8611d6129..3290ccb8e51 100644 --- a/packages/scratch-gui/test/integration/blocks-standalone.test.js +++ b/packages/scratch-gui/test/integration/blocks-standalone.test.js @@ -3,7 +3,6 @@ import SeleniumHelper from '../helpers/selenium-helper'; const { clickText, - scopeForBlockId, clickBlocksCategory, clickButton, clickXpath, @@ -15,7 +14,8 @@ const { Key, loadUri, rightClickText, - scope + scope, + scopeForFlyoutBlock } = new SeleniumHelper(); const uri = path.resolve(__dirname, '../../build/standalone.html'); @@ -134,7 +134,7 @@ describe('Working with the blocks', () => { await clickText('list1', scope.monitors); // Blur the input to submit // Check that the list value has been propagated. - await clickText('list1', scope.blocksTab); + await clickText('list1', scopeForFlyoutBlock('data_listcontents')); await findByText('thing thing thing thing2', scope.reportedValue); // Tooltip with result // Hiding the monitor via context menu should work @@ -300,7 +300,6 @@ describe('Working with the blocks', () => { test('Use variable blocks after switching languages', async () => { const myVariable = 'my\u00A0variable'; - const changeVariableByScope = scopeForBlockId('data_changevariableby'); await loadUri(uri); @@ -308,10 +307,10 @@ describe('Working with the blocks', () => { await clickBlocksCategory('Variables'); // change "my variable" by 1 - await clickText('change', changeVariableByScope); + await clickText('change', scopeForFlyoutBlock('data_changevariableby')); // check reported value 1 - await clickText(myVariable, scope.blocksTab); + await clickText(myVariable, scopeForFlyoutBlock('data_variable')); await findByText('1', scope.reportedValue); // change language @@ -323,20 +322,20 @@ describe('Working with the blocks', () => { await clickBlocksCategory('Variablen'); // make sure "my variable" is still 1 - await clickText(myVariable); + await clickText(myVariable, scopeForFlyoutBlock('data_variable')); await findByText('1', scope.reportedValue); // change step from 1 to 10 - await clickText('1', changeVariableByScope); + await clickText('1', scopeForFlyoutBlock('data_changevariableby')); await driver.actions() .sendKeys('10') .perform(); // change "my variable" by 10 - await clickText('ändere', changeVariableByScope); + await clickText('ändere', scopeForFlyoutBlock('data_changevariableby')); // check it is turned up to 11 - await clickText(myVariable); + await clickText(myVariable, scopeForFlyoutBlock('data_variable')); await findByText('11', scope.reportedValue); }); }); diff --git a/packages/scratch-gui/test/integration/blocks.test.js b/packages/scratch-gui/test/integration/blocks.test.js index dd44fcb17f3..173852dfd69 100644 --- a/packages/scratch-gui/test/integration/blocks.test.js +++ b/packages/scratch-gui/test/integration/blocks.test.js @@ -14,7 +14,8 @@ const { Key, loadUri, rightClickText, - scope + scope, + scopeForFlyoutBlock } = new SeleniumHelper(); const uri = path.resolve(__dirname, '../../build/index.html'); @@ -131,7 +132,7 @@ describe('Working with the blocks', () => { await clickText('list1', scope.monitors); // Blur the input to submit // Check that the list value has been propagated. - await clickText('list1', scope.blocksTab); + await clickText('list1', scopeForFlyoutBlock('data_listcontents')); await findByText('thing thing thing thing2', scope.reportedValue); // Tooltip with result // Hiding the monitor via context menu should work @@ -297,7 +298,6 @@ describe('Working with the blocks', () => { test('Use variable blocks after switching languages', async () => { const myVariable = 'my\u00A0variable'; - const changeVariableByScope = '*[contains(@class, "blocklyFlyout")]//*[contains(@class, "data_changevariableby")]'; await loadUri(uri); @@ -305,10 +305,10 @@ describe('Working with the blocks', () => { await clickBlocksCategory('Variables'); // change "my variable" by 1 - await clickText('change', changeVariableByScope); + await clickText('change', scopeForFlyoutBlock('data_changevariableby')); // check reported value 1 - await clickText(myVariable, scope.blocksTab); + await clickText(myVariable, scopeForFlyoutBlock('data_variable')); await findByText('1', scope.reportedValue); // change language @@ -320,20 +320,20 @@ describe('Working with the blocks', () => { await clickBlocksCategory('Variablen'); // make sure "my variable" is still 1 - await clickText(myVariable); + await clickText(myVariable, scopeForFlyoutBlock('data_variable')); await findByText('1', scope.reportedValue); // change step from 1 to 10 - await clickText('1', changeVariableByScope); + await clickText('1', scopeForFlyoutBlock('data_changevariableby')); await driver.actions() .sendKeys('10') .perform(); // change "my variable" by 10 - await clickText('ändere', changeVariableByScope); + await clickText('ändere', scopeForFlyoutBlock('data_changevariableby')); // check it is turned up to 11 - await clickText(myVariable); + await clickText(myVariable, scopeForFlyoutBlock('data_variable')); await findByText('11', scope.reportedValue); }); }); From 2cec3ae79c99f15f4c45cf8a5931415d9be6d2d7 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 4 Mar 2026 02:15:46 +0000 Subject: [PATCH 278/521] fix(deps): update dependency scratch-storage to v6.1.11 --- package-lock.json | 12 ++++++------ packages/scratch-gui/package.json | 2 +- packages/scratch-render/package.json | 2 +- packages/scratch-vm/package.json | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index c04649b0cad..19d543f0790 100644 --- a/package-lock.json +++ b/package-lock.json @@ -36529,9 +36529,9 @@ } }, "node_modules/scratch-storage": { - "version": "6.1.10", - "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-6.1.10.tgz", - "integrity": "sha512-3+Bb4gJ6g1udGHPgI2dXSNJOK1vXw5g+hrByKr8XWCXgxw5MgNnubpQ2v0CS0N/3YpiwO8UF22rMdRcqq3WRgg==", + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-6.1.11.tgz", + "integrity": "sha512-guan1JGZO6P8LpCtYp+Q3nwpwwwnAwCQH5ZwUbXnNWnReh+Dcw4tCPm9UxzHFEtN6BId9n2Vkgw/qvD4XTSdaQ==", "license": "AGPL-3.0-only", "dependencies": { "@babel/runtime": "^7.21.0", @@ -43030,7 +43030,7 @@ "scratch-l10n": "6.1.60", "scratch-paint": "4.1.50", "scratch-render-fonts": "1.0.252", - "scratch-storage": "6.1.10", + "scratch-storage": "6.1.11", "startaudiocontext": "1.2.1", "style-loader": "4.0.0", "text-encoding": "0.7.0", @@ -43145,7 +43145,7 @@ "playwright-chromium": "1.58.2", "scratch-render-fonts": "1.0.252", "scratch-semantic-release-config": "4.0.1", - "scratch-storage": "6.1.10", + "scratch-storage": "6.1.11", "scratch-webpack-configuration": "3.1.2", "semantic-release": "25.0.3", "tap": "21.6.2", @@ -43378,7 +43378,7 @@ "scratch-audio": "2.0.268", "scratch-parser": "6.0.0", "scratch-sb1-converter": "2.0.279", - "scratch-storage": "6.1.10", + "scratch-storage": "6.1.11", "scratch-translate-extension-languages": "1.0.7", "text-encoding": "0.7.0", "tslog": "4.10.2", diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index adad1c85b06..401073f3b54 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -170,7 +170,7 @@ "scratch-l10n": "6.1.60", "scratch-paint": "4.1.50", "scratch-render-fonts": "1.0.252", - "scratch-storage": "6.1.10", + "scratch-storage": "6.1.11", "startaudiocontext": "1.2.1", "style-loader": "4.0.0", "text-encoding": "0.7.0", diff --git a/packages/scratch-render/package.json b/packages/scratch-render/package.json index 7a21aae8023..b8d1b784191 100644 --- a/packages/scratch-render/package.json +++ b/packages/scratch-render/package.json @@ -79,7 +79,7 @@ "playwright-chromium": "1.58.2", "scratch-render-fonts": "1.0.252", "scratch-semantic-release-config": "4.0.1", - "scratch-storage": "6.1.10", + "scratch-storage": "6.1.11", "scratch-webpack-configuration": "3.1.2", "semantic-release": "25.0.3", "tap": "21.6.2", diff --git a/packages/scratch-vm/package.json b/packages/scratch-vm/package.json index 527db269917..7c2ee3cab4a 100644 --- a/packages/scratch-vm/package.json +++ b/packages/scratch-vm/package.json @@ -76,7 +76,7 @@ "scratch-audio": "2.0.268", "scratch-parser": "6.0.0", "scratch-sb1-converter": "2.0.279", - "scratch-storage": "6.1.10", + "scratch-storage": "6.1.11", "scratch-translate-extension-languages": "1.0.7", "text-encoding": "0.7.0", "tslog": "4.10.2", From f8760f661dabdc5ab7cf46abbfda96bd1f107e64 Mon Sep 17 00:00:00 2001 From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com> Date: Wed, 4 Mar 2026 15:31:00 -0800 Subject: [PATCH 279/521] fix(deps)!: update scratch-blocks to v2.0.0 BREAKING CHANGE: Updating to `scratch-blocks@^2` and Blockly v12 brings significant changes to the document structure and build system. Most applications depending on `scratch-gui` will likely still work, but it's possible that some of these changes will be disruptive to more sensitive applications. It's also possible, maybe likely, to affect any tests that interact with the blocks workspace or wrappers around it. --- package-lock.json | 166 +++++++++++++----------------- packages/scratch-gui/package.json | 2 +- packages/scratch-vm/package.json | 2 +- 3 files changed, 71 insertions(+), 99 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4caeaf767b5..f71e9f72e5f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -221,6 +221,7 @@ "version": "7.29.0", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.29.0", "@babel/generator": "^7.29.0", @@ -2316,6 +2317,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=18" }, @@ -2350,6 +2352,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=18" } @@ -3625,7 +3628,8 @@ }, "node_modules/@mediapipe/face_detection": { "version": "0.4.1646425229", - "license": "Apache-2.0" + "license": "Apache-2.0", + "peer": true }, "node_modules/@microbit/microbit-universal-hex": { "version": "0.2.2", @@ -3677,6 +3681,7 @@ "version": "1.4.0", "devOptional": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 16" }, @@ -4072,6 +4077,7 @@ "version": "7.0.6", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@octokit/auth-token": "^6.0.0", "@octokit/graphql": "^9.0.3", @@ -4194,16 +4200,6 @@ "@octokit/openapi-types": "^27.0.0" } }, - "node_modules/@oxc-project/types": { - "version": "0.99.0", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "funding": { - "url": "https://github.com/sponsors/Boshen" - } - }, "node_modules/@peculiar/asn1-cms": { "version": "2.6.1", "dev": true, @@ -4869,45 +4865,6 @@ "version": "1.1.1", "license": "MIT" }, - "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.0.0-beta.52", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.0.0-beta.52", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.0-beta.52", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, "node_modules/@rollup/pluginutils": { "version": "5.3.0", "dev": true, @@ -7320,6 +7277,7 @@ "dev": true, "inBundle": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -7966,6 +7924,7 @@ "integrity": "sha512-0KKabYyBN4W2CRgnD0rOhDvexbMLMPuT0OElQTz5ezCsx1QGtuUHP9TmRXEGCJAoeL44Us0L2DxPpS4BUW1KEQ==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "dependencies": { "@tapjs/processinfo": "^3.1.9", "@tapjs/stack": "4.3.0", @@ -8888,6 +8847,7 @@ "node_modules/@tensorflow/tfjs-backend-webgl": { "version": "4.22.0", "license": "Apache-2.0", + "peer": true, "dependencies": { "@tensorflow/tfjs-backend-cpu": "4.22.0", "@types/offscreencanvas": "~2019.3.0", @@ -8904,6 +8864,7 @@ "node_modules/@tensorflow/tfjs-converter": { "version": "4.22.0", "license": "Apache-2.0", + "peer": true, "peerDependencies": { "@tensorflow/tfjs-core": "4.22.0" } @@ -8911,6 +8872,7 @@ "node_modules/@tensorflow/tfjs-core": { "version": "4.22.0", "license": "Apache-2.0", + "peer": true, "dependencies": { "@types/long": "^4.0.1", "@types/offscreencanvas": "~2019.7.0", @@ -9594,6 +9556,7 @@ "node_modules/@types/node": { "version": "24.10.1", "license": "MIT", + "peer": true, "dependencies": { "undici-types": "~7.16.0" } @@ -9648,6 +9611,7 @@ "node_modules/@types/react": { "version": "18.3.27", "license": "MIT", + "peer": true, "dependencies": { "@types/prop-types": "*", "csstype": "^3.2.2" @@ -9657,6 +9621,7 @@ "version": "18.3.7", "devOptional": true, "license": "MIT", + "peer": true, "peerDependencies": { "@types/react": "^18.0.0" } @@ -9986,6 +9951,7 @@ "version": "8.46.3", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.46.3", "@typescript-eslint/types": "8.46.3", @@ -10857,6 +10823,7 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -10939,6 +10906,7 @@ "node_modules/ajv": { "version": "8.17.1", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -11259,6 +11227,7 @@ "node_modules/arraybuffer-loader": { "version": "1.0.8", "license": "MIT", + "peer": true, "dependencies": { "loader-utils": "^1.1.0" }, @@ -11534,6 +11503,7 @@ "version": "9.2.1", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "find-cache-dir": "^4.0.0", "schema-utils": "^4.0.0" @@ -11847,6 +11817,7 @@ "node_modules/blockly": { "version": "12.4.1", "license": "Apache-2.0", + "peer": true, "dependencies": { "jsdom": "26.1.0" }, @@ -12156,6 +12127,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -13598,6 +13570,7 @@ "node_modules/copy-webpack-plugin/node_modules/ajv": { "version": "6.12.6", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -13772,6 +13745,7 @@ "version": "8.3.6", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", @@ -13926,6 +13900,7 @@ "node_modules/css-loader/node_modules/ajv": { "version": "6.12.6", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -14692,15 +14667,6 @@ "node": ">= 0.8" } }, - "node_modules/encoding": { - "version": "0.1.13", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, "node_modules/encoding-sniffer": { "version": "0.2.1", "dev": true, @@ -15204,6 +15170,7 @@ "integrity": "sha512-VmQ+sifHUbI/IcSopBCF/HO3YiHQx/AVd3UVyYL6weuwW+HvON9VYn5l6Zl1WZzPWXPNZrSQpxwkkZ/VuvJZzg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -16005,6 +15972,7 @@ "version": "6.12.6", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -16398,6 +16366,7 @@ "version": "6.12.6", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -19843,6 +19812,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=20.19.0" }, @@ -19863,6 +19833,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=20.19.0" } @@ -20213,6 +20184,7 @@ "version": "29.7.0", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/core": "^29.7.0", "@jest/types": "^29.6.3", @@ -26957,6 +26929,7 @@ "dev": true, "inBundle": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -28446,6 +28419,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -28516,6 +28490,7 @@ "node_modules/postcss-loader/node_modules/ajv": { "version": "6.12.6", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -28699,6 +28674,7 @@ "version": "3.8.1", "dev": true, "license": "MIT", + "peer": true, "bin": { "prettier": "bin/prettier.cjs" }, @@ -28925,6 +28901,7 @@ "node_modules/prop-types": { "version": "15.8.1", "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", @@ -29170,6 +29147,7 @@ "node_modules/raw-loader/node_modules/ajv": { "version": "6.12.6", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -29245,6 +29223,7 @@ "node_modules/react": { "version": "18.3.1", "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -29461,6 +29440,7 @@ "node_modules/react-redux": { "version": "8.1.3", "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.12.1", "@types/hoist-non-react-statics": "^3.3.1", @@ -29545,6 +29525,7 @@ "node_modules/react-responsive": { "version": "9.0.2", "license": "MIT", + "peer": true, "dependencies": { "hyphenate-style-name": "^1.0.0", "matchmediaquery": "^0.3.0", @@ -29573,6 +29554,7 @@ "node_modules/react-style-proptype": { "version": "3.2.2", "license": "MIT", + "peer": true, "dependencies": { "prop-types": "^15.5.4" } @@ -30570,39 +30552,6 @@ "rimraf": "bin.js" } }, - "node_modules/rolldown": { - "version": "1.0.0-beta.52", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@oxc-project/types": "=0.99.0", - "@rolldown/pluginutils": "1.0.0-beta.52" - }, - "bin": { - "rolldown": "bin/cli.mjs" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "optionalDependencies": { - "@rolldown/binding-android-arm64": "1.0.0-beta.52", - "@rolldown/binding-darwin-arm64": "1.0.0-beta.52", - "@rolldown/binding-darwin-x64": "1.0.0-beta.52", - "@rolldown/binding-freebsd-x64": "1.0.0-beta.52", - "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-beta.52", - "@rolldown/binding-linux-arm64-gnu": "1.0.0-beta.52", - "@rolldown/binding-linux-arm64-musl": "1.0.0-beta.52", - "@rolldown/binding-linux-x64-gnu": "1.0.0-beta.52", - "@rolldown/binding-linux-x64-musl": "1.0.0-beta.52", - "@rolldown/binding-openharmony-arm64": "1.0.0-beta.52", - "@rolldown/binding-wasm32-wasi": "1.0.0-beta.52", - "@rolldown/binding-win32-arm64-msvc": "1.0.0-beta.52", - "@rolldown/binding-win32-ia32-msvc": "1.0.0-beta.52", - "@rolldown/binding-win32-x64-msvc": "1.0.0-beta.52" - } - }, "node_modules/rrweb-cssom": { "version": "0.8.0", "license": "MIT" @@ -30784,7 +30733,9 @@ } }, "node_modules/scratch-blocks": { - "version": "2.0.0-spork.11", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/scratch-blocks/-/scratch-blocks-2.0.0.tgz", + "integrity": "sha512-HySdHjMcHHKV13e1Kr0D8G9EeuXFgp+968fyeBmbforKfDRy9gmxeJukeEe0cO7p6xb4tU7gRe5Dc9yda0zFjg==", "license": "Apache-2.0", "dependencies": { "@blockly/continuous-toolbox": "^7.0.8", @@ -30886,6 +30837,7 @@ }, "node_modules/scratch-render-fonts": { "version": "1.0.252", + "peer": true, "dependencies": { "base64-loader": "^1.0.0" } @@ -30973,7 +30925,8 @@ }, "node_modules/seedrandom": { "version": "3.0.5", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/select-hose": { "version": "2.0.0", @@ -31010,6 +30963,7 @@ "version": "25.0.3", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@semantic-release/commit-analyzer": "^13.0.1", "@semantic-release/error": "^4.0.0", @@ -32884,6 +32838,7 @@ "node_modules/style-loader": { "version": "4.0.0", "license": "MIT", + "peer": true, "engines": { "node": ">= 18.12.0" }, @@ -33378,6 +33333,7 @@ "node_modules/terser": { "version": "5.44.1", "license": "BSD-2-Clause", + "peer": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.15.0", @@ -33806,6 +33762,7 @@ "version": "29.4.6", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "bs-logger": "^0.2.6", "fast-json-stable-stringify": "^2.1.0", @@ -33887,6 +33844,7 @@ "version": "9.5.4", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "chalk": "^4.1.0", "enhanced-resolve": "^5.0.0", @@ -33938,6 +33896,7 @@ "version": "10.9.2", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", @@ -34211,7 +34170,8 @@ }, "node_modules/tslib": { "version": "2.8.1", - "license": "0BSD" + "license": "0BSD", + "peer": true }, "node_modules/tslog": { "version": "4.10.2", @@ -34548,6 +34508,7 @@ "version": "5.9.3", "devOptional": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -35105,6 +35066,7 @@ "version": "4.1.1", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "loader-utils": "^2.0.0", "mime-types": "^2.1.27", @@ -35131,6 +35093,7 @@ "version": "6.12.6", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -35427,6 +35390,7 @@ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.105.3.tgz", "integrity": "sha512-LLBBA4oLmT7sZdHiYE/PeVuifOxYyE2uL/V+9VQP7YSYdJU7bSf7H8bZRRxW8kEPMkmVjnrXmoR3oejIdX0xbg==", "license": "MIT", + "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.8", @@ -35474,6 +35438,7 @@ "version": "4.10.0", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@discoveryjs/json-ext": "^0.5.0", "@webpack-cli/configtest": "^1.2.0", @@ -36217,6 +36182,7 @@ "version": "2.8.2", "dev": true, "license": "ISC", + "peer": true, "bin": { "yaml": "bin.mjs" }, @@ -36325,6 +36291,7 @@ "version": "4.1.13", "dev": true, "license": "MIT", + "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } @@ -36411,7 +36378,7 @@ "react-visibility-sensor": "5.1.1", "redux-throttle": "0.1.1", "scratch-audio": "2.0.268", - "scratch-blocks": "2.0.0-spork.11", + "scratch-blocks": "2.0.0", "scratch-l10n": "6.1.60", "scratch-paint": "4.1.50", "scratch-render-fonts": "1.0.252", @@ -36577,6 +36544,7 @@ "version": "5.1.4", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@discoveryjs/json-ext": "^0.5.0", "@webpack-cli/configtest": "^2.1.1", @@ -36835,6 +36803,7 @@ "version": "5.1.4", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@discoveryjs/json-ext": "^0.5.0", "@webpack-cli/configtest": "^2.1.1", @@ -37021,6 +36990,7 @@ "version": "5.1.4", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@discoveryjs/json-ext": "^0.5.0", "@webpack-cli/configtest": "^2.1.1", @@ -37105,7 +37075,7 @@ "in-publish": "2.0.1", "js-md5": "0.7.3", "pngjs": "3.4.0", - "scratch-blocks": "2.0.0-spork.11", + "scratch-blocks": "2.0.0", "scratch-l10n": "6.1.60", "scratch-render-fonts": "1.0.252", "scratch-semantic-release-config": "4.0.1", @@ -37504,6 +37474,7 @@ "version": "7.3.1", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@oxc-project/runtime": "0.101.0", "fdir": "^6.5.0", @@ -37578,6 +37549,7 @@ "version": "4.0.18", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@vitest/expect": "4.0.18", "@vitest/mocker": "4.0.18", diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index 661c45b73d9..3a8f266d851 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -166,7 +166,7 @@ "react-visibility-sensor": "5.1.1", "redux-throttle": "0.1.1", "scratch-audio": "2.0.268", - "scratch-blocks": "2.0.0-spork.11", + "scratch-blocks": "2.0.0", "scratch-l10n": "6.1.60", "scratch-paint": "4.1.50", "scratch-render-fonts": "1.0.252", diff --git a/packages/scratch-vm/package.json b/packages/scratch-vm/package.json index a9130ca5ab3..ec6cca8de93 100644 --- a/packages/scratch-vm/package.json +++ b/packages/scratch-vm/package.json @@ -99,7 +99,7 @@ "in-publish": "2.0.1", "js-md5": "0.7.3", "pngjs": "3.4.0", - "scratch-blocks": "2.0.0-spork.11", + "scratch-blocks": "2.0.0", "scratch-l10n": "6.1.60", "scratch-render-fonts": "1.0.252", "scratch-semantic-release-config": "4.0.1", From 810ac12eaa1a1eb19d05fcb37f486ad1c4c56314 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 5 Mar 2026 01:27:42 +0000 Subject: [PATCH 280/521] fix(deps): pin dependencies (#425) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 85 +++++++------------------------ packages/scratch-gui/package.json | 4 +- 2 files changed, 21 insertions(+), 68 deletions(-) diff --git a/package-lock.json b/package-lock.json index f71e9f72e5f..e46b1dbe831 100644 --- a/package-lock.json +++ b/package-lock.json @@ -221,7 +221,6 @@ "version": "7.29.0", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.29.0", "@babel/generator": "^7.29.0", @@ -2317,7 +2316,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -2352,7 +2350,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=18" } @@ -3628,8 +3625,7 @@ }, "node_modules/@mediapipe/face_detection": { "version": "0.4.1646425229", - "license": "Apache-2.0", - "peer": true + "license": "Apache-2.0" }, "node_modules/@microbit/microbit-universal-hex": { "version": "0.2.2", @@ -3681,7 +3677,6 @@ "version": "1.4.0", "devOptional": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 16" }, @@ -4077,7 +4072,6 @@ "version": "7.0.6", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@octokit/auth-token": "^6.0.0", "@octokit/graphql": "^9.0.3", @@ -7277,7 +7271,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -7924,7 +7917,6 @@ "integrity": "sha512-0KKabYyBN4W2CRgnD0rOhDvexbMLMPuT0OElQTz5ezCsx1QGtuUHP9TmRXEGCJAoeL44Us0L2DxPpS4BUW1KEQ==", "dev": true, "license": "BlueOak-1.0.0", - "peer": true, "dependencies": { "@tapjs/processinfo": "^3.1.9", "@tapjs/stack": "4.3.0", @@ -8847,7 +8839,6 @@ "node_modules/@tensorflow/tfjs-backend-webgl": { "version": "4.22.0", "license": "Apache-2.0", - "peer": true, "dependencies": { "@tensorflow/tfjs-backend-cpu": "4.22.0", "@types/offscreencanvas": "~2019.3.0", @@ -8864,7 +8855,6 @@ "node_modules/@tensorflow/tfjs-converter": { "version": "4.22.0", "license": "Apache-2.0", - "peer": true, "peerDependencies": { "@tensorflow/tfjs-core": "4.22.0" } @@ -8872,7 +8862,6 @@ "node_modules/@tensorflow/tfjs-core": { "version": "4.22.0", "license": "Apache-2.0", - "peer": true, "dependencies": { "@types/long": "^4.0.1", "@types/offscreencanvas": "~2019.7.0", @@ -9556,7 +9545,6 @@ "node_modules/@types/node": { "version": "24.10.1", "license": "MIT", - "peer": true, "dependencies": { "undici-types": "~7.16.0" } @@ -9611,7 +9599,6 @@ "node_modules/@types/react": { "version": "18.3.27", "license": "MIT", - "peer": true, "dependencies": { "@types/prop-types": "*", "csstype": "^3.2.2" @@ -9621,7 +9608,6 @@ "version": "18.3.7", "devOptional": true, "license": "MIT", - "peer": true, "peerDependencies": { "@types/react": "^18.0.0" } @@ -9951,7 +9937,6 @@ "version": "8.46.3", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.46.3", "@typescript-eslint/types": "8.46.3", @@ -10823,7 +10808,6 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -10906,7 +10890,6 @@ "node_modules/ajv": { "version": "8.17.1", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -11227,7 +11210,6 @@ "node_modules/arraybuffer-loader": { "version": "1.0.8", "license": "MIT", - "peer": true, "dependencies": { "loader-utils": "^1.1.0" }, @@ -11503,7 +11485,6 @@ "version": "9.2.1", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "find-cache-dir": "^4.0.0", "schema-utils": "^4.0.0" @@ -11817,7 +11798,6 @@ "node_modules/blockly": { "version": "12.4.1", "license": "Apache-2.0", - "peer": true, "dependencies": { "jsdom": "26.1.0" }, @@ -12127,7 +12107,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -13570,7 +13549,6 @@ "node_modules/copy-webpack-plugin/node_modules/ajv": { "version": "6.12.6", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -13745,7 +13723,6 @@ "version": "8.3.6", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", @@ -13900,7 +13877,6 @@ "node_modules/css-loader/node_modules/ajv": { "version": "6.12.6", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -15170,7 +15146,6 @@ "integrity": "sha512-VmQ+sifHUbI/IcSopBCF/HO3YiHQx/AVd3UVyYL6weuwW+HvON9VYn5l6Zl1WZzPWXPNZrSQpxwkkZ/VuvJZzg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -15446,6 +15421,8 @@ }, "node_modules/eslint-plugin-import-x": { "version": "4.16.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import-x/-/eslint-plugin-import-x-4.16.1.tgz", + "integrity": "sha512-vPZZsiOKaBAIATpFE2uMI4w5IRwdv/FpQ+qZZMR4E+PeOcM4OeoEbqxRMnywdxP19TyB/3h6QBB0EWon7letSQ==", "dev": true, "license": "MIT", "dependencies": { @@ -15481,6 +15458,8 @@ }, "node_modules/eslint-plugin-import-x/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": { @@ -15489,6 +15468,8 @@ }, "node_modules/eslint-plugin-import-x/node_modules/brace-expansion": { "version": "5.0.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", + "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", "dev": true, "license": "MIT", "dependencies": { @@ -15500,6 +15481,8 @@ }, "node_modules/eslint-plugin-import-x/node_modules/minimatch": { "version": "10.2.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -15514,6 +15497,8 @@ }, "node_modules/eslint-plugin-import-x/node_modules/semver": { "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "dev": true, "license": "ISC", "bin": { @@ -15972,7 +15957,6 @@ "version": "6.12.6", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -16366,7 +16350,6 @@ "version": "6.12.6", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -19812,7 +19795,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=20.19.0" }, @@ -19833,7 +19815,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=20.19.0" } @@ -20184,7 +20165,6 @@ "version": "29.7.0", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/core": "^29.7.0", "@jest/types": "^29.6.3", @@ -26929,7 +26909,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -28419,7 +28398,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -28490,7 +28468,6 @@ "node_modules/postcss-loader/node_modules/ajv": { "version": "6.12.6", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -28674,7 +28651,6 @@ "version": "3.8.1", "dev": true, "license": "MIT", - "peer": true, "bin": { "prettier": "bin/prettier.cjs" }, @@ -28901,7 +28877,6 @@ "node_modules/prop-types": { "version": "15.8.1", "license": "MIT", - "peer": true, "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", @@ -29147,7 +29122,6 @@ "node_modules/raw-loader/node_modules/ajv": { "version": "6.12.6", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -29223,7 +29197,6 @@ "node_modules/react": { "version": "18.3.1", "license": "MIT", - "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -29439,8 +29412,9 @@ }, "node_modules/react-redux": { "version": "8.1.3", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-8.1.3.tgz", + "integrity": "sha512-n0ZrutD7DaX/j9VscF+uTALI3oUPa/pO4Z3soOBIjuRn/FzVu6aehhysxZCLi6y7duMf52WNZGMl7CtuK5EnRw==", "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.12.1", "@types/hoist-non-react-statics": "^3.3.1", @@ -29477,6 +29451,8 @@ }, "node_modules/react-redux/node_modules/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==", "license": "MIT" }, "node_modules/react-remove-scroll": { @@ -29525,7 +29501,6 @@ "node_modules/react-responsive": { "version": "9.0.2", "license": "MIT", - "peer": true, "dependencies": { "hyphenate-style-name": "^1.0.0", "matchmediaquery": "^0.3.0", @@ -29554,7 +29529,6 @@ "node_modules/react-style-proptype": { "version": "3.2.2", "license": "MIT", - "peer": true, "dependencies": { "prop-types": "^15.5.4" } @@ -30837,7 +30811,6 @@ }, "node_modules/scratch-render-fonts": { "version": "1.0.252", - "peer": true, "dependencies": { "base64-loader": "^1.0.0" } @@ -30925,8 +30898,7 @@ }, "node_modules/seedrandom": { "version": "3.0.5", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/select-hose": { "version": "2.0.0", @@ -30963,7 +30935,6 @@ "version": "25.0.3", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@semantic-release/commit-analyzer": "^13.0.1", "@semantic-release/error": "^4.0.0", @@ -32838,7 +32809,6 @@ "node_modules/style-loader": { "version": "4.0.0", "license": "MIT", - "peer": true, "engines": { "node": ">= 18.12.0" }, @@ -33333,7 +33303,6 @@ "node_modules/terser": { "version": "5.44.1", "license": "BSD-2-Clause", - "peer": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.15.0", @@ -33762,7 +33731,6 @@ "version": "29.4.6", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "bs-logger": "^0.2.6", "fast-json-stable-stringify": "^2.1.0", @@ -33844,7 +33812,6 @@ "version": "9.5.4", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "chalk": "^4.1.0", "enhanced-resolve": "^5.0.0", @@ -33896,7 +33863,6 @@ "version": "10.9.2", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", @@ -34170,8 +34136,7 @@ }, "node_modules/tslib": { "version": "2.8.1", - "license": "0BSD", - "peer": true + "license": "0BSD" }, "node_modules/tslog": { "version": "4.10.2", @@ -34508,7 +34473,6 @@ "version": "5.9.3", "devOptional": true, "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -35066,7 +35030,6 @@ "version": "4.1.1", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "loader-utils": "^2.0.0", "mime-types": "^2.1.27", @@ -35093,7 +35056,6 @@ "version": "6.12.6", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -35390,7 +35352,6 @@ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.105.3.tgz", "integrity": "sha512-LLBBA4oLmT7sZdHiYE/PeVuifOxYyE2uL/V+9VQP7YSYdJU7bSf7H8bZRRxW8kEPMkmVjnrXmoR3oejIdX0xbg==", "license": "MIT", - "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.8", @@ -35438,7 +35399,6 @@ "version": "4.10.0", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@discoveryjs/json-ext": "^0.5.0", "@webpack-cli/configtest": "^1.2.0", @@ -36182,7 +36142,6 @@ "version": "2.8.2", "dev": true, "license": "ISC", - "peer": true, "bin": { "yaml": "bin.mjs" }, @@ -36291,7 +36250,6 @@ "version": "4.1.13", "dev": true, "license": "MIT", - "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } @@ -36369,7 +36327,7 @@ "react-intl": "6.8.9", "react-modal": "3.16.3", "react-popover": "0.5.10", - "react-redux": "^8.0.0", + "react-redux": "8.1.3", "react-responsive": "9.0.2", "react-style-proptype": "3.2.2", "react-tabs": "5.2.0", @@ -36410,7 +36368,7 @@ "eslint": "9.39.3", "eslint-config-scratch": "13.0.0", "eslint-import-resolver-typescript": "4.4.4", - "eslint-plugin-import-x": "^4.16.1", + "eslint-plugin-import-x": "4.16.1", "eslint-plugin-react": "7.37.5", "file-loader": "6.2.0", "gh-pages": "3.2.3", @@ -36544,7 +36502,6 @@ "version": "5.1.4", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@discoveryjs/json-ext": "^0.5.0", "@webpack-cli/configtest": "^2.1.1", @@ -36803,7 +36760,6 @@ "version": "5.1.4", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@discoveryjs/json-ext": "^0.5.0", "@webpack-cli/configtest": "^2.1.1", @@ -36990,7 +36946,6 @@ "version": "5.1.4", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@discoveryjs/json-ext": "^0.5.0", "@webpack-cli/configtest": "^2.1.1", @@ -37474,7 +37429,6 @@ "version": "7.3.1", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@oxc-project/runtime": "0.101.0", "fdir": "^6.5.0", @@ -37549,7 +37503,6 @@ "version": "4.0.18", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@vitest/expect": "4.0.18", "@vitest/mocker": "4.0.18", diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index 3a8f266d851..6e0324c0d1f 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -157,7 +157,7 @@ "react-intl": "6.8.9", "react-modal": "3.16.3", "react-popover": "0.5.10", - "react-redux": "^8.0.0", + "react-redux": "8.1.3", "react-responsive": "9.0.2", "react-style-proptype": "3.2.2", "react-tabs": "5.2.0", @@ -198,7 +198,7 @@ "eslint": "9.39.3", "eslint-config-scratch": "13.0.0", "eslint-import-resolver-typescript": "4.4.4", - "eslint-plugin-import-x": "^4.16.1", + "eslint-plugin-import-x": "4.16.1", "eslint-plugin-react": "7.37.5", "file-loader": "6.2.0", "gh-pages": "3.2.3", From d4f2215deb42a8024b43689973651fd90775df2e Mon Sep 17 00:00:00 2001 From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com> Date: Fri, 6 Mar 2026 10:26:31 -0800 Subject: [PATCH 281/521] ci: attempt to fix test result reporting --- .github/workflows/ci.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e773cf9e024..d20ff884387 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -63,6 +63,11 @@ jobs: runs-on: ubuntu-latest needs: build if: ${{ needs.build.outputs.any-workspace == 'true' }} + permissions: + checks: write + pull-requests: write + contents: read + issues: read strategy: fail-fast: false matrix: From 1500f889e1d39895f3f9bee1f92f14ec28194d94 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 6 Mar 2026 18:28:07 +0000 Subject: [PATCH 282/521] chore(deps): update dependency terser-webpack-plugin to v5.3.17 --- package-lock.json | 18 ++++++++---------- packages/scratch-render/package.json | 2 +- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/package-lock.json b/package-lock.json index e46b1dbe831..fbac51d6478 100644 --- a/package-lock.json +++ b/package-lock.json @@ -33317,13 +33317,14 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.16", + "version": "5.3.17", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.17.tgz", + "integrity": "sha512-YR7PtUp6GMU91BgSJmlaX/rS2lGDbAF7D+Wtq7hRO+MiljNmodYvqslzCFiYVAgW+Qoaaia/QUIP4lGXufjdZw==", "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", "schema-utils": "^4.3.0", - "serialize-javascript": "^6.0.2", "terser": "^5.31.1" }, "engines": { @@ -33350,6 +33351,8 @@ }, "node_modules/terser-webpack-plugin/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==", "license": "MIT", "dependencies": { "@types/node": "*", @@ -33360,15 +33363,10 @@ "node": ">= 10.13.0" } }, - "node_modules/terser-webpack-plugin/node_modules/serialize-javascript": { - "version": "6.0.2", - "license": "BSD-3-Clause", - "dependencies": { - "randombytes": "^2.1.0" - } - }, "node_modules/terser-webpack-plugin/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==", "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -36576,7 +36574,7 @@ "scratch-webpack-configuration": "3.1.2", "semantic-release": "25.0.3", "tap": "21.6.2", - "terser-webpack-plugin": "5.3.16", + "terser-webpack-plugin": "5.3.17", "typedoc": "0.28.16", "webpack": "5.105.3", "webpack-cli": "5.1.4", diff --git a/packages/scratch-render/package.json b/packages/scratch-render/package.json index b8d1b784191..1c5baa0f0a4 100644 --- a/packages/scratch-render/package.json +++ b/packages/scratch-render/package.json @@ -83,7 +83,7 @@ "scratch-webpack-configuration": "3.1.2", "semantic-release": "25.0.3", "tap": "21.6.2", - "terser-webpack-plugin": "5.3.16", + "terser-webpack-plugin": "5.3.17", "typedoc": "0.28.16", "webpack": "5.105.3", "webpack-cli": "5.1.4", From 5f6f60320bc6176ee8b86e2dda0811bf5a1d4de7 Mon Sep 17 00:00:00 2001 From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com> Date: Fri, 6 Mar 2026 10:58:38 -0800 Subject: [PATCH 283/521] ci: retry GH Pages action in case of commit race --- .../deploy-pages-with-retry/action.yml | 64 +++++++++++++++++++ .github/workflows/ci.yml | 10 ++- 2 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 .github/actions/deploy-pages-with-retry/action.yml diff --git a/.github/actions/deploy-pages-with-retry/action.yml b/.github/actions/deploy-pages-with-retry/action.yml new file mode 100644 index 00000000000..5556b7c453a --- /dev/null +++ b/.github/actions/deploy-pages-with-retry/action.yml @@ -0,0 +1,64 @@ +name: Deploy GitHub Pages with retry + +description: Deploy to GitHub Pages and retry failed deploy attempts with a delay. + +inputs: + github_token: + description: GitHub token used by peaceiris/actions-gh-pages + required: true + publish_dir: + description: Directory to publish + required: true + destination_dir: + description: Destination subdirectory in gh-pages branch + required: true + full_commit_message: + description: Full commit message for the deploy commit + required: true + retry_delay_seconds: + description: Delay in seconds between retries + required: false + default: "5" + +runs: + using: composite + steps: + - name: Deploy (attempt 1) + id: deploy_pages_attempt_1 + continue-on-error: true + uses: peaceiris/actions-gh-pages@4f9cc6602d3f66b9c108549d475ec49e8ef4d45e # v4 + with: + github_token: ${{ inputs.github_token }} + publish_dir: ${{ inputs.publish_dir }} + destination_dir: ${{ inputs.destination_dir }} + full_commit_message: ${{ inputs.full_commit_message }} + + - name: Wait before retry (attempt 2) + if: ${{ steps.deploy_pages_attempt_1.outcome == 'failure' }} + shell: bash + run: sleep "${{ inputs.retry_delay_seconds }}" + + - name: Deploy (attempt 2) + id: deploy_pages_attempt_2 + if: ${{ steps.deploy_pages_attempt_1.outcome == 'failure' }} + continue-on-error: true + uses: peaceiris/actions-gh-pages@4f9cc6602d3f66b9c108549d475ec49e8ef4d45e # v4 + with: + github_token: ${{ inputs.github_token }} + publish_dir: ${{ inputs.publish_dir }} + destination_dir: ${{ inputs.destination_dir }} + full_commit_message: ${{ inputs.full_commit_message }} + + - name: Wait before retry (attempt 3) + if: ${{ steps.deploy_pages_attempt_2.outcome == 'failure' }} + shell: bash + run: sleep "${{ inputs.retry_delay_seconds }}" + + - name: Deploy (attempt 3) + if: ${{ steps.deploy_pages_attempt_2.outcome == 'failure' }} + uses: peaceiris/actions-gh-pages@4f9cc6602d3f66b9c108549d475ec49e8ef4d45e # v4 + with: + github_token: ${{ inputs.github_token }} + publish_dir: ${{ inputs.publish_dir }} + destination_dir: ${{ inputs.destination_dir }} + full_commit_message: ${{ inputs.full_commit_message }} diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d20ff884387..e57762693f8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -111,6 +111,14 @@ jobs: }} name: Publish preview playgrounds to GitHub Pages steps: + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5 + with: + sparse-checkout: .github/actions/deploy-pages-with-retry/ + fetch-depth: 1 + sparse-checkout-cone-mode: true + persist-credentials: false + lfs: false + submodules: false - name: Determine GitHub Pages directory name id: branch_dir_name # even `develop` should be published to a subdirectory @@ -138,7 +146,7 @@ jobs: ls -l ../pages/ - name: Deploy playgrounds to GitHub Pages - uses: peaceiris/actions-gh-pages@4f9cc6602d3f66b9c108549d475ec49e8ef4d45e # v4 + uses: ./.github/actions/deploy-pages-with-retry with: github_token: ${{ secrets.GITHUB_TOKEN }} publish_dir: ./pages From 5e9a65ad1a3b7f842de4232667564566bca660e5 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 6 Mar 2026 19:18:53 +0000 Subject: [PATCH 284/521] fix(deps): update dependency scratch-blocks to v2.0.3 (#459) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 10 +++++----- packages/scratch-gui/package.json | 2 +- packages/scratch-vm/package.json | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index fbac51d6478..51b77b8af86 100644 --- a/package-lock.json +++ b/package-lock.json @@ -30707,9 +30707,9 @@ } }, "node_modules/scratch-blocks": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/scratch-blocks/-/scratch-blocks-2.0.0.tgz", - "integrity": "sha512-HySdHjMcHHKV13e1Kr0D8G9EeuXFgp+968fyeBmbforKfDRy9gmxeJukeEe0cO7p6xb4tU7gRe5Dc9yda0zFjg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/scratch-blocks/-/scratch-blocks-2.0.3.tgz", + "integrity": "sha512-ujA7g/rFyoGLK0M0UwJ0+zDsOxVlGA/7eYRSSu3ScdspmbvSpOWhlh25i+J/N2pnl03lwUHhBTpIj3QwuYSmqw==", "license": "Apache-2.0", "dependencies": { "@blockly/continuous-toolbox": "^7.0.8", @@ -36334,7 +36334,7 @@ "react-visibility-sensor": "5.1.1", "redux-throttle": "0.1.1", "scratch-audio": "2.0.268", - "scratch-blocks": "2.0.0", + "scratch-blocks": "2.0.3", "scratch-l10n": "6.1.60", "scratch-paint": "4.1.50", "scratch-render-fonts": "1.0.252", @@ -37028,7 +37028,7 @@ "in-publish": "2.0.1", "js-md5": "0.7.3", "pngjs": "3.4.0", - "scratch-blocks": "2.0.0", + "scratch-blocks": "2.0.3", "scratch-l10n": "6.1.60", "scratch-render-fonts": "1.0.252", "scratch-semantic-release-config": "4.0.1", diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index 6e0324c0d1f..5e7522a8247 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -166,7 +166,7 @@ "react-visibility-sensor": "5.1.1", "redux-throttle": "0.1.1", "scratch-audio": "2.0.268", - "scratch-blocks": "2.0.0", + "scratch-blocks": "2.0.3", "scratch-l10n": "6.1.60", "scratch-paint": "4.1.50", "scratch-render-fonts": "1.0.252", diff --git a/packages/scratch-vm/package.json b/packages/scratch-vm/package.json index ec6cca8de93..057b128af87 100644 --- a/packages/scratch-vm/package.json +++ b/packages/scratch-vm/package.json @@ -99,7 +99,7 @@ "in-publish": "2.0.1", "js-md5": "0.7.3", "pngjs": "3.4.0", - "scratch-blocks": "2.0.0", + "scratch-blocks": "2.0.3", "scratch-l10n": "6.1.60", "scratch-render-fonts": "1.0.252", "scratch-semantic-release-config": "4.0.1", From d7ca93a9d7ccde19290f44b2d9be744c7a2c73b1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 6 Mar 2026 19:36:50 +0000 Subject: [PATCH 285/521] style(deps): update dependency eslint-config-scratch to v13.0.2 --- package-lock.json | 219 ++------------------- packages/scratch-gui/package.json | 2 +- packages/scratch-render/package.json | 2 +- packages/scratch-svg-renderer/package.json | 2 +- packages/scratch-vm/package.json | 2 +- packages/task-herder/package.json | 2 +- 6 files changed, 21 insertions(+), 208 deletions(-) diff --git a/package-lock.json b/package-lock.json index 51b77b8af86..33638a25925 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2386,7 +2386,9 @@ } }, "node_modules/@eslint-community/eslint-plugin-eslint-comments": { - "version": "4.6.0", + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-4.7.1.tgz", + "integrity": "sha512-Ql2nJFwA8wUGpILYGOQaT1glPsmvEwE0d+a+l7AALLzQvInqdbXJdx7aSu0DpUX9dB1wMVBMhm99/++S3MdEtQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2400,11 +2402,13 @@ "url": "https://opencollective.com/eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0" + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0" } }, "node_modules/@eslint-community/eslint-plugin-eslint-comments/node_modules/ignore": { "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", "dev": true, "license": "MIT", "engines": { @@ -4885,11 +4889,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@rtsao/scc": { - "version": "1.1.0", - "dev": true, - "license": "MIT" - }, "node_modules/@scratch/paper": { "version": "0.11.20221201200345", "license": "MIT", @@ -9510,11 +9509,6 @@ "version": "7.0.15", "license": "MIT" }, - "node_modules/@types/json5": { - "version": "0.0.29", - "dev": true, - "license": "MIT" - }, "node_modules/@types/long": { "version": "4.0.2", "license": "MIT" @@ -11138,26 +11132,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array.prototype.findlastindex": { - "version": "1.2.6", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.9", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "es-shim-unscopables": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/array.prototype.flat": { "version": "1.3.3", "dev": true, @@ -15215,14 +15189,14 @@ } }, "node_modules/eslint-config-scratch": { - "version": "12.0.51", - "resolved": "https://registry.npmjs.org/eslint-config-scratch/-/eslint-config-scratch-12.0.51.tgz", - "integrity": "sha512-Y/BVXcGBNHJ3qmhOmAAeXgFdCvOQfPlCuGnLwq3EfJUJbRpjSmK1s/vKNBycf7PKM4W/O2kf5w+KFPahWWgGUA==", + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/eslint-config-scratch/-/eslint-config-scratch-13.0.2.tgz", + "integrity": "sha512-JZ0nhd0J/s1k8RPCACgfFHcu2joNpC65f0n71gx5XpNaV2x1zor5CZkMN/YBC9a/35nzoRZWEmzBY12H7jkQ0w==", "dev": true, "license": "BSD-3-Clause", "dependencies": { "@babel/eslint-parser": "7.28.6", - "@eslint-community/eslint-plugin-eslint-comments": "4.6.0", + "@eslint-community/eslint-plugin-eslint-comments": "4.7.1", "@eslint/eslintrc": "3.3.4", "@eslint/js": "9.39.3", "@eslint/markdown": "7.5.1", @@ -15231,7 +15205,7 @@ "eslint-config-prettier": "10.1.8", "eslint-plugin-formatjs": "5.4.2", "eslint-plugin-html": "8.1.4", - "eslint-plugin-import": "2.32.0", + "eslint-plugin-import-x": "4.16.1", "eslint-plugin-jsdoc": "61.7.1", "eslint-plugin-jsx-a11y": "6.10.2", "eslint-plugin-react": "7.37.5", @@ -15267,24 +15241,6 @@ } } }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, "node_modules/eslint-import-resolver-typescript": { "version": "4.4.4", "dev": true, @@ -15318,30 +15274,6 @@ } } }, - "node_modules/eslint-module-utils": { - "version": "2.12.1", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^3.2.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, "node_modules/eslint-plugin-format-message": { "version": "6.2.4", "dev": true, @@ -15387,38 +15319,6 @@ "node": ">=16.0.0" } }, - "node_modules/eslint-plugin-import": { - "version": "2.32.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@rtsao/scc": "^1.1.0", - "array-includes": "^3.1.9", - "array.prototype.findlastindex": "^1.2.6", - "array.prototype.flat": "^1.3.3", - "array.prototype.flatmap": "^1.3.3", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.12.1", - "hasown": "^2.0.2", - "is-core-module": "^2.16.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.8", - "object.groupby": "^1.0.3", - "object.values": "^1.2.1", - "semver": "^6.3.1", - "string.prototype.trimend": "^1.0.9", - "tsconfig-paths": "^3.15.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" - } - }, "node_modules/eslint-plugin-import-x": { "version": "4.16.1", "resolved": "https://registry.npmjs.org/eslint-plugin-import-x/-/eslint-plugin-import-x-4.16.1.tgz", @@ -15508,22 +15408,6 @@ "node": ">=10" } }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/eslint-plugin-jsdoc": { "version": "61.7.1", "dev": true, @@ -27282,19 +27166,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object.groupby": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/object.values": { "version": "1.2.1", "dev": true, @@ -33928,36 +33799,6 @@ "node": ">=0.3.1" } }, - "node_modules/tsconfig-paths": { - "version": "3.15.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/tsconfig-paths/node_modules/strip-bom": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/tshy": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/tshy/-/tshy-3.3.2.tgz", @@ -36364,7 +36205,7 @@ "cheerio": "1.2.0", "cross-env": "7.0.3", "eslint": "9.39.3", - "eslint-config-scratch": "13.0.0", + "eslint-config-scratch": "13.0.2", "eslint-import-resolver-typescript": "4.4.4", "eslint-plugin-import-x": "4.16.1", "eslint-plugin-react": "7.37.5", @@ -36449,34 +36290,6 @@ "node": ">=14" } }, - "packages/scratch-gui/node_modules/eslint-config-scratch": { - "version": "13.0.0", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/eslint-parser": "7.28.6", - "@eslint-community/eslint-plugin-eslint-comments": "4.6.0", - "@eslint/eslintrc": "3.3.4", - "@eslint/js": "9.39.3", - "@eslint/markdown": "7.5.1", - "@stylistic/eslint-plugin": "^5.3.1", - "@trivago/prettier-plugin-sort-imports": "5.2.2", - "eslint-config-prettier": "10.1.8", - "eslint-plugin-formatjs": "5.4.2", - "eslint-plugin-html": "8.1.4", - "eslint-plugin-import-x": "4.16.1", - "eslint-plugin-jsdoc": "61.7.1", - "eslint-plugin-jsx-a11y": "6.10.2", - "eslint-plugin-react": "7.37.5", - "eslint-plugin-react-hooks": "7.0.1", - "globals": "16.5.0", - "prettier": "3.8.1", - "typescript-eslint": "8.46.3" - }, - "peerDependencies": { - "eslint": "^9.23.0" - } - }, "packages/scratch-gui/node_modules/interpret": { "version": "3.1.1", "dev": true, @@ -36563,7 +36376,7 @@ "copy-webpack-plugin": "6.4.1", "docdash": "0.4.0", "eslint": "9.39.3", - "eslint-config-scratch": "12.0.51", + "eslint-config-scratch": "13.0.2", "gh-pages": "1.2.0", "globals": "16.5.0", "html-webpack-plugin": "5.6.6", @@ -36825,7 +36638,7 @@ "babel-loader": "9.2.1", "copy-webpack-plugin": "6.4.1", "eslint": "9.39.3", - "eslint-config-scratch": "12.0.51", + "eslint-config-scratch": "13.0.2", "globals": "16.5.0", "jsdom": "13.2.0", "mkdirp": "2.1.6", @@ -37020,7 +36833,7 @@ "copy-webpack-plugin": "6.4.1", "docdash": "1.2.0", "eslint": "9.39.3", - "eslint-config-scratch": "12.0.51", + "eslint-config-scratch": "13.0.2", "expose-loader": "1.0.3", "file-loader": "6.2.0", "format-message-cli": "6.2.4", @@ -37123,7 +36936,7 @@ "devDependencies": { "@vitest/coverage-v8": "4.0.18", "eslint": "9.39.3", - "eslint-config-scratch": "12.0.51", + "eslint-config-scratch": "13.0.2", "prettier": "3.8.1", "rimraf": "6.1.2", "typescript": "5.9.3", diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index 5e7522a8247..045b4a14e2c 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -196,7 +196,7 @@ "cheerio": "1.2.0", "cross-env": "7.0.3", "eslint": "9.39.3", - "eslint-config-scratch": "13.0.0", + "eslint-config-scratch": "13.0.2", "eslint-import-resolver-typescript": "4.4.4", "eslint-plugin-import-x": "4.16.1", "eslint-plugin-react": "7.37.5", diff --git a/packages/scratch-render/package.json b/packages/scratch-render/package.json index 1c5baa0f0a4..5c64ff777fb 100644 --- a/packages/scratch-render/package.json +++ b/packages/scratch-render/package.json @@ -72,7 +72,7 @@ "copy-webpack-plugin": "6.4.1", "docdash": "0.4.0", "eslint": "9.39.3", - "eslint-config-scratch": "12.0.51", + "eslint-config-scratch": "13.0.2", "gh-pages": "1.2.0", "globals": "16.5.0", "html-webpack-plugin": "5.6.6", diff --git a/packages/scratch-svg-renderer/package.json b/packages/scratch-svg-renderer/package.json index e9649b011ca..fa02c35a53d 100644 --- a/packages/scratch-svg-renderer/package.json +++ b/packages/scratch-svg-renderer/package.json @@ -63,7 +63,7 @@ "babel-loader": "9.2.1", "copy-webpack-plugin": "6.4.1", "eslint": "9.39.3", - "eslint-config-scratch": "12.0.51", + "eslint-config-scratch": "13.0.2", "globals": "16.5.0", "jsdom": "13.2.0", "mkdirp": "2.1.6", diff --git a/packages/scratch-vm/package.json b/packages/scratch-vm/package.json index 057b128af87..f82f84e039b 100644 --- a/packages/scratch-vm/package.json +++ b/packages/scratch-vm/package.json @@ -91,7 +91,7 @@ "copy-webpack-plugin": "6.4.1", "docdash": "1.2.0", "eslint": "9.39.3", - "eslint-config-scratch": "12.0.51", + "eslint-config-scratch": "13.0.2", "expose-loader": "1.0.3", "file-loader": "6.2.0", "format-message-cli": "6.2.4", diff --git a/packages/task-herder/package.json b/packages/task-herder/package.json index 9b16bf84746..5d05184e4b2 100644 --- a/packages/task-herder/package.json +++ b/packages/task-herder/package.json @@ -45,7 +45,7 @@ "devDependencies": { "@vitest/coverage-v8": "4.0.18", "eslint": "9.39.3", - "eslint-config-scratch": "12.0.51", + "eslint-config-scratch": "13.0.2", "prettier": "3.8.1", "rimraf": "6.1.2", "typescript": "5.9.3", From 49e1234904d6d63e6dfcda2bd28af04dbfd16572 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 6 Mar 2026 20:09:05 +0000 Subject: [PATCH 286/521] chore(deps): update dependency webpack to v5.105.4 --- package-lock.json | 108 ++++++++------------- packages/scratch-gui/package.json | 2 +- packages/scratch-render/package.json | 2 +- packages/scratch-svg-renderer/package.json | 2 +- packages/scratch-vm/package.json | 2 +- 5 files changed, 45 insertions(+), 71 deletions(-) diff --git a/package-lock.json b/package-lock.json index 33638a25925..f0523c321b2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14629,6 +14629,19 @@ "url": "https://github.com/fb55/encoding-sniffer?sponsor=1" } }, + "node_modules/enhanced-resolve": { + "version": "5.20.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.0.tgz", + "integrity": "sha512-/ce7+jQ1PQ6rVXwe+jKEg5hW5ciicHwIQUagZkp6IufBoY3YDgdTTY1azVs0qoRgVmvsNB+rbjLJxDAeHHtwsQ==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/entities": { "version": "4.5.0", "dev": true, @@ -18132,18 +18145,6 @@ } } }, - "node_modules/html-webpack-plugin/node_modules/tapable": { - "version": "2.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/htmlparser2": { "version": "10.1.0", "dev": true, @@ -33067,6 +33068,19 @@ "node": "20 || >=22" } }, + "node_modules/tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/tar": { "version": "6.2.1", "license": "ISC", @@ -33696,18 +33710,6 @@ "webpack": "^5.0.0" } }, - "node_modules/ts-loader/node_modules/enhanced-resolve": { - "version": "5.18.3", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, "node_modules/ts-loader/node_modules/source-map": { "version": "0.7.6", "dev": true, @@ -33716,18 +33718,6 @@ "node": ">= 12" } }, - "node_modules/ts-loader/node_modules/tapable": { - "version": "2.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/ts-node": { "version": "10.9.2", "dev": true, @@ -35187,9 +35177,9 @@ "license": "BSD-2-Clause" }, "node_modules/webpack": { - "version": "5.105.3", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.105.3.tgz", - "integrity": "sha512-LLBBA4oLmT7sZdHiYE/PeVuifOxYyE2uL/V+9VQP7YSYdJU7bSf7H8bZRRxW8kEPMkmVjnrXmoR3oejIdX0xbg==", + "version": "5.105.4", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.105.4.tgz", + "integrity": "sha512-jTywjboN9aHxFlToqb0K0Zs9SbBoW4zRUlGzI2tYNxVYcEi/IPpn+Xi4ye5jTLvX2YeLuic/IvxNot+Q1jMoOw==", "license": "MIT", "dependencies": { "@types/eslint-scope": "^3.7.7", @@ -35202,7 +35192,7 @@ "acorn-import-phases": "^1.0.3", "browserslist": "^4.28.1", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.19.0", + "enhanced-resolve": "^5.20.0", "es-module-lexer": "^2.0.0", "eslint-scope": "5.1.1", "events": "^3.2.0", @@ -35214,7 +35204,7 @@ "neo-async": "^2.6.2", "schema-utils": "^4.3.3", "tapable": "^2.3.0", - "terser-webpack-plugin": "^5.3.16", + "terser-webpack-plugin": "^5.3.17", "watchpack": "^2.5.1", "webpack-sources": "^3.3.4" }, @@ -35457,23 +35447,16 @@ "dev": true, "license": "MIT" }, - "node_modules/webpack/node_modules/enhanced-resolve": { - "version": "5.19.0", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.3.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, "node_modules/webpack/node_modules/es-module-lexer": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", + "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", "license": "MIT" }, "node_modules/webpack/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==", "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", @@ -35485,22 +35468,13 @@ }, "node_modules/webpack/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/webpack/node_modules/tapable": { - "version": "2.3.0", - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/webpack/node_modules/webpack-sources": { "version": "3.3.4", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.4.tgz", @@ -36229,7 +36203,7 @@ "ts-loader": "9.5.4", "url-loader": "4.1.1", "web-audio-test-api": "0.5.2", - "webpack": "5.105.3", + "webpack": "5.105.4", "webpack-cli": "5.1.4", "webpack-dev-server": "5.2.3", "yauzl": "3.2.0" @@ -36389,7 +36363,7 @@ "tap": "21.6.2", "terser-webpack-plugin": "5.3.17", "typedoc": "0.28.16", - "webpack": "5.105.3", + "webpack": "5.105.4", "webpack-cli": "5.1.4", "webpack-dev-server": "5.2.3" }, @@ -36648,7 +36622,7 @@ "scratch-webpack-configuration": "3.1.2", "semantic-release": "25.0.3", "tap": "21.6.2", - "webpack": "5.105.3", + "webpack": "5.105.4", "webpack-cli": "5.1.4", "webpack-dev-server": "5.2.3", "xmldom": "0.1.31" @@ -36852,7 +36826,7 @@ "tap": "21.6.2", "tiny-worker": "2.3.0", "typedoc": "0.28.16", - "webpack": "5.105.3", + "webpack": "5.105.4", "webpack-cli": "4.10.0", "webpack-dev-server": "5.2.3" } diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index 045b4a14e2c..3121410ee84 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -220,7 +220,7 @@ "ts-loader": "9.5.4", "url-loader": "4.1.1", "web-audio-test-api": "0.5.2", - "webpack": "5.105.3", + "webpack": "5.105.4", "webpack-cli": "5.1.4", "webpack-dev-server": "5.2.3", "yauzl": "3.2.0" diff --git a/packages/scratch-render/package.json b/packages/scratch-render/package.json index 5c64ff777fb..4a4a676010c 100644 --- a/packages/scratch-render/package.json +++ b/packages/scratch-render/package.json @@ -85,7 +85,7 @@ "tap": "21.6.2", "terser-webpack-plugin": "5.3.17", "typedoc": "0.28.16", - "webpack": "5.105.3", + "webpack": "5.105.4", "webpack-cli": "5.1.4", "webpack-dev-server": "5.2.3" }, diff --git a/packages/scratch-svg-renderer/package.json b/packages/scratch-svg-renderer/package.json index fa02c35a53d..a333f8ee191 100644 --- a/packages/scratch-svg-renderer/package.json +++ b/packages/scratch-svg-renderer/package.json @@ -73,7 +73,7 @@ "scratch-webpack-configuration": "3.1.2", "semantic-release": "25.0.3", "tap": "21.6.2", - "webpack": "5.105.3", + "webpack": "5.105.4", "webpack-cli": "5.1.4", "webpack-dev-server": "5.2.3", "xmldom": "0.1.31" diff --git a/packages/scratch-vm/package.json b/packages/scratch-vm/package.json index f82f84e039b..e6cdd307402 100644 --- a/packages/scratch-vm/package.json +++ b/packages/scratch-vm/package.json @@ -110,7 +110,7 @@ "tap": "21.6.2", "tiny-worker": "2.3.0", "typedoc": "0.28.16", - "webpack": "5.105.3", + "webpack": "5.105.4", "webpack-cli": "4.10.0", "webpack-dev-server": "5.2.3" } From 3adf0ddfc0403eb9cc1aeda105397efb069d23af Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Fri, 6 Mar 2026 23:53:46 +0000 Subject: [PATCH 287/521] chore(release): 13.0.0 [skip ci] --- package-lock.json | 57 ++++++++++++++++------ package.json | 2 +- packages/scratch-gui/package.json | 8 +-- packages/scratch-render/package.json | 6 +-- packages/scratch-svg-renderer/package.json | 2 +- packages/scratch-vm/package.json | 6 +-- packages/task-herder/package.json | 2 +- 7 files changed, 56 insertions(+), 27 deletions(-) diff --git a/package-lock.json b/package-lock.json index f0523c321b2..a66c5d4651e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "scratch-editor", - "version": "12.7.0", + "version": "13.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "scratch-editor", - "version": "12.7.0", + "version": "13.0.0", "license": "AGPL-3.0-only", "workspaces": [ "packages/task-herder", @@ -30727,6 +30727,12 @@ "minilog": "^3.1.0" } }, + "node_modules/scratch-storage/node_modules/@scratch/task-herder": { + "version": "12.7.0", + "resolved": "https://registry.npmjs.org/@scratch/task-herder/-/task-herder-12.7.0.tgz", + "integrity": "sha512-uNSUGbz1wPKwbOdSdmoqOLx4zVjCE7uoy627DFKK7edUyzQqNFeP9Rd9BTRa/IIDQpVoc42KMXRnLFQzJh0lVA==", + "license": "AGPL-3.0-only" + }, "node_modules/scratch-translate-extension-languages": { "version": "1.0.7", "license": "BSD-3-Clause" @@ -36089,15 +36095,15 @@ }, "packages/scratch-gui": { "name": "@scratch/scratch-gui", - "version": "12.7.0", + "version": "13.0.0", "license": "AGPL-3.0-only", "dependencies": { "@mediapipe/face_detection": "0.4.1646425229", "@microbit/microbit-universal-hex": "0.2.2", "@radix-ui/react-context-menu": "2.2.16", - "@scratch/scratch-render": "12.7.0", - "@scratch/scratch-svg-renderer": "12.7.0", - "@scratch/scratch-vm": "12.7.0", + "@scratch/scratch-render": "13.0.0", + "@scratch/scratch-svg-renderer": "13.0.0", + "@scratch/scratch-vm": "13.0.0", "@tensorflow-models/face-detection": "1.0.3", "@tensorflow/tfjs": "4.22.0", "@testing-library/user-event": "14.6.1", @@ -36215,6 +36221,29 @@ "redux": "^4.0.0" } }, + "packages/scratch-gui/node_modules/@scratch/scratch-render/node_modules/raw-loader": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-0.5.1.tgz", + "integrity": "sha512-sf7oGoLuaYAScB4VGr0tzetsYlS8EJH6qnTCfQ/WVEa89hALQ4RQfCKt5xCyPQKPDUbVUAIP1QsxAwfAjlDp7Q==", + "extraneous": true + }, + "packages/scratch-gui/node_modules/@scratch/scratch-vm/node_modules/scratch-storage": { + "version": "6.1.8", + "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-6.1.8.tgz", + "integrity": "sha512-uDkSNIY7yLalsynLmcGRs6TfF9C9UlCw+OYP0Tr++gjuSJTjOMm/Ve6y5kpxtjYWOAxgzOQgu+QcNz07vELXHg==", + "extraneous": true, + "license": "AGPL-3.0-only", + "dependencies": { + "@babel/runtime": "^7.21.0", + "@scratch/task-herder": "12.6.2", + "arraybuffer-loader": "^1.0.3", + "base64-js": "^1.3.0", + "buffer": "6.0.3", + "fastestsmallesttextencoderdecoder": "^1.0.7", + "js-md5": "^0.7.3", + "minilog": "^3.1.0" + } + }, "packages/scratch-gui/node_modules/@webpack-cli/configtest": { "version": "2.1.1", "dev": true, @@ -36329,10 +36358,10 @@ }, "packages/scratch-render": { "name": "@scratch/scratch-render", - "version": "12.7.0", + "version": "13.0.0", "license": "AGPL-3.0-only", "dependencies": { - "@scratch/scratch-svg-renderer": "12.7.0", + "@scratch/scratch-svg-renderer": "13.0.0", "grapheme-breaker": "0.3.2", "hull.js": "0.2.10", "ify-loader": "1.1.0", @@ -36345,7 +36374,7 @@ "@babel/core": "7.29.0", "@babel/polyfill": "7.12.1", "@babel/preset-env": "7.29.0", - "@scratch/scratch-vm": "12.7.0", + "@scratch/scratch-vm": "13.0.0", "babel-loader": "9.2.1", "copy-webpack-plugin": "6.4.1", "docdash": "0.4.0", @@ -36595,7 +36624,7 @@ }, "packages/scratch-svg-renderer": { "name": "@scratch/scratch-svg-renderer", - "version": "12.7.0", + "version": "13.0.0", "license": "AGPL-3.0-only", "dependencies": { "base64-js": "1.5.1", @@ -36773,11 +36802,11 @@ }, "packages/scratch-vm": { "name": "@scratch/scratch-vm", - "version": "12.7.0", + "version": "13.0.0", "license": "AGPL-3.0-only", "dependencies": { - "@scratch/scratch-render": "12.7.0", - "@scratch/scratch-svg-renderer": "12.7.0", + "@scratch/scratch-render": "13.0.0", + "@scratch/scratch-svg-renderer": "13.0.0", "@vernier/godirect": "1.8.3", "arraybuffer-loader": "1.0.8", "atob": "2.1.2", @@ -36905,7 +36934,7 @@ }, "packages/task-herder": { "name": "@scratch/task-herder", - "version": "12.7.0", + "version": "13.0.0", "license": "AGPL-3.0-only", "devDependencies": { "@vitest/coverage-v8": "4.0.18", diff --git a/package.json b/package.json index 9fc573eb056..f1b20ab6128 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "scratch-editor", - "version": "12.7.0", + "version": "13.0.0", "private": "true", "description": "Scratch editor mono-repository", "keywords": [], diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index 3121410ee84..853ec0e8867 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -1,6 +1,6 @@ { "name": "@scratch/scratch-gui", - "version": "12.7.0", + "version": "13.0.0", "description": "Graphical User Interface for creating and running Scratch 3.0 projects", "keywords": [], "homepage": "https://github.com/scratchfoundation/scratch-gui#readme", @@ -112,9 +112,9 @@ "@mediapipe/face_detection": "0.4.1646425229", "@microbit/microbit-universal-hex": "0.2.2", "@radix-ui/react-context-menu": "2.2.16", - "@scratch/scratch-render": "12.7.0", - "@scratch/scratch-svg-renderer": "12.7.0", - "@scratch/scratch-vm": "12.7.0", + "@scratch/scratch-render": "13.0.0", + "@scratch/scratch-svg-renderer": "13.0.0", + "@scratch/scratch-vm": "13.0.0", "@tensorflow-models/face-detection": "1.0.3", "@tensorflow/tfjs": "4.22.0", "@testing-library/user-event": "14.6.1", diff --git a/packages/scratch-render/package.json b/packages/scratch-render/package.json index 4a4a676010c..d97d4d447f4 100644 --- a/packages/scratch-render/package.json +++ b/packages/scratch-render/package.json @@ -1,6 +1,6 @@ { "name": "@scratch/scratch-render", - "version": "12.7.0", + "version": "13.0.0", "description": "WebGL Renderer for Scratch 3.0", "keywords": [], "homepage": "https://github.com/scratchfoundation/scratch-render#readme", @@ -54,7 +54,7 @@ "allow-incomplete-coverage": true }, "dependencies": { - "@scratch/scratch-svg-renderer": "12.7.0", + "@scratch/scratch-svg-renderer": "13.0.0", "grapheme-breaker": "0.3.2", "hull.js": "0.2.10", "ify-loader": "1.1.0", @@ -67,7 +67,7 @@ "@babel/core": "7.29.0", "@babel/polyfill": "7.12.1", "@babel/preset-env": "7.29.0", - "@scratch/scratch-vm": "12.7.0", + "@scratch/scratch-vm": "13.0.0", "babel-loader": "9.2.1", "copy-webpack-plugin": "6.4.1", "docdash": "0.4.0", diff --git a/packages/scratch-svg-renderer/package.json b/packages/scratch-svg-renderer/package.json index a333f8ee191..5bf5ececb5a 100644 --- a/packages/scratch-svg-renderer/package.json +++ b/packages/scratch-svg-renderer/package.json @@ -1,6 +1,6 @@ { "name": "@scratch/scratch-svg-renderer", - "version": "12.7.0", + "version": "13.0.0", "description": "SVG renderer for Scratch", "keywords": [], "homepage": "https://github.com/scratchfoundation/scratch-svg-renderer#readme", diff --git a/packages/scratch-vm/package.json b/packages/scratch-vm/package.json index e6cdd307402..23b7d496efa 100644 --- a/packages/scratch-vm/package.json +++ b/packages/scratch-vm/package.json @@ -1,6 +1,6 @@ { "name": "@scratch/scratch-vm", - "version": "12.7.0", + "version": "13.0.0", "description": "Virtual Machine for Scratch 3.0", "keywords": [], "homepage": "https://github.com/scratchfoundation/scratch-vm#readme", @@ -60,8 +60,8 @@ "allow-incomplete-coverage": true }, "dependencies": { - "@scratch/scratch-render": "12.7.0", - "@scratch/scratch-svg-renderer": "12.7.0", + "@scratch/scratch-render": "13.0.0", + "@scratch/scratch-svg-renderer": "13.0.0", "@vernier/godirect": "1.8.3", "arraybuffer-loader": "1.0.8", "atob": "2.1.2", diff --git a/packages/task-herder/package.json b/packages/task-herder/package.json index 5d05184e4b2..a4c6057f203 100644 --- a/packages/task-herder/package.json +++ b/packages/task-herder/package.json @@ -1,6 +1,6 @@ { "name": "@scratch/task-herder", - "version": "12.7.0", + "version": "13.0.0", "description": "An asynchronous task runner with configurable rate limiting / throttling and concurrency control.", "keywords": [ "rate limit", From af460f9f49693d24124f283207e19414e9b938da Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 7 Mar 2026 00:41:41 +0000 Subject: [PATCH 288/521] fix(deps): update dependency immutable to v3.8.3 [security] (#460) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 8 +++++--- packages/scratch-gui/package.json | 2 +- packages/scratch-vm/package.json | 2 +- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index a66c5d4651e..1be27885e91 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18483,7 +18483,9 @@ "license": "MIT" }, "node_modules/immutable": { - "version": "3.8.2", + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.3.tgz", + "integrity": "sha512-AUY/VyX0E5XlibOmWt10uabJzam1zlYjwiEgQSDc5+UIkFNaF9WM0JxXKaNMGf+F/ffUF+7kRKXM9A7C0xXqMg==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -36124,7 +36126,7 @@ "fastestsmallesttextencoderdecoder": "1.0.22", "get-float-time-domain-data": "0.1.0", "get-user-media-promise": "1.1.4", - "immutable": "3.8.2", + "immutable": "3.8.3", "intl": "1.2.5", "js-base64": "2.6.4", "keymirror": "0.1.1", @@ -36816,7 +36818,7 @@ "diff-match-patch": "1.0.5", "format-message": "6.2.4", "htmlparser2": "3.10.1", - "immutable": "3.8.2", + "immutable": "3.8.3", "jszip": "3.10.1", "scratch-audio": "2.0.268", "scratch-parser": "6.0.0", diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index 853ec0e8867..273c6f6cafe 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -135,7 +135,7 @@ "fastestsmallesttextencoderdecoder": "1.0.22", "get-float-time-domain-data": "0.1.0", "get-user-media-promise": "1.1.4", - "immutable": "3.8.2", + "immutable": "3.8.3", "intl": "1.2.5", "js-base64": "2.6.4", "keymirror": "0.1.1", diff --git a/packages/scratch-vm/package.json b/packages/scratch-vm/package.json index 23b7d496efa..faf231dfff8 100644 --- a/packages/scratch-vm/package.json +++ b/packages/scratch-vm/package.json @@ -71,7 +71,7 @@ "diff-match-patch": "1.0.5", "format-message": "6.2.4", "htmlparser2": "3.10.1", - "immutable": "3.8.2", + "immutable": "3.8.3", "jszip": "3.10.1", "scratch-audio": "2.0.268", "scratch-parser": "6.0.0", From 93a9638d1c45b8a05149f74990ed25df8d0e11f3 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 7 Mar 2026 00:43:06 +0000 Subject: [PATCH 289/521] style(deps): update dependency eslint-config-scratch to v13.0.5 --- package-lock.json | 1047 +++++--------------- packages/scratch-gui/package.json | 2 +- packages/scratch-render/package.json | 2 +- packages/scratch-svg-renderer/package.json | 2 +- packages/scratch-vm/package.json | 2 +- packages/task-herder/package.json | 2 +- 6 files changed, 280 insertions(+), 777 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1be27885e91..4138b163222 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2363,18 +2363,20 @@ } }, "node_modules/@es-joy/jsdoccomment": { - "version": "0.78.0", + "version": "0.84.0", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.84.0.tgz", + "integrity": "sha512-0xew1CxOam0gV5OMjh2KjFQZsKL2bByX1+q4j3E73MpYIdyUxcZb/xQct9ccUb+ve5KGUYbCUxyPnYB7RbuP+w==", "dev": true, "license": "MIT", "dependencies": { "@types/estree": "^1.0.8", - "@typescript-eslint/types": "^8.46.4", - "comment-parser": "1.4.1", - "esquery": "^1.6.0", - "jsdoc-type-pratt-parser": "~7.0.0" + "@typescript-eslint/types": "^8.54.0", + "comment-parser": "1.4.5", + "esquery": "^1.7.0", + "jsdoc-type-pratt-parser": "~7.1.1" }, "engines": { - "node": ">=20.11.0" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, "node_modules/@es-joy/resolve.exports": { @@ -2416,7 +2418,9 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.9.0", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2631,41 +2635,49 @@ "license": "MIT" }, "node_modules/@formatjs/ecma402-abstract": { - "version": "2.3.6", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-3.1.1.tgz", + "integrity": "sha512-jhZbTwda+2tcNrs4kKvxrPLPjx8QsBCLCUgrrJ/S+G9YrGHWLhAyFMMBHJBnBoOwuLHd7L14FgYudviKaxkO2Q==", "dev": true, "license": "MIT", "dependencies": { - "@formatjs/fast-memoize": "2.2.7", - "@formatjs/intl-localematcher": "0.6.2", - "decimal.js": "^10.4.3", - "tslib": "^2.8.0" + "@formatjs/fast-memoize": "3.1.0", + "@formatjs/intl-localematcher": "0.8.1", + "decimal.js": "^10.6.0", + "tslib": "^2.8.1" } }, "node_modules/@formatjs/fast-memoize": { - "version": "2.2.7", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-3.1.0.tgz", + "integrity": "sha512-b5mvSWCI+XVKiz5WhnBCY3RJ4ZwfjAidU0yVlKa3d3MSgKmH1hC3tBGEAtYyN5mqL7N0G5x0BOUYyO8CEupWgg==", "dev": true, "license": "MIT", "dependencies": { - "tslib": "^2.8.0" + "tslib": "^2.8.1" } }, "node_modules/@formatjs/icu-messageformat-parser": { - "version": "2.11.4", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-3.5.1.tgz", + "integrity": "sha512-sSDmSvmmoVQ92XqWb499KrIhv/vLisJU8ITFrx7T7NZHUmMY7EL9xgRowAosaljhqnj/5iufG24QrdzB6X3ItA==", "dev": true, "license": "MIT", "dependencies": { - "@formatjs/ecma402-abstract": "2.3.6", - "@formatjs/icu-skeleton-parser": "1.8.16", - "tslib": "^2.8.0" + "@formatjs/ecma402-abstract": "3.1.1", + "@formatjs/icu-skeleton-parser": "2.1.1", + "tslib": "^2.8.1" } }, "node_modules/@formatjs/icu-skeleton-parser": { - "version": "1.8.16", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-2.1.1.tgz", + "integrity": "sha512-PSFABlcNefjI6yyk8f7nyX1DC7NHmq6WaCHZLySEXBrXuLOB2f935YsnzuPjlz+ibhb9yWTdPeVX1OVcj24w2Q==", "dev": true, "license": "MIT", "dependencies": { - "@formatjs/ecma402-abstract": "2.3.6", - "tslib": "^2.8.0" + "@formatjs/ecma402-abstract": "3.1.1", + "tslib": "^2.8.1" } }, "node_modules/@formatjs/intl": { @@ -2754,11 +2766,14 @@ } }, "node_modules/@formatjs/intl-localematcher": { - "version": "0.6.2", + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.8.1.tgz", + "integrity": "sha512-xwEuwQFdtSq1UKtQnyTZWC+eHdv7Uygoa+H2k/9uzBVQjDyp9r20LNDNKedWXll7FssT3GRHvqsdJGYSUWqYFA==", "dev": true, "license": "MIT", "dependencies": { - "tslib": "^2.8.0" + "@formatjs/fast-memoize": "3.1.0", + "tslib": "^2.8.1" } }, "node_modules/@formatjs/intl/node_modules/@formatjs/ecma402-abstract": { @@ -2802,17 +2817,21 @@ } }, "node_modules/@formatjs/ts-transformer": { - "version": "3.14.2", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@formatjs/ts-transformer/-/ts-transformer-4.4.0.tgz", + "integrity": "sha512-lFDp9Rbpxk5Dt8O1/I9VG5btqKbOkjT4snSa73HO1YTJ9KGeXPKA7aWVgHFXJVVq0KluhbZiCoPJVHC4ZREgxw==", "dev": true, "license": "MIT", "dependencies": { - "@formatjs/icu-messageformat-parser": "2.11.4", - "@types/node": "^22.0.0", - "chalk": "^4.1.2", + "@formatjs/icu-messageformat-parser": "3.5.1", + "@types/node": "^22.19.5", "json-stable-stringify": "^1.3.0", - "tslib": "^2.8.0", + "tslib": "^2.8.1", "typescript": "^5.6.0" }, + "engines": { + "node": ">= 20.12.0" + }, "peerDependencies": { "ts-jest": "^29" }, @@ -2823,7 +2842,9 @@ } }, "node_modules/@formatjs/ts-transformer/node_modules/@types/node": { - "version": "22.19.1", + "version": "22.19.15", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.15.tgz", + "integrity": "sha512-F0R/h2+dsy5wJAUe3tAU6oqa2qbWY5TpNfL/RGmo1y38hiyO1w3x2jPtt76wmuaJI4DQnOBu21cNXQ2STIUUWg==", "dev": true, "license": "MIT", "dependencies": { @@ -2832,6 +2853,8 @@ }, "node_modules/@formatjs/ts-transformer/node_modules/undici-types": { "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "dev": true, "license": "MIT" }, @@ -9087,23 +9110,28 @@ } }, "node_modules/@trivago/prettier-plugin-sort-imports": { - "version": "5.2.2", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@trivago/prettier-plugin-sort-imports/-/prettier-plugin-sort-imports-6.0.2.tgz", + "integrity": "sha512-3DgfkukFyC/sE/VuYjaUUWoFfuVjPK55vOFDsxD56XXynFMCZDYFogH2l/hDfOsQAm1myoU/1xByJ3tWqtulXA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@babel/generator": "^7.26.5", - "@babel/parser": "^7.26.7", - "@babel/traverse": "^7.26.7", - "@babel/types": "^7.26.7", + "@babel/generator": "^7.28.0", + "@babel/parser": "^7.28.0", + "@babel/traverse": "^7.28.0", + "@babel/types": "^7.28.0", "javascript-natural-sort": "^0.7.1", - "lodash": "^4.17.21" + "lodash-es": "^4.17.21", + "minimatch": "^9.0.0", + "parse-imports-exports": "^0.2.4" }, "engines": { - "node": ">18.12" + "node": ">= 20" }, "peerDependencies": { "@vue/compiler-sfc": "3.x", "prettier": "2.x - 3.x", + "prettier-plugin-ember-template-tag": ">= 2.0.0", "prettier-plugin-svelte": "3.x", "svelte": "4.x || 5.x" }, @@ -9111,6 +9139,9 @@ "@vue/compiler-sfc": { "optional": true }, + "prettier-plugin-ember-template-tag": { + "optional": true + }, "prettier-plugin-svelte": { "optional": true }, @@ -9119,6 +9150,32 @@ } } }, + "node_modules/@trivago/prettier-plugin-sort-imports/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@trivago/prettier-plugin-sort-imports/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@tsconfig/node10": { "version": "1.0.12", "dev": true, @@ -9572,7 +9629,9 @@ "license": "MIT" }, "node_modules/@types/picomatch": { - "version": "3.0.2", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-qHHxQ+P9PysNEGbALT8f8YOSHW0KJu6l2xU8DYY0fu/EmGxXdVnuTLvFUvBgPJMSqXq29SYHveejeAha+4AYgA==", "dev": true, "license": "MIT" }, @@ -9731,19 +9790,20 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.46.3", + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.56.1.tgz", + "integrity": "sha512-Jz9ZztpB37dNC+HU2HI28Bs9QXpzCz+y/twHOwhyrIRdbuVDxSytJNDl6z/aAKlaRIwC7y8wJdkBv7FxYGgi0A==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.46.3", - "@typescript-eslint/type-utils": "8.46.3", - "@typescript-eslint/utils": "8.46.3", - "@typescript-eslint/visitor-keys": "8.46.3", - "graphemer": "^1.4.0", - "ignore": "^7.0.0", + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.56.1", + "@typescript-eslint/type-utils": "8.56.1", + "@typescript-eslint/utils": "8.56.1", + "@typescript-eslint/visitor-keys": "8.56.1", + "ignore": "^7.0.5", "natural-compare": "^1.4.0", - "ts-api-utils": "^2.1.0" + "ts-api-utils": "^2.4.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -9753,281 +9813,33 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.46.3", - "eslint": "^8.57.0 || ^9.0.0", + "@typescript-eslint/parser": "^8.56.1", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/project-service": { - "version": "8.46.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.46.3", - "@typescript-eslint/types": "^8.46.3", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { - "version": "8.46.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.46.3", - "@typescript-eslint/visitor-keys": "8.46.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.46.3", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { - "version": "8.46.3", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.46.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/project-service": "8.46.3", - "@typescript-eslint/tsconfig-utils": "8.46.3", - "@typescript-eslint/types": "8.46.3", - "@typescript-eslint/visitor-keys": "8.46.3", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^2.1.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { - "version": "8.46.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.46.3", - "@typescript-eslint/types": "8.46.3", - "@typescript-eslint/typescript-estree": "8.46.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.46.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.46.3", - "eslint-visitor-keys": "^4.2.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/brace-expansion": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.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==", "dev": true, "license": "MIT", "engines": { "node": ">= 4" } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/minimatch": { - "version": "9.0.5", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { - "version": "7.7.3", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@typescript-eslint/parser": { - "version": "8.46.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/scope-manager": "8.46.3", - "@typescript-eslint/types": "8.46.3", - "@typescript-eslint/typescript-estree": "8.46.3", - "@typescript-eslint/visitor-keys": "8.46.3", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/project-service": { - "version": "8.46.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.46.3", - "@typescript-eslint/types": "^8.46.3", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { - "version": "8.46.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.46.3", - "@typescript-eslint/visitor-keys": "8.46.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.46.3", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { - "version": "8.46.3", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.46.3", + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.56.1.tgz", + "integrity": "sha512-klQbnPAAiGYFyI02+znpBRLyjL4/BrBd0nyWkdC0s/6xFLkXYQ8OoRrSkqacS1ddVxf/LDyODIKbQ5TgKAf/Fg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.46.3", - "@typescript-eslint/tsconfig-utils": "8.46.3", - "@typescript-eslint/types": "8.46.3", - "@typescript-eslint/visitor-keys": "8.46.3", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^2.1.0" + "@typescript-eslint/scope-manager": "8.56.1", + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/typescript-estree": "8.56.1", + "@typescript-eslint/visitor-keys": "8.56.1", + "debug": "^4.4.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -10037,66 +9849,20 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.46.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.46.3", - "eslint-visitor-keys": "^4.2.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/brace-expansion": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/minimatch": { - "version": "9.0.5", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/semver": { - "version": "7.7.3", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@typescript-eslint/project-service": { - "version": "8.48.1", + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.56.1.tgz", + "integrity": "sha512-TAdqQTzHNNvlVFfR+hu2PDJrURiwKsUvxFn1M0h95BB8ah5jejas08jUWG4dBA68jDMI988IvtfdAI53JzEHOQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.48.1", - "@typescript-eslint/types": "^8.48.1", - "debug": "^4.3.4" + "@typescript-eslint/tsconfig-utils": "^8.56.1", + "@typescript-eslint/types": "^8.56.1", + "debug": "^4.4.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -10110,12 +9876,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.48.1", + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.56.1.tgz", + "integrity": "sha512-YAi4VDKcIZp0O4tz/haYKhmIDZFEUPOreKbfdAN3SzUDMcPhJ8QI99xQXqX+HoUVq8cs85eRKnD+rne2UAnj2w==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.48.1", - "@typescript-eslint/visitor-keys": "8.48.1" + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/visitor-keys": "8.56.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -10126,7 +9894,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.48.1", + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.56.1.tgz", + "integrity": "sha512-qOtCYzKEeyr3aR9f28mPJqBty7+DBqsdd63eO0yyDwc6vgThj2UjWfJIcsFeSucYydqcuudMOprZ+x1SpF3ZuQ==", "dev": true, "license": "MIT", "engines": { @@ -10141,68 +9911,18 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.46.3", + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.56.1.tgz", + "integrity": "sha512-yB/7dxi7MgTtGhZdaHCemf7PuwrHMenHjmzgUW1aJpO+bBU43OycnM3Wn+DdvDO/8zzA9HlhaJ0AUGuvri4oGg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.46.3", - "@typescript-eslint/typescript-estree": "8.46.3", - "@typescript-eslint/utils": "8.46.3", - "debug": "^4.3.4", - "ts-api-utils": "^2.1.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/project-service": { - "version": "8.46.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.46.3", - "@typescript-eslint/types": "^8.46.3", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/scope-manager": { - "version": "8.46.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.46.3", - "@typescript-eslint/visitor-keys": "8.46.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/typescript-estree": "8.56.1", + "@typescript-eslint/utils": "8.56.1", + "debug": "^4.4.3", + "ts-api-utils": "^2.4.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.46.3", - "dev": true, - "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -10211,11 +9931,14 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { - "version": "8.46.3", + "node_modules/@typescript-eslint/types": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.56.1.tgz", + "integrity": "sha512-dbMkdIUkIkchgGDIv7KLUpa0Mda4IYjo4IAMJUZ+3xNoUXxMsk9YtKpTHSChRS85o+H9ftm51gsK1dZReY9CVw==", "dev": true, "license": "MIT", "engines": { @@ -10226,21 +9949,22 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.46.3", + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.56.1.tgz", + "integrity": "sha512-qzUL1qgalIvKWAf9C1HpvBjif+Vm6rcT5wZd4VoMb9+Km3iS3Cv9DY6dMRMDtPnwRAFyAi7YXJpTIEXLvdfPxg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.46.3", - "@typescript-eslint/tsconfig-utils": "8.46.3", - "@typescript-eslint/types": "8.46.3", - "@typescript-eslint/visitor-keys": "8.46.3", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^2.1.0" + "@typescript-eslint/project-service": "8.56.1", + "@typescript-eslint/tsconfig-utils": "8.56.1", + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/visitor-keys": "8.56.1", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.4.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -10253,68 +9977,49 @@ "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/utils": { - "version": "8.46.3", + "node_modules/@typescript-eslint/typescript-estree/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", - "dependencies": { - "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.46.3", - "@typescript-eslint/types": "8.46.3", - "@typescript-eslint/typescript-estree": "8.46.3" - }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" + "node": "18 || 20 || >=22" } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.46.3", + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", + "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.46.3", - "eslint-visitor-keys": "^4.2.1" + "balanced-match": "^4.0.2" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/brace-expansion": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" + "node": "18 || 20 || >=22" } }, - "node_modules/@typescript-eslint/type-utils/node_modules/minimatch": { - "version": "9.0.5", + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^5.0.2" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@typescript-eslint/type-utils/node_modules/semver": { - "version": "7.7.3", + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "dev": true, "license": "ISC", "bin": { @@ -10324,32 +10029,17 @@ "node": ">=10" } }, - "node_modules/@typescript-eslint/types": { - "version": "8.48.1", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.48.1", + "node_modules/@typescript-eslint/utils": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.56.1.tgz", + "integrity": "sha512-HPAVNIME3tABJ61siYlHzSWCGtOoeP2RTIaHXFMPqjrQKCGB9OgUVdiNgH7TJS2JNIQ5qQ4RsAUDuGaGme/KOA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.48.1", - "@typescript-eslint/tsconfig-utils": "8.48.1", - "@typescript-eslint/types": "8.48.1", - "@typescript-eslint/visitor-keys": "8.48.1", - "debug": "^4.3.4", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "tinyglobby": "^0.2.15", - "ts-api-utils": "^2.1.0" + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.56.1", + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/typescript-estree": "8.56.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -10359,51 +10049,19 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.5", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.7.3", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "8.48.1", + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.56.1.tgz", + "integrity": "sha512-KiROIzYdEV85YygXw6BI/Dx4fnBlFQu6Mq4QE4MOH9fFnhohw6wX/OAvDY2/C+ut0I3RSPKenvZJIVYqJNkhEw==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.48.1", - "@typescript-eslint/types": "8.48.1", - "@typescript-eslint/typescript-estree": "8.48.1" + "@typescript-eslint/types": "8.56.1", + "eslint-visitor-keys": "^5.0.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -10411,26 +10069,19 @@ "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.48.1", + "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": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.48.1", - "eslint-visitor-keys": "^4.2.1" - }, + "license": "Apache-2.0", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "url": "https://opencollective.com/eslint" } }, "node_modules/@typescript/native-preview": { @@ -10550,6 +10201,13 @@ "win32" ] }, + "node_modules/@unicode/unicode-17.0.0": { + "version": "1.6.16", + "resolved": "https://registry.npmjs.org/@unicode/unicode-17.0.0/-/unicode-17.0.0-1.6.16.tgz", + "integrity": "sha512-advq5p36zZ+PDRUpDkWcHHR++R19kx0LYB5iG3bj0KB8mYVKg0ywS996e2bXeXxDb8XdOF7KTivcx7VkYie1pg==", + "dev": true, + "license": "MIT" + }, "node_modules/@unrs/resolver-binding-linux-x64-gnu": { "version": "1.11.1", "cpu": [ @@ -13239,7 +12897,9 @@ } }, "node_modules/comment-parser": { - "version": "1.4.1", + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.5.tgz", + "integrity": "sha512-aRDkn3uyIlCFfk5NUA+VdwMmMsh8JGhc4hapfV4yxymHGQ3BVskMQfoXGpCo5IoBuQ9tS5iiVKhCpTcB4pW4qw==", "dev": true, "license": "MIT", "engines": { @@ -14589,14 +14249,6 @@ "dev": true, "license": "MIT" }, - "node_modules/emoji-regex-xs": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/emojilib": { "version": "2.4.0", "dev": true, @@ -15202,9 +14854,9 @@ } }, "node_modules/eslint-config-scratch": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/eslint-config-scratch/-/eslint-config-scratch-13.0.2.tgz", - "integrity": "sha512-JZ0nhd0J/s1k8RPCACgfFHcu2joNpC65f0n71gx5XpNaV2x1zor5CZkMN/YBC9a/35nzoRZWEmzBY12H7jkQ0w==", + "version": "13.0.5", + "resolved": "https://registry.npmjs.org/eslint-config-scratch/-/eslint-config-scratch-13.0.5.tgz", + "integrity": "sha512-lfwnMYP2prmZQiUUg+kdO9mMNroTAm+GDXpcXvt4ySibK+1XwCVJ/1E87PNLZmWG/jrg80qQlazIgttGwd8ezg==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -15214,23 +14866,36 @@ "@eslint/js": "9.39.3", "@eslint/markdown": "7.5.1", "@stylistic/eslint-plugin": "^5.3.1", - "@trivago/prettier-plugin-sort-imports": "5.2.2", + "@trivago/prettier-plugin-sort-imports": "6.0.2", "eslint-config-prettier": "10.1.8", - "eslint-plugin-formatjs": "5.4.2", + "eslint-plugin-formatjs": "6.2.0", "eslint-plugin-html": "8.1.4", "eslint-plugin-import-x": "4.16.1", - "eslint-plugin-jsdoc": "61.7.1", + "eslint-plugin-jsdoc": "62.7.1", "eslint-plugin-jsx-a11y": "6.10.2", "eslint-plugin-react": "7.37.5", "eslint-plugin-react-hooks": "7.0.1", - "globals": "16.5.0", + "globals": "17.4.0", "prettier": "3.8.1", - "typescript-eslint": "8.46.3" + "typescript-eslint": "8.56.1" }, "peerDependencies": { "eslint": "^9.23.0" } }, + "node_modules/eslint-config-scratch/node_modules/globals": { + "version": "17.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.4.0.tgz", + "integrity": "sha512-hjrNztw/VajQwOLsMNT1cbJiH2muO3OROCHnbehc8eY5JyD2gqz4AcMHPqgaOR59DjgUjYAYLeH699g/eWi2jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/eslint-import-context": { "version": "0.1.9", "dev": true, @@ -15303,22 +14968,22 @@ } }, "node_modules/eslint-plugin-formatjs": { - "version": "5.4.2", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-formatjs/-/eslint-plugin-formatjs-6.2.0.tgz", + "integrity": "sha512-JftP9glJrS4qdviqTyZ0Kk14hcHB8AJn2FP2W7dsMugOIHDgra30mTvGjRMohivDIaFXnPGCAOv/AYm55BMUBQ==", "dev": true, "license": "MIT", "dependencies": { - "@formatjs/icu-messageformat-parser": "2.11.4", - "@formatjs/ts-transformer": "3.14.2", - "@types/eslint": "^9.6.1", - "@types/picomatch": "^3", - "@typescript-eslint/utils": "^8.27.0", + "@formatjs/icu-messageformat-parser": "3.5.1", + "@formatjs/ts-transformer": "4.4.0", + "@types/picomatch": "^4.0.0", + "@unicode/unicode-17.0.0": "^1.6.16", "magic-string": "^0.30.0", "picomatch": "2 || 3 || 4", - "tslib": "^2.8.0", - "unicode-emoji-utils": "^1.2.0" + "tslib": "^2.8.1" }, "peerDependencies": { - "eslint": "^9.23.0" + "eslint": "9" } }, "node_modules/eslint-plugin-html": { @@ -15422,30 +15087,32 @@ } }, "node_modules/eslint-plugin-jsdoc": { - "version": "61.7.1", + "version": "62.7.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-62.7.1.tgz", + "integrity": "sha512-4Zvx99Q7d1uggYBUX/AIjvoyqXhluGbbKrRmG8SQTLprPFg6fa293tVJH1o1GQwNe3lUydd8ZHzn37OaSncgSQ==", "dev": true, "license": "BSD-3-Clause", "dependencies": { - "@es-joy/jsdoccomment": "~0.78.0", + "@es-joy/jsdoccomment": "~0.84.0", "@es-joy/resolve.exports": "1.2.0", "are-docs-informative": "^0.0.2", - "comment-parser": "1.4.1", + "comment-parser": "1.4.5", "debug": "^4.4.3", "escape-string-regexp": "^4.0.0", - "espree": "^11.0.0", + "espree": "^11.1.0", "esquery": "^1.7.0", "html-entities": "^2.6.0", "object-deep-merge": "^2.0.0", "parse-imports-exports": "^0.2.4", - "semver": "^7.7.3", + "semver": "^7.7.4", "spdx-expression-parse": "^4.0.0", "to-valid-identifier": "^1.0.0" }, "engines": { - "node": ">=20.11.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" + "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0" } }, "node_modules/eslint-plugin-jsdoc/node_modules/eslint-visitor-keys": { @@ -17802,11 +17469,6 @@ "unicode-trie": "^0.3.1" } }, - "node_modules/graphemer": { - "version": "1.4.0", - "dev": true, - "license": "MIT" - }, "node_modules/growl": { "version": "1.10.3", "license": "MIT", @@ -21514,7 +21176,9 @@ "license": "MIT" }, "node_modules/jsdoc-type-pratt-parser": { - "version": "7.0.0", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-7.1.1.tgz", + "integrity": "sha512-/2uqY7x6bsrpi3i9LVU6J89352C0rpMk0as8trXxCtvd4kPk1ke/Eyif6wqfSLvoNJqcDG9Vk4UsXgygzCt2xA==", "dev": true, "license": "MIT", "engines": { @@ -21632,6 +21296,8 @@ }, "node_modules/json-stable-stringify": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.3.0.tgz", + "integrity": "sha512-qtYiSSFlwot9XHtF9bD9c7rwKjr+RecWT//ZnPvSmEjpV5mmPOCN4j8UjY5hbjNkOwZ/jQv3J6R1/pL7RwgMsg==", "dev": true, "license": "MIT", "dependencies": { @@ -21689,6 +21355,8 @@ }, "node_modules/jsonify": { "version": "0.0.1", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", + "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", "dev": true, "license": "Public Domain", "funding": { @@ -33608,7 +33276,9 @@ } }, "node_modules/ts-api-utils": { - "version": "2.1.0", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", + "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", "dev": true, "license": "MIT", "engines": { @@ -34319,35 +33989,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.46.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/eslint-plugin": "8.46.3", - "@typescript-eslint/parser": "8.46.3", - "@typescript-eslint/typescript-estree": "8.46.3", - "@typescript-eslint/utils": "8.46.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/typescript-eslint/node_modules/@typescript-eslint/project-service": { - "version": "8.46.3", + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.56.1.tgz", + "integrity": "sha512-U4lM6pjmBX7J5wk4szltF7I1cGBHXZopnAXCMXb3+fZ3B/0Z3hq3wS/CCUB2NZBNAExK92mCU2tEohWuwVMsDQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.46.3", - "@typescript-eslint/types": "^8.46.3", - "debug": "^4.3.4" + "@typescript-eslint/eslint-plugin": "8.56.1", + "@typescript-eslint/parser": "8.56.1", + "@typescript-eslint/typescript-estree": "8.56.1", + "@typescript-eslint/utils": "8.56.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -34357,150 +34008,10 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/typescript-eslint/node_modules/@typescript-eslint/scope-manager": { - "version": "8.46.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.46.3", - "@typescript-eslint/visitor-keys": "8.46.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/typescript-eslint/node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.46.3", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/typescript-eslint/node_modules/@typescript-eslint/types": { - "version": "8.46.3", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/typescript-eslint/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.46.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/project-service": "8.46.3", - "@typescript-eslint/tsconfig-utils": "8.46.3", - "@typescript-eslint/types": "8.46.3", - "@typescript-eslint/visitor-keys": "8.46.3", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^2.1.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/typescript-eslint/node_modules/@typescript-eslint/utils": { - "version": "8.46.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.46.3", - "@typescript-eslint/types": "8.46.3", - "@typescript-eslint/typescript-estree": "8.46.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/typescript-eslint/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.46.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.46.3", - "eslint-visitor-keys": "^4.2.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/typescript-eslint/node_modules/brace-expansion": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/typescript-eslint/node_modules/minimatch": { - "version": "9.0.5", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/typescript-eslint/node_modules/semver": { - "version": "7.7.3", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/ufo": { "version": "1.6.1", "dev": true, @@ -34562,14 +34073,6 @@ "node": ">=4" } }, - "node_modules/unicode-emoji-utils": { - "version": "1.3.1", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex-xs": "^2.0.0" - } - }, "node_modules/unicode-match-property-ecmascript": { "version": "2.0.0", "dev": true, @@ -36187,7 +35690,7 @@ "cheerio": "1.2.0", "cross-env": "7.0.3", "eslint": "9.39.3", - "eslint-config-scratch": "13.0.2", + "eslint-config-scratch": "13.0.5", "eslint-import-resolver-typescript": "4.4.4", "eslint-plugin-import-x": "4.16.1", "eslint-plugin-react": "7.37.5", @@ -36381,7 +35884,7 @@ "copy-webpack-plugin": "6.4.1", "docdash": "0.4.0", "eslint": "9.39.3", - "eslint-config-scratch": "13.0.2", + "eslint-config-scratch": "13.0.5", "gh-pages": "1.2.0", "globals": "16.5.0", "html-webpack-plugin": "5.6.6", @@ -36643,7 +36146,7 @@ "babel-loader": "9.2.1", "copy-webpack-plugin": "6.4.1", "eslint": "9.39.3", - "eslint-config-scratch": "13.0.2", + "eslint-config-scratch": "13.0.5", "globals": "16.5.0", "jsdom": "13.2.0", "mkdirp": "2.1.6", @@ -36838,7 +36341,7 @@ "copy-webpack-plugin": "6.4.1", "docdash": "1.2.0", "eslint": "9.39.3", - "eslint-config-scratch": "13.0.2", + "eslint-config-scratch": "13.0.5", "expose-loader": "1.0.3", "file-loader": "6.2.0", "format-message-cli": "6.2.4", @@ -36941,7 +36444,7 @@ "devDependencies": { "@vitest/coverage-v8": "4.0.18", "eslint": "9.39.3", - "eslint-config-scratch": "13.0.2", + "eslint-config-scratch": "13.0.5", "prettier": "3.8.1", "rimraf": "6.1.2", "typescript": "5.9.3", diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index 273c6f6cafe..acc23ebce22 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -196,7 +196,7 @@ "cheerio": "1.2.0", "cross-env": "7.0.3", "eslint": "9.39.3", - "eslint-config-scratch": "13.0.2", + "eslint-config-scratch": "13.0.5", "eslint-import-resolver-typescript": "4.4.4", "eslint-plugin-import-x": "4.16.1", "eslint-plugin-react": "7.37.5", diff --git a/packages/scratch-render/package.json b/packages/scratch-render/package.json index d97d4d447f4..b138aca4fc8 100644 --- a/packages/scratch-render/package.json +++ b/packages/scratch-render/package.json @@ -72,7 +72,7 @@ "copy-webpack-plugin": "6.4.1", "docdash": "0.4.0", "eslint": "9.39.3", - "eslint-config-scratch": "13.0.2", + "eslint-config-scratch": "13.0.5", "gh-pages": "1.2.0", "globals": "16.5.0", "html-webpack-plugin": "5.6.6", diff --git a/packages/scratch-svg-renderer/package.json b/packages/scratch-svg-renderer/package.json index 5bf5ececb5a..258da8f25f3 100644 --- a/packages/scratch-svg-renderer/package.json +++ b/packages/scratch-svg-renderer/package.json @@ -63,7 +63,7 @@ "babel-loader": "9.2.1", "copy-webpack-plugin": "6.4.1", "eslint": "9.39.3", - "eslint-config-scratch": "13.0.2", + "eslint-config-scratch": "13.0.5", "globals": "16.5.0", "jsdom": "13.2.0", "mkdirp": "2.1.6", diff --git a/packages/scratch-vm/package.json b/packages/scratch-vm/package.json index faf231dfff8..2a7bdb6fe66 100644 --- a/packages/scratch-vm/package.json +++ b/packages/scratch-vm/package.json @@ -91,7 +91,7 @@ "copy-webpack-plugin": "6.4.1", "docdash": "1.2.0", "eslint": "9.39.3", - "eslint-config-scratch": "13.0.2", + "eslint-config-scratch": "13.0.5", "expose-loader": "1.0.3", "file-loader": "6.2.0", "format-message-cli": "6.2.4", diff --git a/packages/task-herder/package.json b/packages/task-herder/package.json index a4c6057f203..7f8ec19e2bb 100644 --- a/packages/task-herder/package.json +++ b/packages/task-herder/package.json @@ -45,7 +45,7 @@ "devDependencies": { "@vitest/coverage-v8": "4.0.18", "eslint": "9.39.3", - "eslint-config-scratch": "13.0.2", + "eslint-config-scratch": "13.0.5", "prettier": "3.8.1", "rimraf": "6.1.2", "typescript": "5.9.3", From 42ea882750bd1c3b1544df33cfa794efa2a6d907 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 8 Mar 2026 01:03:10 +0000 Subject: [PATCH 290/521] chore(deps): update dependency npm to v10.9.5 --- package-lock.json | 278 ++++++++++++++++++++-------------------------- package.json | 2 +- 2 files changed, 119 insertions(+), 161 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4138b163222..299040da254 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,7 +21,7 @@ "cross-env": "7.0.3", "globals": "16.5.0", "husky": "8.0.3", - "npm": "10.9.4", + "npm": "10.9.5", "ts-node": "10.9.2" } }, @@ -23875,7 +23875,9 @@ } }, "node_modules/npm": { - "version": "10.9.4", + "version": "10.9.5", + "resolved": "https://registry.npmjs.org/npm/-/npm-10.9.5.tgz", + "integrity": "sha512-tFABtwt8S5KDs6DKs4p8uQ+u+8Hpx4ReD6bmkrPzPI0hsYkRWIkY/esz6ZtHyHvqVOltTB9DM/812Lx++SIXRw==", "bundleDependencies": [ "@isaacs/string-locale-compare", "@npmcli/arborist", @@ -23957,24 +23959,24 @@ ], "dependencies": { "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/arborist": "^8.0.1", + "@npmcli/arborist": "^8.0.2", "@npmcli/config": "^9.0.0", "@npmcli/fs": "^4.0.0", "@npmcli/map-workspaces": "^4.0.2", "@npmcli/package-json": "^6.2.0", - "@npmcli/promise-spawn": "^8.0.2", + "@npmcli/promise-spawn": "^8.0.3", "@npmcli/redact": "^3.2.2", "@npmcli/run-script": "^9.1.0", "@sigstore/tuf": "^3.1.1", "abbrev": "^3.0.1", "archy": "~1.0.0", "cacache": "^19.0.1", - "chalk": "^5.4.1", - "ci-info": "^4.2.0", + "chalk": "^5.6.2", + "ci-info": "^4.4.0", "cli-columns": "^4.0.0", "fastest-levenshtein": "^1.0.16", "fs-minipass": "^3.0.3", - "glob": "^10.4.5", + "glob": "^10.5.0", "graceful-fs": "^4.2.11", "hosted-git-info": "^8.1.0", "ini": "^5.0.0", @@ -23982,38 +23984,38 @@ "is-cidr": "^5.1.1", "json-parse-even-better-errors": "^4.0.0", "libnpmaccess": "^9.0.0", - "libnpmdiff": "^7.0.1", - "libnpmexec": "^9.0.1", - "libnpmfund": "^6.0.1", + "libnpmdiff": "^7.0.2", + "libnpmexec": "^9.0.2", + "libnpmfund": "^6.0.2", "libnpmhook": "^11.0.0", "libnpmorg": "^7.0.0", - "libnpmpack": "^8.0.1", - "libnpmpublish": "^10.0.1", + "libnpmpack": "^8.0.2", + "libnpmpublish": "^10.0.2", "libnpmsearch": "^8.0.0", "libnpmteam": "^7.0.0", "libnpmversion": "^7.0.0", "make-fetch-happen": "^14.0.3", - "minimatch": "^9.0.5", - "minipass": "^7.1.1", + "minimatch": "^9.0.9", + "minipass": "^7.1.3", "minipass-pipeline": "^1.2.4", "ms": "^2.1.2", - "node-gyp": "^11.2.0", + "node-gyp": "^11.5.0", "nopt": "^8.1.0", - "normalize-package-data": "^7.0.0", + "normalize-package-data": "^7.0.1", "npm-audit-report": "^6.0.0", - "npm-install-checks": "^7.1.1", + "npm-install-checks": "^7.1.2", "npm-package-arg": "^12.0.2", "npm-pick-manifest": "^10.0.0", "npm-profile": "^11.0.1", "npm-registry-fetch": "^18.0.2", "npm-user-validate": "^3.0.0", - "p-map": "^7.0.3", + "p-map": "^7.0.4", "pacote": "^19.0.1", "parse-conflict-json": "^4.0.0", "proc-log": "^5.0.0", "qrcode-terminal": "^0.12.0", "read": "^4.1.0", - "semver": "^7.7.2", + "semver": "^7.7.4", "spdx-expression-parse": "^4.0.0", "ssri": "^12.0.0", "supports-color": "^9.4.0", @@ -24021,7 +24023,7 @@ "text-table": "~0.2.0", "tiny-relative-date": "^1.3.0", "treeverse": "^3.0.0", - "validate-npm-package-name": "^6.0.1", + "validate-npm-package-name": "^6.0.2", "which": "^5.0.0", "write-file-atomic": "^6.0.0" }, @@ -24211,7 +24213,7 @@ } }, "node_modules/npm/node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.1.0", + "version": "6.2.2", "dev": true, "inBundle": true, "license": "MIT", @@ -24246,12 +24248,12 @@ } }, "node_modules/npm/node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", + "version": "7.2.0", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "ansi-regex": "^6.2.2" }, "engines": { "node": ">=12" @@ -24295,7 +24297,7 @@ } }, "node_modules/npm/node_modules/@npmcli/arborist": { - "version": "8.0.1", + "version": "8.0.2", "dev": true, "inBundle": true, "license": "ISC", @@ -24330,6 +24332,7 @@ "proggy": "^3.0.0", "promise-all-reject-late": "^1.0.0", "promise-call-limit": "^3.0.1", + "promise-retry": "^2.0.1", "read-package-json-fast": "^4.0.0", "semver": "^7.3.7", "ssri": "^12.0.0", @@ -24508,7 +24511,7 @@ } }, "node_modules/npm/node_modules/@npmcli/promise-spawn": { - "version": "8.0.2", + "version": "8.0.3", "dev": true, "inBundle": true, "license": "ISC", @@ -24608,7 +24611,7 @@ } }, "node_modules/npm/node_modules/agent-base": { - "version": "7.1.3", + "version": "7.1.4", "dev": true, "inBundle": true, "license": "MIT", @@ -24626,7 +24629,7 @@ } }, "node_modules/npm/node_modules/ansi-styles": { - "version": "6.2.1", + "version": "6.2.3", "dev": true, "inBundle": true, "license": "MIT", @@ -24638,7 +24641,7 @@ } }, "node_modules/npm/node_modules/aproba": { - "version": "2.0.0", + "version": "2.1.0", "dev": true, "inBundle": true, "license": "ISC" @@ -24724,32 +24727,16 @@ "node": ">=18" } }, - "node_modules/npm/node_modules/cacache/node_modules/mkdirp": { - "version": "3.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "bin": { - "mkdirp": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/npm/node_modules/cacache/node_modules/tar": { - "version": "7.4.3", + "version": "7.5.9", "dev": true, "inBundle": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", - "minizlib": "^3.0.1", - "mkdirp": "^3.0.1", + "minizlib": "^3.1.0", "yallist": "^5.0.0" }, "engines": { @@ -24766,7 +24753,7 @@ } }, "node_modules/npm/node_modules/chalk": { - "version": "5.4.1", + "version": "5.6.2", "dev": true, "inBundle": true, "license": "MIT", @@ -24787,7 +24774,7 @@ } }, "node_modules/npm/node_modules/ci-info": { - "version": "4.2.0", + "version": "4.4.0", "dev": true, "funding": [ { @@ -24901,7 +24888,7 @@ } }, "node_modules/npm/node_modules/debug": { - "version": "4.4.1", + "version": "4.4.3", "dev": true, "inBundle": true, "license": "MIT", @@ -24918,7 +24905,7 @@ } }, "node_modules/npm/node_modules/diff": { - "version": "5.2.0", + "version": "5.2.2", "dev": true, "inBundle": true, "license": "BSD-3-Clause", @@ -24964,7 +24951,7 @@ "license": "MIT" }, "node_modules/npm/node_modules/exponential-backoff": { - "version": "3.1.2", + "version": "3.1.3", "dev": true, "inBundle": true, "license": "Apache-2.0" @@ -24978,6 +24965,23 @@ "node": ">= 4.9.1" } }, + "node_modules/npm/node_modules/fdir": { + "version": "6.5.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, "node_modules/npm/node_modules/foreground-child": { "version": "3.3.1", "dev": true, @@ -25007,7 +25011,7 @@ } }, "node_modules/npm/node_modules/glob": { - "version": "10.4.5", + "version": "10.5.0", "dev": true, "inBundle": true, "license": "ISC", @@ -25138,14 +25142,10 @@ } }, "node_modules/npm/node_modules/ip-address": { - "version": "9.0.5", + "version": "10.1.0", "dev": true, "inBundle": true, "license": "MIT", - "dependencies": { - "jsbn": "1.1.0", - "sprintf-js": "^1.1.3" - }, "engines": { "node": ">= 12" } @@ -25204,12 +25204,6 @@ "@pkgjs/parseargs": "^0.11.0" } }, - "node_modules/npm/node_modules/jsbn": { - "version": "1.1.0", - "dev": true, - "inBundle": true, - "license": "MIT" - }, "node_modules/npm/node_modules/json-parse-even-better-errors": { "version": "4.0.0", "dev": true, @@ -25263,12 +25257,12 @@ } }, "node_modules/npm/node_modules/libnpmdiff": { - "version": "7.0.1", + "version": "7.0.2", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/arborist": "^8.0.1", + "@npmcli/arborist": "^8.0.2", "@npmcli/installed-package-contents": "^3.0.0", "binary-extensions": "^2.3.0", "diff": "^5.1.0", @@ -25282,12 +25276,12 @@ } }, "node_modules/npm/node_modules/libnpmexec": { - "version": "9.0.1", + "version": "9.0.2", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/arborist": "^8.0.1", + "@npmcli/arborist": "^8.0.2", "@npmcli/run-script": "^9.0.1", "ci-info": "^4.0.0", "npm-package-arg": "^12.0.0", @@ -25303,12 +25297,12 @@ } }, "node_modules/npm/node_modules/libnpmfund": { - "version": "6.0.1", + "version": "6.0.2", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/arborist": "^8.0.1" + "@npmcli/arborist": "^8.0.2" }, "engines": { "node": "^18.17.0 || >=20.5.0" @@ -25341,12 +25335,12 @@ } }, "node_modules/npm/node_modules/libnpmpack": { - "version": "8.0.1", + "version": "8.0.2", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/arborist": "^8.0.1", + "@npmcli/arborist": "^8.0.2", "@npmcli/run-script": "^9.0.1", "npm-package-arg": "^12.0.0", "pacote": "^19.0.0" @@ -25356,7 +25350,7 @@ } }, "node_modules/npm/node_modules/libnpmpublish": { - "version": "10.0.1", + "version": "10.0.2", "dev": true, "inBundle": true, "license": "ISC", @@ -25443,22 +25437,13 @@ "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/npm/node_modules/make-fetch-happen/node_modules/negotiator": { - "version": "1.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/npm/node_modules/minimatch": { - "version": "9.0.5", + "version": "9.0.9", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^2.0.2" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -25468,10 +25453,10 @@ } }, "node_modules/npm/node_modules/minipass": { - "version": "7.1.2", + "version": "7.1.3", "dev": true, "inBundle": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "engines": { "node": ">=16 || 14 >=14.17" } @@ -25578,7 +25563,7 @@ } }, "node_modules/npm/node_modules/minizlib": { - "version": "3.0.2", + "version": "3.1.0", "dev": true, "inBundle": true, "license": "MIT", @@ -25616,8 +25601,17 @@ "node": "^18.17.0 || >=20.5.0" } }, + "node_modules/npm/node_modules/negotiator": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/npm/node_modules/node-gyp": { - "version": "11.2.0", + "version": "11.5.0", "dev": true, "inBundle": true, "license": "MIT", @@ -25649,32 +25643,16 @@ "node": ">=18" } }, - "node_modules/npm/node_modules/node-gyp/node_modules/mkdirp": { - "version": "3.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "bin": { - "mkdirp": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/npm/node_modules/node-gyp/node_modules/tar": { - "version": "7.4.3", + "version": "7.5.9", "dev": true, "inBundle": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", - "minizlib": "^3.0.1", - "mkdirp": "^3.0.1", + "minizlib": "^3.1.0", "yallist": "^5.0.0" }, "engines": { @@ -25706,7 +25684,7 @@ } }, "node_modules/npm/node_modules/normalize-package-data": { - "version": "7.0.0", + "version": "7.0.1", "dev": true, "inBundle": true, "license": "BSD-2-Clause", @@ -25741,7 +25719,7 @@ } }, "node_modules/npm/node_modules/npm-install-checks": { - "version": "7.1.1", + "version": "7.1.2", "dev": true, "inBundle": true, "license": "BSD-2-Clause", @@ -25845,7 +25823,7 @@ } }, "node_modules/npm/node_modules/p-map": { - "version": "7.0.3", + "version": "7.0.4", "dev": true, "inBundle": true, "license": "MIT", @@ -25932,8 +25910,20 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/npm/node_modules/picomatch": { + "version": "4.0.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/npm/node_modules/postcss-selector-parser": { - "version": "7.1.0", + "version": "7.1.1", "dev": true, "inBundle": true, "license": "MIT", @@ -26065,7 +26055,7 @@ "optional": true }, "node_modules/npm/node_modules/semver": { - "version": "7.7.2", + "version": "7.7.4", "dev": true, "inBundle": true, "license": "ISC", @@ -26189,12 +26179,12 @@ } }, "node_modules/npm/node_modules/socks": { - "version": "2.8.5", + "version": "2.8.7", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { - "ip-address": "^9.0.5", + "ip-address": "^10.0.1", "smart-buffer": "^4.2.0" }, "engines": { @@ -26253,17 +26243,11 @@ } }, "node_modules/npm/node_modules/spdx-license-ids": { - "version": "3.0.21", + "version": "3.0.23", "dev": true, "inBundle": true, "license": "CC0-1.0" }, - "node_modules/npm/node_modules/sprintf-js": { - "version": "1.1.3", - "dev": true, - "inBundle": true, - "license": "BSD-3-Clause" - }, "node_modules/npm/node_modules/ssri": { "version": "12.0.0", "dev": true, @@ -26430,13 +26414,13 @@ "license": "MIT" }, "node_modules/npm/node_modules/tinyglobby": { - "version": "0.2.14", + "version": "0.2.15", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { - "fdir": "^6.4.4", - "picomatch": "^4.0.2" + "fdir": "^6.5.0", + "picomatch": "^4.0.3" }, "engines": { "node": ">=12.0.0" @@ -26445,32 +26429,6 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/npm/node_modules/tinyglobby/node_modules/fdir": { - "version": "6.4.6", - "dev": true, - "inBundle": true, - "license": "MIT", - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/npm/node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/npm/node_modules/treeverse": { "version": "3.0.0", "dev": true, @@ -26481,14 +26439,14 @@ } }, "node_modules/npm/node_modules/tuf-js": { - "version": "3.0.1", + "version": "3.1.0", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "@tufjs/models": "3.0.1", - "debug": "^4.3.6", - "make-fetch-happen": "^14.0.1" + "debug": "^4.4.1", + "make-fetch-happen": "^14.0.3" }, "engines": { "node": "^18.17.0 || >=20.5.0" @@ -26558,7 +26516,7 @@ } }, "node_modules/npm/node_modules/validate-npm-package-name": { - "version": "6.0.1", + "version": "6.0.2", "dev": true, "inBundle": true, "license": "ISC", @@ -26588,12 +26546,12 @@ } }, "node_modules/npm/node_modules/which/node_modules/isexe": { - "version": "3.1.1", + "version": "3.1.5", "dev": true, "inBundle": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "engines": { - "node": ">=16" + "node": ">=18" } }, "node_modules/npm/node_modules/wrap-ansi": { @@ -26647,7 +26605,7 @@ } }, "node_modules/npm/node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.1.0", + "version": "6.2.2", "dev": true, "inBundle": true, "license": "MIT", @@ -26682,12 +26640,12 @@ } }, "node_modules/npm/node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.1.0", + "version": "7.2.0", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "ansi-regex": "^6.2.2" }, "engines": { "node": ">=12" diff --git a/package.json b/package.json index f1b20ab6128..c2e8fcf1704 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "cross-env": "7.0.3", "globals": "16.5.0", "husky": "8.0.3", - "npm": "10.9.4", + "npm": "10.9.5", "ts-node": "10.9.2" } } From 2daa29dcf45735f619c001775fc9f124cdab279c Mon Sep 17 00:00:00 2001 From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com> Date: Mon, 9 Mar 2026 07:41:13 -0700 Subject: [PATCH 291/521] fix: make menus close on Blockly workspace clicks Resolves scratchfoundation/scratch-blocks#3456 --- packages/scratch-gui/src/containers/menu.jsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/scratch-gui/src/containers/menu.jsx b/packages/scratch-gui/src/containers/menu.jsx index e9a51cd4ced..734e4a39fee 100644 --- a/packages/scratch-gui/src/containers/menu.jsx +++ b/packages/scratch-gui/src/containers/menu.jsx @@ -25,10 +25,12 @@ class Menu extends React.Component { this.removeListeners(); } addListeners () { - document.addEventListener('mouseup', this.handleClick); + // The Blockly workspace suppresses compat events like `mouseup`. + // Listen for `pointerup` instead. + document.addEventListener('pointerup', this.handleClick); } removeListeners () { - document.removeEventListener('mouseup', this.handleClick); + document.removeEventListener('pointerup', this.handleClick); } handleClick (e) { if (this.props.open && !this.menu.contains(e.target)) { From 9ae1551f78cba2d5620ebe5134f0b42e905355f1 Mon Sep 17 00:00:00 2001 From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com> Date: Mon, 9 Mar 2026 11:16:48 -0700 Subject: [PATCH 292/521] fix: prevent "Add Extension" button from hiding category buttons Resolves scratchfoundation/scratch-blocks#3459 --- packages/scratch-gui/src/components/blocks/blocks.css | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/packages/scratch-gui/src/components/blocks/blocks.css b/packages/scratch-gui/src/components/blocks/blocks.css index 583f587f797..bc5a3ed0b8f 100644 --- a/packages/scratch-gui/src/components/blocks/blocks.css +++ b/packages/scratch-gui/src/components/blocks/blocks.css @@ -40,6 +40,11 @@ stroke: none; } +/* + TODO: Check if we still need both `blocklyToolbox` and `blocklyToolboxDiv`, and remove one if possible. + Note that there are other places in this file which use both. +*/ +.blocks :global(.blocklyToolbox), .blocks :global(.blocklyToolboxDiv) { border-right: 1px solid $ui-black-transparent; border-bottom: 1px solid $ui-black-transparent; @@ -55,11 +60,13 @@ -ms-overflow-style: none; } +[dir="rtl"] .blocks :global(.blocklyToolbox), [dir="rtl"] .blocks :global(.blocklyToolboxDiv) { border-right: none; border-left: 1px solid $ui-black-transparent; } +.blocks :global(.blocklyToolbox::-webkit-scrollbar), .blocks :global(.blocklyToolboxDiv::-webkit-scrollbar) { display: none; } From ef66e751ca86929e27dbf125d995e72f6ecc5e35 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 9 Mar 2026 22:55:55 +0000 Subject: [PATCH 293/521] chore(deps): update dependency eslint to v9.39.4 --- package-lock.json | 88 ++++++++++++++++++---- packages/scratch-gui/package.json | 2 +- packages/scratch-render/package.json | 2 +- packages/scratch-svg-renderer/package.json | 2 +- packages/scratch-vm/package.json | 2 +- packages/task-herder/package.json | 2 +- 6 files changed, 77 insertions(+), 21 deletions(-) diff --git a/package-lock.json b/package-lock.json index 299040da254..f90df61b296 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2456,13 +2456,15 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.21.1", + "version": "0.21.2", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz", + "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==", "dev": true, "license": "Apache-2.0", "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", - "minimatch": "^3.1.2" + "minimatch": "^3.1.5" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -14780,25 +14782,25 @@ } }, "node_modules/eslint": { - "version": "9.39.3", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.3.tgz", - "integrity": "sha512-VmQ+sifHUbI/IcSopBCF/HO3YiHQx/AVd3UVyYL6weuwW+HvON9VYn5l6Zl1WZzPWXPNZrSQpxwkkZ/VuvJZzg==", + "version": "9.39.4", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz", + "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.1", + "@eslint/config-array": "^0.21.2", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", - "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.39.3", + "@eslint/eslintrc": "^3.3.5", + "@eslint/js": "9.39.4", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", - "ajv": "^6.12.4", + "ajv": "^6.14.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", @@ -14817,7 +14819,7 @@ "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", + "minimatch": "^3.1.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, @@ -15307,8 +15309,47 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint/node_modules/@eslint/eslintrc": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz", + "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==", + "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" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/@eslint/js": { + "version": "9.39.4", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz", + "integrity": "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, "node_modules/eslint/node_modules/ajv": { - "version": "6.12.6", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "dev": true, "license": "MIT", "dependencies": { @@ -15322,8 +15363,23 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/eslint/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, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "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" }, @@ -35647,7 +35703,7 @@ "buffer": "6.0.3", "cheerio": "1.2.0", "cross-env": "7.0.3", - "eslint": "9.39.3", + "eslint": "9.39.4", "eslint-config-scratch": "13.0.5", "eslint-import-resolver-typescript": "4.4.4", "eslint-plugin-import-x": "4.16.1", @@ -35841,7 +35897,7 @@ "babel-loader": "9.2.1", "copy-webpack-plugin": "6.4.1", "docdash": "0.4.0", - "eslint": "9.39.3", + "eslint": "9.39.4", "eslint-config-scratch": "13.0.5", "gh-pages": "1.2.0", "globals": "16.5.0", @@ -36103,7 +36159,7 @@ "@babel/preset-env": "7.29.0", "babel-loader": "9.2.1", "copy-webpack-plugin": "6.4.1", - "eslint": "9.39.3", + "eslint": "9.39.4", "eslint-config-scratch": "13.0.5", "globals": "16.5.0", "jsdom": "13.2.0", @@ -36298,7 +36354,7 @@ "callsite": "1.0.0", "copy-webpack-plugin": "6.4.1", "docdash": "1.2.0", - "eslint": "9.39.3", + "eslint": "9.39.4", "eslint-config-scratch": "13.0.5", "expose-loader": "1.0.3", "file-loader": "6.2.0", @@ -36401,7 +36457,7 @@ "license": "AGPL-3.0-only", "devDependencies": { "@vitest/coverage-v8": "4.0.18", - "eslint": "9.39.3", + "eslint": "9.39.4", "eslint-config-scratch": "13.0.5", "prettier": "3.8.1", "rimraf": "6.1.2", diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index acc23ebce22..4199759fa88 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -195,7 +195,7 @@ "buffer": "6.0.3", "cheerio": "1.2.0", "cross-env": "7.0.3", - "eslint": "9.39.3", + "eslint": "9.39.4", "eslint-config-scratch": "13.0.5", "eslint-import-resolver-typescript": "4.4.4", "eslint-plugin-import-x": "4.16.1", diff --git a/packages/scratch-render/package.json b/packages/scratch-render/package.json index b138aca4fc8..d68ae72643c 100644 --- a/packages/scratch-render/package.json +++ b/packages/scratch-render/package.json @@ -71,7 +71,7 @@ "babel-loader": "9.2.1", "copy-webpack-plugin": "6.4.1", "docdash": "0.4.0", - "eslint": "9.39.3", + "eslint": "9.39.4", "eslint-config-scratch": "13.0.5", "gh-pages": "1.2.0", "globals": "16.5.0", diff --git a/packages/scratch-svg-renderer/package.json b/packages/scratch-svg-renderer/package.json index 258da8f25f3..b5cef024dca 100644 --- a/packages/scratch-svg-renderer/package.json +++ b/packages/scratch-svg-renderer/package.json @@ -62,7 +62,7 @@ "@babel/preset-env": "7.29.0", "babel-loader": "9.2.1", "copy-webpack-plugin": "6.4.1", - "eslint": "9.39.3", + "eslint": "9.39.4", "eslint-config-scratch": "13.0.5", "globals": "16.5.0", "jsdom": "13.2.0", diff --git a/packages/scratch-vm/package.json b/packages/scratch-vm/package.json index 2a7bdb6fe66..b0604c0882b 100644 --- a/packages/scratch-vm/package.json +++ b/packages/scratch-vm/package.json @@ -90,7 +90,7 @@ "callsite": "1.0.0", "copy-webpack-plugin": "6.4.1", "docdash": "1.2.0", - "eslint": "9.39.3", + "eslint": "9.39.4", "eslint-config-scratch": "13.0.5", "expose-loader": "1.0.3", "file-loader": "6.2.0", diff --git a/packages/task-herder/package.json b/packages/task-herder/package.json index 7f8ec19e2bb..661b24ba94c 100644 --- a/packages/task-herder/package.json +++ b/packages/task-herder/package.json @@ -44,7 +44,7 @@ }, "devDependencies": { "@vitest/coverage-v8": "4.0.18", - "eslint": "9.39.3", + "eslint": "9.39.4", "eslint-config-scratch": "13.0.5", "prettier": "3.8.1", "rimraf": "6.1.2", From 750ddbcb2541f7f8f8513beb2b05e0e40f8247bc Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 11 Mar 2026 13:31:36 +0000 Subject: [PATCH 294/521] style(deps): update dependency eslint-config-scratch to v14 --- package-lock.json | 280 +++++++++++---------- packages/scratch-gui/package.json | 2 +- packages/scratch-render/package.json | 2 +- packages/scratch-svg-renderer/package.json | 2 +- packages/scratch-vm/package.json | 2 +- packages/task-herder/package.json | 2 +- 6 files changed, 151 insertions(+), 139 deletions(-) diff --git a/package-lock.json b/package-lock.json index f90df61b296..388322d9270 100644 --- a/package-lock.json +++ b/package-lock.json @@ -254,39 +254,6 @@ "semver": "bin/semver.js" } }, - "node_modules/@babel/eslint-parser": { - "version": "7.28.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", - "eslint-visitor-keys": "^2.1.0", - "semver": "^6.3.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || >=14.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.11.0", - "eslint": "^7.5.0 || ^8.0.0 || ^9.0.0" - } - }, - "node_modules/@babel/eslint-parser/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10" - } - }, - "node_modules/@babel/eslint-parser/node_modules/semver": { - "version": "6.3.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/generator": { "version": "7.29.1", "dev": true, @@ -2493,9 +2460,9 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.4.tgz", - "integrity": "sha512-4h4MVF8pmBsncB60r0wSJiIeUKTSD4m7FmTFThG8RHlsg9ajqckLm9OraguFGZE4vVdpiI1Q4+hFnisopmG6gQ==", + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz", + "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==", "dev": true, "license": "MIT", "dependencies": { @@ -2506,7 +2473,7 @@ "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.1", - "minimatch": "^3.1.3", + "minimatch": "^3.1.5", "strip-json-comments": "^3.1.1" }, "engines": { @@ -2552,9 +2519,9 @@ "license": "MIT" }, "node_modules/@eslint/js": { - "version": "9.39.3", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.3.tgz", - "integrity": "sha512-1B1VkCq6FuUNlQvlBYb+1jDu/gV297TIs/OeiaSR9l1H27SVW55ONE1e1Vp16NqP683+xEGzxYtv4XCiDPaQiw==", + "version": "9.39.4", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz", + "integrity": "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==", "dev": true, "license": "MIT", "engines": { @@ -3674,34 +3641,6 @@ "license": "MIT", "optional": true }, - "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { - "version": "5.1.1-v1", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-scope": "5.1.1" - } - }, - "node_modules/@nicolo-ribaudo/eslint-scope-5-internals/node_modules/eslint-scope": { - "version": "5.1.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@nicolo-ribaudo/eslint-scope-5-internals/node_modules/estraverse": { - "version": "4.3.0", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, "node_modules/@noble/hashes": { "version": "1.4.0", "devOptional": true, @@ -7779,12 +7718,14 @@ "license": "MIT" }, "node_modules/@stylistic/eslint-plugin": { - "version": "5.6.1", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-5.10.0.tgz", + "integrity": "sha512-nPK52ZHvot8Ju/0A4ucSX1dcPV2/1clx0kLcH5wDmrE4naKso7TUC/voUyU1O9OTKTrR6MYip6LP0ogEMQ9jPQ==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.9.0", - "@typescript-eslint/types": "^8.47.0", + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/types": "^8.56.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "estraverse": "^5.3.0", @@ -7794,7 +7735,7 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "peerDependencies": { - "eslint": ">=9.0.0" + "eslint": "^9.0.0 || ^10.0.0" } }, "node_modules/@tapjs/after": { @@ -14841,6 +14782,22 @@ } } }, + "node_modules/eslint-compat-utils": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz", + "integrity": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, "node_modules/eslint-config-prettier": { "version": "10.1.8", "dev": true, @@ -14856,18 +14813,17 @@ } }, "node_modules/eslint-config-scratch": { - "version": "13.0.5", - "resolved": "https://registry.npmjs.org/eslint-config-scratch/-/eslint-config-scratch-13.0.5.tgz", - "integrity": "sha512-lfwnMYP2prmZQiUUg+kdO9mMNroTAm+GDXpcXvt4ySibK+1XwCVJ/1E87PNLZmWG/jrg80qQlazIgttGwd8ezg==", + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/eslint-config-scratch/-/eslint-config-scratch-14.0.3.tgz", + "integrity": "sha512-D55JyoFMYc6UzosB5BTO2BOmF56aTGVohd0UgvnxiMOyRczU7XdMWBHP2LKZn6sVvIA1zZfGPIokYQO3iBl4hA==", "dev": true, "license": "BSD-3-Clause", "dependencies": { - "@babel/eslint-parser": "7.28.6", "@eslint-community/eslint-plugin-eslint-comments": "4.7.1", - "@eslint/eslintrc": "3.3.4", - "@eslint/js": "9.39.3", + "@eslint/eslintrc": "3.3.5", + "@eslint/js": "9.39.4", "@eslint/markdown": "7.5.1", - "@stylistic/eslint-plugin": "^5.3.1", + "@stylistic/eslint-plugin": "5.10.0", "@trivago/prettier-plugin-sort-imports": "6.0.2", "eslint-config-prettier": "10.1.8", "eslint-plugin-formatjs": "6.2.0", @@ -14875,6 +14831,7 @@ "eslint-plugin-import-x": "4.16.1", "eslint-plugin-jsdoc": "62.7.1", "eslint-plugin-jsx-a11y": "6.10.2", + "eslint-plugin-n": "17.24.0", "eslint-plugin-react": "7.37.5", "eslint-plugin-react-hooks": "7.0.1", "globals": "17.4.0", @@ -14954,6 +14911,28 @@ } } }, + "node_modules/eslint-plugin-es-x": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.8.0.tgz", + "integrity": "sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==", + "dev": true, + "funding": [ + "https://github.com/sponsors/ota-meshi", + "https://opencollective.com/eslint" + ], + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.1.2", + "@eslint-community/regexpp": "^4.11.0", + "eslint-compat-utils": "^0.5.1" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": ">=8" + } + }, "node_modules/eslint-plugin-format-message": { "version": "6.2.4", "dev": true, @@ -15191,6 +15170,59 @@ "node": ">= 0.4" } }, + "node_modules/eslint-plugin-n": { + "version": "17.24.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.24.0.tgz", + "integrity": "sha512-/gC7/KAYmfNnPNOb3eu8vw+TdVnV0zhdQwexsw6FLXbhzroVj20vRn2qL8lDWDGnAQ2J8DhdfvXxX9EoxvERvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.5.0", + "enhanced-resolve": "^5.17.1", + "eslint-plugin-es-x": "^7.8.0", + "get-tsconfig": "^4.8.1", + "globals": "^15.11.0", + "globrex": "^0.1.2", + "ignore": "^5.3.2", + "semver": "^7.6.3", + "ts-declaration-location": "^1.0.6" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": ">=8.23.0" + } + }, + "node_modules/eslint-plugin-n/node_modules/globals": { + "version": "15.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", + "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-plugin-n/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/eslint-plugin-react": { "version": "7.37.5", "dev": true, @@ -15309,43 +15341,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/@eslint/eslintrc": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz", - "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==", - "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" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/@eslint/js": { - "version": "9.39.4", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz", - "integrity": "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - } - }, "node_modules/eslint/node_modules/ajv": { "version": "6.14.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", @@ -15363,19 +15358,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/eslint/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, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "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", @@ -17503,6 +17485,13 @@ "node": ">=8" } }, + "node_modules/globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "dev": true, + "license": "MIT" + }, "node_modules/gopd": { "version": "1.2.0", "license": "MIT", @@ -33302,6 +33291,29 @@ "typescript": ">=4.8.4" } }, + "node_modules/ts-declaration-location": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/ts-declaration-location/-/ts-declaration-location-1.0.7.tgz", + "integrity": "sha512-EDyGAwH1gO0Ausm9gV6T2nUvBgXT5kGoCMJPllOaooZ+4VvJiKBdZE7wK18N1deEowhcUptS+5GXZK8U/fvpwA==", + "dev": true, + "funding": [ + { + "type": "ko-fi", + "url": "https://ko-fi.com/rebeccastevens" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/ts-declaration-location" + } + ], + "license": "BSD-3-Clause", + "dependencies": { + "picomatch": "^4.0.2" + }, + "peerDependencies": { + "typescript": ">=4.0.0" + } + }, "node_modules/ts-jest": { "version": "29.4.6", "dev": true, @@ -35704,7 +35716,7 @@ "cheerio": "1.2.0", "cross-env": "7.0.3", "eslint": "9.39.4", - "eslint-config-scratch": "13.0.5", + "eslint-config-scratch": "14.0.3", "eslint-import-resolver-typescript": "4.4.4", "eslint-plugin-import-x": "4.16.1", "eslint-plugin-react": "7.37.5", @@ -35898,7 +35910,7 @@ "copy-webpack-plugin": "6.4.1", "docdash": "0.4.0", "eslint": "9.39.4", - "eslint-config-scratch": "13.0.5", + "eslint-config-scratch": "14.0.3", "gh-pages": "1.2.0", "globals": "16.5.0", "html-webpack-plugin": "5.6.6", @@ -36160,7 +36172,7 @@ "babel-loader": "9.2.1", "copy-webpack-plugin": "6.4.1", "eslint": "9.39.4", - "eslint-config-scratch": "13.0.5", + "eslint-config-scratch": "14.0.3", "globals": "16.5.0", "jsdom": "13.2.0", "mkdirp": "2.1.6", @@ -36355,7 +36367,7 @@ "copy-webpack-plugin": "6.4.1", "docdash": "1.2.0", "eslint": "9.39.4", - "eslint-config-scratch": "13.0.5", + "eslint-config-scratch": "14.0.3", "expose-loader": "1.0.3", "file-loader": "6.2.0", "format-message-cli": "6.2.4", @@ -36458,7 +36470,7 @@ "devDependencies": { "@vitest/coverage-v8": "4.0.18", "eslint": "9.39.4", - "eslint-config-scratch": "13.0.5", + "eslint-config-scratch": "14.0.3", "prettier": "3.8.1", "rimraf": "6.1.2", "typescript": "5.9.3", diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index 4199759fa88..9e7a26fc450 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -196,7 +196,7 @@ "cheerio": "1.2.0", "cross-env": "7.0.3", "eslint": "9.39.4", - "eslint-config-scratch": "13.0.5", + "eslint-config-scratch": "14.0.3", "eslint-import-resolver-typescript": "4.4.4", "eslint-plugin-import-x": "4.16.1", "eslint-plugin-react": "7.37.5", diff --git a/packages/scratch-render/package.json b/packages/scratch-render/package.json index d68ae72643c..c78b899f1c9 100644 --- a/packages/scratch-render/package.json +++ b/packages/scratch-render/package.json @@ -72,7 +72,7 @@ "copy-webpack-plugin": "6.4.1", "docdash": "0.4.0", "eslint": "9.39.4", - "eslint-config-scratch": "13.0.5", + "eslint-config-scratch": "14.0.3", "gh-pages": "1.2.0", "globals": "16.5.0", "html-webpack-plugin": "5.6.6", diff --git a/packages/scratch-svg-renderer/package.json b/packages/scratch-svg-renderer/package.json index b5cef024dca..469867826e1 100644 --- a/packages/scratch-svg-renderer/package.json +++ b/packages/scratch-svg-renderer/package.json @@ -63,7 +63,7 @@ "babel-loader": "9.2.1", "copy-webpack-plugin": "6.4.1", "eslint": "9.39.4", - "eslint-config-scratch": "13.0.5", + "eslint-config-scratch": "14.0.3", "globals": "16.5.0", "jsdom": "13.2.0", "mkdirp": "2.1.6", diff --git a/packages/scratch-vm/package.json b/packages/scratch-vm/package.json index b0604c0882b..a4c7947feaa 100644 --- a/packages/scratch-vm/package.json +++ b/packages/scratch-vm/package.json @@ -91,7 +91,7 @@ "copy-webpack-plugin": "6.4.1", "docdash": "1.2.0", "eslint": "9.39.4", - "eslint-config-scratch": "13.0.5", + "eslint-config-scratch": "14.0.3", "expose-loader": "1.0.3", "file-loader": "6.2.0", "format-message-cli": "6.2.4", diff --git a/packages/task-herder/package.json b/packages/task-herder/package.json index 661b24ba94c..0f08c7d03d3 100644 --- a/packages/task-herder/package.json +++ b/packages/task-herder/package.json @@ -45,7 +45,7 @@ "devDependencies": { "@vitest/coverage-v8": "4.0.18", "eslint": "9.39.4", - "eslint-config-scratch": "13.0.5", + "eslint-config-scratch": "14.0.3", "prettier": "3.8.1", "rimraf": "6.1.2", "typescript": "5.9.3", From 65c2aed0154b4ffc3cf7b38a62a0b72b18d782d1 Mon Sep 17 00:00:00 2001 From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com> Date: Wed, 11 Mar 2026 07:04:22 -0700 Subject: [PATCH 295/521] style: adapt to eslint-config-scratch@^14 --- packages/scratch-gui/eslint.config.mjs | 2 +- .../browser-modal/browser-modal.jsx | 2 +- .../debug-modal/sections/messages.js | 28 +++++++++---------- .../src/components/menu-bar/menu-bar.jsx | 4 +-- .../src/components/prompt/prompt.jsx | 2 +- .../components/webgl-modal/webgl-modal.jsx | 2 +- packages/scratch-gui/src/gui-config.ts | 4 +-- packages/scratch-gui/src/lib/alerts/index.jsx | 2 +- .../src/lib/default-project/index.ts | 6 ++-- .../src/lib/default-project/project-data.ts | 2 +- packages/scratch-gui/src/lib/editor-state.tsx | 6 ++-- .../scratch-gui/src/lib/legacy-storage.ts | 4 +-- .../src/lib/libraries/extensions/index.jsx | 4 +-- .../src/extensions/scratch3_boost/index.js | 4 +-- .../src/extensions/scratch3_ev3/index.js | 2 +- .../extensions/scratch3_face_sensing/index.js | 8 +++--- .../src/extensions/scratch3_gdx_for/index.js | 4 +-- .../extensions/scratch3_makeymakey/index.js | 2 +- .../src/extensions/scratch3_microbit/index.js | 2 +- .../src/extensions/scratch3_music/index.js | 4 +-- .../src/extensions/scratch3_pen/index.js | 2 +- .../extensions/scratch3_speech2text/index.js | 8 +++--- .../extensions/scratch3_text2speech/index.js | 4 +-- .../extensions/scratch3_translate/index.js | 4 +-- .../scratch3_video_sensing/index.js | 4 +-- .../src/extensions/scratch3_wedo2/index.js | 2 +- ..._to_workspace_comment_import_no_scripts.js | 2 +- .../scratch-vm/test/unit/virtual-machine.js | 4 +-- packages/task-herder/README.md | 6 ++-- packages/task-herder/src/TaskQueue.ts | 6 ++-- packages/task-herder/src/TaskRecord.ts | 2 +- packages/task-herder/test/test-utilities.ts | 2 +- packages/task-herder/vite.config.js | 4 +-- 33 files changed, 72 insertions(+), 72 deletions(-) diff --git a/packages/scratch-gui/eslint.config.mjs b/packages/scratch-gui/eslint.config.mjs index 268ceb3a66c..390d1219c8d 100644 --- a/packages/scratch-gui/eslint.config.mjs +++ b/packages/scratch-gui/eslint.config.mjs @@ -79,7 +79,7 @@ export default eslintConfigScratch.defineConfig( } }, rules: { - 'max-len': [ + '@stylistic/max-len': [ 'warn', // settings copied from eslint-config-scratch.legacy.base { diff --git a/packages/scratch-gui/src/components/browser-modal/browser-modal.jsx b/packages/scratch-gui/src/components/browser-modal/browser-modal.jsx index 973626c1d6c..67f25b4025a 100644 --- a/packages/scratch-gui/src/components/browser-modal/browser-modal.jsx +++ b/packages/scratch-gui/src/components/browser-modal/browser-modal.jsx @@ -41,7 +41,7 @@ const BrowserModal = props => {

- { /* eslint-disable max-len */ } + { /* eslint-disable @stylistic/max-len */ } { props.error ? ); } @@ -528,7 +528,7 @@ class MenuBar extends React.Component { > diff --git a/packages/scratch-gui/src/components/prompt/prompt.jsx b/packages/scratch-gui/src/components/prompt/prompt.jsx index 05f2cbbc4c5..039c3c36faf 100644 --- a/packages/scratch-gui/src/components/prompt/prompt.jsx +++ b/packages/scratch-gui/src/components/prompt/prompt.jsx @@ -22,7 +22,7 @@ const messages = defineMessages({ }, cloudVarOptionMessage: { defaultMessage: 'Cloud variable (stored on server)', - description: 'Option message when creating a variable for making it a cloud variable, a variable that is stored on the server', /* eslint-disable-line max-len */ + description: 'Option message when creating a variable for making it a cloud variable, a variable that is stored on the server', /* eslint-disable-line @stylistic/max-len */ id: 'gui.gui.cloudVariableOption' }, availableToAllSpritesMessage: { diff --git a/packages/scratch-gui/src/components/webgl-modal/webgl-modal.jsx b/packages/scratch-gui/src/components/webgl-modal/webgl-modal.jsx index 4977b0fb094..417430d8f2d 100644 --- a/packages/scratch-gui/src/components/webgl-modal/webgl-modal.jsx +++ b/packages/scratch-gui/src/components/webgl-modal/webgl-modal.jsx @@ -32,7 +32,7 @@ const WebGlModal = props => {

- { /* eslint-disable max-len */ } + { /* eslint-disable @stylistic/max-len */ } ; + ): Promise<{id: ProjectId}>; saveProjectThumbnail?(projectId: ProjectId, thumbnail: Blob): void; @@ -37,7 +37,7 @@ export interface GUIStorage { export type TranslatorFunction = ( msgObj: MessageObject, - options?: { index: number } + options?: {index: number} ) => string; export interface MessageObject { diff --git a/packages/scratch-gui/src/lib/alerts/index.jsx b/packages/scratch-gui/src/lib/alerts/index.jsx index a5e4857f5d1..06c8a4d8cd9 100644 --- a/packages/scratch-gui/src/lib/alerts/index.jsx +++ b/packages/scratch-gui/src/lib/alerts/index.jsx @@ -175,7 +175,7 @@ const alerts = [ clearList: ['cloudInfo'], content: ( { let _TextEncoder: typeof TextEncoder; diff --git a/packages/scratch-gui/src/lib/default-project/project-data.ts b/packages/scratch-gui/src/lib/default-project/project-data.ts index 2effe2ed24e..fd288c73b5c 100644 --- a/packages/scratch-gui/src/lib/default-project/project-data.ts +++ b/packages/scratch-gui/src/lib/default-project/project-data.ts @@ -104,7 +104,7 @@ const projectData = (translateFunction?: TranslatorFunction): object => { meta: { semver: '3.0.0', vm: '0.1.0', - agent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36' // eslint-disable-line max-len + agent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36' // eslint-disable-line @stylistic/max-len } }); }; diff --git a/packages/scratch-gui/src/lib/editor-state.tsx b/packages/scratch-gui/src/lib/editor-state.tsx index c3e28c5846e..bef57c55576 100644 --- a/packages/scratch-gui/src/lib/editor-state.tsx +++ b/packages/scratch-gui/src/lib/editor-state.tsx @@ -12,9 +12,9 @@ interface WindowWithDevtools { const composeEnhancers = (window as WindowWithDevtools).__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose; // TypeScript doesn't know about require here, and we don't want to change behavior, so... -declare function require(path: '../reducers/gui'): typeof import('../reducers/gui'); -declare function require(path: 'scratch-paint'): typeof import('scratch-paint'); -declare function require(path: '../legacy-config'): typeof import('../legacy-config'); +declare function require (path: '../reducers/gui'): typeof import('../reducers/gui'); +declare function require (path: 'scratch-paint'): typeof import('scratch-paint'); +declare function require (path: '../legacy-config'): typeof import('../legacy-config'); export interface EditorStateParams { localesOnly?: boolean; diff --git a/packages/scratch-gui/src/lib/legacy-storage.ts b/packages/scratch-gui/src/lib/legacy-storage.ts index 33cb8ece0ce..0f6626d7c4a 100644 --- a/packages/scratch-gui/src/lib/legacy-storage.ts +++ b/packages/scratch-gui/src/lib/legacy-storage.ts @@ -67,8 +67,8 @@ export class LegacyStorage implements GUIStorage { saveProject ( projectId: number, vmState: string, - params: { originalId: string; isCopy: boolean; isRemix: boolean; title: string; } - ): Promise<{ id: string | number; }> { + params: {originalId: string; isCopy: boolean; isRemix: boolean; title: string;} + ): Promise<{id: string | number;}> { const host = this.projectHost; if (!host) { diff --git a/packages/scratch-gui/src/lib/libraries/extensions/index.jsx b/packages/scratch-gui/src/lib/libraries/extensions/index.jsx index 4b297678ed5..276611ddcca 100644 --- a/packages/scratch-gui/src/lib/libraries/extensions/index.jsx +++ b/packages/scratch-gui/src/lib/libraries/extensions/index.jsx @@ -345,7 +345,7 @@ export default [ connectionTipIconURL: boostConnectionTipIconURL, prescanMessage: ( { const fallbackConfig = { @@ -261,7 +261,7 @@ class Scratch3FaceSensingBlocks { */ _loop () { setTimeout(this._loop.bind(this), Math.max(this.runtime.currentStepTime, Scratch3FaceSensingBlocks.INTERVAL)); - + // Close the alert if the face detector is created and the video loading has either succeeded or failed. // The alert will remain open until the permissions are set if (!this._firstTime && this._videoLoadingCompleted) { diff --git a/packages/scratch-vm/src/extensions/scratch3_gdx_for/index.js b/packages/scratch-vm/src/extensions/scratch3_gdx_for/index.js index d6d53234532..e573c912bc2 100644 --- a/packages/scratch-vm/src/extensions/scratch3_gdx_for/index.js +++ b/packages/scratch-vm/src/extensions/scratch3_gdx_for/index.js @@ -11,14 +11,14 @@ const ScratchLinkDeviceAdapter = require('./scratch-link-device-adapter'); * Icon png to be displayed at the left edge of each extension block, encoded as a data URI. * @type {string} */ -// eslint-disable-next-line max-len +// eslint-disable-next-line @stylistic/max-len const blockIconURI = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAYAAACOEfKtAAAABGdBTUEAALGPC/xhBQAACCNJREFUeAHtnGtsFFUUgM+dfXbbbbcWaKHSFgrlkWgkJCb6A4kmJfiHIBYBpcFfRg1GEkmEVAvhFYw/TExMxGoICAECiZEIIUQCiiT4gh+KILRQCi2ENIV2t/ue6zl3u2Upu4XuzO4csCe587iPmXO/OWfunTszV4ABWfflQU+0p+9bTcLzEmS5gUPlvagAcVMXcMpnK1u+evW8QLYKaNkWpHKxnt6dQsqFjxo80p10Jt1vx7t30n62Ys+2IJUTUpDlqUNomgYutwsjhZFD5r6slBAOhUHX9YTe6D1GTmrIAhFeBZ2c4JFCpBiggmwlBR7pTGLUewxZYBIUWV7yqgb7g8lotuukt5ihqyELHCSEbusk931ExMxbjSkWSNxEyr3vysxZLFHWnDuT0CtFV6OKmmOBRrV4hMubZoGmMZA6lHTfgsLeHnBEIiCxUY86XRDw+sBfOgZ0m820U5lxIFYAncF+GNvVDo5QaLBu1ClyYTyF4tvd8lZltQgXFA6mW73BxoVt0ShUXG2VCp4QQdDEFqez4Bm7p7gaO0of422r3x4Ji/KrbdIexu4SE2FjgWO6OkCLx6gt6gxOiNV92tiY+ni1Ye1nu7dpQfk35ikru9EBN6unsEDIwgLJPQv8dwCfT3WPt+iFIfAUqM3vL7vpjmuz0KX1gkAfOMN33dxKkjwA9vsTDIS8uubdBZcyAWlqWtohQbRSuru/L1O2vMazAGiLxRKVFqDgDEdAaHCN0kU8Ply2vKWxABhzJZ5ipC6qHlRzfJxVz99S49GdYQEw7PYkuAmokZJ6fumlQUqiNpVSQ56i9JnyHMsCYMRdADGHk0ZyHM1b976XicH0rXtWYR57FPNSGQ7CAiCBCJQ8oXhI0FdmBiPfVnl9ZZmz5DmFDcA+HwIUOEYMcjL2+e57PbBp04HxONI4ifIEKC8TYQMwhs+7IU+hwBFOYQvB5qF8grbwJnRfQXnIhbkIG4AExF+ScE00w0X3AZLwisrDyH1JH1YAA8UlIG029FRZsu6TPfVJiIltWYIjMTLgLUlGs1izeRYmGtS383t9wnu7G2J6fH/Tln2LNUdExGLxvZSOQ1qCS/+P9CFhBZAUuj12PHgCvRJHZ7w4EnhYjya6hXGHQ2Jaxj4ilbVC2AFEUNBVXSdKb3WC29+rmISKiqFn7ARBadyEHUACFHM64VZlDTdWafVh1Yik1ZB5JEsLJGaVtosw37ld4TscWQHX4+oRWO1zWrAEWCR6oMnTCEXijmI1234MVvsPgV+WcmKndGHpwlNtZwbhkZYEkuI4CkuAXfpk0HGAPym0TXEchaUL39Br4JvQeljk+lwxOxBeCRQ3UrFHI+AMBsEV6gcnhlwIS4BU0RORV1V42EqnwnLgSyo3AsM3eA9bPOt8bAEOV6NUWGRZ9FYvHSx6R0pfYgkMmk2DCH1+Z7KwB5gKazjLGgpLgUOAuRZWALnDSncxLAOYCmskbqjhe02h5d6y0sFKF5cXgI8LrLwB9PTeGew6POwNnptlpYOVLi4nFjjuWts957rnBk8tomoZ+bjhPcqOcCcnAG34EaTqOjxmsNKxzQnAkX5wronsOry6zIn66ThljLNcg+W1a2Gi55+MCg6XcKl3NuxrbxouS87TLAcY1V0QV5+8jLyuEekeeSGTS1gOcM/lZpOrlN/DsRzOyi8CY2fLuwUum/wR1BT+ZUzrDKUv9D4LB9rXZEjNTfRjZYFS5r86ebfA3W0bcmMKFh01/5fMoorm6rSjAA2SNc2F8dvmQVWCgdy8fxg8gcEN0pWez80QUyyQFAqn/N9mhmK5PAYN7adecCPnMsUCCZ7U8ari4IGb87wJeKFDA/MlmHXBDVkgTR1CV4/gaThKzBoeKYpuSzqSrqSzEiFuJDayWxqyQJp3RUhYSKfWUSEz5iDIrhrZl8I5b37JvrTBT3wdpd43cOqT/WiJhq6ikQpkW5a8BxuS/X219uXZHoPKmdMUGdEgpWzTll3Kr95Z8VJK7N3NL7b/qHY2rnmdjd6G7oF3q/b/3RoFaPDajwIcBWiQgMHioxZoEKChfqDBc2csnmxtM2ZglMDKArFvduhBbLDv9sOD8oymA0xBCHVtl6+c7ey6Ibdt+3ox7WOoxMCmD4i68PrZkBQaEDUe1tnVqSyyfl79+vr6evz1C2jKogkYWEEc0JnViiZRqKuoqJiZtEJcn0GIsykewzhW2jJVZjzBamxsfK79ase/5MoXL106TnEDwfq36qgIF6HGjKyqFsNkDGMwUNxEDEmIHQTxyNGjH1AchvumBcC4vAuXVpiA+TDYMFDXiiZFoN+SrmMI7tixo/v3337diNtQUzNpPq1RChIra5ccAFKDUEwYLra2fnXu3PmtA0gojqbaVUNl23ft+pPiPW73U7RGYdGH5QCQYCg93C73075S34I5c+ZQa0s/B1Njou51tVVVatJAXcrED3Q4EI5plgsHgAQiSiRCoRD9ECeam9fPo32UJzFQYwJLlix9mdZ9fb1naY2iyiQ2rVtyAEi199Pi5M8/tdB62vRpzceOH3+toaHBh61w2clTp96sqq5ehUnxw0eO7KA8KKpMYtO6JZcOKTUeNRhsp0+ffmtilYI1VLf4+Qvn1784d+5ezEfW144hMR05blglpDgHSbqxt6Wl5Y8ZM6afKq8oL7LZHd54PH7H7w+cOPj9dx8uXbLk+ICynbhm4cJDr7LVMKmhoP5dphaWoFGrHMTAQrgBJCjkFdQHpPntqCUmiWCge14PBsvdFnUYlP8AMAKfKIKmYukAAAAASUVORK5CYII='; /** * Icon png to be displayed in the blocks category menu, encoded as a data URI. * @type {string} */ -// eslint-disable-next-line max-len +// eslint-disable-next-line @stylistic/max-len const menuIconURI = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAABGdBTUEAALGPC/xhBQAAA9dJREFUWAnNmE2IFEcUgF/9dE/v7LoaM9kkK4JBRA0EFBIPRm85hBAvEXHXwyo5eFE87GFcReMkObgJiQnkkJzEg9n8HIJixKNe1IMKihgiCbviwV11V3d0d3pmuqsqr5ppcEnb3TNVggVFVVe9eu+r97qqq4tASqp8/fsboQgmU0TMugi571K29bPy9ovPU8Sf16HbpQj3EkYFBcJcr5Am2nZfs94AIWVfqMQeHNwhICUBZ4ypUIA/X2sbIm2AW8AJK0lkEP6TJpfqwXgg4QxmF/fB7Gtvxk1G5ZKHU1CqTgPJoSUXYJYeohSUJu+qrqdVUGh2/pVX4VFffx77WaqBZkrkEFj271+qWH0sXcU3FBzyQe/Mg7B//LbKMTRTxNiDbsMHHjTJlyM7HEJIBHXs2KXFj+oTNSdoQOCYLS5jD9IwBMm5H8NplwwPb/QV4yEIcycaAza9IuA76B38fuz1OF5RXUkmHCdu6rg0BpSMgV/sAe7DdzGFrvvdi0D3mSZjQA0wt7REQsY+iWF0XbfFzyal8SLRxuteD+Du4h4Z/flbqaBHibAQtZmQtcZaAZSMwtTylaR/4vaw1ju5YhWG10pwwAqghmp2FeHO2+t11WqyM80W0m7vAOhsM1kD7CGz8L57Jsq6bitZC/GcWgLf1H6KuHT92cTDAFy/BgXMXm0OCpgV50Bo9kK3BqiBboabQMMU/WoL5im4jToeq/AIgXsiRx5KKCjcwPEsiAv/BQMu9EwyDHXd/3kqCOSzDk6t5/YglQKKeJwq+PNRmJI8kwSTaj1HZy5AhSHqnXkIvU9mMUwEw4Q5wTM57LUtkg8QPw/cdcBJ+PhvKJ0Gj80nGq6JXrg6/XFiX97GXIBpyqTieKpKViOl+WEhWXMaUavvvdIZ8Giy5+Lh3bwKm/t+Be3JazMfxc1tldY26rastiHcsQevTG9pw0znovkAcRWHzSDKnZtaOJLSfMFLB5RqtRBS4LbCurqLCy0YPkU3C0IIPEimMqR2ei7ZX2+KQdRi/WahNT/GmfOD4Vyzhx/66pcjp85dUvcmp6J8+txldXh07PPskdkS+V6EbD0vTOKlB0x9B/O6BS8ULly9PgE6x4kDPR/XX5pyYKj8xcCucsUmkNUQE0JvKKm2VioVK5HRE7UKOHbi6B94RzP+93jtpC0vWgXUF0hr3ipuw8uadwd3jXxoA9IK4Pah8t6BneV9GgjD28Svw1mlxFobgFbeFTz13cKbth93fDryp2CEq0a4hTA+aAPQ/ESJFDdvXLzzzrqNjlTqOP6uDeFf0uhvJ0ZP2QD8D6ZzU6u8YIbBAAAAAElFTkSuQmCC'; /** diff --git a/packages/scratch-vm/src/extensions/scratch3_makeymakey/index.js b/packages/scratch-vm/src/extensions/scratch3_makeymakey/index.js index ff004c2566d..4694c0e73a9 100644 --- a/packages/scratch-vm/src/extensions/scratch3_makeymakey/index.js +++ b/packages/scratch-vm/src/extensions/scratch3_makeymakey/index.js @@ -7,7 +7,7 @@ const Cast = require('../../util/cast'); * Icon svg to be displayed at the left edge of each extension block, encoded as a data URI. * @type {string} */ -// eslint-disable-next-line max-len +// eslint-disable-next-line @stylistic/max-len const blockIconURI = 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MCA0MCI+PHN0eWxlPi5zdDJ7ZmlsbDpyZWR9LnN0M3tmaWxsOiNlMGUwZTB9LnN0NHtmaWxsOm5vbmU7c3Ryb2tlOiM2NjY7c3Ryb2tlLXdpZHRoOi41O3N0cm9rZS1taXRlcmxpbWl0OjEwfTwvc3R5bGU+PHBhdGggZD0iTTM1IDI4SDVhMSAxIDAgMCAxLTEtMVYxMmMwLS42LjQtMSAxLTFoMzBjLjUgMCAxIC40IDEgMXYxNWMwIC41LS41IDEtMSAxeiIgZmlsbD0iI2ZmZiIgaWQ9IkxheWVyXzYiLz48ZyBpZD0iTGF5ZXJfNCI+PHBhdGggY2xhc3M9InN0MiIgZD0iTTQgMjVoMzJ2Mi43SDR6TTEzIDI0aC0yLjJhMSAxIDAgMCAxLTEtMXYtOS43YzAtLjYuNC0xIDEtMUgxM2MuNiAwIDEgLjQgMSAxVjIzYzAgLjYtLjUgMS0xIDF6Ii8+PHBhdGggY2xhc3M9InN0MiIgZD0iTTYuMSAxOS4zdi0yLjJjMC0uNS40LTEgMS0xaDkuN2MuNSAwIDEgLjUgMSAxdjIuMmMwIC41LS41IDEtMSAxSDcuMWExIDEgMCAwIDEtMS0xeiIvPjxjaXJjbGUgY2xhc3M9InN0MiIgY3g9IjIyLjgiIGN5PSIxOC4yIiByPSIzLjQiLz48Y2lyY2xlIGNsYXNzPSJzdDIiIGN4PSIzMC42IiBjeT0iMTguMiIgcj0iMy40Ii8+PHBhdGggY2xhc3M9InN0MiIgZD0iTTQuMiAyN2gzMS45di43SDQuMnoiLz48L2c+PGcgaWQ9IkxheWVyXzUiPjxjaXJjbGUgY2xhc3M9InN0MyIgY3g9IjIyLjgiIGN5PSIxOC4yIiByPSIyLjMiLz48Y2lyY2xlIGNsYXNzPSJzdDMiIGN4PSIzMC42IiBjeT0iMTguMiIgcj0iMi4zIi8+PHBhdGggY2xhc3M9InN0MyIgZD0iTTEyLjUgMjIuOWgtMS4yYy0uMyAwLS41LS4yLS41LS41VjE0YzAtLjMuMi0uNS41LS41aDEuMmMuMyAwIC41LjIuNS41djguNGMwIC4zLS4yLjUtLjUuNXoiLz48cGF0aCBjbGFzcz0ic3QzIiBkPSJNNy4yIDE4Ljd2LTEuMmMwLS4zLjItLjUuNS0uNWg4LjRjLjMgMCAuNS4yLjUuNXYxLjJjMCAuMy0uMi41LS41LjVINy43Yy0uMyAwLS41LS4yLS41LS41ek00IDI2aDMydjJINHoiLz48L2c+PGcgaWQ9IkxheWVyXzMiPjxwYXRoIGNsYXNzPSJzdDQiIGQ9Ik0zNS4yIDI3LjlINC44YTEgMSAwIDAgMS0xLTFWMTIuMWMwLS42LjUtMSAxLTFoMzAuNWMuNSAwIDEgLjQgMSAxVjI3YTEgMSAwIDAgMS0xLjEuOXoiLz48cGF0aCBjbGFzcz0ic3Q0IiBkPSJNMzUuMiAyNy45SDQuOGExIDEgMCAwIDEtMS0xVjEyLjFjMC0uNi41LTEgMS0xaDMwLjVjLjUgMCAxIC40IDEgMVYyN2ExIDEgMCAwIDEtMS4xLjl6Ii8+PC9nPjwvc3ZnPg=='; /** diff --git a/packages/scratch-vm/src/extensions/scratch3_microbit/index.js b/packages/scratch-vm/src/extensions/scratch3_microbit/index.js index f292947ad5c..d0fbd422724 100644 --- a/packages/scratch-vm/src/extensions/scratch3_microbit/index.js +++ b/packages/scratch-vm/src/extensions/scratch3_microbit/index.js @@ -10,7 +10,7 @@ const Base64Util = require('../../util/base64-util'); * Icon png to be displayed at the left edge of each extension block, encoded as a data URI. * @type {string} */ -// eslint-disable-next-line max-len +// eslint-disable-next-line @stylistic/max-len const blockIconURI = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAYAAACOEfKtAAAACXBIWXMAABYlAAAWJQFJUiTwAAAKcElEQVR42u2cfXAU9RnHv7u3L3d7l9yR5PIGXO7MkQKaYiCUWqJhFGvRMk4JZXSc8aXVaSmiYlthVHQEW99FxiIdrVY6teiMdoa+ICqhIqgQAsjwMgYDOQKXl7uY17u9293b3f5x5JKYe8+FJGSfvzbP/n77e/azz+95nt9v90KoqgpN0hdSQ6AB1ABqADWAmmgANYAaQA2gJhpADeBEE2q8GPLaWzu/CslyiY4k9dOn5uijtXGd7+jWkaReVpT3Hrhv6d0awEFC07rgD+ZeYYnXprhwigUAvjj0zbjxQCLebozT7iDzK1ZUWCru2K7L//6MVC8ue45Blz8n6rlQ815QtuohOlXiEdy/AUqPa6y59Mkh6Q1345GNja6m7pHEQKNl3t0704EXat4L6fSOmOeEI1vHKzwAyNJR9MPFpRUPOu0ONm2A0xatWaTLm5WfDrzvAppA8AbiG03fC8CQNkDKZK2YrPAuRrhpifJERsuYywveJc7CqcIDMAyeLm82dEXzw39I/qjXkpr3QuW9lxfAdOABGAKPslWDnbsy7Jl8BxTeM3SqmO0gaA5U6c3jymup0YSn9JyLee67wpTfBQAQjmyF3HFqiJcRtDECjy5dAmbmcgQPvjjxl3Lx4IVjnD/5cE1zkWtyP34VBGcdKLJnLgc9cznk1kMXFdzEn8KJ4KUqqsSHvcxWDf7j1UM8UPr6/YgHhhX8xAaYaXgAIB7fBnbuSrBzV8aNgarEQ/z6/YkLcDTg9V9XlXjQtuqoU1TpcUHlvZDOfDiuyh5qPMCLrJ1bDw3EuUtx81N/BH3pjQBJQ2HMF5V6iKfeRchVm9kkMtrwxmSdobeA9daBde8GwVlBcFYofS1Jw0vaAy9HeJHQwBUPzIBvGxDc92Rmp/BowJs10wkAONfsBs8HAAAltqngOAO8HZ3o6OiMqcvLy4E1Lwc8H8C5ZndMXdLJa/qNacNLCDBw/O8nFUNWxp/64+tWAwBefe1tHKg7CgC4/9d3ori4EHv3HcDrb26PqVt2602ovvaHaGlpw+8ffSamLqXYmya8jG8mpFy6iGLkWLh4HAwG4+r6j4VBfaPpLgU8IMGO9MLqW2pYQ9aQokuR5dgXIwCC1CUcNMj3hpdvLAdSF54EYpCHooRA0Swomo2pC0kCQpIAkqTA6LmYupgxL0X7m78+aG10NXVkpIwxsAwWXncDCESHLkohfPbpbiT6ZFPPZQ9fC0e58Wi6wTDj6UbT/rQAyiERS2pW4Kc3LQDLRO8miCEAKj7d83FcTxyLJJJJ+9MCqKoq9HomMrgkSThxsgEcZ8AMpwMkSYJlKDA0DVUFiHGWRDJp/4jXwqIo4uFHnkZXdw8AYGbZFXhs3WqQJDkhkkim7E8KoMlkxKbnn8DBunrwUli3e8/+yOAA0HjmHDq7upGXm5PUoDUr7hmWRB5Zt3FYwoime+vtd/H6G9uGJIxouniSyP6H7v8FystnY80jGzIA0MihsMAKu20aTp3JzFb6WCWRuDUvHwByw8cOhw2FBVaYjNzIAba1e3Hfb9aiq7MTNStuBwAsvr4KO3d9GnmKztIS5EyxTJiVSDT7p04tipx/9MnnYc7ORlu7NzMxsK3di5AkDHgGw2DTC+uHBeGJshJJZL/fxyMQEDKbRAiCQDAoQhBDYBkKNE2j4uqrhpUBoiSBIMZfEhkN+1NeiWSqEB2rlUg69md0JRIQRHy86z8jXsqNVRLJlP0jqgNJXXgAgjbCcONmCHUvQ+44NWG2s/rtH5Mt/ciToo0wLH4JBGO6LLazRiJk2vBYy4gHHw/bWSN+LZBKEhkMjzn/CaSiKgQOvJDyFB7L7axUJWNJZDA8IhQA1boPin7KZbMSGfUYyFx9b3hXg/cCsoBA2Z0AoYOaxlcC4+mdyCUDKBzanLFBJ3USyaRMuiSSKZmUSSSTMimTCABUlblRU9kAZ0E39p+eii21c+EL0jHbOwu6sfaWgyjND//U4oP6MmzZnfi79XT7mfQSNi7bh0JzOLG19XBY/89r49pYVebGqhuOosDsh1+gsWV3BXYdd2Q+BlaVuXFv9bHgkSbzk+vfcVRyjHhi47J9cftsXLYf7T36Ix8cLHlo6ydlv6qpPI2qssRZcuOy/Wjp4k5s+2zG+offKqtcUt6kJtNv7S0H0RtkvEufXTB/6bML5je2Wy7UVDbEbF9o9mPDsv2oP5v75vbPS26rP5u3fdXiozDppcwDrKlswOlWy9E//DX09Mt/azh8zzNM1RybF86C7pheVGD240CDeX3NWtfml94Rt+0+Mf3Lm8qbEnpfgdmPs+3G9+564vTT//pM/GrHYduWRP0AYOEMN/5S61xT92Vtfd2XtfWb/vu91fHALyxzw9tnkB/cTD5w+2Ou9375HHtfa7exM5mxRpKFaafdQQKgAcDERs98/foLHrXdaXfoABi8vczhWO2/28/TRR5z2h00gKymNl1ton79oigq6bQ7dE67Q+ew9mb1h4FYYwVESgLAXLSRa+3mWpIdK+UYuPiq89f8+XfT/+ftZQ4vLm9ZmUyfdcsv1M2fWfRaUCK8i8vdK1u6ktuAWPWTsztm24o/cnnYHUsrWzd1+fVJ9XtqxbG3XzFdNcPTawjcueibpxK1t+X26f/9R8a953jub4typOvm2b1XnvUmv8JKWMZcaZffX3XDERRP8cGaFRjWxtPLoZvXY4oxgPBNEsgxBhCUKEzL6Ru+JydS8Ak0giKFgESDJFQoKmCgQzAwIfQEWETzmoBIwd2VNaStu8uEHGO4Buz06zHHFv0dRkefAZ1+PQx0KNK2eIoPLCUj2zDc275qzgcBFWv+cf3IyxgTK2KOzQufEM5kfpGF12eGPSf8DXN+No/87HDWiwYYALw+M6ym8AscAxO++X7xCTRM7EDQzht0Da8v/NWo1dQDAxNCocUXs+303IGHdaptOmYXnh/SLlZbV+fwnwJm6UXEm/ojqgM/PFmJQ81OPHfrtqT7bN23BE8seTflYLvz5DwYGQHLKz5Puo/XZ8aLtT+D1dSDuxbsGQIymmz48DbwIguOESJOcce8XaO3oVpZ8k3Em5KVVAAMFnuOB9as1MbimCBunn04vBmR40ls29Wfgxf1KMn1gBdY+MXUCvK4ANvPndpLzrLzALjBN2VPwrDBksgLYkn1jBMp90nVY2++8vAw3RlPeLNYVZSPAEgjKWP6ZCn4lF+gMdnE08spQb73RQB9aXtgo6tJcNodf8rWz3L//Br340UW3sExEkXrFFKSSUVHqkRfkJZ8QSZk5gS6hw9H+GyDQAclSs41BVmSUIn+toAKIUTJskKoQUknCxKlkISKb/sM0NMyyVAhXW+AlYosfgOgQlUJVadTSUWBKoQoudvPioPbenq5oIUTaRUqenhWKi3oyVIUqKpKREoLggDhF6hQb4CV9LRM9rctMPN6glChp2SdTqeSskwoAECSKnG61fzFR/XsGu+FhmONriYl7TImsjoYKJyZSeB8CoBQo6spqU8TCO1fgE7gDVUNoCYaQA2gBlADqAHURAOoAdQAagA10QCOgfwfNp/hXbfBMCAAAAAASUVORK5CYII='; /** diff --git a/packages/scratch-vm/src/extensions/scratch3_music/index.js b/packages/scratch-vm/src/extensions/scratch3_music/index.js index 352128e0c1b..5366331f20f 100644 --- a/packages/scratch-vm/src/extensions/scratch3_music/index.js +++ b/packages/scratch-vm/src/extensions/scratch3_music/index.js @@ -21,14 +21,14 @@ try { * Icon svg to be displayed at the left edge of each extension block, encoded as a data URI. * @type {string} */ -// eslint-disable-next-line max-len +// eslint-disable-next-line @stylistic/max-len const blockIconURI = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgMCA0MCA0MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+PHRpdGxlPm11c2ljLWJsb2NrLWljb248L3RpdGxlPjxkZWZzPjxwYXRoIGQ9Ik0zMi4xOCAyNS44NzRDMzIuNjM2IDI4LjE1NyAzMC41MTIgMzAgMjcuNDMzIDMwYy0zLjA3IDAtNS45MjMtMS44NDMtNi4zNzItNC4xMjYtLjQ1OC0yLjI4NSAxLjY2NS00LjEzNiA0Ljc0My00LjEzNi42NDcgMCAxLjI4My4wODQgMS44OS4yMzQuMzM4LjA4Ni42MzcuMTguOTM4LjMwMi44Ny0uMDItLjEwNC0yLjI5NC0xLjgzNS0xMi4yMy0yLjEzNC0xMi4zMDIgMy4wNi0xLjg3IDguNzY4LTIuNzUyIDUuNzA4LS44ODUuMDc2IDQuODItMy42NSAzLjg0NC0zLjcyNC0uOTg3LTQuNjUtNy4xNTMuMjYzIDE0LjczOHptLTE2Ljk5OCA1Ljk5QzE1LjYzIDM0LjE0OCAxMy41MDcgMzYgMTAuNDQgMzZjLTMuMDcgMC01LjkyMi0xLjg1Mi02LjM4LTQuMTM2LS40NDgtMi4yODQgMS42NzQtNC4xMzUgNC43NS00LjEzNSAxLjAwMyAwIDEuOTc1LjE5NiAyLjg1NS41NDMuODIyLS4wNTUtLjE1LTIuMzc3LTEuODYyLTEyLjIyOC0yLjEzMy0xMi4zMDMgMy4wNi0xLjg3IDguNzY0LTIuNzUzIDUuNzA2LS44OTQuMDc2IDQuODItMy42NDggMy44MzQtMy43MjQtLjk4Ny00LjY1LTcuMTUyLjI2MiAxNC43Mzh6IiBpZD0iYSIvPjwvZGVmcz48ZyBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPjx1c2UgZmlsbD0iI0ZGRiIgeGxpbms6aHJlZj0iI2EiLz48cGF0aCBzdHJva2Utb3BhY2l0eT0iLjEiIHN0cm9rZT0iIzAwMCIgZD0iTTI4LjQ1NiAyMS42NzVjLS4wMS0uMzEyLS4wODctLjgyNS0uMjU2LTEuNzAyLS4wOTYtLjQ5NS0uNjEyLTMuMDIyLS43NTMtMy43My0uMzk1LTEuOTgtLjc2LTMuOTItMS4xNDItNi4xMTMtLjczMi00LjIyMy0uNjkzLTYuMDUuMzQ0LTYuNTI3LjUtLjIzIDEuMDYtLjA4IDEuODQuMzUuNDE0LjIyNyAyLjE4MiAxLjM2NSAyLjA3IDEuMjk2IDEuOTk0IDEuMjQyIDMuNDY0IDEuNzc0IDQuOTMgMS41NDggMS41MjYtLjIzNyAyLjUwNC0uMDYgMi44NzYuNjE4LjM0OC42MzUuMDE1IDEuNDE2LS43MyAyLjE4LTEuNDcyIDEuNTE2LTMuOTc1IDIuNTE0LTUuODQ4IDIuMDIzLS44MjItLjIyLTEuMjM4LS40NjUtMi4zOC0xLjI2N2wtLjA5NS0uMDY2Yy4wNDcuNTkzLjI2NCAxLjc0LjcxNyAzLjgwMy4yOTQgMS4zMzYgMi4wOCA5LjE4NyAyLjYzNyAxMS42NzRsLjAwMi4wMTJjLjUyOCAyLjYzNy0xLjg3MyA0LjcyNC01LjIzNiA0LjcyNC0zLjI5IDAtNi4zNjMtMS45ODgtNi44NjItNC41MjgtLjUzLTIuNjQgMS44NzMtNC43MzQgNS4yMzMtNC43MzQuNjcyIDAgMS4zNDcuMDg1IDIuMDE0LjI1LjIyNy4wNTcuNDM2LjExOC42MzYuMTg3em0tMTYuOTk2IDUuOTljLS4wMS0uMzE4LS4wOS0uODM4LS4yNjYtMS43MzctLjA5LS40Ni0uNTk1LTIuOTM3LS43NTMtMy43MjctLjM5LTEuOTYtLjc1LTMuODktMS4xMy02LjA3LS43MzItNC4yMjMtLjY5Mi02LjA1LjM0NC02LjUyNi41MDItLjIzIDEuMDYtLjA4MiAxLjg0LjM1LjQxNS4yMjcgMi4xODIgMS4zNjQgMi4wNyAxLjI5NSAxLjk5MyAxLjI0MiAzLjQ2MiAxLjc3NCA0LjkyNiAxLjU0OCAxLjUyNS0uMjQgMi41MDQtLjA2NCAyLjg3Ni42MTQuMzQ4LjYzNS4wMTUgMS40MTUtLjcyOCAyLjE4LTEuNDc0IDEuNTE3LTMuOTc3IDIuNTEzLTUuODQ3IDIuMDE3LS44Mi0uMjItMS4yMzYtLjQ2NC0yLjM3OC0xLjI2N2wtLjA5NS0uMDY1Yy4wNDcuNTkzLjI2NCAxLjc0LjcxNyAzLjgwMi4yOTQgMS4zMzcgMi4wNzggOS4xOSAyLjYzNiAxMS42NzVsLjAwMy4wMTNjLjUxNyAyLjYzOC0xLjg4NCA0LjczMi01LjIzNCA0LjczMi0zLjI4NyAwLTYuMzYtMS45OTMtNi44Ny00LjU0LS41Mi0yLjY0IDEuODg0LTQuNzMgNS4yNC00LjczLjkwNSAwIDEuODAzLjE1IDIuNjUuNDM2eiIvPjwvZz48L3N2Zz4='; /** * Icon svg to be displayed in the category menu, encoded as a data URI. * @type {string} */ -// eslint-disable-next-line max-len +// eslint-disable-next-line @stylistic/max-len const menuIconURI = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAiIGhlaWdodD0iMjAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTE2LjA5IDEyLjkzN2MuMjI4IDEuMTQxLS44MzMgMi4wNjMtMi4zNzMgMi4wNjMtMS41MzUgMC0yLjk2Mi0uOTIyLTMuMTg2LTIuMDYzLS4yMy0xLjE0Mi44MzMtMi4wNjggMi4zNzItMi4wNjguMzIzIDAgLjY0MS4wNDIuOTQ1LjExN2EzLjUgMy41IDAgMCAxIC40NjguMTUxYy40MzUtLjAxLS4wNTItMS4xNDctLjkxNy02LjExNC0xLjA2Ny02LjE1MiAxLjUzLS45MzUgNC4zODQtMS4zNzcgMi44NTQtLjQ0Mi4wMzggMi40MS0xLjgyNSAxLjkyMi0xLjg2Mi0uNDkzLTIuMzI1LTMuNTc3LjEzMiA3LjM3ek03LjQ2IDguNTYzYy0xLjg2Mi0uNDkzLTIuMzI1LTMuNTc2LjEzIDcuMzdDNy44MTYgMTcuMDczIDYuNzU0IDE4IDUuMjIgMThjLTEuNTM1IDAtMi45NjEtLjkyNi0zLjE5LTIuMDY4LS4yMjQtMS4xNDIuODM3LTIuMDY3IDIuMzc1LTIuMDY3LjUwMSAwIC45ODcuMDk4IDEuNDI3LjI3Mi40MTItLjAyOC0uMDc0LTEuMTg5LS45My02LjExNEMzLjgzNCAxLjg3IDYuNDMgNy4wODcgOS4yODIgNi42NDZjMi44NTQtLjQ0Ny4wMzggMi40MS0xLjgyMyAxLjkxN3oiIGZpbGw9IiM1NzVFNzUiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvc3ZnPg=='; /** diff --git a/packages/scratch-vm/src/extensions/scratch3_pen/index.js b/packages/scratch-vm/src/extensions/scratch3_pen/index.js index 9706308edb7..4d4c88a5c62 100644 --- a/packages/scratch-vm/src/extensions/scratch3_pen/index.js +++ b/packages/scratch-vm/src/extensions/scratch3_pen/index.js @@ -14,7 +14,7 @@ const StageLayering = require('../../engine/stage-layering'); * Icon svg to be displayed at the left edge of each extension block, encoded as a data URI. * @type {string} */ -// eslint-disable-next-line max-len +// eslint-disable-next-line @stylistic/max-len const blockIconURI = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgMCA0MCA0MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48dGl0bGU+cGVuLWljb248L3RpdGxlPjxnIHN0cm9rZT0iIzU3NUU3NSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxwYXRoIGQ9Ik04Ljc1MyAzNC42MDJsLTQuMjUgMS43OCAxLjc4My00LjIzN2MxLjIxOC0yLjg5MiAyLjkwNy01LjQyMyA1LjAzLTcuNTM4TDMxLjA2NiA0LjkzYy44NDYtLjg0MiAyLjY1LS40MSA0LjAzMi45NjcgMS4zOCAxLjM3NSAxLjgxNiAzLjE3My45NyA0LjAxNUwxNi4zMTggMjkuNTljLTIuMTIzIDIuMTE2LTQuNjY0IDMuOC03LjU2NSA1LjAxMiIgZmlsbD0iI0ZGRiIvPjxwYXRoIGQ9Ik0yOS40MSA2LjExcy00LjQ1LTIuMzc4LTguMjAyIDUuNzcyYy0xLjczNCAzLjc2Ni00LjM1IDEuNTQ2LTQuMzUgMS41NDYiLz48cGF0aCBkPSJNMzYuNDIgOC44MjVjMCAuNDYzLS4xNC44NzMtLjQzMiAxLjE2NGwtOS4zMzUgOS4zYy4yODItLjI5LjQxLS42NjguNDEtMS4xMiAwLS44NzQtLjUwNy0xLjk2My0xLjQwNi0yLjg2OC0xLjM2Mi0xLjM1OC0zLjE0Ny0xLjgtNC4wMDItLjk5TDMwLjk5IDUuMDFjLjg0NC0uODQgMi42NS0uNDEgNC4wMzUuOTYuODk4LjkwNCAxLjM5NiAxLjk4MiAxLjM5NiAyLjg1NU0xMC41MTUgMzMuNzc0Yy0uNTczLjMwMi0xLjE1Ny41Ny0xLjc2NC44M0w0LjUgMzYuMzgybDEuNzg2LTQuMjM1Yy4yNTgtLjYwNC41My0xLjE4Ni44MzMtMS43NTcuNjkuMTgzIDEuNDQ4LjYyNSAyLjEwOCAxLjI4Mi42Ni42NTggMS4xMDIgMS40MTIgMS4yODcgMi4xMDIiIGZpbGw9IiM0Qzk3RkYiLz48cGF0aCBkPSJNMzYuNDk4IDguNzQ4YzAgLjQ2NC0uMTQuODc0LS40MzMgMS4xNjVsLTE5Ljc0MiAxOS42OGMtMi4xMyAyLjExLTQuNjczIDMuNzkzLTcuNTcyIDUuMDFMNC41IDM2LjM4bC45NzQtMi4zMTYgMS45MjUtLjgwOGMyLjg5OC0xLjIxOCA1LjQ0LTIuOSA3LjU3LTUuMDFsMTkuNzQzLTE5LjY4Yy4yOTItLjI5Mi40MzItLjcwMi40MzItMS4xNjUgMC0uNjQ2LS4yNy0xLjQtLjc4LTIuMTIyLjI1LjE3Mi41LjM3Ny43MzcuNjE0Ljg5OC45MDUgMS4zOTYgMS45ODMgMS4zOTYgMi44NTYiIGZpbGw9IiM1NzVFNzUiIG9wYWNpdHk9Ii4xNSIvPjxwYXRoIGQ9Ik0xOC40NSAxMi44M2MwIC41LS40MDQuOTA1LS45MDQuOTA1cy0uOTA1LS40MDUtLjkwNS0uOTA0YzAtLjUuNDA3LS45MDMuOTA2LS45MDMuNSAwIC45MDQuNDA0LjkwNC45MDR6IiBmaWxsPSIjNTc1RTc1Ii8+PC9nPjwvc3ZnPg=='; /** diff --git a/packages/scratch-vm/src/extensions/scratch3_speech2text/index.js b/packages/scratch-vm/src/extensions/scratch3_speech2text/index.js index f20654e78d7..f136e9ea79d 100644 --- a/packages/scratch-vm/src/extensions/scratch3_speech2text/index.js +++ b/packages/scratch-vm/src/extensions/scratch3_speech2text/index.js @@ -10,7 +10,7 @@ const DiffMatchPatch = require('diff-match-patch'); * Url of icon to be displayed at the left edge of each extension block. * @type {string} */ -// eslint-disable-next-line max-len +// eslint-disable-next-line @stylistic/max-len const iconURI = 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSIjRkZGRkZGIj48cGF0aCBkPSJNMTIgMTRjMS42NiAwIDIuOTktMS4zNCAyLjk5LTNMMTUgNWMwLTEuNjYtMS4zNC0zLTMtM1M5IDMuMzQgOSA1djZjMCAxLjY2IDEuMzQgMyAzIDN6bTUuMy0zYzAgMy0yLjU0IDUuMS01LjMgNS4xUzYuNyAxNCA2LjcgMTFINWMwIDMuNDEgMi43MiA2LjIzIDYgNi43MlYyMWgydi0zLjI4YzMuMjgtLjQ4IDYtMy4zIDYtNi43MmgtMS43eiIvPjxwYXRoIGQ9Ik0wIDBoMjR2MjRIMHoiIGZpbGw9Im5vbmUiLz48L3N2Zz4K'; @@ -18,7 +18,7 @@ const iconURI = 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vc * Url of icon to be displayed in the toolbox menu for the extension category. * @type {string} */ -// eslint-disable-next-line max-len +// eslint-disable-next-line @stylistic/max-len const menuIconURI = 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNHB4IiBoZWlnaHQ9IjI0cHgiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0iIzc1NzU3NSI+CiAgICA8cGF0aCBkPSJNMTIgMTRjMS42NiAwIDIuOTktMS4zNCAyLjk5LTNMMTUgNWMwLTEuNjYtMS4zNC0zLTMtM1M5IDMuMzQgOSA1djZjMCAxLjY2IDEuMzQgMyAzIDN6bTUuMy0zYzAgMy0yLjU0IDUuMS01LjMgNS4xUzYuNyAxNCA2LjcgMTFINWMwIDMuNDEgMi43MiA2LjIzIDYgNi43MlYyMWgydi0zLjI4YzMuMjgtLjQ4IDYtMy4zIDYtNi43MmgtMS43eiIvPgogICAgPHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPgo8L3N2Zz4K'; @@ -623,7 +623,7 @@ class Scratch3Speech2TextBlocks { text: formatMessage({ id: 'speech.listenAndWait', default: 'listen and wait', - // eslint-disable-next-line max-len + // eslint-disable-next-line @stylistic/max-len description: 'Start listening to the microphone and wait for a result from the speech recognition system.' }), blockType: BlockType.COMMAND @@ -633,7 +633,7 @@ class Scratch3Speech2TextBlocks { text: formatMessage({ id: 'speech.whenIHear', default: 'when I hear [PHRASE]', - // eslint-disable-next-line max-len + // eslint-disable-next-line @stylistic/max-len description: 'Event that triggers when the text entered on the block is recognized by the speech recognition system.' }), blockType: BlockType.HAT, diff --git a/packages/scratch-vm/src/extensions/scratch3_text2speech/index.js b/packages/scratch-vm/src/extensions/scratch3_text2speech/index.js index 1cf97431225..f9f8afeeb03 100644 --- a/packages/scratch-vm/src/extensions/scratch3_text2speech/index.js +++ b/packages/scratch-vm/src/extensions/scratch3_text2speech/index.js @@ -13,14 +13,14 @@ const {fetchWithTimeout} = require('../../util/fetch-with-timeout'); * Icon svg to be displayed in the blocks category menu, encoded as a data URI. * @type {string} */ -// eslint-disable-next-line max-len +// eslint-disable-next-line @stylistic/max-len const menuIconURI = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjBweCIgaGVpZ2h0PSIyMHB4IiB2aWV3Qm94PSIwIDAgMjAgMjAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDUyLjIgKDY3MTQ1KSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KICAgIDx0aXRsZT5FeHRlbnNpb25zL1NvZnR3YXJlL1RleHQtdG8tU3BlZWNoLU1lbnU8L3RpdGxlPgogICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+CiAgICA8ZyBpZD0iRXh0ZW5zaW9ucy9Tb2Z0d2FyZS9UZXh0LXRvLVNwZWVjaC1NZW51IiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8ZyBpZD0idGV4dDJzcGVlY2giIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIuMDAwMDAwLCAyLjAwMDAwMCkiIGZpbGwtcnVsZT0ibm9uemVybyI+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik01Ljc1LDguODM0NjcxNzMgQzUuNzUsOC4zMjY5NjM0NCA1LjAwMzAwNzI3LDguMDQyMjEzNzEgNC41NTYyODAxMiw4LjQ0NDE0OTk5IEwzLjIwNjI4MDEyLDkuNTI1MzU3MDIgQzIuNjk2NzMzNzgsOS45MzM0NDk2OCAyLjAzNzQ4Njc1LDEwLjE2NTg3ODggMS4zNSwxMC4xNjU4Nzg4IEwxLjE1LDEwLjE2NTg3ODggQzAuNjMyNTk2MTY1LDEwLjE2NTg3ODggMC4yNSwxMC41MTA2MDAyIDAuMjUsMTAuOTUyMDM1NSBMMC4yNSwxMy4wNjkzOTkzIEMwLjI1LDEzLjUxMDgzNDYgMC42MzI1OTYxNjUsMTMuODU1NTU2IDEuMTUsMTMuODU1NTU2IEwxLjM1LDEzLjg1NTU1NiBDMi4wNzg3Nzg0MSwxMy44NTU1NTYgMi43MjY4NjE2MSwxNC4wNjY3NjM2IDMuMjU5ODYwNDksMTQuNDk5IEw0LjU1OTIwMTQ3LDE1LjU3OTY2MDggQzUuMDEzMDkyNzYsMTUuOTU0NTM5NiA1Ljc1LDE1LjY3MzYzNDQgNS43NSwxNS4xNDE3MTI4IEw1Ljc1LDguODM0NjcxNzMgWiIgaWQ9InNwZWFrZXIiIHN0cm9rZS1vcGFjaXR5PSIwLjE1IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMC41IiBmaWxsPSIjNEQ0RDREIj48L3BhdGg+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik0xMC43MDQ4MzEzLDggQzkuNzkwNjc0NjgsOS4xMzExNDg0NyA4LjMwNjYxODQsOS43MTQyODU3MSA3LjgzMzMzMzMzLDkuNzE0Mjg1NzEgQzcuODMzMzMzMzMsOS43MTQyODU3MSA3LjUsOS43MTQyODU3MSA3LjUsOS4zODA5NTIzOCBDNy41LDkuMDg1MjI2ODQgOC4wNjIyMDE2OCw4LjkwMTk0MTY0IDguMTg5MDYwNjcsNy41Njc1NDA1OCBDNi44ODk5Njk5MSw2LjkwNjc5MDA1IDYsNS41NTczMjY4MyA2LDQgQzYsMS43OTA4NjEgNy43OTA4NjEsNC4wNTgxMjI1MWUtMTYgMTAsMCBMMTIsMCBDMTQuMjA5MTM5LC00LjA1ODEyMjUxZS0xNiAxNiwxLjc5MDg2MSAxNiw0IEMxNiw2LjIwOTEzOSAxNC4yMDkxMzksOCAxMiw4IEwxMC43MDQ4MzEzLDggWiIgaWQ9InNwZWVjaCIgZmlsbD0iIzBFQkQ4QyI+PC9wYXRoPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+'; /** * Icon svg to be displayed at the left edge of each extension block, encoded as a data URI. * @type {string} */ -// eslint-disable-next-line max-len +// eslint-disable-next-line @stylistic/max-len const blockIconURI = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNDBweCIgaGVpZ2h0PSI0MHB4IiB2aWV3Qm94PSIwIDAgNDAgNDAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDUyLjIgKDY3MTQ1KSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KICAgIDx0aXRsZT5FeHRlbnNpb25zL1NvZnR3YXJlL1RleHQtdG8tU3BlZWNoLUJsb2NrPC90aXRsZT4KICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPgogICAgPGcgaWQ9IkV4dGVuc2lvbnMvU29mdHdhcmUvVGV4dC10by1TcGVlY2gtQmxvY2siIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHN0cm9rZS1vcGFjaXR5PSIwLjE1Ij4KICAgICAgICA8ZyBpZD0idGV4dDJzcGVlY2giIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQuMDAwMDAwLCA0LjAwMDAwMCkiIGZpbGwtcnVsZT0ibm9uemVybyIgc3Ryb2tlPSIjMDAwMDAwIj4KICAgICAgICAgICAgPHBhdGggZD0iTTExLjUsMTcuNjY5MzQzNSBDMTEuNSwxNi42NTM5MjY5IDEwLjAwNjAxNDUsMTYuMDg0NDI3NCA5LjExMjU2MDI0LDE2Ljg4ODMgTDYuNDEyNTYwMjQsMTkuMDUwNzE0IEM1LjM5MzQ2NzU1LDE5Ljg2Njg5OTQgNC4wNzQ5NzM1MSwyMC4zMzE3NTc1IDIuNywyMC4zMzE3NTc1IEwyLjMsMjAuMzMxNzU3NSBDMS4yNjUxOTIzMywyMC4zMzE3NTc1IDAuNSwyMS4wMjEyMDAzIDAuNSwyMS45MDQwNzEgTDAuNSwyNi4xMzg3OTg2IEMwLjUsMjcuMDIxNjY5MyAxLjI2NTE5MjMzLDI3LjcxMTExMiAyLjMsMjcuNzExMTEyIEwyLjcsMjcuNzExMTEyIEM0LjE1NzU1NjgyLDI3LjcxMTExMiA1LjQ1MzcyMzIyLDI4LjEzMzUyNzEgNi41MTk3MjA5OCwyOC45OTggTDkuMTE4NDAyOTMsMzEuMTU5MzIxNiBDMTAuMDI2MTg1NSwzMS45MDkwNzkzIDExLjUsMzEuMzQ3MjY4OSAxMS41LDMwLjI4MzQyNTUgTDExLjUsMTcuNjY5MzQzNSBaIiBpZD0ic3BlYWtlciIgZmlsbD0iIzRENEQ0RCI+PC9wYXRoPgogICAgICAgICAgICA8cGF0aCBkPSJNMjEuNjQzNjA2NiwxNi41IEMxOS45NzcwMDk5LDE4LjQzNzAyMzQgMTcuMTA1MDI3NSwxOS45Mjg1NzE0IDE1LjY2NjY2NjcsMTkuOTI4NTcxNCBDMTUuNTEyNjM5NywxOS45Mjg1NzE0IDE1LjMxNjYyOTIsMTkuODk1OTAzIDE1LjEwOTcyNjUsMTkuNzkyNDUxNyBDMTQuNzM3NjAzOSwxOS42MDYzOTA0IDE0LjUsMTkuMjQ5OTg0NiAxNC41LDE4Ljc2MTkwNDggQzE0LjUsMTguNjU2ODA0MSAxNC41MTcwNTU1LDE4LjU1NDUwNzYgMTQuNTQ5NDQ2NywxOC40NTQwODQ0IEMxNC42MjU3NTQ1LDE4LjIxNzUwNjMgMTUuMTczNTcyMSwxNy40Njc1MzEgMTUuMjc3MjA3MSwxNy4yODA5ODgxIEMxNS41NDYzNTI2LDE2Ljc5NjUyNjEgMTUuNzM5MDI1LDE2LjIwNjM1NjEgMTUuODQzMjg5MSwxNS40MTYwMDM0IEMxMy4xODk3MDA1LDEzLjkyNjgzNjkgMTEuNSwxMS4xMTM5NjY4IDExLjUsOCBDMTEuNSwzLjMwNTU3OTYzIDE1LjMwNTU3OTYsLTAuNSAyMCwtMC41IEwyNCwtMC41IEMyOC42OTQ0MjA0LC0wLjUgMzIuNSwzLjMwNTU3OTYzIDMyLjUsOCBDMzIuNSwxMi42OTQ0MjA0IDI4LjY5NDQyMDQsMTYuNSAyNCwxNi41IEwyMS42NDM2MDY2LDE2LjUgWiIgaWQ9InNwZWVjaCIgZmlsbD0iI0ZGRkZGRiI+PC9wYXRoPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+'; /** diff --git a/packages/scratch-vm/src/extensions/scratch3_translate/index.js b/packages/scratch-vm/src/extensions/scratch3_translate/index.js index 4141ed88900..b1b3033417f 100644 --- a/packages/scratch-vm/src/extensions/scratch3_translate/index.js +++ b/packages/scratch-vm/src/extensions/scratch3_translate/index.js @@ -10,14 +10,14 @@ const formatMessage = require('format-message'); * Icon svg to be displayed in the blocks category menu, encoded as a data URI. * @type {string} */ -// eslint-disable-next-line max-len +// eslint-disable-next-line @stylistic/max-len const menuIconURI = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAABYlAAAWJQFJUiTwAAAGAklEQVRYhe1YbUxTVxh+rh02o0KtkOEgKA4U4yeRWCdgxDoxCnH6h22iqSz76aasZlnijzkTBlvS4TJ/LGaJsmiyESe4hAVJvMJGxwQhLKECcRWkpWNZERs6Ctb2Lm97C/fe3n6Jyfzhk5y09z3nPPe57znnPe85DMdxeJ6x6LlW90LgM8BLchR1dXUZeXl5b3Ect+ppXsEwzHBfX98PVVVVY0GbmjW2AdgpaFYP4JxTZ+iLyCVdJFeuXNmdn59fn56enrFkyRIsWhSfk30+H1wuF+x2+1hPT4++oqLiJi/wEoA8AJslXSqdOsOlmARWV1dnlpeXd2ZnZ2fEK0xOqMViGWtoaNh++vRpa9CuZo1ZAJokQlc5dYYROR6RCq1WW56WlhZV3H0H8O9sZIHEQVzEKbTzQooBPBCYz4TlET4oFIosGtZoOHUN+Ph61GYgLuIU2tSscSmAYwAeCcx6NWs8o2aNxVKOkEUi9R55qv428Ng7b3viA/6eAs7dmrctVgD6bYBKGZ6LB4mrk7F/whcmokApfh8BWu6G2mc8ADsktuWmAbtzozGiLUJdu9QQVSC98JUkYNgBfPsboH4Z+GhPoK62FZiaAU7sCrTZmB5VHM3BPjVrrARwUVL1B4CD0vYxLVV68YFNQIICcLrn7SROtTjwEbGIE4iksFIpEVfs1BkeSdvGFUsObAz8Gm8CNTcC/49q42EIEbkLwKfhxCGWIRZC/zrQ/ifgcAWMK5YB+zc8nUBeZFuUORmfQIp/PsHGM/04YMta5oPT6cTs7Cw8Ho+oj9vtzmloaCgPZQtApVI96ejo6K2trR3lOM4nrRftJCzLfq3T6Y7LCfvuNtDL7wepfKgkTz6ZdeHdzePYlq30xz2lUintHhH0UbQ12my2+oKCguMcx7mE7aOHmWHgsxvzzzQP3ysMxMfzt2bxKmNHyZblSE5OjktYEImJidBoNFCr1frOzs5khmHe4Thubp8SCVQoFBwNUUJCwpyNwsfyZGBDOvB2fuCZQAH56KYJKJUpTy1OCOJYvXr1ocbGxjIAPwarRKvYZrNdn5iYEHV8LRW4cBj4oHheXBDT09PPRFwQxKXRaIQpmVjgkSNHfrFardcmJydjIqSMRehtOfzjmMTZmm/8hf5HAnF5vV7RVicSyHGcR6vVHh4YGPjKYrFMkTelq5JAH0B1MzMzUT+iu6cfdwfv+wv9jxchgZomaEFBwcmcnJxVY2NjXQqFQlQ/Pj6O/v7+s2az+U2Hw9Ec7X3tHXfm/v/c2hG3wLCruLm5+VBGRoY2mJGQJ0nc4ODgqZKSkjqKWSzL7olEPjJqx4PRv5CaqvE/OxyTflvWitj3xbBbnUql2kRxjYTRcA4MDHR1d3frguJiIW//NeC9/SVF2LplvcgWK8J6sKWl5UuVSrXO4/HYHj58+FNZWVkLx3HT8Rz0u3vN/t8Ho3aRaH3FgYULrKmpodT8jeBzvDcQ3T1m/5D6RXX0zNmn3TP+uq356xcmkE/NTwLoc+oMTXGpA3CnN7Bi99Hw5s8PL4mlulgFys5BXlwbn4I3qlnjsXgFBr22f+8OrFub7S/79u4Q1cWCEA8KxAmPhRfVrBFy51cK1nJnj+/rvwix0eqVswu5pJDzoPTMKhSZJzQolUoLZSLPCsRFnEI6OYE7I7xPdGYoKiq6YLVaByllWiiIg7iIM5rAYBouBB2yq5w6g+iATWGnqampZGhoqItiJSUP4YrcR9CQUh31JQ7iIk5hm7AXmPxdip5/dNIUCnduYBgm8fLly9tzc3NLwzlSqVTuW7NmzVphQkubwL179+xdXV3HKisrTVJxiJKwnuGHVM2XNjVrPCh3h8IT3+SLLKqrq+tKS0uvrly5UksJKvjsJSkpKd3r9TrkxCGSBxHwIoWXc7zAIOiIOOLUGULOsNHAMIzSZDJ9npmZeSIlJcWfTdPQm0ym8zqd7n257hGPnXxYyePv8py8mVb40ji1+UGZUmFh4Yetra1bzGbzteHh4SlKQNxu961wff7XS3Sau/w0c4VLQF7c8i8IAP4DcHKth/4Ur7MAAAAASUVORK5CYII='; /** * Icon svg to be displayed at the left edge of each extension block, encoded as a data URI. * @type {string} */ -// eslint-disable-next-line max-len +// eslint-disable-next-line @stylistic/max-len const blockIconURI = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAYAAACOEfKtAAAACXBIWXMAABYlAAAWJQFJUiTwAAAN+UlEQVR4Ae1ce2xT1xn/Tkhq4hqHJKRLDAlQGI+GUfFc14HaLmxuGd0ab93GgK6Vmm01y9BUsaU0RfyRFTakaRHq3So6jVapWEUxa9dRuU8x6IAGCoO6wa1KXiSQOE9jkjivO/2u7yWOuff6XvvekFb5SUdx7ON7v/vz9zrnO+cwnudpAokjZYK75DBBYJKYIDBJTBCYJCYITBJfOgIZYzbGWA5jLJ8xNm/z5s334a/4P1omYyzNsPt9WdIYxhiUId/j8azPz89fY7VaF6ampjqi+4TD4Qvd3d0f7t+/fx/HcTVE1M7z/EBS99VDoCikTWzWMdTgYSLqIaIQGs/zwzKyOaqrq1+aOnVqUUZGBqWnp5PFYqG0tDQaHh6mvr4+GhwcpFAoJLSenp4P9+7dW8Zx3Fme5zsTFSxVa0eovtPpnL1ly5YfzJgxw2WxWBYketNEAO25dOmSp7Ky8iBjrFbmoW12u70oOzubMjMzR32QkpJCVqtVeG2322lgYIACgcDK0tLS1+6+++4yxpiH5/krCQkGDYzXiCi3qqrKXVNTE7x48SLf0dHB9/X18WMF3Av3xL0hA2SBTNFyE9E8v9/PX758WbNUuCa+4/F4ymKvp7XF1UDGWK7H43m0sLBwZ05Ozg2/7lgApoiGe3d2dk5ZsWLFcx6Px84Y2xelOcHW1taXiOiRcDgsaJ2gljab0GDKscD1Jk2ahHd3ejwePOtenufb9TySKoEw26qqKhfIy83NFdT/ZiP6oauqqoKMsf2iObeuXr26vKKiwpOVlTXFbrfb8/LyFubk5KyBu1H68aVnGh4e3uZ2u08yxo7pCixKqgrX4XQ6l8JkoOrjDZAJskFGyBolt0UMcGhgJ19yP2rm3dDQwJ85c+akXlNWI9B++PDh38PvjFdANsgIWVUfksheUVHxfZDY3d0t+zT9/f2CP3S73feJWYZFC4FqJmxDtJ06daphRnuiluhrDqJbLcZcD7JBRiJ6Dj5Qrg9jDHfLhlm3tbUdslgsj8i5IvhI+MpNmzaVLlq0yCN+9wMiCvA8H1KSQY1AK3yHFP6ThfcTouePEaVNItrzI6LbpiR/TcgmplOyQmLE4XQ6C3fv3v0y+iEQIbggjZELKiB2+vTpxXl5ecUIRD6fr/nQoUNuxtjbPM/3yN1DLREWPsNNjUBNC9HgMFEKI2q5asglo2VTeo7sioqKP6anpwtBZObMmZSfny9LHokRG5+jn8PhoFtuucVRXFzMQdmVZPiyTyakIblGBqE3/QKZIBLDQafTmavUT/NIRA3XwkSlB4jaFD3FCPqHiJ5+Xb3PNBvRnoeN85UYyiUCmDHg9XoVn8wQDTxRR9RxjQjxLl4DgfH64Fq4pgEY6OjoONTe3q6bRPTH9zBmFsfgsjBEA4vmE/kuE30eiPzfN0B0WYyJGelEWQpx6FJXhNC0FKIcG9Fk0TUVZEWuaQBad+zYUbF79+6FjY2NC+DfpBGKGkBeY2MjBYPBC2VlZU9g1sZUAoFf3zvyGia9/u8RbRrmiSofvrG/1IeEaEn0/E+NkmQEmLVhjPmIaAMisRYSo8nbunXrBq/X6+N5PqzU35QgAt8177bI655+ovPNN/Z50xeJyIyIlswwQ4oI8PAgAWSAFJCjZM56ySMzo/DP7iJKTSEaGibi/jP6M2jfwbNEQzzRpBSin68yS4oItJCYCHlkJoEYcWSKvu9KkOjwxyOf7T9F1DsQ0b6CTGOS6niQIxEJNSVBHhnpA+Xwm28RPfOvSAL9t+NEy2cShcJEr5+P+EcQ+PT9ZkowGiBF8olIsMPhcBFmrnt7e4Voi4Chhzwym0BoYWFexAcODBGVvUbU3RshbxIjWrdobLQvGhKJXq+3xO12z1q3bt2aN9544x2O45A4Neshj8wmENjmJHr8ZaJQ/0iizcRk+fFvmn13eYgk1TLGWjiOwxQWKY1148H0oRwiMohiUYky8Oz3zL5zfIA0qSV6DdM18NWPiF4+FXnNogh84h9EW9cQ3TV7pC+ceVTVTNPooa5OGLLMYkgmE0fcqp8STCPwYhvRn94jauqKBBHJbOED4Q8xAtn1FtH8rxA9WUSUNthJiQy5Zs2aRX6/35usvBqqfrJQrAujmu/3+/3z5s3TJQgCxsEzRP9riuSAUsBYXhCJysCWVyP+EHkgiA0Hr9D9Xw3S/QuJJlvShIlSca4vASr0A5MG0Piuri68vnr69OmyjRs3aip1GqaByPNePRuZCMDwTSIuPY1oy32jTfWFDUQvniB67RzRta4rtDwvSN8tJBrnVT9ZGEIgpupf+C/RgGh90CpMEKwtJFq/XH5aCiOVb0zvpH+fipD3Baj6yUKNQIEOqLcWU4IPx9ANGue6k+iBQvX5PPi6lHD7dc0bD+RJgCxDQ0O0bNmyXU6n8wRjrFsxsKhUshznzp2r0VrSbAny/OcB7eU7VMdQBfuiV/3U8sAQohIcqxZgRHH7NO2/MlIVEitr4xVRVT+bkoiqBCKkIyp1dia8eEkRiHokVtbGK+JV/VQJhM17vd5ahPRAIICZCkMfU8r3xipVSQQaqn7qURjRB0u/ENIRleBYb0aaEQ+Btk4qfXLnqF7bn/oF3bFgjun3jjsWRh7kcrn2VVdXb25pablaW1uLXOl6xWo84LD36A1SHDl6akwk05QHgkTkQwjpsQsstSa/V65cGeUGMIbFMMwIyJFVfdpHj2zopVut6YbcQwmaZ2Ngzl6v9+zatWv/sHjx4u9UVlYKAzMUoOMB5HV1dV09cODAQ/NFOJ1OpxEPAKJ6evtueB/vnTrtM+IWqtA1nYXAwvM81GgAi3CUFi5KQKBobm4WyDt48OCm8vLy93me/xQNSmjEAxw5NqJ91vTJQpNQ/dE4I5AikwxWjuPWZGVlFWM9shLgI+vr6zHDcoHjuAdF8gwN5dd6eulUFEkrlhUKTQI+Q4AxE4lMqOasWrXqafg9uRREquiDvKamppe2bdv2kz179pwwmjyS8X3Lly4SWjSqT38s/2WDkMhkggUBJHbsCuIQndH6+/ubjxw58ju32/0eXKCeCUo9iDbfadMyr2sfzFjyi4ffOkZrnatNoi8xAoX1JjabrRhDnehZZBDn9/v3uFyuV+ItTEwWdQ3NVN9w+fpVViwdMV0QeeTYaeF1W1un0HdWgcNoEQQkYsJd27dvfxa+7dKlS9TQ0NBcV1d36OTJk5sLCwtXuVwujuf5WjPJIxnzvWf18uuvY834TZk80Sjo1kBxdPLp4sWLizBnKr4NewnqLQkmg1gCy575s+LVkOo8UWKOHAlV5cSAgGmadnG/WWCsyZPL/ZSAvmaNTHRroLho2xFdlGaMXRSDxZiQGJvf3bHgdtl+n1y4OOo70WZuFHQRCPKwaHvXrl1/sVqtK7EsYs6cOdsee+yxd8vLy3+Lir/ZJCKvi879Zhbk0fanfinb91dP7hSCCEXlhDnTjJ0M0WzCEnlYZ5eZmbly7ty5woLs2bNnYzxchPfxuaihpiE2r7tnlbJWRUdmMikn1ERgNHl2u33UIkUM5fA/3h8LEpHXRWPFskWKfWNNNva7RkDLZkNF8iTgf7yPFaDoh9VPZpnzvVEaZ7VOVjVJ5H4/fOjbRoswGnG2SIG8pSgu1dXV8UNDQ6pFGHyOfugv7mFT3C5FRHNRVBrLbbN6AdkgI2RNZK+cLvIkyJCYonB9XVW/mwHIBhkhayJVuWxEWyWzVYJkzjabbcGOHTvKUbBT6Kqr6nczANkgo9o2BzVWbEhVMGWllbzrF01JIXwPU16IMwrdTK36JQuxbHEVMiZEoNPpFKaaE62axSPd7KpfMoAskAmyQUa12STFKOz1egODg4PN9fX1Dqxb0TJ1LwG/HuYEg8Hgu5i9Ueo3Hqt+kB3k+Xy+p8QVWqrmoZbGtGOrJ3YrNjc3O6StonhAOTKx4h21D0xvYTYa6+0wOlHb5UMjBat9WMiDtShdXV1TvkjL21TPjcEpQJiB5jhOWM28ZMkSV0FBQTG2gsoBJU/MQp8/f/5tt9v9gZ5F20Yeq4LJXlhNPEjaRjELLEWz1eaYNR57AlWwYTs88iJsj5cDFgxhWz2218fbhq90ToN4zgF+obk4ykRvk7b2azn+JGabf754b9m0S3ceqPCAuTiYAQc0KAGCR53tIgklHQKh6RyCZFr0+QhNTU1x81f0OX78uMe0c2Ni0I7jknDiTzAYxNEiN3SA6VgsFmGV57lz50oDgcA7fr9f2ErQ0dFxlTH2ERE1mVUnwVwlY+z9lpaWB0tKSv4aDocXwOUo+VOkW6FQqJjjOI94gpG+FfsJmFk2TvqB6iudgCGZBzJ5aCsaRif4ztGjR19M9NfWKadl3bp1d+J+uG9bW5uiNra2tkojjpm675OgcLkSiXqGYjBvcWw5z2wC+RGf6uA4bqPP52v67LPPZImMGvPqliuhNdKxqUdvb+8UrJFRW6VAN2Epm+gmmhlj/ySiDzwez4/nz59f2tnZ6ZCOhEJqhvQFlUa1nFUJCS8ylxYcud3umpKSkl2hUGilJFRqaipNnjz5+hEjyLOwoa+7u1tKrk2t2MnIKmygYYzhBI5XqqqqHpgzZ84au93+dRwqgRQGlUaxzqMLSR/AKJ4Gme12uxeuX7/+0YyMjJWxORxGND09PTWNjY3vuFyu/UTUaFYQ0SizRcwOpIU0Q2JVUf8Pa6C/AZGZYuqSL+VkYh6H/3OQS46F7xvLNnGSeZKYOMU3SUwQmCQmCEwSEwQmiQkCkwER/R+aET3lwEIlXgAAAABJRU5ErkJggg=='; /** diff --git a/packages/scratch-vm/src/extensions/scratch3_video_sensing/index.js b/packages/scratch-vm/src/extensions/scratch3_video_sensing/index.js index 1c925b21824..81985f67021 100644 --- a/packages/scratch-vm/src/extensions/scratch3_video_sensing/index.js +++ b/packages/scratch-vm/src/extensions/scratch3_video_sensing/index.js @@ -13,14 +13,14 @@ const VideoMotion = require('./library'); * Icon svg to be displayed in the blocks category menu, encoded as a data URI. * @type {string} */ -// eslint-disable-next-line max-len +// eslint-disable-next-line @stylistic/max-len const menuIconURI = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjBweCIgaGVpZ2h0PSIyMHB4IiB2aWV3Qm94PSIwIDAgMjAgMjAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDUyLjIgKDY3MTQ1KSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KICAgIDx0aXRsZT5FeHRlbnNpb25zL1NvZnR3YXJlL1ZpZGVvLVNlbnNpbmctTWVudTwvdGl0bGU+CiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4KICAgIDxnIGlkPSJFeHRlbnNpb25zL1NvZnR3YXJlL1ZpZGVvLVNlbnNpbmctTWVudSIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgICAgICAgPGcgaWQ9InZpZGVvLW1vdGlvbiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMC4wMDAwMDAsIDUuMDAwMDAwKSIgZmlsbC1ydWxlPSJub256ZXJvIj4KICAgICAgICAgICAgPGNpcmNsZSBpZD0iT3ZhbC1Db3B5IiBmaWxsPSIjMEVCRDhDIiBvcGFjaXR5PSIwLjI1IiBjeD0iMTYiIGN5PSI4IiByPSIyIj48L2NpcmNsZT4KICAgICAgICAgICAgPGNpcmNsZSBpZD0iT3ZhbC1Db3B5IiBmaWxsPSIjMEVCRDhDIiBvcGFjaXR5PSIwLjUiIGN4PSIxNiIgY3k9IjYiIHI9IjIiPjwvY2lyY2xlPgogICAgICAgICAgICA8Y2lyY2xlIGlkPSJPdmFsLUNvcHkiIGZpbGw9IiMwRUJEOEMiIG9wYWNpdHk9IjAuNzUiIGN4PSIxNiIgY3k9IjQiIHI9IjIiPjwvY2lyY2xlPgogICAgICAgICAgICA8Y2lyY2xlIGlkPSJPdmFsIiBmaWxsPSIjMEVCRDhDIiBjeD0iMTYiIGN5PSIyIiByPSIyIj48L2NpcmNsZT4KICAgICAgICAgICAgPHBhdGggZD0iTTExLjMzNTk3MzksMi4yMDk3ODgyNSBMOC4yNSw0LjIwOTk1NjQ5IEw4LjI1LDMuMDUgQzguMjUsMi4wNDQ4ODIyNyA3LjQ2ODU5MDMxLDEuMjUgNi41LDEuMjUgTDIuMDUsMS4yNSBDMS4wMzgwNzExOSwxLjI1IDAuMjUsMi4wMzgwNzExOSAwLjI1LDMuMDUgTDAuMjUsNyBDMC4yNSw3Ljk2MzY5OTM3IDEuMDQyMjQ5MTksOC43NTU5NDg1NiAyLjA1LDguOCBMNi41LDguOCBDNy40NTA4MzAwOSw4LjggOC4yNSw3Ljk3MzI3MjUgOC4yNSw3IEw4LjI1LDUuODU4NDUyNDEgTDguNjI4NjIzOTQsNi4wODU2MjY3NyBMMTEuNDI2Nzc2Nyw3Ljc3MzIyMzMgQzExLjQzNjg5NDMsNy43ODMzNDA5MSAxMS40NzU3NjU1LDcuOCAxMS41LDcuOCBDMTEuNjMzNDkzMiw3LjggMTEuNzUsNy42OTEyNjAzNCAxMS43NSw3LjU1IEwxMS43NSwyLjQgQzExLjc1LDIuNDE4MzgyNjkgMTEuNzIxOTAyOSwyLjM1MjgyMjgyIDExLjY4NTYyNjgsMi4yNzg2MjM5NCBDMTEuNjEyOTUyOCwyLjE1NzUwMDY5IDExLjQ3MDc5NjgsMi4xMjkwNjk1IDExLjMzNTk3MzksMi4yMDk3ODgyNSBaIiBpZD0idmlkZW9fMzdfIiBzdHJva2Utb3BhY2l0eT0iMC4xNSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjAuNSIgZmlsbD0iIzRENEQ0RCI+PC9wYXRoPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+'; /** * Icon svg to be displayed at the left edge of each extension block, encoded as a data URI. * @type {string} */ -// eslint-disable-next-line max-len +// eslint-disable-next-line @stylistic/max-len const blockIconURI = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNDBweCIgaGVpZ2h0PSI0MHB4IiB2aWV3Qm94PSIwIDAgNDAgNDAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDUyLjIgKDY3MTQ1KSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KICAgIDx0aXRsZT5FeHRlbnNpb25zL1NvZnR3YXJlL1ZpZGVvLVNlbnNpbmctQmxvY2s8L3RpdGxlPgogICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+CiAgICA8ZyBpZD0iRXh0ZW5zaW9ucy9Tb2Z0d2FyZS9WaWRlby1TZW5zaW5nLUJsb2NrIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIiBzdHJva2Utb3BhY2l0eT0iMC4xNSI+CiAgICAgICAgPGcgaWQ9InZpZGVvLW1vdGlvbiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMC4wMDAwMDAsIDEwLjAwMDAwMCkiIGZpbGwtcnVsZT0ibm9uemVybyIgc3Ryb2tlPSIjMDAwMDAwIj4KICAgICAgICAgICAgPGNpcmNsZSBpZD0iT3ZhbC1Db3B5IiBmaWxsPSIjRkZGRkZGIiBvcGFjaXR5PSIwLjI1IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGN4PSIzMiIgY3k9IjE2IiByPSI0LjUiPjwvY2lyY2xlPgogICAgICAgICAgICA8Y2lyY2xlIGlkPSJPdmFsLUNvcHkiIGZpbGw9IiNGRkZGRkYiIG9wYWNpdHk9IjAuNSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBjeD0iMzIiIGN5PSIxMiIgcj0iNC41Ij48L2NpcmNsZT4KICAgICAgICAgICAgPGNpcmNsZSBpZD0iT3ZhbC1Db3B5IiBmaWxsPSIjRkZGRkZGIiBvcGFjaXR5PSIwLjc1IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGN4PSIzMiIgY3k9IjgiIHI9IjQuNSI+PC9jaXJjbGU+CiAgICAgICAgICAgIDxjaXJjbGUgaWQ9Ik92YWwiIGZpbGw9IiNGRkZGRkYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgY3g9IjMyIiBjeT0iNCIgcj0iNC41Ij48L2NpcmNsZT4KICAgICAgICAgICAgPHBhdGggZD0iTTIyLjY3MTk0NzcsNC40MTk1NzY0OSBMMTYuNSw4LjQxOTkxMjk4IEwxNi41LDYuMSBDMTYuNSw0LjA4OTc2NDU0IDE0LjkzNzE4MDYsMi41IDEzLDIuNSBMNC4xLDIuNSBDMi4wNzYxNDIzNywyLjUgMC41LDQuMDc2MTQyMzcgMC41LDYuMSBMMC41LDE0IEMwLjUsMTUuOTI3Mzk4NyAyLjA4NDQ5ODM5LDE3LjUxMTg5NzEgNC4xLDE3LjYgTDEzLDE3LjYgQzE0LjkwMTY2MDIsMTcuNiAxNi41LDE1Ljk0NjU0NSAxNi41LDE0IEwxNi41LDExLjcxNjkwNDggTDIyLjc1NzI0NzksMTUuNDcxMjUzNSBMMjIuODUzNTUzNCwxNS41NDY0NDY2IEMyMi44NzM3ODg2LDE1LjU2NjY4MTggMjIuOTUxNTMxLDE1LjYgMjMsMTUuNiBDMjMuMjY2OTg2NSwxNS42IDIzLjUsMTUuMzgyNTIwNyAyMy41LDE1LjEgTDIzLjUsNC44IEMyMy41LDQuODM2NzY1MzggMjMuNDQzODA1OCw0LjcwNTY0NTYzIDIzLjM3MTI1MzUsNC41NTcyNDc4OCBDMjMuMjI1OTA1Niw0LjMxNTAwMTM5IDIyLjk0MTU5MzcsNC4yNTgxMzg5OSAyMi42NzE5NDc3LDQuNDE5NTc2NDkgWiIgaWQ9InZpZGVvXzM3XyIgZmlsbD0iIzRENEQ0RCI+PC9wYXRoPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+'; /** diff --git a/packages/scratch-vm/src/extensions/scratch3_wedo2/index.js b/packages/scratch-vm/src/extensions/scratch3_wedo2/index.js index ce345965b29..923579b1062 100644 --- a/packages/scratch-vm/src/extensions/scratch3_wedo2/index.js +++ b/packages/scratch-vm/src/extensions/scratch3_wedo2/index.js @@ -13,7 +13,7 @@ const log = require('../../util/log'); * Icon svg to be displayed at the left edge of each extension block, encoded as a data URI. * @type {string} */ -// eslint-disable-next-line max-len +// eslint-disable-next-line @stylistic/max-len const iconURI = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAYAAACOEfKtAAAACXBIWXMAABYlAAAWJQFJUiTwAAAF8klEQVR4Ae2cbWxTVRjH/7ctbVc2tyEMNpWBk0VIkLcEjSAQgglTE5HEaKqJi1E/mbCP/dJA0kQbvzgTQ0Ki2T7V6AeYGoEPLJmGKPiyzZDwEpYJCHSbQIcbdLvres1zOa13Xbvdu2eTDp9fst329Lnn5XfPPfece7tphmFAmDkuccdDBDIRgUxEIBMRyEQEMhGBTEQgExHIRAQyEYFMRCATEchEBDIRgUxEIBMRyEQEMhGBTEQgExHIxMPNIByNVQBoBUDb7kgo2KTS9wBoUmFNkVCwW6U3A1gP4JJKHwxHY/S+WcW2RkLBVhV7AMAOAIMAGlWstbyOSCh4QMU2Uoy1PBVL+a7IqZu1vOZIKNg20/azBarGvKxebw9HY22RULADwBFLTBcATQnZl4lVEimN4ssteXQrQfstebQpmW1q30xshyqvxRLbofYnYW9ZYgeV8C5LLOWlzbTxM3ouHI7GPgSwWx3Z0syBSBku6IYnlTbM+uQenJQaMnKHDaqAFnDrcCFbl3G1defEjas0a4N/Vz10OybyvapfrSX1sjpo+WIz0ME7QL3djgtHPTAcjb2mepw/b2ZaGh5NL5RnofR8R99dIC5fHusK5JsrCUpm7TSx21XvbcwTNwnbAsPR2GcA3qaG+H0LsHlDPZ7fca/ujZ+cRW9/Em5vCXzlNVhQUjFpf/3OTSRvXkKJz43Xt1bh1S1LUeq/5+njQ9/iVmLIfL1ieRU2b1iFtavztXNu6TrTi8PfnYI67WdPoOp5przV9Y8iuHdb9rOW9uumPI+vDIElddBckztPOqVn5X36Xj1WVQeynx1sOWbK83jc2PviM/dFXIYNax9H55leXLoyYHsfWwI14JCRRx7x5ckBU1oheYQ+1G9u39lVM0Hej7+cR7w/Yb7e9+5LqChfaLvixcK088BwNNZkAOV02ubK6+odwt3RcfOULSSPGEveG48bNj08If3kqXPmdtO6unkpDzYn0u/TLxrzcumJJ80Ut79sygzoFF6/siw75mUYupOEpmnY0/A0pw33FTsCa+hX5oJhZXgkZb5zub2O20CnL7EwkPeCPm+wI7CEBvi5wuOZ36tJW7X3uGXJXAgxk8P4eNpRPEvgskqfuR0Z/BNGejxvDM3/5gs0pboWv+motqybCc+tqUCzz43kaBJ/X+2eMjZ3ClNsjIzo5ioknXZ2b4AlkKYltLJoaY9jOJm/B0KJbtg4c4F/XOmH3+dF9dLKbBo1OD6QQGV56YQ55ODtO0jcHkZ1VSX8/n9nB9S7RkZ1rFy+NG8ZR9s70TeQQKDEh7vJUdt1Y9/OopXFB2/WcbMpyOexE9mlFS21aLlHMmKHfzBl0QT/hV2bzM9oLXv0xG8YGR0zpdLEn6RT2k+/XjDzoLX2G3u3TZBLUyral/Z5qCyAK1f/sl2/or+IWNel1Eji3MWrpjyCZHWqdNrSe6ieSHFERl4mP+q5GehgHGvvRGal5XI5uzU47f3A/R99YTgdF2wXrmkolr9ToZ5NvTjT4yOhoC2T057CJM/r9WDxoqmXa07R9THcuDVcMO8bt4ag6ynULKvkFjWBTLl0ugZKvNlyqLeSQKfYGgOpgXt2b5zVhlzrS+Dr451YvKg0b95txztxvS8xZ+VuXFuLJ5+oNgV+9c3PuHDxGs6cu+w4v//9RJo6x5bN9UgbBo4cPY1U6j+cSD8orFvzGFYuX4KxsRQGbth6FCICc9m5dY05HtN46AQRqPB5PWjY+ZT5RnMwkxGBFh5ZVmle9Z3MrGbjwfqccrC1vajrV7QCaVCfS6qrJj96nQlFK5CujPRT7MgYyEQEMhGBTGwJpAW4kJ9pBbo0zbx70X7y7AOv8HxP3LyB4YTpb2cZBt2iqL3QEwf9zDbX+waLca439QMeC7a+YBmOxugLiM/OTt2yaOoMoO+H6LOcNwf6xusrthsh/7mIh1yFmYhAJiKQiQhkIgKZiEAmIpCJCGQiApmIQCYikIkIZCICmYhAJiKQiQhkIgKZiEAmIpCJCGQiAjkA+AeOwQKMcWZqHgAAAABJRU5ErkJggg=='; /** diff --git a/packages/scratch-vm/test/integration/block_to_workspace_comment_import_no_scripts.js b/packages/scratch-vm/test/integration/block_to_workspace_comment_import_no_scripts.js index f3dec670744..3879f3e11e8 100644 --- a/packages/scratch-vm/test/integration/block_to_workspace_comment_import_no_scripts.js +++ b/packages/scratch-vm/test/integration/block_to_workspace_comment_import_no_scripts.js @@ -7,7 +7,7 @@ const VirtualMachine = require('../../src/index'); const projectUri = path.resolve(__dirname, '../fixtures/block-to-workspace-comments-without-scripts.sb2'); const project = readFileToBuffer(projectUri); -/* eslint-disable-next-line max-len */ +/* eslint-disable-next-line @stylistic/max-len */ test('importing sb2 project where block comment is converted to workspace comment and block is deleted, and there are no scripts on the workspace', t => { const vm = new VirtualMachine(); vm.attachStorage(makeTestStorage()); diff --git a/packages/scratch-vm/test/unit/virtual-machine.js b/packages/scratch-vm/test/unit/virtual-machine.js index 133bc821b97..f7935acc64d 100644 --- a/packages/scratch-vm/test/unit/virtual-machine.js +++ b/packages/scratch-vm/test/unit/virtual-machine.js @@ -230,7 +230,7 @@ test('deleteSprite deletes a sprite when given id is associated with a known spr t.end(); }); -// eslint-disable-next-line max-len +// eslint-disable-next-line @stylistic/max-len test('deleteSprite sets editing target as null when given sprite is current editing target, and the only target in the runtime', t => { const vm = new VirtualMachine(); const spr = new Sprite(null, vm.runtime); @@ -246,7 +246,7 @@ test('deleteSprite sets editing target as null when given sprite is current edit t.end(); }); -// eslint-disable-next-line max-len +// eslint-disable-next-line @stylistic/max-len test('deleteSprite updates editingTarget when sprite being deleted is current editing target, and there is another target in the runtime', t => { const vm = new VirtualMachine(); const spr1 = new Sprite(null, vm.runtime); diff --git a/packages/task-herder/README.md b/packages/task-herder/README.md index 7be51fa8853..43cdfa4c3f8 100644 --- a/packages/task-herder/README.md +++ b/packages/task-herder/README.md @@ -72,10 +72,10 @@ queue cost: 2, }, ) - .then(response => { + .then((response) => { // Handle successful response }) - .catch(error => { + .catch((error) => { // Handle error }) ``` @@ -96,7 +96,7 @@ queue signal: controller.signal, }, ) - .catch(error => { + .catch((error) => { if (error.name === 'AbortError') { // Handle task cancellation } else { diff --git a/packages/task-herder/src/TaskQueue.ts b/packages/task-herder/src/TaskQueue.ts index 9e455d0b443..cc92e550596 100644 --- a/packages/task-herder/src/TaskQueue.ts +++ b/packages/task-herder/src/TaskQueue.ts @@ -106,7 +106,7 @@ export class TaskQueue { * @returns True if the task was found and cancelled, false otherwise. */ cancel(taskPromise: Promise, reason?: Error): boolean { - const taskIndex = this.pendingTaskRecords.findIndex(record => record.promise === taskPromise) + const taskIndex = this.pendingTaskRecords.findIndex((record) => record.promise === taskPromise) if (taskIndex !== -1) { const [taskRecord] = this.pendingTaskRecords.splice(taskIndex, 1) taskRecord.cancel(reason ?? new Error(CancelReason.Cancel)) @@ -124,7 +124,7 @@ export class TaskQueue { const oldTasks = this.pendingTaskRecords this.pendingTaskRecords = [] reason = reason ?? new Error(CancelReason.Cancel) - oldTasks.forEach(taskRecord => { + oldTasks.forEach((taskRecord) => { taskRecord.cancel(reason) }) return oldTasks.length @@ -202,7 +202,7 @@ export class TaskQueue { this.pendingTaskRecords.unshift(nextRecord) const tokensNeeded = Math.max(nextRecord.cost - this.tokenCount, 0) const estimatedWait = Math.ceil((1000 * tokensNeeded) / this.sustainRate) - await new Promise(resolve => setTimeout(resolve, estimatedWait)) + await new Promise((resolve) => setTimeout(resolve, estimatedWait)) } } } diff --git a/packages/task-herder/src/TaskRecord.ts b/packages/task-herder/src/TaskRecord.ts index 2eb47c9fa7c..25bf7971ff7 100644 --- a/packages/task-herder/src/TaskRecord.ts +++ b/packages/task-herder/src/TaskRecord.ts @@ -26,7 +26,7 @@ export class TaskRecord { const { promise, resolve, reject } = PromiseWithResolvers() this.promise = promise - this.cancel = e => { + this.cancel = (e) => { reject(e) } this.run = async () => { diff --git a/packages/task-herder/test/test-utilities.ts b/packages/task-herder/test/test-utilities.ts index 4a8285117b1..63394215de9 100644 --- a/packages/task-herder/test/test-utilities.ts +++ b/packages/task-herder/test/test-utilities.ts @@ -7,7 +7,7 @@ export async function waitTicks(count: number): Promise { } export async function waitTime(ms: number): Promise { - return new Promise(resolve => { + return new Promise((resolve) => { setTimeout(resolve, ms) }) } diff --git a/packages/task-herder/vite.config.js b/packages/task-herder/vite.config.js index f52c6d5b8bc..0f085ce738c 100644 --- a/packages/task-herder/vite.config.js +++ b/packages/task-herder/vite.config.js @@ -11,7 +11,7 @@ const externalDeps = [ ...Object.keys(packageJson.dependencies || {}), ...Object.keys(packageJson.peerDependencies || {}), ...Object.keys(packageJson.optionalDependencies || {}), -].map(name => new RegExp(`^${name}(?:/.*)?$`)) +].map((name) => new RegExp(`^${name}(?:/.*)?$`)) export default defineConfig({ build: { @@ -28,7 +28,7 @@ export default defineConfig({ * @param {string} depName - The name of a dependency * @returns {string} - The global variable name to use for the dependency */ - globals: depName => { + globals: (depName) => { switch (depName) { case 'p-limit': return 'pLimit' From b9812a1ada59837a13409df247bda685c099618e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 11 Mar 2026 17:54:24 +0000 Subject: [PATCH 296/521] style(deps): update dependency eslint-config-scratch to v14.0.4 --- package-lock.json | 16 ++++++++-------- packages/scratch-gui/package.json | 2 +- packages/scratch-render/package.json | 2 +- packages/scratch-svg-renderer/package.json | 2 +- packages/scratch-vm/package.json | 2 +- packages/task-herder/package.json | 2 +- 6 files changed, 13 insertions(+), 13 deletions(-) diff --git a/package-lock.json b/package-lock.json index 388322d9270..248a81b2c59 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14813,9 +14813,9 @@ } }, "node_modules/eslint-config-scratch": { - "version": "14.0.3", - "resolved": "https://registry.npmjs.org/eslint-config-scratch/-/eslint-config-scratch-14.0.3.tgz", - "integrity": "sha512-D55JyoFMYc6UzosB5BTO2BOmF56aTGVohd0UgvnxiMOyRczU7XdMWBHP2LKZn6sVvIA1zZfGPIokYQO3iBl4hA==", + "version": "14.0.4", + "resolved": "https://registry.npmjs.org/eslint-config-scratch/-/eslint-config-scratch-14.0.4.tgz", + "integrity": "sha512-bMjPzQCuzdeUwkap6eIrnoY27/g17dhY6gg+JTkbFaMitvJKA2i8vv498QfgkLl6OgA9RXdKCqcM+UjEgay7IA==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -35716,7 +35716,7 @@ "cheerio": "1.2.0", "cross-env": "7.0.3", "eslint": "9.39.4", - "eslint-config-scratch": "14.0.3", + "eslint-config-scratch": "14.0.4", "eslint-import-resolver-typescript": "4.4.4", "eslint-plugin-import-x": "4.16.1", "eslint-plugin-react": "7.37.5", @@ -35910,7 +35910,7 @@ "copy-webpack-plugin": "6.4.1", "docdash": "0.4.0", "eslint": "9.39.4", - "eslint-config-scratch": "14.0.3", + "eslint-config-scratch": "14.0.4", "gh-pages": "1.2.0", "globals": "16.5.0", "html-webpack-plugin": "5.6.6", @@ -36172,7 +36172,7 @@ "babel-loader": "9.2.1", "copy-webpack-plugin": "6.4.1", "eslint": "9.39.4", - "eslint-config-scratch": "14.0.3", + "eslint-config-scratch": "14.0.4", "globals": "16.5.0", "jsdom": "13.2.0", "mkdirp": "2.1.6", @@ -36367,7 +36367,7 @@ "copy-webpack-plugin": "6.4.1", "docdash": "1.2.0", "eslint": "9.39.4", - "eslint-config-scratch": "14.0.3", + "eslint-config-scratch": "14.0.4", "expose-loader": "1.0.3", "file-loader": "6.2.0", "format-message-cli": "6.2.4", @@ -36470,7 +36470,7 @@ "devDependencies": { "@vitest/coverage-v8": "4.0.18", "eslint": "9.39.4", - "eslint-config-scratch": "14.0.3", + "eslint-config-scratch": "14.0.4", "prettier": "3.8.1", "rimraf": "6.1.2", "typescript": "5.9.3", diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index 9e7a26fc450..e87a453ddfa 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -196,7 +196,7 @@ "cheerio": "1.2.0", "cross-env": "7.0.3", "eslint": "9.39.4", - "eslint-config-scratch": "14.0.3", + "eslint-config-scratch": "14.0.4", "eslint-import-resolver-typescript": "4.4.4", "eslint-plugin-import-x": "4.16.1", "eslint-plugin-react": "7.37.5", diff --git a/packages/scratch-render/package.json b/packages/scratch-render/package.json index c78b899f1c9..70479bd4f6b 100644 --- a/packages/scratch-render/package.json +++ b/packages/scratch-render/package.json @@ -72,7 +72,7 @@ "copy-webpack-plugin": "6.4.1", "docdash": "0.4.0", "eslint": "9.39.4", - "eslint-config-scratch": "14.0.3", + "eslint-config-scratch": "14.0.4", "gh-pages": "1.2.0", "globals": "16.5.0", "html-webpack-plugin": "5.6.6", diff --git a/packages/scratch-svg-renderer/package.json b/packages/scratch-svg-renderer/package.json index 469867826e1..f775c16eb52 100644 --- a/packages/scratch-svg-renderer/package.json +++ b/packages/scratch-svg-renderer/package.json @@ -63,7 +63,7 @@ "babel-loader": "9.2.1", "copy-webpack-plugin": "6.4.1", "eslint": "9.39.4", - "eslint-config-scratch": "14.0.3", + "eslint-config-scratch": "14.0.4", "globals": "16.5.0", "jsdom": "13.2.0", "mkdirp": "2.1.6", diff --git a/packages/scratch-vm/package.json b/packages/scratch-vm/package.json index a4c7947feaa..7d29de037d6 100644 --- a/packages/scratch-vm/package.json +++ b/packages/scratch-vm/package.json @@ -91,7 +91,7 @@ "copy-webpack-plugin": "6.4.1", "docdash": "1.2.0", "eslint": "9.39.4", - "eslint-config-scratch": "14.0.3", + "eslint-config-scratch": "14.0.4", "expose-loader": "1.0.3", "file-loader": "6.2.0", "format-message-cli": "6.2.4", diff --git a/packages/task-herder/package.json b/packages/task-herder/package.json index 0f08c7d03d3..c66e1836e6e 100644 --- a/packages/task-herder/package.json +++ b/packages/task-herder/package.json @@ -45,7 +45,7 @@ "devDependencies": { "@vitest/coverage-v8": "4.0.18", "eslint": "9.39.4", - "eslint-config-scratch": "14.0.3", + "eslint-config-scratch": "14.0.4", "prettier": "3.8.1", "rimraf": "6.1.2", "typescript": "5.9.3", From 3db66ea81745c5265b52adecf526e22a7b22f0e4 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 11 Mar 2026 19:52:55 +0000 Subject: [PATCH 297/521] fix(deps): update dependency scratch-blocks to v2.0.6 --- package-lock.json | 10 +++++----- packages/scratch-gui/package.json | 2 +- packages/scratch-vm/package.json | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 248a81b2c59..1f9f1a7ebd0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -30252,9 +30252,9 @@ } }, "node_modules/scratch-blocks": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/scratch-blocks/-/scratch-blocks-2.0.3.tgz", - "integrity": "sha512-ujA7g/rFyoGLK0M0UwJ0+zDsOxVlGA/7eYRSSu3ScdspmbvSpOWhlh25i+J/N2pnl03lwUHhBTpIj3QwuYSmqw==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/scratch-blocks/-/scratch-blocks-2.0.6.tgz", + "integrity": "sha512-Ar/KvRyABD3wQpzczYxjbQ4+9UAazOvZkeY4wVjSE8RHoLdzGOFXx6O+0mz3c27tDg0TjDl3POtbz4IL0k/4/Q==", "license": "Apache-2.0", "dependencies": { "@blockly/continuous-toolbox": "^7.0.8", @@ -35686,7 +35686,7 @@ "react-visibility-sensor": "5.1.1", "redux-throttle": "0.1.1", "scratch-audio": "2.0.268", - "scratch-blocks": "2.0.3", + "scratch-blocks": "2.0.6", "scratch-l10n": "6.1.60", "scratch-paint": "4.1.50", "scratch-render-fonts": "1.0.252", @@ -36375,7 +36375,7 @@ "in-publish": "2.0.1", "js-md5": "0.7.3", "pngjs": "3.4.0", - "scratch-blocks": "2.0.3", + "scratch-blocks": "2.0.6", "scratch-l10n": "6.1.60", "scratch-render-fonts": "1.0.252", "scratch-semantic-release-config": "4.0.1", diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index e87a453ddfa..23f42437935 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -166,7 +166,7 @@ "react-visibility-sensor": "5.1.1", "redux-throttle": "0.1.1", "scratch-audio": "2.0.268", - "scratch-blocks": "2.0.3", + "scratch-blocks": "2.0.6", "scratch-l10n": "6.1.60", "scratch-paint": "4.1.50", "scratch-render-fonts": "1.0.252", diff --git a/packages/scratch-vm/package.json b/packages/scratch-vm/package.json index 7d29de037d6..680c7b9d28f 100644 --- a/packages/scratch-vm/package.json +++ b/packages/scratch-vm/package.json @@ -99,7 +99,7 @@ "in-publish": "2.0.1", "js-md5": "0.7.3", "pngjs": "3.4.0", - "scratch-blocks": "2.0.3", + "scratch-blocks": "2.0.6", "scratch-l10n": "6.1.60", "scratch-render-fonts": "1.0.252", "scratch-semantic-release-config": "4.0.1", From bec70d6c634c4368e69a13800b031d28f455effc Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Wed, 11 Mar 2026 20:08:49 +0000 Subject: [PATCH 298/521] chore(release): 13.0.2 [skip ci] --- package-lock.json | 49 ++++++++++------------ package.json | 2 +- packages/scratch-gui/package.json | 8 ++-- packages/scratch-render/package.json | 6 +-- packages/scratch-svg-renderer/package.json | 2 +- packages/scratch-vm/package.json | 6 +-- packages/task-herder/package.json | 2 +- 7 files changed, 34 insertions(+), 41 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1f9f1a7ebd0..6866fa63605 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "scratch-editor", - "version": "13.0.0", + "version": "13.0.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "scratch-editor", - "version": "13.0.0", + "version": "13.0.2", "license": "AGPL-3.0-only", "workspaces": [ "packages/task-herder", @@ -35626,15 +35626,15 @@ }, "packages/scratch-gui": { "name": "@scratch/scratch-gui", - "version": "13.0.0", + "version": "13.0.2", "license": "AGPL-3.0-only", "dependencies": { "@mediapipe/face_detection": "0.4.1646425229", "@microbit/microbit-universal-hex": "0.2.2", "@radix-ui/react-context-menu": "2.2.16", - "@scratch/scratch-render": "13.0.0", - "@scratch/scratch-svg-renderer": "13.0.0", - "@scratch/scratch-vm": "13.0.0", + "@scratch/scratch-render": "13.0.2", + "@scratch/scratch-svg-renderer": "13.0.2", + "@scratch/scratch-vm": "13.0.2", "@tensorflow-models/face-detection": "1.0.3", "@tensorflow/tfjs": "4.22.0", "@testing-library/user-event": "14.6.1", @@ -35758,21 +35758,14 @@ "integrity": "sha512-sf7oGoLuaYAScB4VGr0tzetsYlS8EJH6qnTCfQ/WVEa89hALQ4RQfCKt5xCyPQKPDUbVUAIP1QsxAwfAjlDp7Q==", "extraneous": true }, - "packages/scratch-gui/node_modules/@scratch/scratch-vm/node_modules/scratch-storage": { - "version": "6.1.8", - "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-6.1.8.tgz", - "integrity": "sha512-uDkSNIY7yLalsynLmcGRs6TfF9C9UlCw+OYP0Tr++gjuSJTjOMm/Ve6y5kpxtjYWOAxgzOQgu+QcNz07vELXHg==", + "packages/scratch-gui/node_modules/@scratch/scratch-vm/node_modules/immutable": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", + "integrity": "sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg==", "extraneous": true, - "license": "AGPL-3.0-only", - "dependencies": { - "@babel/runtime": "^7.21.0", - "@scratch/task-herder": "12.6.2", - "arraybuffer-loader": "^1.0.3", - "base64-js": "^1.3.0", - "buffer": "6.0.3", - "fastestsmallesttextencoderdecoder": "^1.0.7", - "js-md5": "^0.7.3", - "minilog": "^3.1.0" + "license": "MIT", + "engines": { + "node": ">=0.10.0" } }, "packages/scratch-gui/node_modules/@webpack-cli/configtest": { @@ -35889,10 +35882,10 @@ }, "packages/scratch-render": { "name": "@scratch/scratch-render", - "version": "13.0.0", + "version": "13.0.2", "license": "AGPL-3.0-only", "dependencies": { - "@scratch/scratch-svg-renderer": "13.0.0", + "@scratch/scratch-svg-renderer": "13.0.2", "grapheme-breaker": "0.3.2", "hull.js": "0.2.10", "ify-loader": "1.1.0", @@ -35905,7 +35898,7 @@ "@babel/core": "7.29.0", "@babel/polyfill": "7.12.1", "@babel/preset-env": "7.29.0", - "@scratch/scratch-vm": "13.0.0", + "@scratch/scratch-vm": "13.0.2", "babel-loader": "9.2.1", "copy-webpack-plugin": "6.4.1", "docdash": "0.4.0", @@ -36155,7 +36148,7 @@ }, "packages/scratch-svg-renderer": { "name": "@scratch/scratch-svg-renderer", - "version": "13.0.0", + "version": "13.0.2", "license": "AGPL-3.0-only", "dependencies": { "base64-js": "1.5.1", @@ -36333,11 +36326,11 @@ }, "packages/scratch-vm": { "name": "@scratch/scratch-vm", - "version": "13.0.0", + "version": "13.0.2", "license": "AGPL-3.0-only", "dependencies": { - "@scratch/scratch-render": "13.0.0", - "@scratch/scratch-svg-renderer": "13.0.0", + "@scratch/scratch-render": "13.0.2", + "@scratch/scratch-svg-renderer": "13.0.2", "@vernier/godirect": "1.8.3", "arraybuffer-loader": "1.0.8", "atob": "2.1.2", @@ -36465,7 +36458,7 @@ }, "packages/task-herder": { "name": "@scratch/task-herder", - "version": "13.0.0", + "version": "13.0.2", "license": "AGPL-3.0-only", "devDependencies": { "@vitest/coverage-v8": "4.0.18", diff --git a/package.json b/package.json index c2e8fcf1704..fe0877ceadd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "scratch-editor", - "version": "13.0.0", + "version": "13.0.2", "private": "true", "description": "Scratch editor mono-repository", "keywords": [], diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index 23f42437935..c32118ff319 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -1,6 +1,6 @@ { "name": "@scratch/scratch-gui", - "version": "13.0.0", + "version": "13.0.2", "description": "Graphical User Interface for creating and running Scratch 3.0 projects", "keywords": [], "homepage": "https://github.com/scratchfoundation/scratch-gui#readme", @@ -112,9 +112,9 @@ "@mediapipe/face_detection": "0.4.1646425229", "@microbit/microbit-universal-hex": "0.2.2", "@radix-ui/react-context-menu": "2.2.16", - "@scratch/scratch-render": "13.0.0", - "@scratch/scratch-svg-renderer": "13.0.0", - "@scratch/scratch-vm": "13.0.0", + "@scratch/scratch-render": "13.0.2", + "@scratch/scratch-svg-renderer": "13.0.2", + "@scratch/scratch-vm": "13.0.2", "@tensorflow-models/face-detection": "1.0.3", "@tensorflow/tfjs": "4.22.0", "@testing-library/user-event": "14.6.1", diff --git a/packages/scratch-render/package.json b/packages/scratch-render/package.json index 70479bd4f6b..78ffe7d33a9 100644 --- a/packages/scratch-render/package.json +++ b/packages/scratch-render/package.json @@ -1,6 +1,6 @@ { "name": "@scratch/scratch-render", - "version": "13.0.0", + "version": "13.0.2", "description": "WebGL Renderer for Scratch 3.0", "keywords": [], "homepage": "https://github.com/scratchfoundation/scratch-render#readme", @@ -54,7 +54,7 @@ "allow-incomplete-coverage": true }, "dependencies": { - "@scratch/scratch-svg-renderer": "13.0.0", + "@scratch/scratch-svg-renderer": "13.0.2", "grapheme-breaker": "0.3.2", "hull.js": "0.2.10", "ify-loader": "1.1.0", @@ -67,7 +67,7 @@ "@babel/core": "7.29.0", "@babel/polyfill": "7.12.1", "@babel/preset-env": "7.29.0", - "@scratch/scratch-vm": "13.0.0", + "@scratch/scratch-vm": "13.0.2", "babel-loader": "9.2.1", "copy-webpack-plugin": "6.4.1", "docdash": "0.4.0", diff --git a/packages/scratch-svg-renderer/package.json b/packages/scratch-svg-renderer/package.json index f775c16eb52..63103dd898f 100644 --- a/packages/scratch-svg-renderer/package.json +++ b/packages/scratch-svg-renderer/package.json @@ -1,6 +1,6 @@ { "name": "@scratch/scratch-svg-renderer", - "version": "13.0.0", + "version": "13.0.2", "description": "SVG renderer for Scratch", "keywords": [], "homepage": "https://github.com/scratchfoundation/scratch-svg-renderer#readme", diff --git a/packages/scratch-vm/package.json b/packages/scratch-vm/package.json index 680c7b9d28f..3ea24c803c0 100644 --- a/packages/scratch-vm/package.json +++ b/packages/scratch-vm/package.json @@ -1,6 +1,6 @@ { "name": "@scratch/scratch-vm", - "version": "13.0.0", + "version": "13.0.2", "description": "Virtual Machine for Scratch 3.0", "keywords": [], "homepage": "https://github.com/scratchfoundation/scratch-vm#readme", @@ -60,8 +60,8 @@ "allow-incomplete-coverage": true }, "dependencies": { - "@scratch/scratch-render": "13.0.0", - "@scratch/scratch-svg-renderer": "13.0.0", + "@scratch/scratch-render": "13.0.2", + "@scratch/scratch-svg-renderer": "13.0.2", "@vernier/godirect": "1.8.3", "arraybuffer-loader": "1.0.8", "atob": "2.1.2", diff --git a/packages/task-herder/package.json b/packages/task-herder/package.json index c66e1836e6e..7d98c1dddbb 100644 --- a/packages/task-herder/package.json +++ b/packages/task-herder/package.json @@ -1,6 +1,6 @@ { "name": "@scratch/task-herder", - "version": "13.0.0", + "version": "13.0.2", "description": "An asynchronous task runner with configurable rate limiting / throttling and concurrency control.", "keywords": [ "rate limit", From 765226103174fb2fa475ce5a316c206dac29c2a8 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 12 Mar 2026 01:34:35 +0000 Subject: [PATCH 299/521] fix(deps): update dependency scratch-blocks to v2.0.8 --- package-lock.json | 10 +++++----- packages/scratch-gui/package.json | 2 +- packages/scratch-vm/package.json | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6866fa63605..6122b6a6a6b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -30252,9 +30252,9 @@ } }, "node_modules/scratch-blocks": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/scratch-blocks/-/scratch-blocks-2.0.6.tgz", - "integrity": "sha512-Ar/KvRyABD3wQpzczYxjbQ4+9UAazOvZkeY4wVjSE8RHoLdzGOFXx6O+0mz3c27tDg0TjDl3POtbz4IL0k/4/Q==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/scratch-blocks/-/scratch-blocks-2.0.8.tgz", + "integrity": "sha512-a5m054IVwqr8iVdTF32iwFv/J2WEA+FqdR86wEo4o30i7aXVusVjB5G9D1U7WWIyHtb96RWJ6jSKGHWqrUIoaQ==", "license": "Apache-2.0", "dependencies": { "@blockly/continuous-toolbox": "^7.0.8", @@ -35686,7 +35686,7 @@ "react-visibility-sensor": "5.1.1", "redux-throttle": "0.1.1", "scratch-audio": "2.0.268", - "scratch-blocks": "2.0.6", + "scratch-blocks": "2.0.8", "scratch-l10n": "6.1.60", "scratch-paint": "4.1.50", "scratch-render-fonts": "1.0.252", @@ -36368,7 +36368,7 @@ "in-publish": "2.0.1", "js-md5": "0.7.3", "pngjs": "3.4.0", - "scratch-blocks": "2.0.6", + "scratch-blocks": "2.0.8", "scratch-l10n": "6.1.60", "scratch-render-fonts": "1.0.252", "scratch-semantic-release-config": "4.0.1", diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index c32118ff319..923ea754760 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -166,7 +166,7 @@ "react-visibility-sensor": "5.1.1", "redux-throttle": "0.1.1", "scratch-audio": "2.0.268", - "scratch-blocks": "2.0.6", + "scratch-blocks": "2.0.8", "scratch-l10n": "6.1.60", "scratch-paint": "4.1.50", "scratch-render-fonts": "1.0.252", diff --git a/packages/scratch-vm/package.json b/packages/scratch-vm/package.json index 3ea24c803c0..8fd66f2dcec 100644 --- a/packages/scratch-vm/package.json +++ b/packages/scratch-vm/package.json @@ -99,7 +99,7 @@ "in-publish": "2.0.1", "js-md5": "0.7.3", "pngjs": "3.4.0", - "scratch-blocks": "2.0.6", + "scratch-blocks": "2.0.8", "scratch-l10n": "6.1.60", "scratch-render-fonts": "1.0.252", "scratch-semantic-release-config": "4.0.1", From bb9d5c501851324a297cc850734979cdb56071d9 Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Thu, 12 Mar 2026 09:47:34 +0000 Subject: [PATCH 300/521] chore(release): 13.1.0 [skip ci] --- package-lock.json | 38 ++++++++-------------- package.json | 2 +- packages/scratch-gui/package.json | 8 ++--- packages/scratch-render/package.json | 6 ++-- packages/scratch-svg-renderer/package.json | 2 +- packages/scratch-vm/package.json | 6 ++-- packages/task-herder/package.json | 2 +- 7 files changed, 27 insertions(+), 37 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6122b6a6a6b..726824e85b6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "scratch-editor", - "version": "13.0.2", + "version": "13.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "scratch-editor", - "version": "13.0.2", + "version": "13.1.0", "license": "AGPL-3.0-only", "workspaces": [ "packages/task-herder", @@ -35626,15 +35626,15 @@ }, "packages/scratch-gui": { "name": "@scratch/scratch-gui", - "version": "13.0.2", + "version": "13.1.0", "license": "AGPL-3.0-only", "dependencies": { "@mediapipe/face_detection": "0.4.1646425229", "@microbit/microbit-universal-hex": "0.2.2", "@radix-ui/react-context-menu": "2.2.16", - "@scratch/scratch-render": "13.0.2", - "@scratch/scratch-svg-renderer": "13.0.2", - "@scratch/scratch-vm": "13.0.2", + "@scratch/scratch-render": "13.1.0", + "@scratch/scratch-svg-renderer": "13.1.0", + "@scratch/scratch-vm": "13.1.0", "@tensorflow-models/face-detection": "1.0.3", "@tensorflow/tfjs": "4.22.0", "@testing-library/user-event": "14.6.1", @@ -35758,16 +35758,6 @@ "integrity": "sha512-sf7oGoLuaYAScB4VGr0tzetsYlS8EJH6qnTCfQ/WVEa89hALQ4RQfCKt5xCyPQKPDUbVUAIP1QsxAwfAjlDp7Q==", "extraneous": true }, - "packages/scratch-gui/node_modules/@scratch/scratch-vm/node_modules/immutable": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", - "integrity": "sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg==", - "extraneous": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "packages/scratch-gui/node_modules/@webpack-cli/configtest": { "version": "2.1.1", "dev": true, @@ -35882,10 +35872,10 @@ }, "packages/scratch-render": { "name": "@scratch/scratch-render", - "version": "13.0.2", + "version": "13.1.0", "license": "AGPL-3.0-only", "dependencies": { - "@scratch/scratch-svg-renderer": "13.0.2", + "@scratch/scratch-svg-renderer": "13.1.0", "grapheme-breaker": "0.3.2", "hull.js": "0.2.10", "ify-loader": "1.1.0", @@ -35898,7 +35888,7 @@ "@babel/core": "7.29.0", "@babel/polyfill": "7.12.1", "@babel/preset-env": "7.29.0", - "@scratch/scratch-vm": "13.0.2", + "@scratch/scratch-vm": "13.1.0", "babel-loader": "9.2.1", "copy-webpack-plugin": "6.4.1", "docdash": "0.4.0", @@ -36148,7 +36138,7 @@ }, "packages/scratch-svg-renderer": { "name": "@scratch/scratch-svg-renderer", - "version": "13.0.2", + "version": "13.1.0", "license": "AGPL-3.0-only", "dependencies": { "base64-js": "1.5.1", @@ -36326,11 +36316,11 @@ }, "packages/scratch-vm": { "name": "@scratch/scratch-vm", - "version": "13.0.2", + "version": "13.1.0", "license": "AGPL-3.0-only", "dependencies": { - "@scratch/scratch-render": "13.0.2", - "@scratch/scratch-svg-renderer": "13.0.2", + "@scratch/scratch-render": "13.1.0", + "@scratch/scratch-svg-renderer": "13.1.0", "@vernier/godirect": "1.8.3", "arraybuffer-loader": "1.0.8", "atob": "2.1.2", @@ -36458,7 +36448,7 @@ }, "packages/task-herder": { "name": "@scratch/task-herder", - "version": "13.0.2", + "version": "13.1.0", "license": "AGPL-3.0-only", "devDependencies": { "@vitest/coverage-v8": "4.0.18", diff --git a/package.json b/package.json index fe0877ceadd..e66d8621126 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "scratch-editor", - "version": "13.0.2", + "version": "13.1.0", "private": "true", "description": "Scratch editor mono-repository", "keywords": [], diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index 923ea754760..597df7f1f88 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -1,6 +1,6 @@ { "name": "@scratch/scratch-gui", - "version": "13.0.2", + "version": "13.1.0", "description": "Graphical User Interface for creating and running Scratch 3.0 projects", "keywords": [], "homepage": "https://github.com/scratchfoundation/scratch-gui#readme", @@ -112,9 +112,9 @@ "@mediapipe/face_detection": "0.4.1646425229", "@microbit/microbit-universal-hex": "0.2.2", "@radix-ui/react-context-menu": "2.2.16", - "@scratch/scratch-render": "13.0.2", - "@scratch/scratch-svg-renderer": "13.0.2", - "@scratch/scratch-vm": "13.0.2", + "@scratch/scratch-render": "13.1.0", + "@scratch/scratch-svg-renderer": "13.1.0", + "@scratch/scratch-vm": "13.1.0", "@tensorflow-models/face-detection": "1.0.3", "@tensorflow/tfjs": "4.22.0", "@testing-library/user-event": "14.6.1", diff --git a/packages/scratch-render/package.json b/packages/scratch-render/package.json index 78ffe7d33a9..40878f9d553 100644 --- a/packages/scratch-render/package.json +++ b/packages/scratch-render/package.json @@ -1,6 +1,6 @@ { "name": "@scratch/scratch-render", - "version": "13.0.2", + "version": "13.1.0", "description": "WebGL Renderer for Scratch 3.0", "keywords": [], "homepage": "https://github.com/scratchfoundation/scratch-render#readme", @@ -54,7 +54,7 @@ "allow-incomplete-coverage": true }, "dependencies": { - "@scratch/scratch-svg-renderer": "13.0.2", + "@scratch/scratch-svg-renderer": "13.1.0", "grapheme-breaker": "0.3.2", "hull.js": "0.2.10", "ify-loader": "1.1.0", @@ -67,7 +67,7 @@ "@babel/core": "7.29.0", "@babel/polyfill": "7.12.1", "@babel/preset-env": "7.29.0", - "@scratch/scratch-vm": "13.0.2", + "@scratch/scratch-vm": "13.1.0", "babel-loader": "9.2.1", "copy-webpack-plugin": "6.4.1", "docdash": "0.4.0", diff --git a/packages/scratch-svg-renderer/package.json b/packages/scratch-svg-renderer/package.json index 63103dd898f..62513bae9c8 100644 --- a/packages/scratch-svg-renderer/package.json +++ b/packages/scratch-svg-renderer/package.json @@ -1,6 +1,6 @@ { "name": "@scratch/scratch-svg-renderer", - "version": "13.0.2", + "version": "13.1.0", "description": "SVG renderer for Scratch", "keywords": [], "homepage": "https://github.com/scratchfoundation/scratch-svg-renderer#readme", diff --git a/packages/scratch-vm/package.json b/packages/scratch-vm/package.json index 8fd66f2dcec..be7fb6f4dc5 100644 --- a/packages/scratch-vm/package.json +++ b/packages/scratch-vm/package.json @@ -1,6 +1,6 @@ { "name": "@scratch/scratch-vm", - "version": "13.0.2", + "version": "13.1.0", "description": "Virtual Machine for Scratch 3.0", "keywords": [], "homepage": "https://github.com/scratchfoundation/scratch-vm#readme", @@ -60,8 +60,8 @@ "allow-incomplete-coverage": true }, "dependencies": { - "@scratch/scratch-render": "13.0.2", - "@scratch/scratch-svg-renderer": "13.0.2", + "@scratch/scratch-render": "13.1.0", + "@scratch/scratch-svg-renderer": "13.1.0", "@vernier/godirect": "1.8.3", "arraybuffer-loader": "1.0.8", "atob": "2.1.2", diff --git a/packages/task-herder/package.json b/packages/task-herder/package.json index 7d98c1dddbb..b300ec30fe3 100644 --- a/packages/task-herder/package.json +++ b/packages/task-herder/package.json @@ -1,6 +1,6 @@ { "name": "@scratch/task-herder", - "version": "13.0.2", + "version": "13.1.0", "description": "An asynchronous task runner with configurable rate limiting / throttling and concurrency control.", "keywords": [ "rate limit", From 45c293530605025af69ffafac7eeea721b9b7e24 Mon Sep 17 00:00:00 2001 From: Krum Angelov Date: Thu, 12 Mar 2026 15:56:16 +0200 Subject: [PATCH 301/521] chore: moved button in editor and added modal --- .../src/components/button/button.jsx | 5 +- .../confirmation-prompt.css | 66 +++++ .../confirmation-prompt.jsx | 240 ++++++++++++++++++ .../confirmation-prompt/icon--arrow-down.svg | 3 + .../confirmation-prompt/icon--arrow-left.svg | 3 + .../confirmation-prompt/icon--arrow-right.svg | 3 + .../confirmation-prompt/icon--arrow-up.svg | 13 + .../scratch-gui/src/components/gui/gui.jsx | 8 +- .../src/components/menu-bar/menu-bar.jsx | 57 +---- .../stage-header/icon--thumbnail.svg | 4 + .../components/stage-header/stage-header.css | 11 +- .../components/stage-header/stage-header.jsx | 92 +++++-- .../stage-wrapper/stage-wrapper.jsx | 3 + .../scratch-gui/src/lib/project-saver-hoc.jsx | 38 +-- 14 files changed, 433 insertions(+), 113 deletions(-) create mode 100644 packages/scratch-gui/src/components/confirmation-prompt/confirmation-prompt.css create mode 100644 packages/scratch-gui/src/components/confirmation-prompt/confirmation-prompt.jsx create mode 100644 packages/scratch-gui/src/components/confirmation-prompt/icon--arrow-down.svg create mode 100644 packages/scratch-gui/src/components/confirmation-prompt/icon--arrow-left.svg create mode 100644 packages/scratch-gui/src/components/confirmation-prompt/icon--arrow-right.svg create mode 100644 packages/scratch-gui/src/components/confirmation-prompt/icon--arrow-up.svg create mode 100644 packages/scratch-gui/src/components/stage-header/icon--thumbnail.svg diff --git a/packages/scratch-gui/src/components/button/button.jsx b/packages/scratch-gui/src/components/button/button.jsx index eb4a5bdd4e1..447f2ff8c0f 100644 --- a/packages/scratch-gui/src/components/button/button.jsx +++ b/packages/scratch-gui/src/components/button/button.jsx @@ -11,6 +11,7 @@ const ButtonComponent = ({ iconSrc, onClick, children, + componentRef, ...props }) => { @@ -33,6 +34,7 @@ const ButtonComponent = ({ className )} onClick={onClick} + ref={componentRef} {...props} > {icon} @@ -47,7 +49,8 @@ ButtonComponent.propTypes = { disabled: PropTypes.bool, iconClassName: PropTypes.string, iconSrc: PropTypes.string, - onClick: PropTypes.func + onClick: PropTypes.func, + componentRef: PropTypes.func }; export default ButtonComponent; diff --git a/packages/scratch-gui/src/components/confirmation-prompt/confirmation-prompt.css b/packages/scratch-gui/src/components/confirmation-prompt/confirmation-prompt.css new file mode 100644 index 00000000000..30d9cb69a1c --- /dev/null +++ b/packages/scratch-gui/src/components/confirmation-prompt/confirmation-prompt.css @@ -0,0 +1,66 @@ +@import "../../css/colors.css"; +@import "../../css/units.css"; + +.modal-container { + display: flex; + width: 200px; + padding: 12px; + flex-direction: column; + align-items: flex-start; + border-radius: 8px; + background: #855CD6; + gap: 15px; + box-sizing: border-box; +} + +.label { + align-self: stretch; + color: var(--White-White, #FFF); + text-align: center; + font-family: "Helvetica Neue"; + font-size: 16px; + font-style: normal; + font-weight: 700; + line-height: 24px; +} + +.button-row { + font-weight: bolder; + display: flex; + gap: 0.5rem; + width: 100%; +} + +.button-row button { + all: unset; + display: flex; + padding: 8px 16px; + justify-content: center; + align-items: center; + gap: 8px; + flex: 1 0 0; + border-radius: 40px; + background: inherit; + cursor: pointer; +} + +.button-row button span { + color: var(--white-white-100, #FFF); + font-family: "Helvetica Neue"; + font-size: 12px; + font-style: normal; + font-weight: 700; + line-height: 16px; +} + +.button-row button.confirm-button { + background: var(--White-White, #FFF); +} + +.button-row button.confirm-button span { + color: var(--Looks-Purple-2, #855CD6); +} + +.button-row button.cancel-button { + border: 1px solid var(--white-white-100, #FFF); +} diff --git a/packages/scratch-gui/src/components/confirmation-prompt/confirmation-prompt.jsx b/packages/scratch-gui/src/components/confirmation-prompt/confirmation-prompt.jsx new file mode 100644 index 00000000000..ce583a982c5 --- /dev/null +++ b/packages/scratch-gui/src/components/confirmation-prompt/confirmation-prompt.jsx @@ -0,0 +1,240 @@ +import React, {useRef, useCallback} from 'react'; +import PropTypes from 'prop-types'; +import ReactModal from 'react-modal'; +import {defineMessages, FormattedMessage, useIntl} from 'react-intl'; + +import Box from '../box/box.jsx'; + +import arrowLeftIcon from './icon--arrow-left.svg'; +import arrowRightIcon from './icon--arrow-right.svg'; +import arrowDownIcon from './icon--arrow-down.svg'; +import arrowUpIcon from './icon--arrow-up.svg'; + +import styles from './confirmation-prompt.css'; + +const messages = defineMessages({ + defaultConfirmLabel: { + defaultMessage: 'yes', + description: 'Label for confirm button in confirmation prompt', + id: 'gui.confirmationPrompt.confirm' + }, + defaultCancelLabel: { + defaultMessage: 'no', + description: 'Label for cancel button in confirmation prompt', + id: 'gui.confirmationPrompt.cancel' + } +}); + +const modalWidth = 200; +const spaceForArrow = 16; +const arrowOffsetFromEnd = 7; +const arrowLongSide = 29; +const arrowShortSide = 13; + +const calculateModalPosition = (relativeElemRef, modalRef, modalPosition) => { + const arrowHeight = (modalPosition === 'left' || modalPosition === 'right') ? + arrowLongSide : arrowShortSide; + const arrowWidth = (modalPosition === 'left' || modalPosition === 'right') ? + arrowShortSide : arrowLongSide; + + const el = relativeElemRef?.current; + const modalEl = modalRef?.current; + if (!el || !modalEl) { + return {}; + } + + const buttonRect = el.getBoundingClientRect(); + const modalRect = modalEl.getBoundingClientRect(); + const modalHeight = modalRect.height; + + let top = 0; + let left = 0; + let arrowIcon = null; + let arrowTop = 0; + let arrowLeft = 0; + + switch (modalPosition) { + case 'left': + top = buttonRect.top - (modalHeight / 2) + (buttonRect.height / 2); + left = buttonRect.left - modalWidth - spaceForArrow; + arrowIcon = arrowRightIcon; + arrowTop = buttonRect.top + (buttonRect.height / 2) - (arrowHeight / 2); + arrowLeft = left + modalWidth; + break; + case 'right': + top = buttonRect.top - (modalHeight / 2) + (buttonRect.height / 2); + left = buttonRect.right + spaceForArrow; + arrowIcon = arrowLeftIcon; + arrowTop = buttonRect.top + (buttonRect.height / 2) - (arrowHeight / 2); + arrowLeft = left - arrowWidth; + break; + case 'up': + top = buttonRect.top - modalHeight - spaceForArrow; + left = buttonRect.left - ((modalWidth - buttonRect.width) / 2); + arrowIcon = arrowDownIcon; + arrowTop = top + modalHeight; + arrowLeft = buttonRect.left + (buttonRect.width / 2) - (arrowWidth / 2); + break; + case 'down': + top = buttonRect.bottom + spaceForArrow; + left = buttonRect.left - ((modalWidth - buttonRect.width) / 2); + arrowIcon = arrowUpIcon; + arrowTop = top - arrowHeight; + arrowLeft = buttonRect.left + (buttonRect.width / 2) - (arrowWidth / 2); + break; + case 'down left': + top = buttonRect.bottom + spaceForArrow; + left = buttonRect.left - modalWidth + buttonRect.width + arrowOffsetFromEnd; + arrowIcon = arrowUpIcon; + arrowTop = top - arrowHeight; + arrowLeft = buttonRect.left + (buttonRect.width / 2) - (arrowWidth / 2); + break; + case 'down right': + top = buttonRect.bottom + spaceForArrow; + left = buttonRect.left - arrowOffsetFromEnd; + arrowIcon = arrowUpIcon; + arrowTop = top - arrowHeight; + arrowLeft = buttonRect.left + (buttonRect.width / 2) - (arrowWidth / 2); + break; + case 'up left': + top = buttonRect.top - modalHeight - spaceForArrow; + left = buttonRect.left - modalWidth + buttonRect.width + arrowOffsetFromEnd; + arrowIcon = arrowDownIcon; + arrowTop = top + modalHeight; + arrowLeft = buttonRect.left + (buttonRect.width / 2) - (arrowWidth / 2); + break; + case 'up right': + top = buttonRect.top - modalHeight - spaceForArrow; + left = buttonRect.left - arrowOffsetFromEnd; + arrowIcon = arrowDownIcon; + arrowTop = top + modalHeight; + arrowLeft = buttonRect.left + (buttonRect.width / 2) - (arrowWidth / 2); + break; + } + + return {top, left, arrowIcon, arrowTop, arrowLeft}; +}; + +const ConfirmationPrompt = ({ + title, + message, + confirmLabel, + cancelLabel, + onConfirm, + onCancel, + isOpen, + relativeElemRef, + modalPosition +}) => { + const intl = useIntl(); + + const modalRef = useRef(null); + const [modalPositionValues, setModalPositionValues] = React.useState({}); + + const onModalMount = useCallback(el => { + if (!el) return; + modalRef.current = el; + + if (isOpen && relativeElemRef.current) { + const pos = calculateModalPosition(relativeElemRef, modalRef, modalPosition); + setModalPositionValues(pos); + } + }, [isOpen, relativeElemRef, modalPosition]); + + return ( + isOpen && ( + + {modalPositionValues.arrowIcon && ( + + )} + + + + + + + + + + + + + ) + ); +}; + +ConfirmationPrompt.propTypes = { + isOpen: PropTypes.bool.isRequired, + title: PropTypes.string.isRequired, + message: PropTypes.string.isRequired, + confirmLabel: PropTypes.string, + cancelLabel: PropTypes.string, + onConfirm: PropTypes.func.isRequired, + onCancel: PropTypes.func.isRequired, + relativeElemRef: PropTypes.object.isRequired, + modalPosition: PropTypes.oneOf([ + 'left', + 'right', + 'up', + 'down', + 'down left', + 'down right', + 'up left', + 'up right' + ]).isRequired +}; + +export default ConfirmationPrompt; diff --git a/packages/scratch-gui/src/components/confirmation-prompt/icon--arrow-down.svg b/packages/scratch-gui/src/components/confirmation-prompt/icon--arrow-down.svg new file mode 100644 index 00000000000..5c932999e6e --- /dev/null +++ b/packages/scratch-gui/src/components/confirmation-prompt/icon--arrow-down.svg @@ -0,0 +1,3 @@ + + + diff --git a/packages/scratch-gui/src/components/confirmation-prompt/icon--arrow-left.svg b/packages/scratch-gui/src/components/confirmation-prompt/icon--arrow-left.svg new file mode 100644 index 00000000000..0712a6f88b8 --- /dev/null +++ b/packages/scratch-gui/src/components/confirmation-prompt/icon--arrow-left.svg @@ -0,0 +1,3 @@ + + + diff --git a/packages/scratch-gui/src/components/confirmation-prompt/icon--arrow-right.svg b/packages/scratch-gui/src/components/confirmation-prompt/icon--arrow-right.svg new file mode 100644 index 00000000000..cc59340dc3f --- /dev/null +++ b/packages/scratch-gui/src/components/confirmation-prompt/icon--arrow-right.svg @@ -0,0 +1,3 @@ + + + diff --git a/packages/scratch-gui/src/components/confirmation-prompt/icon--arrow-up.svg b/packages/scratch-gui/src/components/confirmation-prompt/icon--arrow-up.svg new file mode 100644 index 00000000000..110e25bc789 --- /dev/null +++ b/packages/scratch-gui/src/components/confirmation-prompt/icon--arrow-up.svg @@ -0,0 +1,13 @@ + + + + + + + + + \ No newline at end of file diff --git a/packages/scratch-gui/src/components/gui/gui.jsx b/packages/scratch-gui/src/components/gui/gui.jsx index 15ef41cb9f6..21209037045 100644 --- a/packages/scratch-gui/src/components/gui/gui.jsx +++ b/packages/scratch-gui/src/components/gui/gui.jsx @@ -259,10 +259,6 @@ const GUIComponent = props => { isRendererSupported={isRendererSupported} isRtl={isRtl} loading={loading} - manuallySaveThumbnails={ - manuallySaveThumbnails && - userOwnsProject - } onUpdateProjectThumbnail={onUpdateProjectThumbnail} stageSize={STAGE_SIZE_MODES.large} vm={vm} @@ -349,7 +345,6 @@ const GUIComponent = props => { canManageFiles={canManageFiles} canRemix={canRemix} canSave={canSave} - canUpdateThumbnail={userOwnsProject && manuallySaveThumbnails && !isPlayerOnly} canShare={canShare} className={styles.menuBarPosition} enableCommunity={enableCommunity} @@ -371,7 +366,6 @@ const GUIComponent = props => { onShare={onShare} onStartSelectingFileUpload={onStartSelectingFileUpload} onToggleLoginOpen={onToggleLoginOpen} - onUpdateProjectThumbnail={onUpdateProjectThumbnail} userOwnsProject={userOwnsProject} username={username} accountMenuOptions={accountMenuOptions} @@ -547,6 +541,8 @@ const GUIComponent = props => { vm={vm} ariaRole="region" ariaLabel={intl.formatMessage(ariaMessages.stage)} + manuallySaveThumbnails={manuallySaveThumbnails} + isInEditor /> { - console.log('Updating thumbnail...'); - this.props.onUpdateProjectThumbnail( - projectId, - dataURItoBlob(dataURI) - ); - console.log('After dispatch'); - }); - } handleClickSeeCommunity (waitForUpdate) { if (this.props.shouldSaveBeforeTransition()) { this.props.autoUpdateProject(); // save before transitioning to project page @@ -410,13 +385,6 @@ class MenuBar extends React.Component { }; } render () { - const updateThumbnailMessage = ( - - ); const saveNowMessage = ( - {(this.props.canSave || this.props.canCreateCopy || - this.props.canRemix || this.props.canUpdateThumbnail) && ( + {(this.props.canSave || this.props.canCreateCopy || this.props.canRemix) && ( {this.props.canSave && ( @@ -546,11 +513,6 @@ class MenuBar extends React.Component { {remixMessage} )} - {this.props.canUpdateThumbnail && ( - - {updateThumbnailMessage} - - )} )} @@ -958,7 +920,6 @@ MenuBar.propTypes = { canManageFiles: PropTypes.bool, canRemix: PropTypes.bool, canSave: PropTypes.bool, - canUpdateThumbnail: PropTypes.bool, canShare: PropTypes.bool, className: PropTypes.string, confirmReadyToReplaceProject: PropTypes.func, @@ -982,7 +943,6 @@ MenuBar.propTypes = { mode220022BC: PropTypes.bool, modeMenuOpen: PropTypes.bool, modeNow: PropTypes.bool, - projectId: PropTypes.number.isRequired, onClickAbout: PropTypes.oneOfType([ PropTypes.func, // button mode: call this callback when the About button is clicked PropTypes.arrayOf( // menu mode: list of items in the About menu @@ -1021,7 +981,6 @@ MenuBar.propTypes = { onShare: PropTypes.func, onStartSelectingFileUpload: PropTypes.func, onToggleLoginOpen: PropTypes.func, - onUpdateProjectThumbnail: PropTypes.func, platform: PropTypes.oneOf(Object.keys(PLATFORM)), projectTitle: PropTypes.string, renderLogin: PropTypes.func, @@ -1034,10 +993,7 @@ MenuBar.propTypes = { accountMenuOptions: AccountMenuOptionsPropTypes, - vm: PropTypes.instanceOf(VM).isRequired, - - - storage: GUIStoragePropType, + vm: PropTypes.instanceOf(VM).isRequired }; MenuBar.defaultProps = { @@ -1050,7 +1006,6 @@ const mapStateToProps = (state, ownProps) => { const user = state.session && state.session.session && state.session.session.user; const permissions = state.session && state.session.permissions; const sessionExists = state.session && typeof state.session.session !== 'undefined'; - const storage = state.scratchGui.config.storage; return { aboutMenuOpen: aboutMenuOpen(state), @@ -1075,10 +1030,6 @@ const mapStateToProps = (state, ownProps) => { mode1990: isTimeTravel1990(state), mode2020: isTimeTravel2020(state), modeNow: isTimeTravelNow(state), - projectId: state.scratchGui.projectState.projectId, - onUpdateProjectThumbnail: - ownProps.onUpdateProjectThumbnail ?? - storage.saveProjectThumbnail?.bind(storage), platform: state.scratchGui.platform.platform, @@ -1099,9 +1050,7 @@ const mapStateToProps = (state, ownProps) => { myClassesUrl: permissions?.educator ? '/educators/classes/' : null, myClassUrl: user && permissions?.student ? `/classes/${user.classroomId}/` : null, accountSettingsUrl: '/accounts/settings/' - }, - - storage + } }; }; diff --git a/packages/scratch-gui/src/components/stage-header/icon--thumbnail.svg b/packages/scratch-gui/src/components/stage-header/icon--thumbnail.svg new file mode 100644 index 00000000000..b2986770bf9 --- /dev/null +++ b/packages/scratch-gui/src/components/stage-header/icon--thumbnail.svg @@ -0,0 +1,4 @@ + + + + diff --git a/packages/scratch-gui/src/components/stage-header/stage-header.css b/packages/scratch-gui/src/components/stage-header/stage-header.css index 3b82aae0d7c..9ef095c2682 100644 --- a/packages/scratch-gui/src/components/stage-header/stage-header.css +++ b/packages/scratch-gui/src/components/stage-header/stage-header.css @@ -34,6 +34,7 @@ .stage-size-row { display: flex; + gap: 0.25rem; } .stage-size-toggle-group { @@ -46,14 +47,6 @@ border-radius: $form-radius; } -[dir="ltr"] .stage-size-toggle-group { - margin-right: .2rem; -} - -[dir="rtl"] .stage-size-toggle-group { - margin-left: .2rem; -} - .stage-button { display: block; border: 1px solid $ui-black-transparent; @@ -85,7 +78,7 @@ align-items: center; gap: 0.5rem; background-color: transparent; - + .setThumbnailButton { padding: 0.625rem 0.75rem; font-size: 0.75rem; diff --git a/packages/scratch-gui/src/components/stage-header/stage-header.jsx b/packages/scratch-gui/src/components/stage-header/stage-header.jsx index 5c69607fd97..264d7fa35ba 100644 --- a/packages/scratch-gui/src/components/stage-header/stage-header.jsx +++ b/packages/scratch-gui/src/components/stage-header/stage-header.jsx @@ -1,6 +1,6 @@ -import {FormattedMessage, defineMessages, useIntl} from 'react-intl'; +import {defineMessages, useIntl} from 'react-intl'; import PropTypes from 'prop-types'; -import React, {useCallback} from 'react'; +import React, {useCallback, useRef} from 'react'; import {connect} from 'react-redux'; import VM from '@scratch/scratch-vm'; @@ -21,6 +21,12 @@ import styles from './stage-header.css'; import {storeProjectThumbnail} from '../../lib/store-project-thumbnail.js'; import dataURItoBlob from '../../lib/data-uri-to-blob.js'; import throttle from 'lodash.throttle'; +import thumbnailIcon from './icon--thumbnail.svg'; +import { + getIsShowingWithId, + getIsUpdating +} from '../../reducers/project-state.js'; +import ConfirmationPrompt from '../confirmation-prompt/confirmation-prompt.jsx'; const messages = defineMessages({ largeStageSizeMessage: { @@ -48,6 +54,11 @@ const messages = defineMessages({ description: 'Manually save project thumbnail', id: 'gui.stageHeader.saveThumbnail' }, + setThumbnailMessage: { + defaultMessage: 'Are you sure you want to set your thumbnail?', + description: 'Confirmation message for manually saving project thumbnail', + id: 'gui.stageHeader.saveThumbnailMessage' + }, fullscreenControl: { defaultMessage: 'Full Screen Control', description: 'Button to enter/exit full screen mode', @@ -69,12 +80,16 @@ const StageHeaderComponent = function (props) { projectId, showBranding, stageSizeMode, - vm + vm, + isInEditor, + isProjectLoaded } = props; const intl = useIntl(); let header = null; + const [isThumbnailPromptOpen, setIsThumbnailPromptOpen] = React.useState(false); + const onUpdateThumbnail = useCallback( throttle( () => { @@ -91,6 +106,21 @@ const StageHeaderComponent = function (props) { [projectId, onUpdateProjectThumbnail] ); + const onThumbnailPromptOpen = useCallback(() => { + setIsThumbnailPromptOpen(true); + }, []); + + const onThumbnailPromptClose = useCallback(() => { + setIsThumbnailPromptOpen(false); + }, []); + + const onUpdateThumbnailAndClose = useCallback(() => { + onUpdateThumbnail(); + onThumbnailPromptClose(); + }, [onUpdateThumbnail]); + + const thumbnailButtonRef = useRef(null); + if (isFullScreen) { const stageDimensions = getStageDimensions(null, true); const stageButton = showBranding ? ( @@ -165,17 +195,32 @@ const StageHeaderComponent = function (props) {

+ {manuallySaveThumbnails && isInEditor && isProjectLoaded && ( + + )} + {stageControls}
- {manuallySaveThumbnails && ( - - )}
)); SaveStatus.propTypes = { alertsList: PropTypes.arrayOf(PropTypes.object), onClickSave: PropTypes.func, - projectChanged: PropTypes.bool, - formattedMessage: PropTypes.string + projectChanged: PropTypes.bool }; const mapStateToProps = state => ({ diff --git a/packages/scratch-gui/src/components/stage-header/stage-header.css b/packages/scratch-gui/src/components/stage-header/stage-header.css index 9ef095c2682..04c556e6e9c 100644 --- a/packages/scratch-gui/src/components/stage-header/stage-header.css +++ b/packages/scratch-gui/src/components/stage-header/stage-header.css @@ -78,7 +78,7 @@ align-items: center; gap: 0.5rem; background-color: transparent; - + .setThumbnailButton { padding: 0.625rem 0.75rem; font-size: 0.75rem; diff --git a/packages/scratch-gui/src/components/stage-header/stage-header.jsx b/packages/scratch-gui/src/components/stage-header/stage-header.jsx index 5e6cf399c4d..a634999aaf8 100644 --- a/packages/scratch-gui/src/components/stage-header/stage-header.jsx +++ b/packages/scratch-gui/src/components/stage-header/stage-header.jsx @@ -88,7 +88,7 @@ const StageHeaderComponent = function (props) { vm, isInEditor, isProjectLoaded, - isOwner, + userOwnsProject, showThumbnailSetting, showThumbnailSuccess, showThumbnailError @@ -209,7 +209,7 @@ const StageHeaderComponent = function (props) {
- {manuallySaveThumbnails && isInEditor && isProjectLoaded && isOwner && ( + {manuallySaveThumbnails && isInEditor && isProjectLoaded && userOwnsProject && (