{
/>
);
-
+
expect(storage.load).toHaveBeenLastCalledWith(
storage.AssetType.Project, '100', storage.DataFormat.JSON
);
storage.load = originalLoad;
- // nextTick needed since storage.load is async, and onFetchedProject is called in its then()
- process.nextTick(
+ // delay needed since storage.load is async, and onFetchedProject is called in its then()
+ setTimeout(
() => expect(mockedOnFetchedProject)
- .toHaveBeenLastCalledWith('100', LoadingState.FETCHING_WITH_ID)
+ .toHaveBeenLastCalledWith('100', LoadingState.FETCHING_WITH_ID),
+ 1
);
});
});
diff --git a/packages/scratch-gui/test/unit/util/vm-manager-hoc.test.jsx b/packages/scratch-gui/test/unit/util/vm-manager-hoc.test.jsx
index 670c914039..9f2fe143e7 100644
--- a/packages/scratch-gui/test/unit/util/vm-manager-hoc.test.jsx
+++ b/packages/scratch-gui/test/unit/util/vm-manager-hoc.test.jsx
@@ -165,10 +165,10 @@ describe('VMManagerHOC', () => {
/>
);
expect(vm.loadProject).toHaveBeenLastCalledWith('100');
- // nextTick needed since vm.loadProject is async, and we have to wait for it :/
- process.nextTick(() => (
+ // delay needed since vm.loadProject is async, and we have to wait for it :/
+ setTimeout(() => (
expect(mockedOnLoadedProject).toHaveBeenLastCalledWith(LoadingState.LOADING_VM_WITH_ID, true)
- ));
+ ), 1);
});
test('if the fontsLoaded prop becomes true, it loads project data into the vm', () => {
vm.loadProject = jest.fn(() => Promise.resolve());
@@ -196,10 +196,10 @@ describe('VMManagerHOC', () => {
/>
);
expect(vm.loadProject).toHaveBeenLastCalledWith('100');
- // nextTick needed since vm.loadProject is async, and we have to wait for it :/
- process.nextTick(() => (
+ // delay needed since vm.loadProject is async, and we have to wait for it :/
+ setTimeout(() => (
expect(mockedOnLoadedProject).toHaveBeenLastCalledWith(LoadingState.LOADING_VM_WITH_ID, false)
- ));
+ ), 1);
});
test('if the fontsLoaded prop is false, project data is never loaded', () => {
vm.loadProject = jest.fn(() => Promise.resolve());
@@ -225,6 +225,7 @@ describe('VMManagerHOC', () => {
/>
);
expect(vm.loadProject).toHaveBeenCalledTimes(0);
- process.nextTick(() => expect(mockedOnLoadedProject).toHaveBeenCalledTimes(0));
+ // delay needed since vm.loadProject is async
+ setTimeout(() => expect(mockedOnLoadedProject).toHaveBeenCalledTimes(0), 1);
});
});
From 517717f9b8628a59451bebec62bfe0750c9eaa1f Mon Sep 17 00:00:00 2001
From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com>
Date: Wed, 24 Sep 2025 08:23:06 -0700
Subject: [PATCH 09/13] test: fix detect-locale test with mock window
---
.../test/unit/util/detect-locale.test.js | 85 +++++++++----------
1 file changed, 41 insertions(+), 44 deletions(-)
diff --git a/packages/scratch-gui/test/unit/util/detect-locale.test.js b/packages/scratch-gui/test/unit/util/detect-locale.test.js
index f9b1f63fce..51bb19b6ae 100644
--- a/packages/scratch-gui/test/unit/util/detect-locale.test.js
+++ b/packages/scratch-gui/test/unit/util/detect-locale.test.js
@@ -2,85 +2,82 @@ import {detectLocale} from '../../../src/lib/detect-locale.js';
const supportedLocales = ['en', 'es', 'pt-br', 'de', 'it'];
-Object.defineProperty(window.location,
- 'search',
- {value: '?name=val', configurable: true}
-);
-Object.defineProperty(window.navigator,
- 'language',
- {value: 'en-US', configurable: true}
-);
+/**
+ * @type {jest.SpyInstance}
+ */
+let windowSpy;
+
+/**
+ * @type {jest.SpyInstance}
+ */
+let locationSpy;
+
+const mockWindowLocation = new URL('http://example.com/?name=val');
+const mockWindowNavigator = {
+ language: 'en-US'
+};
+
+beforeEach(() => {
+ windowSpy = jest.spyOn(global, 'window', 'get');
+ locationSpy = jest.spyOn(global, 'location', 'get');
+
+ windowSpy.mockImplementation(() => ({
+ location: mockWindowLocation,
+ navigator: mockWindowNavigator
+ }));
+
+ // `window.location` and `location` should point to the same object
+ locationSpy.mockImplementation(() => mockWindowLocation);
+});
+
+afterEach(() => {
+ windowSpy.mockRestore();
+ locationSpy.mockRestore();
+});
describe('detectLocale', () => {
test('uses locale from the URL when present', () => {
- Object.defineProperty(window.location,
- 'search',
- {value: '?locale=pt-br'}
- );
+ mockWindowLocation.search = '?locale=pt-br';
expect(detectLocale(supportedLocales)).toEqual('pt-br');
});
test('is case insensitive', () => {
- Object.defineProperty(window.location,
- 'search',
- {value: '?locale=pt-BR'}
- );
+ mockWindowLocation.search = '?locale=pt-BR';
expect(detectLocale(supportedLocales)).toEqual('pt-br');
});
test('also accepts lang from the URL when present', () => {
- Object.defineProperty(window.location,
- 'search',
- {value: '?lang=it'}
- );
+ mockWindowLocation.search = '?lang=it';
expect(detectLocale(supportedLocales)).toEqual('it');
});
test('ignores unsupported locales', () => {
- Object.defineProperty(window.location,
- 'search',
- {value: '?lang=sv'}
- );
+ mockWindowLocation.search = '?lang=sv';
expect(detectLocale(supportedLocales)).toEqual('en');
});
test('ignores other parameters', () => {
- Object.defineProperty(window.location,
- 'search',
- {value: '?enable=language'}
- );
+ mockWindowLocation.search = '?enable=language';
expect(detectLocale(supportedLocales)).toEqual('en');
});
test('uses navigator language property for default if supported', () => {
- Object.defineProperty(window.navigator,
- 'language',
- {value: 'pt-BR'}
- );
+ mockWindowNavigator.language = 'pt-BR';
expect(detectLocale(supportedLocales)).toEqual('pt-br');
});
test('ignores navigator language property if unsupported', () => {
- Object.defineProperty(window.navigator,
- 'language',
- {value: 'da'}
- );
+ mockWindowNavigator.language = 'da';
expect(detectLocale(supportedLocales)).toEqual('en');
});
test('works with an empty locale', () => {
- Object.defineProperty(window.location,
- 'search',
- {value: '?locale='}
- );
+ mockWindowLocation.search = '?locale=';
expect(detectLocale(supportedLocales)).toEqual('en');
});
test('if multiple, uses the first locale', () => {
- Object.defineProperty(window.location,
- 'search',
- {value: '?locale=de&locale=en'}
- );
+ mockWindowLocation.search = '?locale=de&locale=en';
expect(detectLocale(supportedLocales)).toEqual('de');
});
});
From 24116e10705ea12aaa422320781b312fe58a559b Mon Sep 17 00:00:00 2001
From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com>
Date: Wed, 15 Oct 2025 09:11:39 -0700
Subject: [PATCH 10/13] style: auto-fix lint issues in scratch-svg-renderer
---
packages/scratch-svg-renderer/src/bitmap-adapter.js | 8 ++++----
packages/scratch-svg-renderer/src/font-converter.js | 2 +-
packages/scratch-svg-renderer/src/font-inliner.js | 2 +-
packages/scratch-svg-renderer/src/load-svg-string.js | 6 +++---
packages/scratch-svg-renderer/src/sanitize-svg.js | 6 +++---
packages/scratch-svg-renderer/src/svg-renderer.js | 8 ++++----
packages/scratch-svg-renderer/src/transform-applier.js | 3 +--
7 files changed, 17 insertions(+), 18 deletions(-)
diff --git a/packages/scratch-svg-renderer/src/bitmap-adapter.js b/packages/scratch-svg-renderer/src/bitmap-adapter.js
index 1d41c6ec03..801bf35794 100644
--- a/packages/scratch-svg-renderer/src/bitmap-adapter.js
+++ b/packages/scratch-svg-renderer/src/bitmap-adapter.js
@@ -5,8 +5,8 @@ const base64js = require('base64-js');
*/
class BitmapAdapter {
/**
- * @param {?function} makeImage HTML image constructor. Tests can provide this.
- * @param {?function} makeCanvas HTML canvas constructor. Tests can provide this.
+ * @param {?Function} makeImage HTML image constructor. Tests can provide this.
+ * @param {?Function} makeCanvas HTML canvas constructor. Tests can provide this.
*/
constructor (makeImage, makeCanvas) {
this._makeImage = makeImage ? makeImage : () => new Image();
@@ -46,7 +46,7 @@ class BitmapAdapter {
* to resolution 2 bitmaps. Therefore, converting a resolution 1 bitmap means doubling
* it in width and height.
* @param {!string} dataURI Base 64 encoded image data of the bitmap
- * @param {!function} callback Node-style callback that returns updated dataURI if conversion succeeded
+ * @param {!Function} callback Node-style callback that returns updated dataURI if conversion succeeded
*/
convertResolution1Bitmap (dataURI, callback) {
const image = this._makeImage();
@@ -64,7 +64,7 @@ class BitmapAdapter {
* to in Scratch 3.0
* @param {!number} oldWidth original width
* @param {!number} oldHeight original height
- * @return {object} Array of new width, new height
+ * @returns {object} Array of new width, new height
*/
getResizedWidthHeight (oldWidth, oldHeight) {
const STAGE_WIDTH = 480;
diff --git a/packages/scratch-svg-renderer/src/font-converter.js b/packages/scratch-svg-renderer/src/font-converter.js
index eb6a5d684c..5fff714000 100644
--- a/packages/scratch-svg-renderer/src/font-converter.js
+++ b/packages/scratch-svg-renderer/src/font-converter.js
@@ -5,7 +5,7 @@
/**
* Given an SVG, replace Scratch 2.0 fonts with new 3.0 fonts. Add defaults where there are none.
* @param {SVGElement} svgTag The SVG dom object
- * @return {void}
+ * @returns {void}
*/
const convertFonts = function (svgTag) {
// Collect all text elements into a list.
diff --git a/packages/scratch-svg-renderer/src/font-inliner.js b/packages/scratch-svg-renderer/src/font-inliner.js
index 349add25e3..d060f5daea 100644
--- a/packages/scratch-svg-renderer/src/font-inliner.js
+++ b/packages/scratch-svg-renderer/src/font-inliner.js
@@ -15,7 +15,7 @@ const getFonts = require('scratch-render-fonts');
* // Using a
or to link to font-family
* // injected into the document: no effect.
* @param {string} svgString The string representation of the svg to modify
- * @return {string} The svg with any needed fonts inlined
+ * @returns {string} The svg with any needed fonts inlined
*/
const inlineSvgFonts = function (svgString) {
const FONTS = getFonts();
diff --git a/packages/scratch-svg-renderer/src/load-svg-string.js b/packages/scratch-svg-renderer/src/load-svg-string.js
index cf9a5ce906..f6c50badf3 100644
--- a/packages/scratch-svg-renderer/src/load-svg-string.js
+++ b/packages/scratch-svg-renderer/src/load-svg-string.js
@@ -6,7 +6,7 @@ const {sanitizeSvgText} = require('./sanitize-svg');
/**
* @param {SVGElement} svgTag the tag to search within
* @param {string} [tagName] svg tag to search for (or collect all elements if not given)
- * @return {Array} a list of elements with the given tagname
+ * @returns {Array} a list of elements with the given tagname
*/
const collectElements = (svgTag, tagName) => {
const elts = [];
@@ -162,7 +162,7 @@ const transformText = svgTag => {
* This is used to enlarge the computed bounding box, which doesn't take
* stroke width into account.
* @param {SVGSVGElement} rootNode The root SVG node to traverse.
- * @return {number} The largest stroke width in the SVG.
+ * @returns {number} The largest stroke width in the SVG.
*/
const findLargestStrokeWidth = rootNode => {
let largestStrokeWidth = 0;
@@ -300,7 +300,7 @@ const normalizeSvg = (svgTag, fromVersion2) => {
* mimic Scratch 2.0's SVG rendering.
* @param {!string} svgString String of SVG data to draw in quirks-mode.
* @param {boolean} [fromVersion2] True if we should perform conversion from version 2 to version 3 svg.
- * @return {SVGSVGElement} The normalized SVG element.
+ * @returns {SVGSVGElement} The normalized SVG element.
*/
const loadSvgString = (svgString, fromVersion2) => {
// Parse string into SVG XML.
diff --git a/packages/scratch-svg-renderer/src/sanitize-svg.js b/packages/scratch-svg-renderer/src/sanitize-svg.js
index e12886bdfe..1590657135 100644
--- a/packages/scratch-svg-renderer/src/sanitize-svg.js
+++ b/packages/scratch-svg-renderer/src/sanitize-svg.js
@@ -98,7 +98,7 @@ let _TextDecoder;
let _TextEncoder;
if (typeof TextDecoder === 'undefined' || typeof TextEncoder === 'undefined') {
// Wait to require the text encoding polyfill until we know it's needed.
- // eslint-disable-next-line global-require
+
const encoding = require('fastestsmallesttextencoderdecoder');
_TextDecoder = encoding.TextDecoder;
_TextEncoder = encoding.TextEncoder;
@@ -110,7 +110,7 @@ if (typeof TextDecoder === 'undefined' || typeof TextEncoder === 'undefined') {
/**
* Load an SVG Uint8Array of bytes and "sanitize" it
* @param {!Uint8Array} rawData unsanitized SVG daata
- * @return {Uint8Array} sanitized SVG data
+ * @returns {Uint8Array} sanitized SVG data
*/
sanitizeSvg.sanitizeByteStream = function (rawData) {
const decoder = new _TextDecoder();
@@ -124,7 +124,7 @@ sanitizeSvg.sanitizeByteStream = function (rawData) {
* fixup-svg-string.js, and thus more risky; there are known examples of SVGs that
* it will clobber. We use DOMPurify's svg profile, which restricts many types of tag.
* @param {!string} rawSvgText unsanitized SVG string
- * @return {string} sanitized SVG text
+ * @returns {string} sanitized SVG text
*/
sanitizeSvg.sanitizeSvgText = function (rawSvgText) {
let sanitizedText = DOMPurify.sanitize(rawSvgText, {
diff --git a/packages/scratch-svg-renderer/src/svg-renderer.js b/packages/scratch-svg-renderer/src/svg-renderer.js
index 9561949fe6..e95b32776d 100644
--- a/packages/scratch-svg-renderer/src/svg-renderer.js
+++ b/packages/scratch-svg-renderer/src/svg-renderer.js
@@ -10,7 +10,7 @@ class SvgRenderer {
* Create a quirks-mode SVG renderer for a particular canvas.
* @param {HTMLCanvasElement} [canvas] An optional canvas element to draw to. If this is not provided, the renderer
* will create a new canvas.
- * @constructor
+ * @class
*/
constructor (canvas) {
/**
@@ -59,14 +59,14 @@ class SvgRenderer {
}
/**
- * @return {Array
} the natural size, in Scratch units, of this SVG.
+ * @returns {Array} the natural size, in Scratch units, of this SVG.
*/
get size () {
return [this._measurements.width, this._measurements.height];
}
/**
- * @return {Array} the offset (upper left corner) of the SVG's view box.
+ * @returns {Array} the offset (upper left corner) of the SVG's view box.
*/
get viewOffset () {
return [this._measurements.x, this._measurements.y];
@@ -143,7 +143,7 @@ class SvgRenderer {
/**
* Draw to the canvas from a loaded image element.
* @param {number} [scale] - Optionally, also scale the image by this factor.
- **/
+ */
_drawFromImage (scale) {
if (this._cachedImage === null) return;
diff --git a/packages/scratch-svg-renderer/src/transform-applier.js b/packages/scratch-svg-renderer/src/transform-applier.js
index 0dde34464f..eef68c76ae 100644
--- a/packages/scratch-svg-renderer/src/transform-applier.js
+++ b/packages/scratch-svg-renderer/src/transform-applier.js
@@ -501,14 +501,13 @@ const _parseUrl = (value, windowRef) => {
* on groups down to the leaf level and averaging out the stroke width
* around the shapes. Note that this doens't just change stroke widths, it
* changes path data and attributes throughout the SVG.
- *
* @param {SVGElement} svgTag The SVG dom object
* @param {Window} windowRef The window to use. Need to pass in for
* tests to work, as they get angry at even the mention of window.
* @param {object} bboxForTesting The bounds to use. Need to pass in for
* tests only, because getBBox doesn't work in Node. This should
* be the bounds of the svgTag without including stroke width or transforms.
- * @return {void}
+ * @returns {void}
*/
const transformStrokeWidths = function (svgTag, windowRef, bboxForTesting) {
const inherited = Matrix.identity();
From c0b97babb2e0b771194089a1a5d38dd8585a93a4 Mon Sep 17 00:00:00 2001
From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com>
Date: Wed, 15 Oct 2025 09:33:26 -0700
Subject: [PATCH 11/13] style: auto-fix lint issues in scratch-vm
---
.../scratch-vm/src/blocks/scratch3_control.js | 2 +-
.../src/blocks/scratch3_core_example.js | 2 +-
.../scratch-vm/src/blocks/scratch3_data.js | 4 +-
.../scratch-vm/src/blocks/scratch3_event.js | 2 +-
.../scratch-vm/src/blocks/scratch3_looks.js | 20 +--
.../scratch-vm/src/blocks/scratch3_motion.js | 2 +-
.../src/blocks/scratch3_operators.js | 2 +-
.../src/blocks/scratch3_procedures.js | 2 +-
.../scratch-vm/src/blocks/scratch3_sensing.js | 2 +-
.../scratch-vm/src/blocks/scratch3_sound.js | 10 +-
packages/scratch-vm/src/engine/adapter.js | 6 +-
.../scratch-vm/src/engine/block-utility.js | 16 +-
.../src/engine/blocks-execute-cache.js | 2 +-
.../src/engine/blocks-runtime-cache.js | 2 +-
packages/scratch-vm/src/engine/blocks.js | 58 ++++----
packages/scratch-vm/src/engine/comment.js | 4 +-
packages/scratch-vm/src/engine/execute.js | 11 +-
.../scratch-vm/src/engine/mutation-adapter.js | 4 +-
packages/scratch-vm/src/engine/profiler.js | 34 ++---
packages/scratch-vm/src/engine/runtime.js | 138 +++++++++---------
.../src/engine/scratch-blocks-constants.js | 6 +-
packages/scratch-vm/src/engine/sequencer.js | 8 +-
packages/scratch-vm/src/engine/target.js | 35 +++--
packages/scratch-vm/src/engine/thread.js | 36 ++---
packages/scratch-vm/src/engine/variable.js | 10 +-
.../src/extension-support/define-messages.js | 2 +-
.../extension-support/extension-manager.js | 1 -
.../extension-support/extension-metadata.js | 10 +-
.../src/extensions/scratch3_boost/index.js | 90 ++++++------
.../src/extensions/scratch3_ev3/index.js | 68 ++++-----
.../extensions/scratch3_face_sensing/index.js | 14 +-
.../extensions/scratch3_face_sensing/utils.js | 2 -
.../src/extensions/scratch3_gdx_for/index.js | 8 +-
.../extensions/scratch3_makeymakey/index.js | 2 +-
.../src/extensions/scratch3_microbit/index.js | 60 ++++----
.../src/extensions/scratch3_music/index.js | 25 ++--
.../src/extensions/scratch3_pen/index.js | 6 +-
.../extensions/scratch3_speech2text/index.js | 11 +-
.../extensions/scratch3_text2speech/index.js | 12 +-
.../extensions/scratch3_translate/index.js | 14 +-
.../scratch3_video_sensing/index.js | 4 +-
.../scratch3_video_sensing/library.js | 4 +-
.../extensions/scratch3_video_sensing/view.js | 2 +-
.../src/extensions/scratch3_wedo2/index.js | 92 ++++++------
packages/scratch-vm/src/io/ble.js | 10 +-
packages/scratch-vm/src/io/bt.js | 4 +-
packages/scratch-vm/src/io/keyboard.js | 6 +-
packages/scratch-vm/src/io/mouse.js | 12 +-
packages/scratch-vm/src/io/video.js | 10 +-
.../src/serialization/deserialize-assets.js | 4 +-
packages/scratch-vm/src/serialization/sb2.js | 22 +--
.../src/serialization/sb2_specmap.js | 2 +-
packages/scratch-vm/src/serialization/sb3.js | 42 +++---
.../scratch-vm/src/sprites/rendered-target.js | 51 ++++---
packages/scratch-vm/src/sprites/sprite.js | 10 +-
packages/scratch-vm/src/util/base64-util.js | 12 +-
packages/scratch-vm/src/util/cast.js | 18 +--
packages/scratch-vm/src/util/color.js | 24 +--
.../scratch-vm/src/util/get-monitor-id.js | 1 +
packages/scratch-vm/src/util/math-util.js | 17 +--
.../src/util/maybe-format-message.js | 2 +-
packages/scratch-vm/src/util/new-block-ids.js | 2 +-
packages/scratch-vm/src/util/rateLimiter.js | 4 +-
packages/scratch-vm/src/util/string-util.js | 5 +-
packages/scratch-vm/src/util/task-queue.js | 11 +-
packages/scratch-vm/src/util/timer.js | 2 +-
packages/scratch-vm/src/util/uid.js | 4 +-
packages/scratch-vm/src/util/variable-util.js | 2 +-
packages/scratch-vm/src/util/xml-escape.js | 2 +-
packages/scratch-vm/src/virtual-machine.js | 30 ++--
.../fixtures/dispatch-test-worker-shim.js | 2 +-
.../scratch-vm/test/fixtures/fake-renderer.js | 8 +-
.../scratch-vm/test/fixtures/mock-timer.js | 6 +-
.../scratch-vm/test/integration/execute.js | 2 +-
.../test/integration/monitors_sb2_to_sb3.js | 2 +-
.../test/integration/offline-custom-assets.js | 2 +-
packages/scratch-vm/test/unit/blocks_looks.js | 12 +-
77 files changed, 568 insertions(+), 620 deletions(-)
diff --git a/packages/scratch-vm/src/blocks/scratch3_control.js b/packages/scratch-vm/src/blocks/scratch3_control.js
index bfededec96..4f2592adc1 100644
--- a/packages/scratch-vm/src/blocks/scratch3_control.js
+++ b/packages/scratch-vm/src/blocks/scratch3_control.js
@@ -19,7 +19,7 @@ class Scratch3ControlBlocks {
/**
* Retrieve the block primitives implemented by this package.
- * @return {object.} Mapping of opcode to Function.
+ * @returns {object.} Mapping of opcode to Function.
*/
getPrimitives () {
return {
diff --git a/packages/scratch-vm/src/blocks/scratch3_core_example.js b/packages/scratch-vm/src/blocks/scratch3_core_example.js
index 4e63f1b00c..9e22016f01 100644
--- a/packages/scratch-vm/src/blocks/scratch3_core_example.js
+++ b/packages/scratch-vm/src/blocks/scratch3_core_example.js
@@ -1,7 +1,7 @@
const BlockType = require('../extension-support/block-type');
const ArgumentType = require('../extension-support/argument-type');
-/* eslint-disable-next-line max-len */
+
const blockIconURI = 'data:image/svg+xml,%3Csvg id="rotate-counter-clockwise" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"%3E%3Cdefs%3E%3Cstyle%3E.cls-1%7Bfill:%233d79cc;%7D.cls-2%7Bfill:%23fff;%7D%3C/style%3E%3C/defs%3E%3Ctitle%3Erotate-counter-clockwise%3C/title%3E%3Cpath class="cls-1" d="M22.68,12.2a1.6,1.6,0,0,1-1.27.63H13.72a1.59,1.59,0,0,1-1.16-2.58l1.12-1.41a4.82,4.82,0,0,0-3.14-.77,4.31,4.31,0,0,0-2,.8,4.25,4.25,0,0,0-1.34,1.73,5.06,5.06,0,0,0,.54,4.62A5.58,5.58,0,0,0,12,17.74h0a2.26,2.26,0,0,1-.16,4.52A10.25,10.25,0,0,1,3.74,18,10.14,10.14,0,0,1,2.25,8.78,9.7,9.7,0,0,1,5.08,4.64,9.92,9.92,0,0,1,9.66,2.5a10.66,10.66,0,0,1,7.72,1.68l1.08-1.35a1.57,1.57,0,0,1,1.24-.6,1.6,1.6,0,0,1,1.54,1.21l1.7,7.37A1.57,1.57,0,0,1,22.68,12.2Z"/%3E%3Cpath class="cls-2" d="M21.38,11.83H13.77a.59.59,0,0,1-.43-1l1.75-2.19a5.9,5.9,0,0,0-4.7-1.58,5.07,5.07,0,0,0-4.11,3.17A6,6,0,0,0,7,15.77a6.51,6.51,0,0,0,5,2.92,1.31,1.31,0,0,1-.08,2.62,9.3,9.3,0,0,1-7.35-3.82A9.16,9.16,0,0,1,3.17,9.12,8.51,8.51,0,0,1,5.71,5.4,8.76,8.76,0,0,1,9.82,3.48a9.71,9.71,0,0,1,7.75,2.07l1.67-2.1a.59.59,0,0,1,1,.21L22,11.08A.59.59,0,0,1,21.38,11.83Z"/%3E%3C/svg%3E';
/**
diff --git a/packages/scratch-vm/src/blocks/scratch3_data.js b/packages/scratch-vm/src/blocks/scratch3_data.js
index 824831451c..67eea4527f 100644
--- a/packages/scratch-vm/src/blocks/scratch3_data.js
+++ b/packages/scratch-vm/src/blocks/scratch3_data.js
@@ -11,7 +11,7 @@ class Scratch3DataBlocks {
/**
* Retrieve the block primitives implemented by this package.
- * @return {object.} Mapping of opcode to Function.
+ * @returns {object.} Mapping of opcode to Function.
*/
getPrimitives () {
return {
@@ -247,7 +247,7 @@ class Scratch3DataBlocks {
/**
* Type representation for list variables.
- * @const {number}
+ * @constant {number}
*/
static get LIST_ITEM_LIMIT () {
return 200000;
diff --git a/packages/scratch-vm/src/blocks/scratch3_event.js b/packages/scratch-vm/src/blocks/scratch3_event.js
index 10ceb10cc3..c8d891ca5c 100644
--- a/packages/scratch-vm/src/blocks/scratch3_event.js
+++ b/packages/scratch-vm/src/blocks/scratch3_event.js
@@ -20,7 +20,7 @@ class Scratch3EventBlocks {
/**
* Retrieve the block primitives implemented by this package.
- * @return {object.} Mapping of opcode to Function.
+ * @returns {object.} Mapping of opcode to Function.
*/
getPrimitives () {
return {
diff --git a/packages/scratch-vm/src/blocks/scratch3_looks.js b/packages/scratch-vm/src/blocks/scratch3_looks.js
index 18e163a9a9..d7d78a5dd2 100644
--- a/packages/scratch-vm/src/blocks/scratch3_looks.js
+++ b/packages/scratch-vm/src/blocks/scratch3_looks.js
@@ -8,7 +8,7 @@ const MathUtil = require('../util/math-util');
/**
* @typedef {object} BubbleState - the bubble state associated with a particular target.
- * @property {Boolean} onSpriteRight - tracks whether the bubble is right or left of the sprite.
+ * @property {boolean} onSpriteRight - tracks whether the bubble is right or left of the sprite.
* @property {?int} drawableId - the ID of the associated bubble Drawable, null if none.
* @property {string} text - the text of the bubble.
* @property {string} type - the type of the bubble, "say" or "think"
@@ -62,7 +62,7 @@ class Scratch3LooksBlocks {
/**
* Event name for a text bubble being created or updated.
- * @const {string}
+ * @constant {string}
*/
static get SAY_OR_THINK () {
// There are currently many places in the codebase which explicitly refer to this event by the string 'SAY',
@@ -72,7 +72,7 @@ class Scratch3LooksBlocks {
/**
* Limit for say bubble string.
- * @const {string}
+ * @constant {string}
*/
static get SAY_BUBBLE_LIMIT () {
return 330;
@@ -80,7 +80,7 @@ class Scratch3LooksBlocks {
/**
* Limit for ghost effect
- * @const {object}
+ * @constant {object}
*/
static get EFFECT_GHOST_LIMIT (){
return {min: 0, max: 100};
@@ -88,7 +88,7 @@ class Scratch3LooksBlocks {
/**
* Limit for brightness effect
- * @const {object}
+ * @constant {object}
*/
static get EFFECT_BRIGHTNESS_LIMIT (){
return {min: -100, max: 100};
@@ -212,7 +212,7 @@ class Scratch3LooksBlocks {
* just set it to visible and update the type/text. Otherwise create a new
* bubble and update the relevant custom state.
* @param {!Target} target Target who needs a bubble.
- * @return {undefined} Early return if text is empty string.
+ * @returns {undefined} Early return if text is empty string.
* @private
*/
_renderBubble (target) {
@@ -242,7 +242,7 @@ class Scratch3LooksBlocks {
/**
* Properly format text for a text bubble.
* @param {string} text The text to be formatted
- * @return {string} The formatted text
+ * @returns {string} The formatted text
* @private
*/
_formatBubbleText (text) {
@@ -280,7 +280,7 @@ class Scratch3LooksBlocks {
/**
* Retrieve the block primitives implemented by this package.
- * @return {object.} Mapping of opcode to Function.
+ * @returns {object.} Mapping of opcode to Function.
*/
getPrimitives () {
return {
@@ -384,7 +384,7 @@ class Scratch3LooksBlocks {
* @param {!Target} target Target to set costume to.
* @param {Any} requestedCostume Costume requested, e.g., 0, 'name', etc.
* @param {boolean=} optZeroIndex Set to zero-index the requestedCostume.
- * @return {Array.} Any threads started by this switch.
+ * @returns {Array.} Any threads started by this switch.
*/
_setCostume (target, requestedCostume, optZeroIndex) {
if (typeof requestedCostume === 'number') {
@@ -418,7 +418,7 @@ class Scratch3LooksBlocks {
* @param {!Target} stage Target to set backdrop to.
* @param {Any} requestedBackdrop Backdrop requested, e.g., 0, 'name', etc.
* @param {boolean=} optZeroIndex Set to zero-index the requestedBackdrop.
- * @return {Array.} Any threads started by this switch.
+ * @returns {Array.} Any threads started by this switch.
*/
_setBackdrop (stage, requestedBackdrop, optZeroIndex) {
if (typeof requestedBackdrop === 'number') {
diff --git a/packages/scratch-vm/src/blocks/scratch3_motion.js b/packages/scratch-vm/src/blocks/scratch3_motion.js
index d42dce463b..774c0bbd9b 100644
--- a/packages/scratch-vm/src/blocks/scratch3_motion.js
+++ b/packages/scratch-vm/src/blocks/scratch3_motion.js
@@ -13,7 +13,7 @@ class Scratch3MotionBlocks {
/**
* Retrieve the block primitives implemented by this package.
- * @return {object.} Mapping of opcode to Function.
+ * @returns {object.} Mapping of opcode to Function.
*/
getPrimitives () {
return {
diff --git a/packages/scratch-vm/src/blocks/scratch3_operators.js b/packages/scratch-vm/src/blocks/scratch3_operators.js
index 4fd6a7bf42..cb5d6ef84f 100644
--- a/packages/scratch-vm/src/blocks/scratch3_operators.js
+++ b/packages/scratch-vm/src/blocks/scratch3_operators.js
@@ -12,7 +12,7 @@ class Scratch3OperatorsBlocks {
/**
* Retrieve the block primitives implemented by this package.
- * @return {object.} Mapping of opcode to Function.
+ * @returns {object.} Mapping of opcode to Function.
*/
getPrimitives () {
return {
diff --git a/packages/scratch-vm/src/blocks/scratch3_procedures.js b/packages/scratch-vm/src/blocks/scratch3_procedures.js
index 0f2ec3642d..bd23b36748 100644
--- a/packages/scratch-vm/src/blocks/scratch3_procedures.js
+++ b/packages/scratch-vm/src/blocks/scratch3_procedures.js
@@ -9,7 +9,7 @@ class Scratch3ProcedureBlocks {
/**
* Retrieve the block primitives implemented by this package.
- * @return {object.} Mapping of opcode to Function.
+ * @returns {object.} Mapping of opcode to Function.
*/
getPrimitives () {
return {
diff --git a/packages/scratch-vm/src/blocks/scratch3_sensing.js b/packages/scratch-vm/src/blocks/scratch3_sensing.js
index 2b031307c8..3d1ddbf4dd 100644
--- a/packages/scratch-vm/src/blocks/scratch3_sensing.js
+++ b/packages/scratch-vm/src/blocks/scratch3_sensing.js
@@ -49,7 +49,7 @@ class Scratch3SensingBlocks {
/**
* Retrieve the block primitives implemented by this package.
- * @return {object.} Mapping of opcode to Function.
+ * @returns {object.} Mapping of opcode to Function.
*/
getPrimitives () {
return {
diff --git a/packages/scratch-vm/src/blocks/scratch3_sound.js b/packages/scratch-vm/src/blocks/scratch3_sound.js
index 26df698e60..1f6ef42839 100644
--- a/packages/scratch-vm/src/blocks/scratch3_sound.js
+++ b/packages/scratch-vm/src/blocks/scratch3_sound.js
@@ -4,7 +4,7 @@ const Clone = require('../util/clone');
/**
* Occluded boolean value to make its use more understandable.
- * @const {boolean}
+ * @constant {boolean}
*/
const STORE_WAITING = true;
@@ -73,14 +73,16 @@ class Scratch3SoundBlocks {
return {min: 0, max: 100};
}
- /** The minimum and maximum tempo values, in bpm.
+ /**
+ * The minimum and maximum tempo values, in bpm.
* @type {{min: number, max: number}}
*/
static get TEMPO_RANGE () {
return {min: 20, max: 500};
}
- /** The minimum and maximum values for each sound effect.
+ /**
+ * The minimum and maximum values for each sound effect.
* @type {{effect:{min: number, max: number}}}
*/
static get EFFECT_RANGE () {
@@ -124,7 +126,7 @@ class Scratch3SoundBlocks {
/**
* Retrieve the block primitives implemented by this package.
- * @return {object.} Mapping of opcode to Function.
+ * @returns {object.} Mapping of opcode to Function.
*/
getPrimitives () {
return {
diff --git a/packages/scratch-vm/src/engine/adapter.js b/packages/scratch-vm/src/engine/adapter.js
index d10c6874ac..f11b4c9ce9 100644
--- a/packages/scratch-vm/src/engine/adapter.js
+++ b/packages/scratch-vm/src/engine/adapter.js
@@ -9,7 +9,7 @@ const uid = require('../util/uid');
* @param {object} blocks Collection of blocks to add to.
* @param {boolean} isTopBlock Whether blocks at this level are "top blocks."
* @param {?string} parent Parent block ID.
- * @return {undefined}
+ * @returns {undefined}
*/
const domToBlock = function (blockDOM, blocks, isTopBlock, parent) {
if (!blockDOM.attribs.id) {
@@ -135,7 +135,7 @@ const domToBlock = function (blockDOM, blocks, isTopBlock, parent) {
* to a usable form for the Scratch runtime.
* This structure is based on Blockly xml.js:`domToWorkspace` and `domToBlock`.
* @param {Element} blocksDOM DOM tree for this event.
- * @return {Array.