Skip to content

Commit 389a596

Browse files
CrispStrobeclaude
andcommitted
Pseudocode tab: associate SVGs to sprites via a 2-column table
- SVG uploader is now a table: SVG file (preview + name) | Sprite | Mode. The Sprite column is a dropdown populated from the SPRITE names parsed from the pseudocode, so you pick a real sprite instead of typing a name. - Warn when no SPRITE declarations exist yet; flag chosen names not in code. Also add vendored-file syncing + CI tweaks: - scripts/sync-sb3creator.mjs pulls the compiler + examples from the sb3-creator source repo (npm run sync:sb3creator[:check]). - CI: concurrency cancel-in-progress, skip docs-only pushes, and an informational vendored-drift check. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
1 parent 62c6f39 commit 389a596

4 files changed

Lines changed: 301 additions & 186 deletions

File tree

‎.github/workflows/node.js.yml‎

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,17 @@ name: CI
33
on:
44
push:
55
branches: [develop]
6+
paths-ignore: ['**.md', 'docs/**']
67
pull_request:
8+
paths-ignore: ['**.md', 'docs/**']
79
workflow_dispatch:
810

11+
# A new push to the same branch/PR cancels the previous (still-building) run
12+
# instead of queuing another 8 GB webpack build behind it.
13+
concurrency:
14+
group: ci-${{ github.ref }}
15+
cancel-in-progress: true
16+
917
jobs:
1018
build:
1119
name: Lint + build smoke test
@@ -39,6 +47,12 @@ jobs:
3947
- name: Install ESLint parser missing from package.json
4048
run: npm install --no-save --legacy-peer-deps --no-audit --no-fund @babel/eslint-parser
4149

50+
# Informational: flag if the vendored SB3 Creator compiler/examples have
51+
# drifted from the source repo. Fix with `npm run sync:sb3creator`.
52+
- name: Check vendored sb3-creator is in sync
53+
continue-on-error: true
54+
run: npm run sync:sb3creator:check
55+
4256
# The micro:bit firmware-flasher imports a generated file that is not
4357
# produced by --ignore-scripts. Stub it; the flasher path won't function
4458
# but every other code path is unaffected.

‎package.json‎

