From 53c3484d51867866fdc21d690ee15266fd793736 Mon Sep 17 00:00:00 2001 From: 8to16 Date: Thu, 2 Oct 2025 17:15:46 +0100 Subject: [PATCH 1/5] add terser --- package-lock.json | 107 +++++++++++++++++++++++++++++++++++++++++++++- package.json | 3 +- 2 files changed, 108 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 31e06a5da3..244accd8b3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,7 +25,8 @@ "espree": "^9.6.1", "esquery": "^1.6.0", "prettier": "^3.5.3", - "spdx-expression-parse": "^4.0.0" + "spdx-expression-parse": "^4.0.0", + "terser": "^5.44.0" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -253,6 +254,56 @@ "url": "https://github.com/sponsors/nzakas" } }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, "node_modules/@transifex/api": { "version": "7.1.4", "resolved": "https://registry.npmjs.org/@transifex/api/-/api-7.1.4.tgz", @@ -434,6 +485,13 @@ "concat-map": "0.0.1" } }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -526,6 +584,13 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "license": "MIT" + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -1972,6 +2037,27 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, "node_modules/spdx-exceptions": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", @@ -2026,6 +2112,25 @@ "node": ">=8" } }, + "node_modules/terser": { + "version": "5.44.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.44.0.tgz", + "integrity": "sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.15.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", diff --git a/package.json b/package.json index aefeb6c065..75ba30ee9a 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,8 @@ "espree": "^9.6.1", "esquery": "^1.6.0", "prettier": "^3.5.3", - "spdx-expression-parse": "^4.0.0" + "spdx-expression-parse": "^4.0.0", + "terser": "^5.44.0" }, "private": true } From 0b0c7ea1abe171b59462eab258d42828dc92aa68 Mon Sep 17 00:00:00 2001 From: 8to16 Date: Thu, 2 Oct 2025 17:22:22 +0100 Subject: [PATCH 2/5] Revert "add terser" This reverts commit 53c3484d51867866fdc21d690ee15266fd793736. --- package-lock.json | 107 +--------------------------------------------- package.json | 3 +- 2 files changed, 2 insertions(+), 108 deletions(-) diff --git a/package-lock.json b/package-lock.json index 244accd8b3..31e06a5da3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,8 +25,7 @@ "espree": "^9.6.1", "esquery": "^1.6.0", "prettier": "^3.5.3", - "spdx-expression-parse": "^4.0.0", - "terser": "^5.44.0" + "spdx-expression-parse": "^4.0.0" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -254,56 +253,6 @@ "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.11", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", - "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, "node_modules/@transifex/api": { "version": "7.1.4", "resolved": "https://registry.npmjs.org/@transifex/api/-/api-7.1.4.tgz", @@ -485,13 +434,6 @@ "concat-map": "0.0.1" } }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true, - "license": "MIT" - }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -584,13 +526,6 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true, - "license": "MIT" - }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -2037,27 +1972,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, "node_modules/spdx-exceptions": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", @@ -2112,25 +2026,6 @@ "node": ">=8" } }, - "node_modules/terser": { - "version": "5.44.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.44.0.tgz", - "integrity": "sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.15.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", diff --git a/package.json b/package.json index 75ba30ee9a..aefeb6c065 100644 --- a/package.json +++ b/package.json @@ -42,8 +42,7 @@ "espree": "^9.6.1", "esquery": "^1.6.0", "prettier": "^3.5.3", - "spdx-expression-parse": "^4.0.0", - "terser": "^5.44.0" + "spdx-expression-parse": "^4.0.0" }, "private": true } From e393f7841d967598a39d21ada02b878f24fa2e69 Mon Sep 17 00:00:00 2001 From: 8to16 Date: Thu, 13 Nov 2025 15:54:51 +0000 Subject: [PATCH 3/5] start work on the temporal extension --- extension-dependencies.json | 4 +++ extensions/8to16/temporal.js | 52 ++++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 extensions/8to16/temporal.js diff --git a/extension-dependencies.json b/extension-dependencies.json index 6e4e4bff2c..27bf88a562 100644 --- a/extension-dependencies.json +++ b/extension-dependencies.json @@ -35,6 +35,10 @@ "https://cdn.jsdelivr.net/npm/lz-string@1.5.0/libs/lz-string.min.js": { "sha256": "95f4d1cbf099f57161b664bc048426ec3df92637801a4c79116e83315aa787e7", "contentType": "application/javascript; charset=utf-8" + }, + "https://cdn.jsdelivr.net/npm/temporal-polyfill@0.3.0/global.min.js": { + "sha256": "719ec13d7f412157f9dd59456a0aaf97f755f15d8e848edddbb28e391b3ca3f6", + "contentType": "application/javascript; charset=utf-8" } } } \ No newline at end of file diff --git a/extensions/8to16/temporal.js b/extensions/8to16/temporal.js new file mode 100644 index 0000000000..42c70353fe --- /dev/null +++ b/extensions/8to16/temporal.js @@ -0,0 +1,52 @@ +// Name: Temporal +// ID: temporalby8x2 +// Description: Advanced time blocks. +// By: 8to16 +// License: MPL-2.0 + +// @ts-nocheck + +(async function (Scratch) { + "use strict"; + + if (!Scratch.extensions.unsandboxed) { + throw new Error("Temporal extension must run unsandboxed"); + } + + let Temporal = window.Temporal ?? undefined; + if (typeof window.Temporal === "undefined") { + Temporal = await Scratch.external.evalAndReturn( + "https://cdn.jsdelivr.net/npm/temporal-polyfill@0.3.0/global.min.js", + "Temporal" + ); + } + + const blockIconURI = + "data:image/svg+xml,%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20xmlns%3Axlink%3D%22http%3A//www.w3.org/1999/xlink%22%20width%3D%2228.0123%22%20height%3D%2228.0123%22%20viewBox%3D%220%2C0%2C28.0123%2C28.0123%22%3E%3Cg%20transform%3D%22translate%28-225.99386%2C-165.99386%29%22%3E%3Cg%20stroke%3D%22%23005188%22%20stroke-width%3D%222%22%20stroke-miterlimit%3D%2210%22%3E%3Cpath%20d%3D%22M226.99387%2C180.000002c0%2C-7.1831%205.82305%2C-13.000615%2013.000615%2C-13.000615c7.1831%2C0%2013.000615%2C5.82305%2013.000615%2C13.000615c0%2C7.1831%20-5.82305%2C13.000615%20-13.000615%2C13.000615c-7.1831%2C0%20-13.000615%2C-5.82305%20-13.000615%2C-13.000615z%22%20fill%3D%22%23ffffff%22%20stroke-linecap%3D%22butt%22/%3E%3Cpath%20d%3D%22M250.16156%2C180.25856h-11.26048v-10.1807%22%20fill%3D%22none%22%20stroke-linecap%3D%22round%22/%3E%3C/g%3E%3C/g%3E%3C/svg%3E"; + + class TemporalExtension { + getInfo() { + return { + id: "temporalby8x2", + name: Scratch.translate("Temporal"), + blockIconURI, + color1: "#5598d4", + color2: "#236fa8", + color3: "#005188", + blocks: [ + { + opcode: "now", + text: Scratch.translate("present timestamp"), + blockType: Scratch.BlockType.REPORTER, + }, + ], + }; + } + + now(args, util) { + return Temporal.Now.zonedDateTimeISO().toString(); + } + } + + Scratch.extensions.register(new TemporalExtension()); +})(Scratch); From 1b7c050b0ecb9de7d077a98ddf77af23ec326e65 Mon Sep 17 00:00:00 2001 From: 8to16 Date: Thu, 13 Nov 2025 16:14:20 +0000 Subject: [PATCH 4/5] it should be done like this --- extensions/8to16/temporal.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions/8to16/temporal.js b/extensions/8to16/temporal.js index 42c70353fe..90525d2777 100644 --- a/extensions/8to16/temporal.js +++ b/extensions/8to16/temporal.js @@ -5,6 +5,7 @@ // License: MPL-2.0 // @ts-nocheck +/* eslint-disable no-undef */ (async function (Scratch) { "use strict"; @@ -13,9 +14,8 @@ throw new Error("Temporal extension must run unsandboxed"); } - let Temporal = window.Temporal ?? undefined; if (typeof window.Temporal === "undefined") { - Temporal = await Scratch.external.evalAndReturn( + await Scratch.external.evalAndReturn( "https://cdn.jsdelivr.net/npm/temporal-polyfill@0.3.0/global.min.js", "Temporal" ); From bdd4ad1b4cd4ba811f769799d39ee16769a01a9d Mon Sep 17 00:00:00 2001 From: 8to16 Date: Thu, 13 Nov 2025 18:36:58 +0000 Subject: [PATCH 5/5] 8to16/temporal: updates --- extensions/8to16/temporal.js | 57 ++++++++++++++++++++++++++++++++++-- 1 file changed, 55 insertions(+), 2 deletions(-) diff --git a/extensions/8to16/temporal.js b/extensions/8to16/temporal.js index 90525d2777..fb3f1ca063 100644 --- a/extensions/8to16/temporal.js +++ b/extensions/8to16/temporal.js @@ -36,7 +36,45 @@ blocks: [ { opcode: "now", - text: Scratch.translate("present timestamp"), + text: Scratch.translate("current timestamp"), + blockType: Scratch.BlockType.REPORTER, + }, + { + opcode: "timestamp", + text: Scratch.translate( + "timestamp of date: [YYYY]-[MM]-[DD] time: [HH]:[MIN]:[SS]" + ), + blockType: Scratch.BlockType.REPORTER, + arguments: { + YYYY: { + type: Scratch.ArgumentType.NUMBER, + defaultValue: "2020", + }, + MM: { + type: Scratch.ArgumentType.NUMBER, + defaultValue: "06", + }, + DD: { + type: Scratch.ArgumentType.NUMBER, + defaultValue: "08", + }, + HH: { + type: Scratch.ArgumentType.NUMBER, + defaultValue: "00", + }, + MIN: { + type: Scratch.ArgumentType.NUMBER, + defaultValue: "00", + }, + SS: { + type: Scratch.ArgumentType.NUMBER, + defaultValue: "00", + }, + }, + }, + { + opcode: "timezone", + text: Scratch.translate("timezone"), blockType: Scratch.BlockType.REPORTER, }, ], @@ -44,7 +82,22 @@ } now(args, util) { - return Temporal.Now.zonedDateTimeISO().toString(); + return Temporal.Now.plainDateTimeISO().toString(); + } + + timestamp(args, util) { + return new Temporal.PlainDateTime( + args.YYYY, + args.MM, + args.DD, + args.HH, + args.MIN, + args.SS + ); + } + + timezone(args, util) { + return Temporal.Now.timeZoneId(); } }