From 8a8c633fec899154910986a2240427d0ab44be78 Mon Sep 17 00:00:00 2001 From: Aaron Dodson Date: Mon, 22 Apr 2024 10:35:29 -0700 Subject: [PATCH 001/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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/135] 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 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 086/135] 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 087/135] fix: Fix test failures. (#10) From a9110b710cde295347ebd73545d6c6db09be9e71 Mon Sep 17 00:00:00 2001 From: Ayshe Dzhindzhi Date: Thu, 12 Feb 2026 16:49:08 +0200 Subject: [PATCH 088/135] fix: only attempt to blur when the currently focused element is the Costume tab --- packages/scratch-gui/src/containers/costume-tab.jsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/scratch-gui/src/containers/costume-tab.jsx b/packages/scratch-gui/src/containers/costume-tab.jsx index 196474fd205..992cbed9e61 100644 --- a/packages/scratch-gui/src/containers/costume-tab.jsx +++ b/packages/scratch-gui/src/containers/costume-tab.jsx @@ -113,7 +113,9 @@ class CostumeTab extends React.Component { } componentDidMount () { this.handleDocumentClick = () => { - if (document.activeElement !== document.body) { + // If the costume tab is focused and the user clicks outside of it, unfocus the costume tab. + // This is to prevent keypresses from affecting the tabs when users try to interact with the paint editor + if (document.activeElement instanceof HTMLLIElement && document.activeElement.role === 'tab') { document.activeElement.blur(); } }; From f5810908628139aeb7648abca16c827e84569beb Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 15 Feb 2026 17:39:55 +0000 Subject: [PATCH 089/135] chore(deps): update dependency webpack to v5.105.2 --- package-lock.json | 20 ++++++++++---------- 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, 14 insertions(+), 14 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9184c88f7f4..66509da1943 100644 --- a/package-lock.json +++ b/package-lock.json @@ -41801,9 +41801,9 @@ "license": "BSD-2-Clause" }, "node_modules/webpack": { - "version": "5.105.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.105.1.tgz", - "integrity": "sha512-Gdj3X74CLJJ8zy4URmK42W7wTZUJrqL+z8nyGEr4dTN0kb3nVs+ZvjbTOqRYPD7qX4tUmwyHL9Q9K6T1seW6Yw==", + "version": "5.105.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.105.2.tgz", + "integrity": "sha512-dRXm0a2qcHPUBEzVk8uph0xWSjV/xZxenQQbLwnwP7caQCYpqG1qddwlyEkIDkYn0K8tvmcrZ+bOrzoQ3HxCDw==", "license": "MIT", "dependencies": { "@types/eslint-scope": "^3.7.7", @@ -42144,9 +42144,9 @@ } }, "node_modules/webpack/node_modules/webpack-sources": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", - "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.4.tgz", + "integrity": "sha512-7tP1PdV4vF+lYPnkMR0jMY5/la2ub5Fc/8VQrrU+lXkiM6C4TjVfGw7iKfyhnTQOsD+6Q/iKw0eFciziRgD58Q==", "license": "MIT", "engines": { "node": ">=10.13.0" @@ -42896,7 +42896,7 @@ "ts-loader": "9.5.4", "url-loader": "4.1.1", "web-audio-test-api": "0.5.2", - "webpack": "5.105.1", + "webpack": "5.105.2", "webpack-cli": "5.1.4", "webpack-dev-server": "5.2.3", "yauzl": "3.2.0" @@ -42967,7 +42967,7 @@ "tap": "21.5.1", "terser-webpack-plugin": "5.3.16", "typedoc": "0.28.16", - "webpack": "5.105.1", + "webpack": "5.105.2", "webpack-cli": "5.1.4", "webpack-dev-server": "5.2.3" }, @@ -43131,7 +43131,7 @@ "scratch-webpack-configuration": "3.1.1", "semantic-release": "25.0.3", "tap": "21.5.1", - "webpack": "5.105.1", + "webpack": "5.105.2", "webpack-cli": "5.1.4", "webpack-dev-server": "5.2.3", "xmldom": "0.1.31" @@ -43228,7 +43228,7 @@ "tap": "21.5.1", "tiny-worker": "2.3.0", "typedoc": "0.28.16", - "webpack": "5.105.1", + "webpack": "5.105.2", "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 776e789c79f..0e5535baa8a 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.1", + "webpack": "5.105.2", "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 068b70ce666..5bd4fa2bf47 100644 --- a/packages/scratch-render/package.json +++ b/packages/scratch-render/package.json @@ -85,7 +85,7 @@ "tap": "21.5.1", "terser-webpack-plugin": "5.3.16", "typedoc": "0.28.16", - "webpack": "5.105.1", + "webpack": "5.105.2", "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 91dc4500c09..ea0fff27d37 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.5.1", - "webpack": "5.105.1", + "webpack": "5.105.2", "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 cb083c1baac..6735c00018e 100644 --- a/packages/scratch-vm/package.json +++ b/packages/scratch-vm/package.json @@ -110,7 +110,7 @@ "tap": "21.5.1", "tiny-worker": "2.3.0", "typedoc": "0.28.16", - "webpack": "5.105.1", + "webpack": "5.105.2", "webpack-cli": "4.10.0", "webpack-dev-server": "5.2.3" } From e084e0bab238eee19a97d1100048943a4346f281 Mon Sep 17 00:00:00 2001 From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com> Date: Thu, 19 Feb 2026 11:52:13 -0800 Subject: [PATCH 090/135] style: fix scratch-vm lint --- packages/scratch-vm/src/engine/blocks.js | 32 +++++++++++------------ packages/scratch-vm/src/engine/runtime.js | 10 +++---- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/packages/scratch-vm/src/engine/blocks.js b/packages/scratch-vm/src/engine/blocks.js index 0c47aa26f86..95813ebf753 100644 --- a/packages/scratch-vm/src/engine/blocks.js +++ b/packages/scratch-vm/src/engine/blocks.js @@ -464,13 +464,13 @@ class Blocks { break; case 'var_delete': { const target = - editingTarget && + editingTarget && Object.prototype.hasOwnProperty.call( editingTarget.variables, e.varId ) ? - editingTarget : - stage; + editingTarget : + stage; target.deleteVariable(e.varId); this.emitProjectChanged(); break; @@ -733,18 +733,18 @@ class Blocks { if (block.opcode === 'sensing_of_object_menu') { if (block.fields.OBJECT.value === '_stage_') { this._blocks[block.parent].fields.PROPERTY.value = - 'backdrop #'; + 'backdrop #'; } else { this._blocks[block.parent].fields.PROPERTY.value = - 'x position'; + 'x position'; } this.runtime.requestBlocksUpdate(); } const flyoutBlock = - block.shadow && block.parent ? - this._blocks[block.parent] : - block; + block.shadow && block.parent ? + this._blocks[block.parent] : + block; if (flyoutBlock.isMonitored) { this.runtime.requestUpdateMonitor( Map({ @@ -795,18 +795,18 @@ class Blocks { let isSpriteLocalVariable = false; if (block.opcode === 'data_variable') { isSpriteLocalVariable = - !this.runtime.getTargetForStage().variables[ - block.fields.VARIABLE.id - ]; + !this.runtime.getTargetForStage().variables[ + block.fields.VARIABLE.id + ]; } else if (block.opcode === 'data_listcontents') { isSpriteLocalVariable = - !this.runtime.getTargetForStage().variables[ - block.fields.LIST.id - ]; + !this.runtime.getTargetForStage().variables[ + block.fields.LIST.id + ]; } const isSpriteSpecific = - isSpriteLocalVariable || + isSpriteLocalVariable || (Object.prototype.hasOwnProperty.call( this.runtime.monitorBlockInfo, block.opcode @@ -818,7 +818,7 @@ class Blocks { // 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; + block.targetId || this.runtime.getEditingTarget().id; } else { block.targetId = null; } diff --git a/packages/scratch-vm/src/engine/runtime.js b/packages/scratch-vm/src/engine/runtime.js index 13668f9ad9b..674dbe41df8 100644 --- a/packages/scratch-vm/src/engine/runtime.js +++ b/packages/scratch-vm/src/engine/runtime.js @@ -1197,7 +1197,7 @@ class Runtime extends EventEmitter { switch (blockInfo.blockType) { case BlockType.COMMAND: blockJSON.outputShape = - ScratchBlocksConstants.OUTPUT_SHAPE_SQUARE; + ScratchBlocksConstants.OUTPUT_SHAPE_SQUARE; blockJSON.previousStatement = null; // null = available connection; undefined = hat if (!blockInfo.isTerminal) { blockJSON.nextStatement = null; // null = available connection; undefined = terminal @@ -1206,12 +1206,12 @@ class Runtime extends EventEmitter { case BlockType.REPORTER: blockJSON.output = 'String'; // TODO: distinguish number & string here? blockJSON.outputShape = - ScratchBlocksConstants.OUTPUT_SHAPE_ROUND; + ScratchBlocksConstants.OUTPUT_SHAPE_ROUND; break; case BlockType.BOOLEAN: blockJSON.output = 'Boolean'; blockJSON.outputShape = - ScratchBlocksConstants.OUTPUT_SHAPE_HEXAGONAL; + ScratchBlocksConstants.OUTPUT_SHAPE_HEXAGONAL; break; case BlockType.HAT: case BlockType.EVENT: @@ -1225,7 +1225,7 @@ class Runtime extends EventEmitter { blockInfo.isEdgeActivated = true; } blockJSON.outputShape = - ScratchBlocksConstants.OUTPUT_SHAPE_SQUARE; + ScratchBlocksConstants.OUTPUT_SHAPE_SQUARE; blockJSON.nextStatement = null; // null = available connection; undefined = terminal blockJSON.extensions.push('shape_hat'); break; @@ -1233,7 +1233,7 @@ class Runtime extends EventEmitter { case BlockType.LOOP: blockInfo.branchCount = blockInfo.branchCount || 1; blockJSON.outputShape = - ScratchBlocksConstants.OUTPUT_SHAPE_SQUARE; + ScratchBlocksConstants.OUTPUT_SHAPE_SQUARE; blockJSON.previousStatement = null; // null = available connection; undefined = hat if (!blockInfo.isTerminal) { blockJSON.nextStatement = null; // null = available connection; undefined = terminal From b17d293651cb3f476265f47bd21bfa0cd1965e12 Mon Sep 17 00:00:00 2001 From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com> Date: Thu, 19 Feb 2026 13:58:04 -0800 Subject: [PATCH 091/135] style: match formatting in develop to reduce diff noise --- packages/scratch-vm/src/engine/blocks.js | 396 ++++----------- packages/scratch-vm/src/engine/runtime.js | 575 +++++++--------------- 2 files changed, 281 insertions(+), 690 deletions(-) diff --git a/packages/scratch-vm/src/engine/blocks.js b/packages/scratch-vm/src/engine/blocks.js index 95813ebf753..c1897d36fda 100644 --- a/packages/scratch-vm/src/engine/blocks.js +++ b/packages/scratch-vm/src/engine/blocks.js @@ -45,10 +45,7 @@ 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 @@ -132,7 +129,7 @@ class Blocks { */ getNextBlock (id) { const block = this._blocks[id]; - return typeof block === 'undefined' ? null : block.next; + return (typeof block === 'undefined') ? null : block.next; } /** @@ -153,7 +150,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; } /** @@ -162,7 +159,7 @@ class Blocks { * @returns {?string} the opcode corresponding to that block */ getOpcode (block) { - return typeof block === 'undefined' ? null : block.opcode; + return (typeof block === 'undefined') ? null : block.opcode; } /** @@ -171,7 +168,7 @@ class Blocks { * @returns {?object} All fields and their values. */ getFields (block) { - return typeof block === 'undefined' ? null : block.fields; + return (typeof block === 'undefined') ? null : block.fields; } /** @@ -189,10 +186,8 @@ class Blocks { 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]; } } @@ -207,7 +202,7 @@ class Blocks { * @returns {?object} Mutation for the block. */ getMutation (block) { - return typeof block === 'undefined' ? null : block.mutation; + return (typeof block === 'undefined') ? null : block.mutation; } /** @@ -236,9 +231,7 @@ class Blocks { } 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') { const internal = this._getCustomBlockInternal(block); @@ -274,14 +267,10 @@ class Blocks { } 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); @@ -312,11 +301,8 @@ class Blocks { 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.blockId !== 'string' && typeof e.varId !== 'string' && + typeof e.commentId !== 'string') { return; } const stage = this.runtime.getTargetForStage(); @@ -365,13 +351,8 @@ class Blocks { 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 - ) { + 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. @@ -388,18 +369,9 @@ class Blocks { // 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 (e.isLocal && editingTarget && !editingTarget.isStage && !e.isCloud) { if (!editingTarget.lookupVariableById(e.varId)) { - editingTarget.createVariable( - e.varId, - e.varName, - e.varType - ); + editingTarget.createVariable(e.varId, e.varName, e.varType); this.emitProjectChanged(); } } else { @@ -408,45 +380,23 @@ class Blocks { return; } // Check for name conflicts in all of the targets - const allTargets = this.runtime.targets.filter( - t => t.isOriginal - ); + const allTargets = this.runtime.targets.filter(t => t.isOriginal); for (const target of allTargets) { - if ( - target.lookupVariableByNameAndType( - e.varName, - e.varType, - true - ) - ) { + if (target.lookupVariableByNameAndType(e.varName, e.varType, true)) { return; } } - stage.createVariable( - e.varId, - e.varName, - e.varType, - e.isCloud - ); + 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 - ) - ) { + 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 - ); + editingTarget.blocks.updateBlocksAfterVarRename(e.varId, e.newName); } else { // This is a global variable stage.renameVariable(e.varId, e.newName); @@ -454,23 +404,14 @@ class Blocks { const targets = this.runtime.targets; for (let i = 0; i < targets.length; i++) { const currTarget = targets[i]; - currTarget.blocks.updateBlocksAfterVarRename( - e.varId, - e.newName - ); + 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; + const target = (editingTarget && Object.prototype.hasOwnProperty.call(editingTarget.variables, e.varId)) ? + editingTarget : stage; target.deleteVariable(e.varId); this.emitProjectChanged(); break; @@ -479,21 +420,11 @@ class Blocks { 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 - ); + 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 - ) { + 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 @@ -510,15 +441,8 @@ class Blocks { 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.` - ); + 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]; @@ -530,16 +454,8 @@ class Blocks { 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.` - ); + 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]; @@ -597,12 +513,7 @@ class Blocks { case 'comment_delete': if (this.runtime.getEditingTarget()) { const currTarget = this.runtime.getEditingTarget(); - if ( - !Object.prototype.hasOwnProperty.call( - currTarget.comments, - e.commentId - ) - ) { + 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 @@ -613,9 +524,7 @@ class Blocks { 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}` - ); + log.warn(`Could not find block referenced by comment with id: ${e.commentId}`); return; } delete block.comment; @@ -692,9 +601,7 @@ class Blocks { */ 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; switch (args.element) { @@ -708,17 +615,13 @@ class Blocks { // 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' - ) { + 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); + const variable = this.runtime.getEditingTarget().lookupVariableById(args.value); if (variable) { block.fields[args.name].value = variable.name; block.fields[args.name].id = args.value; @@ -732,26 +635,19 @@ class Blocks { // TODO: (#1787) if (block.opcode === 'sensing_of_object_menu') { if (block.fields.OBJECT.value === '_stage_') { - this._blocks[block.parent].fields.PROPERTY.value = - 'backdrop #'; + this._blocks[block.parent].fields.PROPERTY.value = 'backdrop #'; } else { - this._blocks[block.parent].fields.PROPERTY.value = - 'x position'; + this._blocks[block.parent].fields.PROPERTY.value = 'x position'; } this.runtime.requestBlocksUpdate(); } - const flyoutBlock = - block.shadow && block.parent ? - this._blocks[block.parent] : - block; + 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) - }) - ); + this.runtime.requestUpdateMonitor(Map({ + id: flyoutBlock.id, + params: this._getBlockParams(flyoutBlock) + })); } } break; @@ -762,20 +658,14 @@ class Blocks { // 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' - ) { + 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 // 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 - ); + const newId = getMonitorIdForBlockWithArgs(block.id, block.fields); // check if a block with the new id already exists, otherwise create let newBlock = this.runtime.monitorBlocks.getBlock(newId); @@ -794,31 +684,19 @@ class Blocks { // 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 - ]; + isSpriteLocalVariable = !(this.runtime.getTargetForStage().variables[block.fields.VARIABLE.id]); } else if (block.opcode === 'data_listcontents') { - isSpriteLocalVariable = - !this.runtime.getTargetForStage().variables[ - block.fields.LIST.id - ]; + 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); + 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; + block.targetId = block.targetId || this.runtime.getEditingTarget().id; } else { block.targetId = null; } @@ -828,25 +706,16 @@ class Blocks { } 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' - }) - ); + 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; @@ -875,8 +744,8 @@ 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; @@ -885,10 +754,8 @@ class Blocks { // Remove from any old parent. if (typeof e.oldParent !== 'undefined') { const oldParent = this._blocks[e.oldParent]; - if ( - typeof e.oldInput !== 'undefined' && - oldParent.inputs[e.oldInput].block === e.id - ) { + if (typeof e.oldInput !== 'undefined' && + oldParent.inputs[e.oldInput].block === e.id) { // 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. @@ -926,14 +793,8 @@ class Blocks { // 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 @@ -955,6 +816,7 @@ class Blocks { if (didChange) this.emitProjectChanged(); } + /** * Block management: run all blocks. * @param {!object} runtime Runtime to run all blocks in. @@ -967,9 +829,7 @@ class Blocks { const targetId = this.getBlock(blockId).targetId; return { blockId, - target: targetId ? - runtime.getTargetById(targetId) : - null + target: targetId ? runtime.getTargetById(targetId) : null }; }); } @@ -1008,10 +868,8 @@ 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); } } @@ -1057,10 +915,7 @@ 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; } @@ -1072,12 +927,10 @@ class Blocks { type: varType }); } else { - allReferences[currVarId] = [ - { - referencingField: varOrListField, - type: varType - } - ]; + allReferences[currVarId] = [{ + referencingField: varOrListField, + type: varType + }]; } } } @@ -1114,15 +967,9 @@ class Blocks { updateTargetSpecificBlocks (isStage) { const blocks = this._blocks; for (const blockId in blocks) { - if ( - isStage && - 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' - ) { + } else if (!isStage && blocks[blockId].opcode === 'event_whenstageclicked') { blocks[blockId].opcode = 'event_whenthisspriteclicked'; } } @@ -1172,12 +1019,10 @@ class 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; @@ -1198,10 +1043,7 @@ class Blocks { */ _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; @@ -1216,10 +1058,7 @@ class Blocks { */ _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; @@ -1234,10 +1073,7 @@ class Blocks { */ _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; @@ -1255,15 +1091,8 @@ class Blocks { 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)) { @@ -1282,9 +1111,7 @@ class Blocks { * @returns {string} String of XML representing this object's blocks. */ toXML (comments) { - return this._scripts - .map(script => this.blockToXML(script, comments)) - .join(); + return this._scripts.map(script => this.blockToXML(script, comments)).join(); } /** @@ -1301,8 +1128,9 @@ class Blocks { // 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}"` : ''} @@ -1313,14 +1141,10 @@ 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. @@ -1329,9 +1153,7 @@ 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) { @@ -1339,10 +1161,7 @@ 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); } @@ -1351,9 +1170,7 @@ class Blocks { } // 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 += `${this.blockToXML( - block.next, - comments - )}`; + xmlString += `${this.blockToXML(block.next, comments)}`; } xmlString += ``; return xmlString; @@ -1390,10 +1204,8 @@ class Blocks { 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]; + let mutationValue = (typeof mutation[prop] === 'string') ? + xmlEscape(mutation[prop]) : mutation[prop]; // Handle dynamic extension blocks if (prop === 'blockInfo') { diff --git a/packages/scratch-vm/src/engine/runtime.js b/packages/scratch-vm/src/engine/runtime.js index 674dbe41df8..1b32e2f662f 100644 --- a/packages/scratch-vm/src/engine/runtime.js +++ b/packages/scratch-vm/src/engine/runtime.js @@ -389,8 +389,7 @@ 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 @@ -398,8 +397,7 @@ 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 @@ -747,24 +745,24 @@ class Runtime extends EventEmitter { // Helper function for initializing the addCloudVariable function _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 () => { + return (() => { const hadCloudVarsBefore = this.hasCloudData(); newCloudDataManager.removeCloudVariable(); if (hadCloudVarsBefore && !this.hasCloudData()) { this.emit(Runtime.HAS_CLOUD_DATA_UPDATE, false); } - }; + }); } /** @@ -774,26 +772,14 @@ class Runtime extends EventEmitter { */ _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); } @@ -803,23 +789,14 @@ 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()); } } } @@ -849,9 +826,7 @@ class Runtime extends EventEmitter { 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); } } @@ -884,14 +859,8 @@ 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, { @@ -910,9 +879,7 @@ class Runtime extends EventEmitter { * @private */ _refreshExtensionPrimitives (extensionInfo) { - const categoryInfo = this._blockInfo.find( - info => info.id === extensionInfo.id - ); + const categoryInfo = this._blockInfo.find(info => info.id === extensionInfo.id); if (categoryInfo) { categoryInfo.name = maybeFormatMessage(extensionInfo.name); this._fillExtensionCategory(categoryInfo, extensionInfo); @@ -935,29 +902,15 @@ class Runtime extends EventEmitter { 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, @@ -972,32 +925,22 @@ 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}); } } } @@ -1013,25 +956,14 @@ class Runtime extends EventEmitter { if (typeof menuItems !== 'function') { const extensionMessageContext = this.makeMessageContextForTarget(); return menuItems.map(item => { - const formattedItem = maybeFormatMessage( - item, - extensionMessageContext - ); + const formattedItem = maybeFormatMessage(item, extensionMessageContext); switch (typeof formattedItem) { case 'string': return [formattedItem, formattedItem]; case 'object': - return [ - maybeFormatMessage( - item.text, - extensionMessageContext - ), - item.value - ]; + return [maybeFormatMessage(item.text, extensionMessageContext), item.value]; default: - throw new Error( - `Can't interpret menu item: ${JSON.stringify(item)}` - ); + throw new Error(`Can't interpret menu item: ${JSON.stringify(item)}`); } }); } @@ -1059,8 +991,7 @@ class Runtime extends EventEmitter { output: 'String', style: categoryInfo.id, outputShape: menuInfo.acceptReporters ? - ScratchBlocksConstants.OUTPUT_SHAPE_ROUND : - ScratchBlocksConstants.OUTPUT_SHAPE_SQUARE, + ScratchBlocksConstants.OUTPUT_SHAPE_ROUND : ScratchBlocksConstants.OUTPUT_SHAPE_SQUARE, args0: [ { type: 'field_dropdown', @@ -1102,12 +1033,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 ( - fieldName, - output, - outputShape, - categoryInfo - ) { + _buildCustomFieldTypeForScratchBlocks (fieldName, output, outputShape, categoryInfo) { return { json: { type: fieldName, @@ -1191,13 +1117,15 @@ class Runtime extends EventEmitter { const separatorJSON = { 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.outputShape = ScratchBlocksConstants.OUTPUT_SHAPE_SQUARE; blockJSON.previousStatement = null; // null = available connection; undefined = hat if (!blockInfo.isTerminal) { blockJSON.nextStatement = null; // null = available connection; undefined = terminal @@ -1205,35 +1133,26 @@ class Runtime extends EventEmitter { break; case BlockType.REPORTER: blockJSON.output = 'String'; // TODO: distinguish number & string here? - blockJSON.outputShape = - ScratchBlocksConstants.OUTPUT_SHAPE_ROUND; + blockJSON.outputShape = ScratchBlocksConstants.OUTPUT_SHAPE_ROUND; break; case BlockType.BOOLEAN: blockJSON.output = 'Boolean'; - blockJSON.outputShape = - ScratchBlocksConstants.OUTPUT_SHAPE_HEXAGONAL; + blockJSON.outputShape = ScratchBlocksConstants.OUTPUT_SHAPE_HEXAGONAL; break; case BlockType.HAT: case BlockType.EVENT: - if ( - !Object.prototype.hasOwnProperty.call( - blockInfo, - 'isEdgeActivated' - ) - ) { + if (!Object.prototype.hasOwnProperty.call(blockInfo, 'isEdgeActivated')) { // if absent, this property defaults to true blockInfo.isEdgeActivated = true; } - blockJSON.outputShape = - ScratchBlocksConstants.OUTPUT_SHAPE_SQUARE; + 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 = - ScratchBlocksConstants.OUTPUT_SHAPE_SQUARE; + 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 @@ -1241,33 +1160,19 @@ class Runtime extends EventEmitter { 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 { @@ -1278,14 +1183,10 @@ class Runtime extends EventEmitter { } if (inBranchNum < blockInfo.branchCount) { blockJSON[`message${outLineNum}`] = '%1'; - blockJSON[`args${outLineNum}`] = [ - { - type: 'input_statement', - name: `SUBSTACK${ - inBranchNum > 0 ? inBranchNum + 1 : '' - }` - } - ]; + blockJSON[`args${outLineNum}`] = [{ + type: 'input_statement', + name: `SUBSTACK${inBranchNum > 0 ? inBranchNum + 1 : ''}` + }]; ++inBranchNum; ++outLineNum; } @@ -1299,22 +1200,18 @@ class Runtime extends EventEmitter { // 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[`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 mutation = blockInfo.isDynamic ? `` : ''; const inputs = context.inputList.join(''); const blockXML = `${mutation}${inputs}`; @@ -1349,22 +1246,13 @@ class Runtime extends EventEmitter { */ _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: `` @@ -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 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 092/135] 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 093/135] 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 094/135] 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 095/135] 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 096/135] 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 097/135] 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 098/135] 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 099/135] 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 100/135] 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 101/135] 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 102/135] 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 103/135] 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 104/135] 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 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 105/135] 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 106/135] 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 107/135] 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 108/135] 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 109/135] 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 110/135] 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 111/135] 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 112/135] 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 113/135] 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 114/135] 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 115/135] 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 116/135] 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 117/135] 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 118/135] 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 119/135] 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 120/135] 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 121/135] 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 122/135] 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 123/135] 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 124/135] 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 125/135] 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 126/135] 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 72ff13d61824f6cbf40358d76a72e2b5f969043d Mon Sep 17 00:00:00 2001 From: Kouji Takao Date: Sun, 8 Mar 2026 17:40:40 +0900 Subject: [PATCH 127/135] fix: resolve lint errors from upstream merge - Fix colorMode destructuring in blocks.jsx (used by CustomProcedures) - Add redux to import-x/no-unresolved ignore (peer dependency) - Export blockDisplayInitialState alias from block-display reducer - Update import/core-modules to import-x/core-modules Co-Authored-By: Claude Opus 4.6 --- packages/scratch-gui/eslint.config.mjs | 2 +- packages/scratch-gui/src/containers/blocks.jsx | 2 +- packages/scratch-gui/src/reducers/block-display.js | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/scratch-gui/eslint.config.mjs b/packages/scratch-gui/eslint.config.mjs index 405b8db2206..d150a412764 100644 --- a/packages/scratch-gui/eslint.config.mjs +++ b/packages/scratch-gui/eslint.config.mjs @@ -50,7 +50,7 @@ export default eslintConfigScratch.defineConfig( 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: ['^!']}], + 'import-x/no-unresolved': ['error', {ignore: ['^!', '^redux$']}], // BEGIN: these caused trouble after upgrading eslint-plugin-react from 7.24.0 to 7.33.2 'react/forbid-prop-types': 'warn', diff --git a/packages/scratch-gui/src/containers/blocks.jsx b/packages/scratch-gui/src/containers/blocks.jsx index 43a96951095..52898e7c418 100644 --- a/packages/scratch-gui/src/containers/blocks.jsx +++ b/packages/scratch-gui/src/containers/blocks.jsx @@ -909,7 +909,7 @@ class Blocks extends React.Component { updateMetrics: _updateMetricsProp, useCatBlocks: _useCatBlocks, workspaceMetrics: _workspaceMetrics, - colorMode: _colorMode, + colorMode, paletteVisible, onTogglePalette: _onTogglePalette, projectTitle: _projectTitle, diff --git a/packages/scratch-gui/src/reducers/block-display.js b/packages/scratch-gui/src/reducers/block-display.js index 741599dbebe..aa416e16eda 100644 --- a/packages/scratch-gui/src/reducers/block-display.js +++ b/packages/scratch-gui/src/reducers/block-display.js @@ -96,6 +96,7 @@ const setScratchBlocks = function (scratchBlocks) { export { reducer as default, initialState, + initialState as blockDisplayInitialState, setSelectedBlocks, openBlockDisplayModal, closeBlockDisplayModal, From 9cbdc768da34993d07b5121398e58f81b9e25168 Mon Sep 17 00:00:00 2001 From: Kouji Takao Date: Sun, 8 Mar 2026 17:45:03 +0900 Subject: [PATCH 128/135] fix: add react, react-dom, redux as direct dependencies These were peer dependencies that are now needed as direct deps after the upstream migration to scratch-blocks v2.0.0. Co-Authored-By: Claude Opus 4.6 --- package-lock.json | 27 +++++++++++++++++++++++++-- packages/scratch-gui/package.json | 3 +++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 336ea109445..1baed6a1496 100644 --- a/package-lock.json +++ b/package-lock.json @@ -33258,7 +33258,6 @@ }, "node_modules/react": { "version": "18.3.1", - "dev": true, "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" @@ -33267,6 +33266,19 @@ "node": ">=0.10.0" } }, + "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", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, "node_modules/react-draggable": { "version": "3.3.2", "license": "MIT", @@ -34038,6 +34050,15 @@ "node": ">=8" } }, + "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", + "dependencies": { + "@babel/runtime": "^7.9.2" + } + }, "node_modules/redux-mock-store": { "version": "1.5.5", "dev": true, @@ -34773,7 +34794,6 @@ }, "node_modules/scheduler": { "version": "0.23.2", - "dev": true, "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" @@ -41018,6 +41038,8 @@ "prop-types": "15.8.1", "query-string": "5.1.1", "raw-loader": "4.0.2", + "react": "18.3.1", + "react-dom": "18.3.1", "react-draggable": "3.3.2", "react-ga": "3.3.1", "react-intl": "6.8.9", @@ -41030,6 +41052,7 @@ "react-tooltip": "4.5.1", "react-virtualized": "9.22.6", "react-visibility-sensor": "5.1.1", + "redux": "4.2.1", "redux-throttle": "0.1.1", "scratch-audio": "2.0.268", "scratch-blocks": "2.0.3", diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index a7e9c2ff8be..789fe8dc04b 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -171,12 +171,15 @@ "prop-types": "15.8.1", "query-string": "5.1.1", "raw-loader": "4.0.2", + "react": "18.3.1", + "react-dom": "18.3.1", "react-draggable": "3.3.2", "react-ga": "3.3.1", "react-intl": "6.8.9", "react-modal": "3.16.3", "react-popover": "0.5.10", "react-redux": "8.1.3", + "redux": "4.2.1", "react-responsive": "9.0.2", "react-style-proptype": "3.2.2", "react-tabs": "5.2.0", From 422783874edf0196de3ee25f8d786351269b5496 Mon Sep 17 00:00:00 2001 From: Kouji Takao Date: Sun, 8 Mar 2026 17:45:34 +0900 Subject: [PATCH 129/135] chore: update upstream merge history Co-Authored-By: Claude Opus 4.6 --- .upstream-merge-history.json | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/.upstream-merge-history.json b/.upstream-merge-history.json index 7e254beab61..c77fbf52791 100644 --- a/.upstream-merge-history.json +++ b/.upstream-merge-history.json @@ -1,10 +1,18 @@ { "lastMerge": { - "date": "2026-02-14", - "upstreamCommit": "5f063605b67927f01647f56a8abf28b972a292bd", - "smalrubyCommit": "8220cde2ad0589dc5decfae18ae17ca66c57562b", - "mergeCommit": "58b3f1c7c", - "notes": "PR #431 green flag keyboard focus fix - 93 upstream commits merged" + "date": "2026-03-08", + "upstreamCommit": "42ea882750bd1c3b1544df33cfa794efa2a6d907", + "smalrubyCommit": "fe2bee4d37263f1d814235843d118b66406f5762", + "mergeCommit": "6ac14806a", + "notes": "146 upstream commits merged - scratch-blocks v2.0.0, release 13.0.0" }, - "previousMerges": [] + "previousMerges": [ + { + "date": "2026-02-14", + "upstreamCommit": "5f063605b67927f01647f56a8abf28b972a292bd", + "smalrubyCommit": "8220cde2ad0589dc5decfae18ae17ca66c57562b", + "mergeCommit": "58b3f1c7c", + "notes": "PR #431 green flag keyboard focus fix - 93 upstream commits merged" + } + ] } From 20450664b3c7796e3d1931eb238a788d49e9b04d Mon Sep 17 00:00:00 2001 From: Kouji Takao Date: Sun, 8 Mar 2026 17:46:09 +0900 Subject: [PATCH 130/135] docs: add upstream merge documentation Co-Authored-By: Claude Opus 4.6 --- .../merge-2026-03/conflict-resolutions.md | 34 +++++++++++++++++++ notes/upstream/merge-2026-03/progress.md | 23 +++++++++++++ notes/upstream/merge-2026-03/test-results.md | 16 +++++++++ 3 files changed, 73 insertions(+) create mode 100644 notes/upstream/merge-2026-03/conflict-resolutions.md create mode 100644 notes/upstream/merge-2026-03/progress.md create mode 100644 notes/upstream/merge-2026-03/test-results.md diff --git a/notes/upstream/merge-2026-03/conflict-resolutions.md b/notes/upstream/merge-2026-03/conflict-resolutions.md new file mode 100644 index 00000000000..76c1639cc3c --- /dev/null +++ b/notes/upstream/merge-2026-03/conflict-resolutions.md @@ -0,0 +1,34 @@ +# Conflict Resolutions - 2026-03 Upstream Merge + +## Files with Conflicts + +### Known Conflicts (Resolved) +- [x] `package-lock.json` - Regenerated with `npm install --legacy-peer-deps` +- [x] `packages/scratch-gui/package.json` - Kept @smalruby naming, merged deps +- [x] `packages/scratch-render/package.json` - Kept @smalruby naming, bumped version +- [x] `packages/scratch-svg-renderer/package.json` - Kept @smalruby naming, bumped version +- [x] `packages/scratch-vm/package.json` - Kept @smalruby naming, bumped version +- [x] `packages/task-herder/package.json` - Kept @smalruby naming, bumped version + +### Unexpected Conflicts (Manual Resolution) +- [x] `.github/workflows/ci.yml` (DU) - Kept deletion (Smalruby uses own CI) +- [x] `packages/scratch-gui/src/lib/settings/color-mode/dark/__mocks__/index.js` (DU) - Accepted upstream +- [x] `packages/scratch-gui/src/lib/settings/color-mode/default/__mocks__/index.js` (DU) - Accepted upstream +- [x] `packages/scratch-gui/eslint.config.mjs` - Kept Smalruby additions + upstream globalIgnores, updated import/core-modules to import-x/core-modules +- [x] `packages/scratch-gui/src/containers/blocks.jsx` - Kept Smalruby logic (Ruby tab guard, fromRuby cleanup), updated ScratchBlocks API calls to v2.0.0 +- [x] `packages/scratch-gui/test/integration/blocks-standalone.test.js` - Imported both `until` and `scopeForFlyoutBlock` +- [x] `packages/scratch-gui/test/integration/blocks.test.js` - Imported both `until` and `scopeForFlyoutBlock` +- [x] `packages/scratch-gui/test/integration/localization.test.js` - Kept Smalruby version (Japanese locale test) + +## Post-Merge Fixes +- Added `blockDisplayInitialState` export alias to `block-display.js` reducer +- Added `redux` to `import-x/no-unresolved` ignore in eslint config +- Fixed `colorMode` destructuring in blocks.jsx (needed by CustomProcedures) +- Added `react`, `react-dom`, `redux` as direct dependencies (were peer deps only) + +## ScratchBlocks v2.0.0 API Changes Applied +- `ScratchBlocks.prompt` → `ScratchBlocks.dialog.setPrompt()` +- `ScratchBlocks.statusButtonCallback` → `ScratchBlocks.StatusIndicatorLabel.statusButtonCallback` +- `ScratchBlocks.Xml.textToDom` → `ScratchBlocks.utils.xml.textToDom` +- `ScratchBlocks.Xml.clearWorkspaceAndLoadFromXml` → `ScratchBlocks.clearWorkspaceAndLoadFromXml` +- `this.workspace.reportValue()` → `this.ScratchBlocks.reportValue()` diff --git a/notes/upstream/merge-2026-03/progress.md b/notes/upstream/merge-2026-03/progress.md new file mode 100644 index 00000000000..1b7ec336824 --- /dev/null +++ b/notes/upstream/merge-2026-03/progress.md @@ -0,0 +1,23 @@ +# Upstream Merge Progress - 2026-03 + +## Info +- **Date**: 2026-03-08 +- **Branch**: feat/upstream-merge-2026-03 +- **Upstream commits**: 146 +- **Previous merge commit**: 5f063605b67927f01647f56a8abf28b972a292bd + +## Steps + +| Step | Status | Time | +|------|--------|------| +| Prerequisites | ✅ | 2026-03-08 | +| Branch creation | ✅ | 2026-03-08 | +| Merge execution | ⏳ | | +| Conflict resolution | ⏳ | | +| Lint | ⏳ | | +| Build | ⏳ | | +| Unit tests | ⏳ | | +| Integration tests | ⏳ | | +| CI check | ⏳ | | +| Documentation | ⏳ | | +| PR creation | ⏳ | | diff --git a/notes/upstream/merge-2026-03/test-results.md b/notes/upstream/merge-2026-03/test-results.md new file mode 100644 index 00000000000..210b148679f --- /dev/null +++ b/notes/upstream/merge-2026-03/test-results.md @@ -0,0 +1,16 @@ +# Test Results - 2026-03 Upstream Merge + +## Lint +✅ Passed (3 pre-existing warnings) + +## Build +✅ Passed (dev build, warnings only) + +## Unit Tests +⏳ Pending (will run in CI) + +## Integration Tests +⏳ Pending (will run in CI) + +## CI Status +⏳ Pending - https://github.com/smalruby/smalruby3-editor/actions From 06e3fe4fbda6e6feedb49fd8b62193eddcaac4d4 Mon Sep 17 00:00:00 2001 From: Kouji Takao Date: Sun, 8 Mar 2026 18:32:06 +0900 Subject: [PATCH 131/135] fix: adapt to scratch-blocks v2.0.0 API changes - Change `import Blockly from` to `import * as Blockly from` for scratch-blocks (v2 has no default export) - Update `Blockly.utils.genUid()` to `Blockly.utils.idGenerator.genUid()` - Update `Blockly.NAME_TYPE` to `Blockly.Names.NameType` - Add scratch-blocks to Jest transformIgnorePatterns and transform rules for .mjs file support Co-Authored-By: Claude Opus 4.6 --- packages/scratch-gui/package.json | 4 ++-- .../block-display-modal/block-display-modal.jsx | 4 ++-- packages/scratch-gui/src/lib/generator.js | 4 ++-- packages/scratch-gui/src/lib/ruby-generator/index.js | 2 +- .../src/lib/ruby-to-blocks-converter/block-utils.js | 8 ++++---- .../src/lib/ruby-to-blocks-converter/my-blocks.js | 4 ++-- .../src/lib/ruby-to-blocks-converter/variable-utils.js | 10 +++++----- 7 files changed, 18 insertions(+), 18 deletions(-) diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index 789fe8dc04b..bec2b79ef89 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -113,10 +113,10 @@ } ], "^.+\\.jsx?$": "babel-jest", - "node_modules/(@bjorn3/browser_wasi_shim|@ruby/prism)/.*\\.js$": "babel-jest" + "node_modules/(@bjorn3/browser_wasi_shim|@ruby/prism|scratch-blocks)/.*\\.m?js$": "babel-jest" }, "transformIgnorePatterns": [ - "node_modules/(?!(intl-messageformat|intl-messageformat-parser|@bjorn3/browser_wasi_shim|@ruby/prism)/)" + "node_modules/(?!(intl-messageformat|intl-messageformat-parser|@bjorn3/browser_wasi_shim|@ruby/prism|scratch-blocks)/)" ] }, "dependencies": { diff --git a/packages/scratch-gui/src/components/block-display-modal/block-display-modal.jsx b/packages/scratch-gui/src/components/block-display-modal/block-display-modal.jsx index 9c16cbae06a..461be545c1b 100644 --- a/packages/scratch-gui/src/components/block-display-modal/block-display-modal.jsx +++ b/packages/scratch-gui/src/components/block-display-modal/block-display-modal.jsx @@ -4,7 +4,7 @@ import React from 'react'; import bindAll from 'lodash.bindall'; import {defineMessages, FormattedMessage, injectIntl} from 'react-intl'; import intlShape from '../../lib/intlShape.js'; -import Blockly from 'scratch-blocks'; +import * as Blockly from 'scratch-blocks'; import {CATEGORY_BLOCKS, generateBlockOrder} from '../../lib/block-utils'; import Box from '../box/box.jsx'; @@ -285,7 +285,7 @@ class BlockDisplayModal extends React.Component { existingComment.text = commentText; } else { // Create new comment - const commentId = Blockly.utils.genUid(); + const commentId = Blockly.utils.idGenerator.genUid(); stage.createComment( commentId, null, diff --git a/packages/scratch-gui/src/lib/generator.js b/packages/scratch-gui/src/lib/generator.js index de156db0521..e3c6519eb3b 100644 --- a/packages/scratch-gui/src/lib/generator.js +++ b/packages/scratch-gui/src/lib/generator.js @@ -1,6 +1,6 @@ import _ from 'lodash'; import log from './log'; -import Blockly from 'scratch-blocks'; +import * as Blockly from 'scratch-blocks'; /** * Class for a code generator that translates the blocks into a language. @@ -80,7 +80,7 @@ class Generator { * @returns {string} Category name. */ static get NAME_TYPE () { - return Blockly.NAME_TYPE; + return Blockly.Names.NameType; } /** diff --git a/packages/scratch-gui/src/lib/ruby-generator/index.js b/packages/scratch-gui/src/lib/ruby-generator/index.js index e32bb194345..db9297f0198 100644 --- a/packages/scratch-gui/src/lib/ruby-generator/index.js +++ b/packages/scratch-gui/src/lib/ruby-generator/index.js @@ -1,6 +1,6 @@ import _ from 'lodash'; -import Blockly from 'scratch-blocks'; +import * as Blockly from 'scratch-blocks'; import Generator from '../generator'; import MathBlocks from './math.js'; diff --git a/packages/scratch-gui/src/lib/ruby-to-blocks-converter/block-utils.js b/packages/scratch-gui/src/lib/ruby-to-blocks-converter/block-utils.js index da6f94f7c47..376f4169440 100644 --- a/packages/scratch-gui/src/lib/ruby-to-blocks-converter/block-utils.js +++ b/packages/scratch-gui/src/lib/ruby-to-blocks-converter/block-utils.js @@ -1,4 +1,4 @@ -import Blockly from 'scratch-blocks'; +import * as Blockly from 'scratch-blocks'; import _ from 'lodash'; /** @@ -22,7 +22,7 @@ const BlockUtils = { }, _createComment (text, blockId, x = 0, y = 0, minimized = true) { - const id = Blockly.utils.genUid(); + const id = Blockly.utils.idGenerator.genUid(); this._context.comments[id] = { id: id, text: text, @@ -42,7 +42,7 @@ const BlockUtils = { _createBlock (opcode, type, attributes = {}) { const block = Object.assign({ - id: Blockly.utils.genUid(), + id: Blockly.utils.idGenerator.genUid(), opcode: opcode, inputs: {}, fields: {}, @@ -337,7 +337,7 @@ const BlockUtils = { } const newBlock = Object.assign({}, block, { - id: Blockly.utils.genUid(), + id: Blockly.utils.idGenerator.genUid(), parent: null, next: null, inputs: {}, diff --git a/packages/scratch-gui/src/lib/ruby-to-blocks-converter/my-blocks.js b/packages/scratch-gui/src/lib/ruby-to-blocks-converter/my-blocks.js index 8157f6df2b8..7fc6756753c 100644 --- a/packages/scratch-gui/src/lib/ruby-to-blocks-converter/my-blocks.js +++ b/packages/scratch-gui/src/lib/ruby-to-blocks-converter/my-blocks.js @@ -1,5 +1,5 @@ import _ from 'lodash'; -import Blockly from 'scratch-blocks'; +import * as Blockly from 'scratch-blocks'; import Primitive from './primitive'; import {RubyToBlocksConverterError} from './errors'; @@ -199,7 +199,7 @@ const MyBlocksConverter = { procedure.argumentVariables.push(variable); procedure.procCode.push('%s'); procedure.argumentDefaults.push(''); - const inputId = Blockly.utils.genUid(); + const inputId = Blockly.utils.idGenerator.genUid(); procedure.argumentIds.push(inputId); const inputBlock = converter._createBlock('argument_reporter_string_number', 'value', { fields: { diff --git a/packages/scratch-gui/src/lib/ruby-to-blocks-converter/variable-utils.js b/packages/scratch-gui/src/lib/ruby-to-blocks-converter/variable-utils.js index 374c11e38f6..11eb1ca4604 100644 --- a/packages/scratch-gui/src/lib/ruby-to-blocks-converter/variable-utils.js +++ b/packages/scratch-gui/src/lib/ruby-to-blocks-converter/variable-utils.js @@ -1,5 +1,5 @@ import {Variable} from './constants'; -import Blockly from 'scratch-blocks'; +import * as Blockly from 'scratch-blocks'; import {RubyToBlocksConverterError} from './errors'; /** @@ -68,7 +68,7 @@ const VariableUtils = { if (!variable) { variable = { - id: Blockly.utils.genUid(), + id: Blockly.utils.idGenerator.genUid(), name: transformedName, originalName: varName, scope: 'local', // Mark as local for internal tracking @@ -98,7 +98,7 @@ const VariableUtils = { } } else { variable = { - id: Blockly.utils.genUid(), + id: Blockly.utils.idGenerator.genUid(), name: varName, scope: scope, type: type, @@ -140,7 +140,7 @@ const VariableUtils = { let broadcastMsg = this._context.broadcastMsgs[key]; if (!broadcastMsg) { broadcastMsg = { - id: Blockly.utils.genUid(), + id: Blockly.utils.idGenerator.genUid(), name: name, scope: 'global' }; @@ -180,7 +180,7 @@ const VariableUtils = { ); } procedure = { - id: Blockly.utils.genUid(), + id: Blockly.utils.idGenerator.genUid(), name: name, procCode: [name], argumentNames: [], From 4f2a5073fe6f7dea89f26e3d78b88edab61776ed Mon Sep 17 00:00:00 2001 From: Kouji Takao Date: Sun, 8 Mar 2026 18:39:30 +0900 Subject: [PATCH 132/135] fix: fix remaining unit test failures from upstream merge MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Update color-modes test to use __mocks__ files instead of inline mocks (aligns with upstream's approach using colourPrimary naming) - Update empty-block-selection test to check toolboxitemid attributes - Update monitor test snapshots for new color mode mock data - Fix NAME_TYPE → Names.NameType in generator.js Co-Authored-By: Claude Opus 4.6 --- .../__snapshots__/monitor.test.jsx.snap | 4 +- .../test/unit/empty-block-selection.test.js | 4 +- .../test/unit/util/color-modes.test.js | 37 +------------------ 3 files changed, 6 insertions(+), 39 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 996996b6283..9291a57b399 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 @@ -16,7 +16,7 @@ exports[`Monitor Component it selects the correct colors based on dark mode 1`] My label
@@ -40,7 +40,7 @@ exports[`Monitor Component it selects the correct colors based on default color My label
diff --git a/packages/scratch-gui/test/unit/empty-block-selection.test.js b/packages/scratch-gui/test/unit/empty-block-selection.test.js index 183ad66af5b..4330033e9fd 100644 --- a/packages/scratch-gui/test/unit/empty-block-selection.test.js +++ b/packages/scratch-gui/test/unit/empty-block-selection.test.js @@ -30,8 +30,8 @@ describe('Empty block selection filtering', () => { expect(xml).not.toContain('BKY_CATEGORY_OPERATORS'); // Variables and myBlocks categories should still be present (always visible) - expect(xml).toContain('CATEGORY_VARIABLES'); - expect(xml).toContain('CATEGORY_MYBLOCKS'); + expect(xml).toContain('toolboxitemid="variables"'); + expect(xml).toContain('toolboxitemid="myBlocks"'); }); test('should show all blocks when no only_blocks parameter is provided (null)', () => { diff --git a/packages/scratch-gui/test/unit/util/color-modes.test.js b/packages/scratch-gui/test/unit/util/color-modes.test.js index fff374fbf98..51794df9600 100644 --- a/packages/scratch-gui/test/unit/util/color-modes.test.js +++ b/packages/scratch-gui/test/unit/util/color-modes.test.js @@ -8,41 +8,8 @@ import { import {injectExtensionBlockIcons, injectExtensionCategoryMode} from '../../../src/lib/settings/color-mode/blockHelpers'; import {detectColorMode, persistColorMode} from '../../../src/lib/settings/color-mode/persistence'; -jest.mock('../../../src/lib/settings/color-mode/default', () => ({ - blockColors: { - motion: { - primary: '#111111', - secondary: '#222222', - tertiary: '#333333' - }, - pen: { - primary: '#121212', - secondary: '#232323', - tertiary: '#343434' - }, - text: '#444444', - workspace: '#555555' - } -})); - -jest.mock('../../../src/lib/settings/color-mode/dark', () => ({ - blockColors: { - motion: { - primary: '#AAAAAA' - }, - pen: { - primary: '#FFFFFF', - secondary: '#EEEEEE', - tertiary: '#DDDDDD' - }, - text: '#BBBBBB' - }, - extensions: { - pen: { - blockIconURI: 'darkPenIcon' - } - } -})); +jest.mock('../../../src/lib/settings/color-mode/default'); +jest.mock('../../../src/lib/settings/color-mode/dark'); describe('color modes', () => { let serializeToString; From c5397b8db459b190a0c27dfccf8d1b4e39514c9a Mon Sep 17 00:00:00 2001 From: Kouji Takao Date: Sun, 8 Mar 2026 18:55:45 +0900 Subject: [PATCH 133/135] fix: update integration tests for scratch-blocks v2 DOM changes - palette-toggle: Use ".blocklyToolbox" selector (was ".blocklyToolboxDiv" in v1) - localization: Use clickBlocksCategory for category clicks (v2 changed click targets) - block-display-modal: Use clickBlocksCategory for Looks category clicks Co-Authored-By: Claude Opus 4.6 --- .../test/integration/block-display-modal.test.js | 7 +++---- packages/scratch-gui/test/integration/localization.test.js | 2 +- .../scratch-gui/test/integration/palette-toggle.test.js | 7 +++++-- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/packages/scratch-gui/test/integration/block-display-modal.test.js b/packages/scratch-gui/test/integration/block-display-modal.test.js index 50fbda81e3f..cc4583a4644 100644 --- a/packages/scratch-gui/test/integration/block-display-modal.test.js +++ b/packages/scratch-gui/test/integration/block-display-modal.test.js @@ -3,6 +3,7 @@ import SeleniumHelper from '../helpers/selenium-helper'; import {SETTINGS_MENU_XPATH} from '../helpers/menu-xpaths'; const { + clickBlocksCategory, clickText, clickXpath, findByText, @@ -179,8 +180,7 @@ describe('Block Display Modal', () => { await driver.sleep(1000); // Click on Looks category to expand it - await clickText('Looks'); - await driver.sleep(1000); + await clickBlocksCategory('Looks'); // looks_say should be visible (it was specified in only_blocks) const sayBlockExists = await textExists('say', scope.blocksTab); @@ -272,8 +272,7 @@ describe('Block Display Modal', () => { await driver.sleep(1000); // Click on Looks category to expand it - await clickText('Looks'); - await driver.sleep(1000); + await clickBlocksCategory('Looks'); // looks_say should be visible (it was specified in only_blocks) const sayBlockExists = await textExists('say', scope.blocksTab); diff --git a/packages/scratch-gui/test/integration/localization.test.js b/packages/scratch-gui/test/integration/localization.test.js index 22e72014da5..3ab565ea9e6 100644 --- a/packages/scratch-gui/test/integration/localization.test.js +++ b/packages/scratch-gui/test/integration/localization.test.js @@ -49,7 +49,7 @@ describe('Localization', () => { await new Promise(resolve => setTimeout(resolve, 1000)); // wait for blocks refresh // Make sure the blocks are translating - await clickText('調べる'); // Sensing category in Japanese + await clickBlocksCategory('調べる'); // Sensing category in Japanese await new Promise(resolve => setTimeout(resolve, 1000)); // wait for blocks to scroll await clickText('答え'); // Find the "answer" block in Japanese diff --git a/packages/scratch-gui/test/integration/palette-toggle.test.js b/packages/scratch-gui/test/integration/palette-toggle.test.js index a8023dbb25e..ad66b0b6d01 100644 --- a/packages/scratch-gui/test/integration/palette-toggle.test.js +++ b/packages/scratch-gui/test/integration/palette-toggle.test.js @@ -40,8 +40,10 @@ describe('Palette toggle', () => { // The show-palette button (▶) should now be visible await findByXpath('//button[@title="ブロックパレットを表示する"]'); // The toolbox should be hidden + // The toolbox should be hidden + // Note: scratch-blocks v2 uses "blocklyToolbox" class (was "blocklyToolboxDiv" in v1) const toolboxVisible = await driver.executeScript( - 'const el = document.querySelector(".blocklyToolboxDiv"); return el ? el.style.display !== "none" : true;' + 'const el = document.querySelector(".blocklyToolbox"); return el ? el.style.display !== "none" : true;' ); expect(toolboxVisible).toBe(false); // The extension button should be hidden @@ -64,8 +66,9 @@ describe('Palette toggle', () => { // The hide-palette button should be visible again await findByXpath('//button[@title="ブロックパレットを隠す"]'); // The toolbox should be visible again + // Note: scratch-blocks v2 uses "blocklyToolbox" class (was "blocklyToolboxDiv" in v1) const toolboxVisible = await driver.executeScript( - 'const el = document.querySelector(".blocklyToolboxDiv"); return el ? el.style.display !== "none" : true;' + 'const el = document.querySelector(".blocklyToolbox"); return el ? el.style.display !== "none" : true;' ); expect(toolboxVisible).toBe(true); const logs = await getLogs(); From 1e06354d927ba2e55f4dca28eaede008e4bc11d3 Mon Sep 17 00:00:00 2001 From: Kouji Takao Date: Sun, 8 Mar 2026 19:12:34 +0900 Subject: [PATCH 134/135] fix: remove TAP_REPORTER=junit from CI to fix scratch-vm test failure The junit reporter was causing tap to exit with code 1 despite all tests passing. This also masked real failures by hiding coverage threshold errors. Co-Authored-By: Claude Opus 4.6 --- .github/workflows/ci-cd.yml | 14 ----- notes/upstream/merge-2026-03/progress.md | 18 +++--- notes/upstream/merge-2026-03/test-results.md | 30 +++++++++- package-lock.json | 60 +------------------- 4 files changed, 39 insertions(+), 83 deletions(-) diff --git a/.github/workflows/ci-cd.yml b/.github/workflows/ci-cd.yml index 9fdb6e45b90..de760855789 100644 --- a/.github/workflows/ci-cd.yml +++ b/.github/workflows/ci-cd.yml @@ -81,22 +81,8 @@ jobs: run: npm run build:dev - name: Lint run: npm run lint - - name: Create test-results directories - run: | - mkdir -p packages/scratch-vm/test-results - mkdir -p packages/scratch-gui/test-results - name: Run Unit Tests - env: - TAP_REPORTER: junit - TAP_REPORTER_FILE: test-results/unit-tests-results.xml run: npm run test:unit - - name: Store Test Results - if: always() # Even if tests fail - uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5 - with: - name: test-output-unit - path: | - packages/*/test-results/* integration-test-vm: runs-on: ubuntu-latest diff --git a/notes/upstream/merge-2026-03/progress.md b/notes/upstream/merge-2026-03/progress.md index 1b7ec336824..7752d1aae55 100644 --- a/notes/upstream/merge-2026-03/progress.md +++ b/notes/upstream/merge-2026-03/progress.md @@ -12,12 +12,12 @@ |------|--------|------| | Prerequisites | ✅ | 2026-03-08 | | Branch creation | ✅ | 2026-03-08 | -| Merge execution | ⏳ | | -| Conflict resolution | ⏳ | | -| Lint | ⏳ | | -| Build | ⏳ | | -| Unit tests | ⏳ | | -| Integration tests | ⏳ | | -| CI check | ⏳ | | -| Documentation | ⏳ | | -| PR creation | ⏳ | | +| Merge execution | ✅ | 2026-03-08 | +| Conflict resolution | ✅ | 2026-03-08 | +| Lint | ✅ | 2026-03-08 | +| Build | ✅ | 2026-03-08 | +| Unit tests | ✅ | 2026-03-08 | +| Integration tests | ✅ | 2026-03-08 | +| CI check | ⏳ Running | | +| Documentation | ✅ | 2026-03-08 | +| PR creation | ✅ | PR #238 | diff --git a/notes/upstream/merge-2026-03/test-results.md b/notes/upstream/merge-2026-03/test-results.md index 210b148679f..4e253256e86 100644 --- a/notes/upstream/merge-2026-03/test-results.md +++ b/notes/upstream/merge-2026-03/test-results.md @@ -7,10 +7,34 @@ ✅ Passed (dev build, warnings only) ## Unit Tests -⏳ Pending (will run in CI) +✅ Passed (183 suites, 1582/1583 passed, 1 skipped) ## Integration Tests -⏳ Pending (will run in CI) +✅ Passed (local) + +- smalruby-tutorials.test.js: 3/3 ✅ +- block-display-modal.test.js: 7/7 ✅ +- gemini-modal.test.js: 1/1 ✅ +- ruby-tab-completion-and-indent.test.js: ✅ (skipped: 12) +- tutorial-block-restriction.test.js: 3/3 ✅ +- palette-toggle.test.js: 4/4 ✅ +- backpack.test.js: ✅ +- ruby-tab.test.js: ✅ +- menu-bar.test.js: ✅ +- project-loading.test.js: ✅ +- sprites.test.js: ✅ +- blocks.test.js: ✅ +- localization.test.js: 4/4 ✅ + +### Fixes Required for scratch-blocks v2 +- `clickText` → `clickBlocksCategory` for toolbox category clicks (DOM structure changed) +- `.blocklyToolboxDiv` → `.blocklyToolbox` CSS selector (class name changed) +- `import Blockly from 'scratch-blocks'` → `import * as Blockly from 'scratch-blocks'` (no default export) +- `Blockly.utils.genUid()` → `Blockly.utils.idGenerator.genUid()` (API changed) +- `Blockly.NAME_TYPE` → `Blockly.Names.NameType` (API changed) ## CI Status -⏳ Pending - https://github.com/smalruby/smalruby3-editor/actions +⏳ Running - https://github.com/smalruby/smalruby3-editor/actions/runs/22818709584 + +### Known CI Issue +- "Lint commit messages" workflow fails due to upstream commits with headers >100 characters. This is expected for merge branches and not a blocking issue. diff --git a/package-lock.json b/package-lock.json index 1baed6a1496..1227c0b1aae 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5806,7 +5806,6 @@ }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.13", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", @@ -5824,7 +5823,6 @@ }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", - "dev": true, "license": "MIT", "engines": { "node": ">=6.0.0" @@ -5832,7 +5830,6 @@ }, "node_modules/@jridgewell/source-map": { "version": "0.3.11", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", @@ -5841,12 +5838,10 @@ }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.5", - "dev": true, "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.31", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -6041,7 +6036,7 @@ }, "node_modules/@noble/hashes": { "version": "1.4.0", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">= 16" @@ -12682,7 +12677,6 @@ }, "node_modules/@types/eslint": { "version": "9.6.1", - "dev": true, "license": "MIT", "dependencies": { "@types/estree": "*", @@ -12691,7 +12685,6 @@ }, "node_modules/@types/eslint-scope": { "version": "3.7.7", - "dev": true, "license": "MIT", "dependencies": { "@types/eslint": "*", @@ -12700,7 +12693,6 @@ }, "node_modules/@types/estree": { "version": "1.0.8", - "dev": true, "license": "MIT" }, "node_modules/@types/express": { @@ -12968,7 +12960,7 @@ }, "node_modules/@types/react-dom": { "version": "18.3.7", - "dev": true, + "devOptional": true, "license": "MIT", "peerDependencies": { "@types/react": "^18.0.0" @@ -13583,7 +13575,6 @@ }, "node_modules/@webassemblyjs/ast": { "version": "1.14.1", - "dev": true, "license": "MIT", "dependencies": { "@webassemblyjs/helper-numbers": "1.13.2", @@ -13592,22 +13583,18 @@ }, "node_modules/@webassemblyjs/floating-point-hex-parser": { "version": "1.13.2", - "dev": true, "license": "MIT" }, "node_modules/@webassemblyjs/helper-api-error": { "version": "1.13.2", - "dev": true, "license": "MIT" }, "node_modules/@webassemblyjs/helper-buffer": { "version": "1.14.1", - "dev": true, "license": "MIT" }, "node_modules/@webassemblyjs/helper-numbers": { "version": "1.13.2", - "dev": true, "license": "MIT", "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.13.2", @@ -13617,12 +13604,10 @@ }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { "version": "1.13.2", - "dev": true, "license": "MIT" }, "node_modules/@webassemblyjs/helper-wasm-section": { "version": "1.14.1", - "dev": true, "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.14.1", @@ -13633,7 +13618,6 @@ }, "node_modules/@webassemblyjs/ieee754": { "version": "1.13.2", - "dev": true, "license": "MIT", "dependencies": { "@xtuc/ieee754": "^1.2.0" @@ -13641,7 +13625,6 @@ }, "node_modules/@webassemblyjs/leb128": { "version": "1.13.2", - "dev": true, "license": "Apache-2.0", "dependencies": { "@xtuc/long": "4.2.2" @@ -13649,12 +13632,10 @@ }, "node_modules/@webassemblyjs/utf8": { "version": "1.13.2", - "dev": true, "license": "MIT" }, "node_modules/@webassemblyjs/wasm-edit": { "version": "1.14.1", - "dev": true, "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.14.1", @@ -13669,7 +13650,6 @@ }, "node_modules/@webassemblyjs/wasm-gen": { "version": "1.14.1", - "dev": true, "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.14.1", @@ -13681,7 +13661,6 @@ }, "node_modules/@webassemblyjs/wasm-opt": { "version": "1.14.1", - "dev": true, "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.14.1", @@ -13692,7 +13671,6 @@ }, "node_modules/@webassemblyjs/wasm-parser": { "version": "1.14.1", - "dev": true, "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.14.1", @@ -13705,7 +13683,6 @@ }, "node_modules/@webassemblyjs/wast-printer": { "version": "1.14.1", - "dev": true, "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.14.1", @@ -13766,12 +13743,10 @@ }, "node_modules/@xtuc/ieee754": { "version": "1.2.0", - "dev": true, "license": "BSD-3-Clause" }, "node_modules/@xtuc/long": { "version": "4.2.2", - "dev": true, "license": "Apache-2.0" }, "node_modules/abab": { @@ -13826,7 +13801,6 @@ "version": "8.16.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", - "dev": true, "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -13857,7 +13831,6 @@ }, "node_modules/acorn-import-phases": { "version": "1.0.4", - "dev": true, "license": "MIT", "engines": { "node": ">=10.13.0" @@ -13916,7 +13889,6 @@ }, "node_modules/ajv": { "version": "8.17.1", - "dev": true, "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", @@ -13931,7 +13903,6 @@ }, "node_modules/ajv-formats": { "version": "2.1.1", - "dev": true, "license": "MIT", "dependencies": { "ajv": "^8.0.0" @@ -13947,7 +13918,6 @@ }, "node_modules/ajv-keywords": { "version": "5.1.0", - "dev": true, "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3" @@ -16260,7 +16230,6 @@ }, "node_modules/chrome-trace-event": { "version": "1.0.4", - "dev": true, "license": "MIT", "engines": { "node": ">=6.0" @@ -18267,7 +18236,6 @@ "version": "5.20.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.0.tgz", "integrity": "sha512-/ce7+jQ1PQ6rVXwe+jKEg5hW5ciicHwIQUagZkp6IufBoY3YDgdTTY1azVs0qoRgVmvsNB+rbjLJxDAeHHtwsQ==", - "dev": true, "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", @@ -19407,7 +19375,6 @@ }, "node_modules/esrecurse": { "version": "4.3.0", - "dev": true, "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" @@ -19829,7 +19796,6 @@ }, "node_modules/fast-uri": { "version": "3.1.0", - "dev": true, "funding": [ { "type": "github", @@ -21548,7 +21514,6 @@ }, "node_modules/glob-to-regexp": { "version": "0.4.1", - "dev": true, "license": "BSD-2-Clause" }, "node_modules/global": { @@ -21633,7 +21598,6 @@ }, "node_modules/graceful-fs": { "version": "4.2.11", - "dev": true, "license": "ISC" }, "node_modules/grapheme-breaker": { @@ -25625,7 +25589,6 @@ }, "node_modules/json-schema-traverse": { "version": "1.0.0", - "dev": true, "license": "MIT" }, "node_modules/json-stable-stringify": { @@ -26032,7 +25995,6 @@ }, "node_modules/loader-runner": { "version": "4.3.1", - "dev": true, "license": "MIT", "engines": { "node": ">=6.11.5" @@ -26973,7 +26935,6 @@ }, "node_modules/merge-stream": { "version": "2.0.0", - "dev": true, "license": "MIT" }, "node_modules/merge2": { @@ -28055,7 +28016,6 @@ }, "node_modules/neo-async": { "version": "2.6.2", - "dev": true, "license": "MIT" }, "node_modules/nerf-dart": { @@ -34801,7 +34761,6 @@ }, "node_modules/schema-utils": { "version": "4.3.3", - "dev": true, "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.9", @@ -37568,7 +37527,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", - "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -37684,7 +37642,6 @@ }, "node_modules/terser": { "version": "5.44.1", - "dev": true, "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -37703,7 +37660,6 @@ "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==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", @@ -37737,7 +37693,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, "license": "MIT", "dependencies": { "@types/node": "*", @@ -37752,7 +37707,6 @@ "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -37766,12 +37720,10 @@ }, "node_modules/terser/node_modules/commander": { "version": "2.20.3", - "dev": true, "license": "MIT" }, "node_modules/terser/node_modules/source-map-support": { "version": "0.5.21", - "dev": true, "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", @@ -38804,7 +38756,7 @@ }, "node_modules/typescript": { "version": "5.9.3", - "dev": true, + "devOptional": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -39537,7 +39489,6 @@ }, "node_modules/watchpack": { "version": "2.5.1", - "dev": true, "license": "MIT", "dependencies": { "glob-to-regexp": "^0.4.1", @@ -39573,7 +39524,6 @@ "version": "5.105.4", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.105.4.tgz", "integrity": "sha512-jTywjboN9aHxFlToqb0K0Zs9SbBoW4zRUlGzI2tYNxVYcEi/IPpn+Xi4ye5jTLvX2YeLuic/IvxNot+Q1jMoOw==", - "dev": true, "license": "MIT", "dependencies": { "@types/eslint-scope": "^3.7.7", @@ -39873,14 +39823,12 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", - "dev": true, "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==", - "dev": true, "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", @@ -39894,7 +39842,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=4.0" @@ -39904,7 +39851,6 @@ "version": "3.3.4", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.4.tgz", "integrity": "sha512-7tP1PdV4vF+lYPnkMR0jMY5/la2ub5Fc/8VQrrU+lXkiM6C4TjVfGw7iKfyhnTQOsD+6Q/iKw0eFciziRgD58Q==", - "dev": true, "license": "MIT", "engines": { "node": ">=10.13.0" From cb9a310dc4b2e79dfcc2af22c5d1692b454cc942 Mon Sep 17 00:00:00 2001 From: Kouji Takao Date: Sun, 8 Mar 2026 19:23:06 +0900 Subject: [PATCH 135/135] fix: mock Date constructor in mesh v2 test to fix CI flakiness The test used setTimeout for timing intervals between fireEvent calls, which was unreliable in CI. Now mocks both Date.now() and new Date() to control timestamps deterministically. Co-Authored-By: Claude Opus 4.6 --- .../test/unit/mesh_service_v2_integration.js | 64 ++++++++++++------- 1 file changed, 42 insertions(+), 22 deletions(-) diff --git a/packages/scratch-vm/test/unit/mesh_service_v2_integration.js b/packages/scratch-vm/test/unit/mesh_service_v2_integration.js index 889a5ff1676..414f0322a91 100644 --- a/packages/scratch-vm/test/unit/mesh_service_v2_integration.js +++ b/packages/scratch-vm/test/unit/mesh_service_v2_integration.js @@ -59,50 +59,70 @@ test('MeshV2Service Integration: Batching and Timing', async t => { } }; - // 1. Fire events at intervals - sender.fireEvent('e1'); - await new Promise(r => setTimeout(r, 100)); - sender.fireEvent('e2'); - await new Promise(r => setTimeout(r, 100)); - sender.fireEvent('e3'); - - // 2. Process batch (simulates timer trigger) - await sender.processBatchEvents(); - - // 3. Verify queuing - t.equal(receiver.pendingBroadcasts.length, 3, 'Events should be queued'); - t.equal(receiver.pendingBroadcasts[0].event.name, 'e1'); - t.equal(receiver.pendingBroadcasts[1].event.name, 'e2'); - t.equal(receiver.pendingBroadcasts[2].event.name, 'e3'); - - // 4. Process events via BEFORE_STEP simulation - // Mock Date.now to control elapsed time + // Mock both Date.now and Date constructor to avoid CI timing flakiness const realDateNow = Date.now; + const RealDate = Date; const startTime = realDateNow(); let currentTime = startTime; Date.now = () => currentTime; + // eslint-disable-next-line no-global-assign + Date = class extends RealDate { + constructor (...args) { + if (args.length === 0) { + super(currentTime); + } else { + super(...args); + } + } + + static now () { + return currentTime; + } + }; try { + // 1. Fire events at controlled intervals + sender.fireEvent('e1'); + currentTime = startTime + 100; + sender.fireEvent('e2'); + currentTime = startTime + 200; + sender.fireEvent('e3'); + + // 2. Process batch (simulates timer trigger) + await sender.processBatchEvents(); + + // 3. Verify queuing + t.equal(receiver.pendingBroadcasts.length, 3, 'Events should be queued'); + t.equal(receiver.pendingBroadcasts[0].event.name, 'e1'); + t.equal(receiver.pendingBroadcasts[1].event.name, 'e2'); + t.equal(receiver.pendingBroadcasts[2].event.name, 'e3'); + + // 4. Process events via BEFORE_STEP simulation + // Reset time to when batch was received (same as last event time) + currentTime = startTime + 200; + // Initially, only e1 should be ready (offset 0) receiver.processNextBroadcast(); t.equal(broadcasted.length, 1); t.equal(broadcasted[0].name, 'e1'); t.equal(receiver.pendingBroadcasts.length, 2); - // Advance time to 150ms, e2 should be ready (offset ~100ms) - currentTime = startTime + 150; + // Advance time to 150ms after batch receipt, e2 should be ready (offset 100ms) + currentTime = startTime + 350; receiver.processNextBroadcast(); t.equal(broadcasted.length, 2); t.equal(broadcasted[1].name, 'e2'); t.equal(receiver.pendingBroadcasts.length, 1); - // Advance time to 300ms, e3 should be ready (offset ~200ms) - currentTime = startTime + 300; + // Advance time to 300ms after batch receipt, e3 should be ready (offset 200ms) + currentTime = startTime + 500; receiver.processNextBroadcast(); t.equal(broadcasted.length, 3); t.equal(broadcasted[2].name, 'e3'); t.equal(receiver.pendingBroadcasts.length, 0); } finally { + // eslint-disable-next-line no-global-assign + Date = RealDate; Date.now = realDateNow; }