From cc69f7900bf4e7842ba15bccf1f5c9b95b0f15e3 Mon Sep 17 00:00:00 2001 From: GermanCodeEngineer Date: Sun, 9 Nov 2025 13:59:59 +0100 Subject: [PATCH 1/3] jwArrayHandler and dogeiscutObjectHandler now work for both strings and HTML --- src/extensions/jwArray/index.js | 4 ++-- src/extensions/jwColor/index.js | 4 +++- src/extensions/jwDate/index.js | 2 +- src/extensions/jwLambda/index.js | 2 +- src/extensions/jwNum/index.js | 2 +- src/extensions/jwTargets/index.js | 3 ++- src/extensions/jwVector/index.js | 2 +- src/extensions/jwXML/index.js | 4 ++-- 8 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/extensions/jwArray/index.js b/src/extensions/jwArray/index.js index 6f30482416e..22504c45a73 100644 --- a/src/extensions/jwArray/index.js +++ b/src/extensions/jwArray/index.js @@ -98,7 +98,7 @@ class ArrayType { case "object": if (x === null) return "null" if (typeof x.jwArrayHandler == "function") { - return x.jwArrayHandler() + return x.jwArrayHandler(false, "array") } return "Object" case "undefined": @@ -114,7 +114,7 @@ class ArrayType { return "?" } - jwArrayHandler() { + jwArrayHandler(expectsPlainString, context) { return `Array<${formatNumber(this.array.length)}>` } diff --git a/src/extensions/jwColor/index.js b/src/extensions/jwColor/index.js index 9f69aa9e3ed..176a7dff233 100644 --- a/src/extensions/jwColor/index.js +++ b/src/extensions/jwColor/index.js @@ -89,7 +89,9 @@ class ColorType { return this.fromRGB(r, g, b) } - jwArrayHandler() { + jwArrayHandler(expectsPlainString, context) { + if (expectsPlainString) return this.toString() + let color = document.createElement('div') color.style.width = "16px" color.style.height = "16px" diff --git a/src/extensions/jwDate/index.js b/src/extensions/jwDate/index.js index c41387e57de..0b3df70b1ff 100644 --- a/src/extensions/jwDate/index.js +++ b/src/extensions/jwDate/index.js @@ -30,7 +30,7 @@ class DateType { return new DateType() } - jwArrayHandler() { + jwArrayHandler(expectsPlainString, context) { return this.date.toLocaleDateString() } diff --git a/src/extensions/jwLambda/index.js b/src/extensions/jwLambda/index.js index 95550864967..49b68cdc738 100644 --- a/src/extensions/jwLambda/index.js +++ b/src/extensions/jwLambda/index.js @@ -47,7 +47,7 @@ class LambdaType { return new LambdaType() } - jwArrayHandler() { + jwArrayHandler(expectsPlainString, context) { return 'Lambda' } diff --git a/src/extensions/jwNum/index.js b/src/extensions/jwNum/index.js index c04c8461249..1ef838065ec 100644 --- a/src/extensions/jwNum/index.js +++ b/src/extensions/jwNum/index.js @@ -33,7 +33,7 @@ class NumType { return new NumType(x) } - jwArrayHandler() { + jwArrayHandler(expectsPlainString, context) { return this.number.toStringWithDecimalPlaces(3) } diff --git a/src/extensions/jwTargets/index.js b/src/extensions/jwTargets/index.js index e1f3be2d446..de7545727d4 100644 --- a/src/extensions/jwTargets/index.js +++ b/src/extensions/jwTargets/index.js @@ -39,7 +39,8 @@ class jwTargetType { return new jwTargetType("") } - jwArrayHandler() { + jwArrayHandler(expectsPlainString, context) { + // always a string try { return escapeHTML(`Target<${this.target.sprite.name}>`) } catch { diff --git a/src/extensions/jwVector/index.js b/src/extensions/jwVector/index.js index 07fa83e3085..336fe8852ce 100644 --- a/src/extensions/jwVector/index.js +++ b/src/extensions/jwVector/index.js @@ -42,7 +42,7 @@ class VectorType { return new VectorType(0, 0) } - jwArrayHandler() { + jwArrayHandler(expectsPlainString, context) { return 'Vector' } diff --git a/src/extensions/jwXML/index.js b/src/extensions/jwXML/index.js index a75454dc0cd..7983a376c8e 100644 --- a/src/extensions/jwXML/index.js +++ b/src/extensions/jwXML/index.js @@ -117,8 +117,8 @@ class XMLType { ].reduce((a, b) => a.replaceAll(b, ""), text) } - jwArrayHandler() { - return XMLType.safeText(`<${this.name} />`) + jwArrayHandler(expectsPlainString, context) { + return XMLType.safeText(`<${this.name} />`) // always a string } toString(pretty = false, depth = 0) { From 75514259f538bf63d94da22c6260834ab89696dd Mon Sep 17 00:00:00 2001 From: GermanCodeEngineer Date: Tue, 7 Apr 2026 11:07:10 +0200 Subject: [PATCH 2/3] setup eslint to stop annoying me --- .eslintrc.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.eslintrc.js b/.eslintrc.js index 3010f60d3f1..f0beeebf3f9 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,3 +1,6 @@ module.exports = { - extends: ['scratch', 'scratch/node', 'scratch/es6'] + extends: ['scratch', 'scratch/node', 'scratch/es6'], + rules: { + 'no-trailing-spaces': 'off' + } }; From 6ce28ecda8363ded48862604f0c085edae6a6239 Mon Sep 17 00:00:00 2001 From: GermanCodeEngineer Date: Tue, 7 Apr 2026 18:37:56 +0200 Subject: [PATCH 3/3] implement custom autoloaded extensions --- src/extension-support/custom-autoloaded-extensions.json | 3 +++ src/extension-support/extension-manager.js | 9 ++++++--- 2 files changed, 9 insertions(+), 3 deletions(-) create mode 100644 src/extension-support/custom-autoloaded-extensions.json diff --git a/src/extension-support/custom-autoloaded-extensions.json b/src/extension-support/custom-autoloaded-extensions.json new file mode 100644 index 00000000000..2a9ae89d26b --- /dev/null +++ b/src/extension-support/custom-autoloaded-extensions.json @@ -0,0 +1,3 @@ +[ + "http://localhost:5173/extensions/classes.js" +] diff --git a/src/extension-support/extension-manager.js b/src/extension-support/extension-manager.js index 80469a60b9e..e004d967033 100644 --- a/src/extension-support/extension-manager.js +++ b/src/extension-support/extension-manager.js @@ -256,9 +256,9 @@ const CORE_EXTENSIONS = [ const coreExtensionList = Object.getOwnPropertyNames(defaultBuiltinExtensions); const preload = []; - -if (IsLocal || IsLiveTests) { - preload.push("jgDev"); +const customAutoloadedExtensions = require('./custom-autoloaded-extensions.json'); +if ((IsLocal || IsLiveTests)) { + preload.push('jgDev'); } /** @@ -363,6 +363,9 @@ class ExtensionManager { log.error(`ExtensionManager was unable to register extension service: ${JSON.stringify(e)}`); }); + customAutoloadedExtensions.forEach(extensionId => { + this.loadExtensionURL(value); + }) preload.forEach(value => { this.loadExtensionURL(value); });