Lines changed: 166 additions & 164 deletions
Original file line numberDiff line numberDiff line change
@@ -1,167 +1,169 @@
11
{
2-
"name": "scratch-gui",
3-
"version": "3.2.37",
4-
"description": "Graphical User Interface for creating and running Scratch 3.0 projects",
5-
"author": "Massachusetts Institute of Technology",
6-
"license": "GPL-3.0",
7-
"homepage": "https://crispstrobe.github.io/scratch-gui",
8-
"repository": {
9-
"type": "git",
10-
"url": "https://github.com/crispstrobe/scratch-gui.git"
11-
},
12-
"main": "./dist/js/scratch-gui.js",
13-
"scripts": {
14-
"prebuild": "node ./scripts/makePWAAssetsManifest.js",
15-
"build": "npm run clean && webpack --colors --bail",
16-
"postinstall": "patch-package",
17-
"clean": "rimraf ./build && mkdirp build && rimraf ./dist && mkdirp dist",
18-
"deploy": "gh-pages -d build",
19-
"prepublish": "node scripts/prepublish.mjs",
20-
"prune": "./prune-gh-pages.sh",
21-
"i18n:push": "tx-push-src scratch-editor interface translations/en.json",
22-
"i18n:src": "rimraf ./translations/messages/src && babel src > tmp.js && rimraf tmp.js && build-i18n-src ./translations/messages/src ./translations/",
23-
"start": "webpack-dev-server",
24-
"test": "npm run test:lint && npm run test:unit && npm run build && npm run test:integration",
25-
"test:integration": "jest --maxWorkers=4 test[\\\\/]integration",
26-
"test:lint": "eslint . --ext .js,.jsx",
27-
"test:unit": "jest test[\\\\/]unit[\\\\/]addons",
28-
"test:smoke": "jest --runInBand test[\\\\/]smoke",
29-
"watch": "webpack --colors --watch"
30-
},
31-
"config": {
32-
"commitizen": {
33-
"path": "cz-conventional-changelog"
34-
}
35-
},
36-
"dependencies": {
37-
"@microbit/microbit-universal-hex": "0.2.2",
38-
"@turbowarp/jszip": "^3.11.1",
39-
"@turbowarp/nanolog": "^1.0.1",
40-
"@turbowarp/scratch-l10n": "^3.1001.0-202401241456-994097a5",
41-
"@turbowarp/scratch-storage": "^0.0.202505311821",
42-
"@turbowarp/scratch-svg-renderer": "^1.0.0-202312242305-12c360b",
43-
"@turbowarp/startaudiocontext": "^1.0.0",
44-
"arraybuffer-loader": "^1.0.6",
45-
"autoprefixer": "^9.0.1",
46-
"balance-text": "3.3.1",
47-
"base64-loader": "1.0.0",
48-
"bowser": "1.9.4",
49-
"classnames": "2.2.6",
50-
"computed-style-to-inline-style": "3.0.0",
51-
"cookie": "0.5.0",
52-
"copy-webpack-plugin": "6.4.1",
53-
"core-js": "2.5.7",
54-
"css-loader": "^1.0.0",
55-
"dapjs": "2.3.0",
56-
"es6-object-assign": "1.1.0",
57-
"get-float-time-domain-data": "0.1.0",
58-
"get-user-media-promise": "1.1.4",
59-
"intl": "1.2.5",
60-
"intl-messageformat": "^2.2.0",
61-
"js-base64": "2.4.9",
62-
"keymirror": "0.1.1",
63-
"lodash.bindall": "4.4.0",
64-
"lodash.debounce": "4.0.8",
65-
"lodash.defaultsdeep": "4.6.1",
66-
"lodash.omit": "4.5.0",
67-
"lodash.throttle": "4.0.1",
68-
"omggif": "1.0.9",
69-
"papaparse": "5.3.0",
70-
"postcss-import": "^12.0.0",
71-
"postcss-loader": "^3.0.0",
72-
"postcss-simple-vars": "^5.0.1",
73-
"prop-types": "^15.5.10",
74-
"query-string": "^5.1.1",
75-
"raw-loader": "^0.5.1",
76-
"react": "^16.14.0",
77-
"react-contextmenu": "2.9.4",
78-
"react-dom": "^16.14.0",
79-
"react-draggable": "3.0.5",
80-
"react-ga": "2.5.3",
81-
"react-intl": "2.9.0",
82-
"react-modal": "3.9.1",
83-
"react-popover": "0.5.10",
84-
"react-redux": "5.0.7",
85-
"react-responsive": "5.0.0",
86-
"react-string-replace": "^0.4.4",
87-
"react-style-proptype": "3.2.2",
88-
"react-tabs": "2.3.0",
89-
"react-tooltip": "3.8.0",
90-
"react-virtualized": "9.20.1",
91-
"redux": "3.7.2",
92-
"redux-throttle": "0.1.1",
93-
"scratch-audio": "github:TurboWarp/scratch-audio#develop",
94-
"scratch-blocks": "github:TurboWarp/scratch-blocks#develop-builds",
95-
"scratch-paint": "github:TurboWarp/scratch-paint#develop",
96-
"scratch-render": "github:TurboWarp/scratch-render#develop",
97-
"scratch-vm": "github:TurboWarp/scratch-vm#develop",
98-
"style-loader": "^0.23.0",
99-
"text-encoding": "0.7.0",
100-
"to-style": "1.3.3",
101-
"wav-encoder": "1.3.0",
102-
"xhr": "2.5.0"
103-
},
104-
"peerDependencies": {
105-
"react": "^16.0.0",
106-
"react-dom": "^16.0.0"
107-
},
108-
"devDependencies": {
109-
"@babel/cli": "^7.26.4",
110-
"@babel/core": "^7.26.9",
111-
"@babel/plugin-proposal-object-rest-spread": "7.14.7",
112-
"@babel/plugin-syntax-dynamic-import": "7.2.0",
113-
"@babel/plugin-transform-async-to-generator": "7.14.5",
114-
"@babel/preset-env": "7.14.8",
115-
"@babel/preset-react": "7.14.5",
116-
"babel-core": "7.0.0-bridge.0",
117-
"babel-eslint": "10.1.0",
118-
"babel-loader": "8.3.0",
119-
"chromedriver": "117.0.3",
120-
"enzyme": "3.10.0",
121-
"enzyme-adapter-react-16": "1.15.7",
122-
"eslint": "8.55.0",
123-
"eslint-config-scratch": "9.0.3",
124-
"eslint-import-resolver-webpack": "0.11.1",
125-
"eslint-plugin-import": "2.29.1",
126-
"eslint-plugin-jest": "22.17.0",
127-
"eslint-plugin-react": "7.33.2",
128-
"file-loader": "6.2.0",
129-
"gh-pages": "^3.2.3",
130-
"html-webpack-plugin": "^4.2.0",
131-
"jest": "^29.7.0",
132-
"jest-junit": "7.0.0",
133-
"mkdirp": "1.0.3",
134-
"patch-package": "^8.0.1",
135-
"raf": "3.4.1",
136-
"react-test-renderer": "16.14.0",
137-
"redux-mock-store": "1.5.3",
138-
"rimraf": "2.7.1",
139-
"selenium-webdriver": "3.6.0",
140-
"uglifyjs-webpack-plugin": "1.3.0",
141-
"url-loader": "4.1.1",
142-
"web-audio-test-api": "0.5.2",
143-
"webpack": "4.47.0",
144-
"webpack-cli": "3.3.12",
145-
"webpack-dev-server": "3.11.2",
146-
"yauzl": "2.10.0"
147-
},
148-
"jest": {
149-
"setupFiles": [
150-
"raf/polyfill",
151-
"<rootDir>/test/helpers/enzyme-setup.js"
152-
],
153-
"testPathIgnorePatterns": [
154-
"src/test.js"
155-
],
156-
"moduleNameMapper": {
157-
"\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": "<rootDir>/test/__mocks__/fileMock.js",
158-
"\\.(css|less)$": "<rootDir>/test/__mocks__/styleMock.js",
159-
"editor-msgs(\\.js)?$": "<rootDir>/test/__mocks__/editor-msgs-mock.js"
160-
}
161-
},
162-
"overrides": {
163-
"webpack@4.47.0": {
164-
"terser-webpack-plugin": "^4.2.3"
165-
}
2+
"name": "scratch-gui",
3+
"version": "3.2.37",
4+
"description": "Graphical User Interface for creating and running Scratch 3.0 projects",
5+
"author": "Massachusetts Institute of Technology",
6+
"license": "GPL-3.0",
7+
"homepage": "https://crispstrobe.github.io/scratch-gui",
8+
"repository": {
9+
"type": "git",
10+
"url": "https://github.com/crispstrobe/scratch-gui.git"
11+
},
12+
"main": "./dist/js/scratch-gui.js",
13+
"scripts": {
14+
"prebuild": "node ./scripts/makePWAAssetsManifest.js",
15+
"build": "npm run clean && webpack --colors --bail",
16+
"postinstall": "patch-package",
17+
"clean": "rimraf ./build && mkdirp build && rimraf ./dist && mkdirp dist",
18+
"deploy": "gh-pages -d build",
19+
"prepublish": "node scripts/prepublish.mjs",
20+
"prune": "./prune-gh-pages.sh",
21+
"i18n:push": "tx-push-src scratch-editor interface translations/en.json",
22+
"i18n:src": "rimraf ./translations/messages/src && babel src > tmp.js && rimraf tmp.js && build-i18n-src ./translations/messages/src ./translations/",
23+
"start": "webpack-dev-server",
24+
"test": "npm run test:lint && npm run test:unit && npm run build && npm run test:integration",
25+
"test:integration": "jest --maxWorkers=4 test[\\\\/]integration",
26+
"test:lint": "eslint . --ext .js,.jsx",
27+
"test:unit": "jest test[\\\\/]unit[\\\\/]addons",
28+
"test:smoke": "jest --runInBand test[\\\\/]smoke",
29+
"watch": "webpack --colors --watch",
30+
"sync:sb3creator": "node scripts/sync-sb3creator.mjs",
31+
"sync:sb3creator:check": "node scripts/sync-sb3creator.mjs --check"
32+
},
33+
"config": {
34+
"commitizen": {
35+
"path": "cz-conventional-changelog"
16636
}
37+
},
38+
"dependencies": {
39+
"@microbit/microbit-universal-hex": "0.2.2",
40+
"@turbowarp/jszip": "^3.11.1",
41+
"@turbowarp/nanolog": "^1.0.1",
42+
"@turbowarp/scratch-l10n": "^3.1001.0-202401241456-994097a5",
43+
"@turbowarp/scratch-storage": "^0.0.202505311821",
44+
"@turbowarp/scratch-svg-renderer": "^1.0.0-202312242305-12c360b",
45+
"@turbowarp/startaudiocontext": "^1.0.0",
46+
"arraybuffer-loader": "^1.0.6",
47+
"autoprefixer": "^9.0.1",
48+
"balance-text": "3.3.1",
49+
"base64-loader": "1.0.0",
50+
"bowser": "1.9.4",
51+
"classnames": "2.2.6",
52+
"computed-style-to-inline-style": "3.0.0",
53+
"cookie": "0.5.0",
54+
"copy-webpack-plugin": "6.4.1",
55+
"core-js": "2.5.7",
56+
"css-loader": "^1.0.0",
57+
"dapjs": "2.3.0",
58+
"es6-object-assign": "1.1.0",
59+
"get-float-time-domain-data": "0.1.0",
60+
"get-user-media-promise": "1.1.4",
61+
"intl": "1.2.5",
62+
"intl-messageformat": "^2.2.0",
63+
"js-base64": "2.4.9",
64+
"keymirror": "0.1.1",
65+
"lodash.bindall": "4.4.0",
66+
"lodash.debounce": "4.0.8",
67+
"lodash.defaultsdeep": "4.6.1",
68+
"lodash.omit": "4.5.0",
69+
"lodash.throttle": "4.0.1",
70+
"omggif": "1.0.9",
71+
"papaparse": "5.3.0",
72+
"postcss-import": "^12.0.0",
73+
"postcss-loader": "^3.0.0",
74+
"postcss-simple-vars": "^5.0.1",
75+
"prop-types": "^15.5.10",
76+
"query-string": "^5.1.1",
77+
"raw-loader": "^0.5.1",
78+
"react": "^16.14.0",
79+
"react-contextmenu": "2.9.4",
80+
"react-dom": "^16.14.0",
81+
"react-draggable": "3.0.5",
82+
"react-ga": "2.5.3",
83+
"react-intl": "2.9.0",
84+
"react-modal": "3.9.1",
85+
"react-popover": "0.5.10",
86+
"react-redux": "5.0.7",
87+
"react-responsive": "5.0.0",
88+
"react-string-replace": "^0.4.4",
89+
"react-style-proptype": "3.2.2",
90+
"react-tabs": "2.3.0",
91+
"react-tooltip": "3.8.0",
92+
"react-virtualized": "9.20.1",
93+
"redux": "3.7.2",
94+
"redux-throttle": "0.1.1",
95+
"scratch-audio": "github:TurboWarp/scratch-audio#develop",
96+
"scratch-blocks": "github:TurboWarp/scratch-blocks#develop-builds",
97+
"scratch-paint": "github:TurboWarp/scratch-paint#develop",
98+
"scratch-render": "github:TurboWarp/scratch-render#develop",
99+
"scratch-vm": "github:TurboWarp/scratch-vm#develop",
100+
"style-loader": "^0.23.0",
101+
"text-encoding": "0.7.0",
102+
"to-style": "1.3.3",
103+
"wav-encoder": "1.3.0",
104+
"xhr": "2.5.0"
105+
},
106+
"peerDependencies": {
107+
"react": "^16.0.0",
108+
"react-dom": "^16.0.0"
109+
},
110+
"devDependencies": {
111+
"@babel/cli": "^7.26.4",
112+
"@babel/core": "^7.26.9",
113+
"@babel/plugin-proposal-object-rest-spread": "7.14.7",
114+
"@babel/plugin-syntax-dynamic-import": "7.2.0",
115+
"@babel/plugin-transform-async-to-generator": "7.14.5",
116+
"@babel/preset-env": "7.14.8",
117+
"@babel/preset-react": "7.14.5",
118+
"babel-core": "7.0.0-bridge.0",
119+
"babel-eslint": "10.1.0",
120+
"babel-loader": "8.3.0",
121+
"chromedriver": "117.0.3",
122+
"enzyme": "3.10.0",
123+
"enzyme-adapter-react-16": "1.15.7",
124+
"eslint": "8.55.0",
125+
"eslint-config-scratch": "9.0.3",
126+
"eslint-import-resolver-webpack": "0.11.1",
127+
"eslint-plugin-import": "2.29.1",
128+
"eslint-plugin-jest": "22.17.0",
129+
"eslint-plugin-react": "7.33.2",
130+
"file-loader": "6.2.0",
131+
"gh-pages": "^3.2.3",
132+
"html-webpack-plugin": "^4.2.0",
133+
"jest": "^29.7.0",
134+
"jest-junit": "7.0.0",
135+
"mkdirp": "1.0.3",
136+
"patch-package": "^8.0.1",
137+
"raf": "3.4.1",
138+
"react-test-renderer": "16.14.0",
139+
"redux-mock-store": "1.5.3",
140+
"rimraf": "2.7.1",
141+
"selenium-webdriver": "3.6.0",
142+
"uglifyjs-webpack-plugin": "1.3.0",
143+
"url-loader": "4.1.1",
144+
"web-audio-test-api": "0.5.2",
145+
"webpack": "4.47.0",
146+
"webpack-cli": "3.3.12",
147+
"webpack-dev-server": "3.11.2",
148+
"yauzl": "2.10.0"
149+
},
150+
"jest": {
151+
"setupFiles": [
152+
"raf/polyfill",
153+
"<rootDir>/test/helpers/enzyme-setup.js"
154+
],
155+
"testPathIgnorePatterns": [
156+
"src/test.js"
157+
],
158+
"moduleNameMapper": {
159+
"\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": "<rootDir>/test/__mocks__/fileMock.js",
160+
"\\.(css|less)$": "<rootDir>/test/__mocks__/styleMock.js",
161+
"editor-msgs(\\.js)?$": "<rootDir>/test/__mocks__/editor-msgs-mock.js"
162+
}
163+
},
164+
"overrides": {
165+
"webpack@4.47.0": {
166+
"terser-webpack-plugin": "^4.2.3"
167+
}
168+
}
167169
}

0 commit comments

Comments
 (0)