diff --git a/README.md b/README.md
index f25a63b29..5c71ca0ea 100644
--- a/README.md
+++ b/README.md
@@ -165,7 +165,6 @@ the beginning of the command, before `npm start`:
| `ASSET_HOST` | `https://assets.scratch.mit.edu` | Hostname for asset requests |
| `BACKPACK_HOST` | `https://backpack.scratch.mit.edu` | Hostname for backpack requests |
| `PROJECT_HOST` | `https://projects.scratch.mit.edu` | Hostname for project requests |
-| `SENTRY_DSN` | `''` | DSN for Sentry |
| `FALLBACK` | `''` | Pass-through location for old site |
| `GA_TRACKER` | `''` | Where to log Google Analytics data |
| `NODE_ENV` | `null` | If not `production`, app acts like development |
diff --git a/package-lock.json b/package-lock.json
index 3289507fb..ab5dce6fe 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -9,7 +9,6 @@
"version": "1.0.0",
"license": "BSD-3-Clause",
"dependencies": {
- "@sentry/browser": "4.4.2",
"bunyan": "1.8.15",
"clipboard-copy": "2.0.1",
"express": "4.16.1",
@@ -93,14 +92,15 @@
"react-slick": "0.16.0",
"react-string-replace": "0.4.1",
"react-telephone-input": "4.3.4",
+ "react-test-renderer": "16.14.0",
"redux": "3.5.2",
"redux-mock-store": "1.5.4",
"redux-thunk": "2.0.1",
"regenerator-runtime": "0.13.9",
"sass": "1.49.7",
"sass-loader": "10.2.1",
- "scratch-gui": "1.3.5",
- "scratch-l10n": "3.15.20230110032123",
+ "scratch-gui": "1.3.10",
+ "scratch-l10n": "3.15.20230202032115",
"selenium-webdriver": "4.1.0",
"slick-carousel": "1.6.0",
"style-loader": "0.12.3",
@@ -1645,81 +1645,6 @@
"node": ">=8.0.0"
}
},
- "node_modules/@sentry/browser": {
- "version": "4.4.2",
- "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-4.4.2.tgz",
- "integrity": "sha512-km5p3hPz+aoY4UiEvYxAdRJAbIK30urZSuMs/3zAUVe+8Zij0IHjHmdi9JtrMqpn+rAcWCxtRmFSYlkiKjdSUg==",
- "dependencies": {
- "@sentry/core": "4.4.2",
- "@sentry/types": "4.4.2",
- "@sentry/utils": "4.4.2",
- "tslib": "^1.9.3"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/@sentry/core": {
- "version": "4.4.2",
- "resolved": "https://registry.npmjs.org/@sentry/core/-/core-4.4.2.tgz",
- "integrity": "sha512-hJyAodTCf4sZfVdf41Rtuzj4EsyzYq5rdMZ+zc2Vinwdf8D0/brHe91fHeO0CKXEb2P0wJsrjwMidG/ccq/M8A==",
- "dependencies": {
- "@sentry/hub": "4.4.2",
- "@sentry/minimal": "4.4.2",
- "@sentry/types": "4.4.2",
- "@sentry/utils": "4.4.2",
- "tslib": "^1.9.3"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/@sentry/hub": {
- "version": "4.4.2",
- "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-4.4.2.tgz",
- "integrity": "sha512-oe9ytXkTWyD+QmOpVzHAqTbRV4Hc0ee2Nt6HvrDtRmlXzQxfvTWG2F8KYT6w8kzqg5klnuRpnsmgTTV3KuNBVQ==",
- "dependencies": {
- "@sentry/types": "4.4.2",
- "@sentry/utils": "4.4.2",
- "tslib": "^1.9.3"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/@sentry/minimal": {
- "version": "4.4.2",
- "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-4.4.2.tgz",
- "integrity": "sha512-GEZZiNvVgqFAESZhAe3vjwTInn13lI2bSI3ItQN4RUWKL/W4n/fwVoDJbkb1U8aWxanuMnRDEpKwyQv6zYTZfw==",
- "dependencies": {
- "@sentry/hub": "4.4.2",
- "@sentry/types": "4.4.2",
- "tslib": "^1.9.3"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/@sentry/types": {
- "version": "4.4.2",
- "resolved": "https://registry.npmjs.org/@sentry/types/-/types-4.4.2.tgz",
- "integrity": "sha512-QyQd6PKKIyjJgaq/RQjsxPJEWbXcuiWZ9RvSnhBjS5jj53HEzkM1qkbAFqlYHJ1DTJJ1EuOM4+aTmGzHe93zuA==",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/@sentry/utils": {
- "version": "4.4.2",
- "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-4.4.2.tgz",
- "integrity": "sha512-j/Ad8G1abHlJdD2q7aWWbSOSeWB5M5v1R1VKL8YPlwEbSvvmEQWePhBKFI0qlnKd2ObdUQsj86pHEXJRSFNfCw==",
- "dependencies": {
- "@sentry/types": "4.4.2",
- "tslib": "^1.9.3"
- },
- "engines": {
- "node": ">=6"
- }
- },
"node_modules/@sindresorhus/is": {
"version": "0.7.0",
"resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz",
@@ -20568,15 +20493,6 @@
"react-is": "^16.8.1"
}
},
- "node_modules/react-test-renderer/node_modules/scheduler": {
- "version": "0.19.1",
- "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz",
- "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==",
- "dependencies": {
- "loose-envify": "^1.1.0",
- "object-assign": "^4.1.1"
- }
- },
"node_modules/react-tooltip": {
"version": "3.8.0",
"resolved": "https://registry.npmjs.org/react-tooltip/-/react-tooltip-3.8.0.tgz",
@@ -23084,21 +23000,39 @@
}
},
"node_modules/scratch-blocks": {
- "version": "0.1.0-prerelease.20230110085824",
- "resolved": "https://registry.npmjs.org/scratch-blocks/-/scratch-blocks-0.1.0-prerelease.20230110085824.tgz",
- "integrity": "sha512-GHoE6UH67bB5OLRrPFl/cMHiq7fed0R111sS2QtjxRPLz40uXAvKYE6xphFxYY4z2bvOz1KM0Ya1sg0zsBYMIw==",
+ "version": "0.1.0-prerelease.20230113103241",
+ "resolved": "https://registry.npmjs.org/scratch-blocks/-/scratch-blocks-0.1.0-prerelease.20230113103241.tgz",
+ "integrity": "sha512-bQgjkm54gr820GLZ4E9mYlKYTVdDnt5DcA6BOImiFgyBScdKfRnycuh0cMGJnJeQ1JcyVEX1uezre8Wix91mWQ==",
"dev": true,
"dependencies": {
"exports-loader": "0.7.0",
"google-closure-library": "20190301.0.0",
"imports-loader": "0.8.0",
- "scratch-l10n": "3.15.20230110032123"
+ "scratch-l10n": "3.15.20230113032113"
+ }
+ },
+ "node_modules/scratch-blocks/node_modules/scratch-l10n": {
+ "version": "3.15.20230113032113",
+ "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-3.15.20230113032113.tgz",
+ "integrity": "sha512-q5//oIbED4o3VznMCFnbJH1vEtJwXUgWhEEHqdGGrysl/kp90X/F82YznCpCb042XpZy6FfS1X/YfcGvLRz6bA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/cli": "^7.1.2",
+ "@babel/core": "^7.1.2",
+ "@transifex/api": "4.2.5",
+ "babel-plugin-react-intl": "^3.0.1",
+ "download": "^8.0.0",
+ "transifex": "1.6.6"
+ },
+ "bin": {
+ "build-i18n-src": "scripts/build-i18n-src.js",
+ "tx-push-src": "scripts/tx-push-src.js"
}
},
"node_modules/scratch-gui": {
- "version": "1.3.5",
- "resolved": "https://registry.npmjs.org/scratch-gui/-/scratch-gui-1.3.5.tgz",
- "integrity": "sha512-EOgNxudEtwNm9USdou9uWvrPlhUXffctEvRyScGxmkvtkhag4sA1zxFuJEAldUj0TDcUbFwKDaIzqZsmvNcHTg==",
+ "version": "1.3.10",
+ "resolved": "https://registry.npmjs.org/scratch-gui/-/scratch-gui-1.3.10.tgz",
+ "integrity": "sha512-mtPpJ8PP1M0uuLqA0SU+7hTP21uYm/mK7ixuqNPeaFgLjVTxLm7q9w8PKIetmYeRr6hiQXrqZOQ8YSAPp2NH3A==",
"dev": true,
"dependencies": {
"arraybuffer-loader": "^1.0.6",
@@ -23149,14 +23083,14 @@
"redux": "3.7.2",
"redux-throttle": "0.1.1",
"scratch-audio": "0.1.0-prerelease.20221123180128",
- "scratch-blocks": "0.1.0-prerelease.20230110085824",
- "scratch-l10n": "3.15.20230110032123",
+ "scratch-blocks": "0.1.0-prerelease.20230113103241",
+ "scratch-l10n": "3.15.20230113032113",
"scratch-paint": "1.1.31",
"scratch-render": "0.1.0-prerelease.20221121051603",
"scratch-render-fonts": "1.0.0-prerelease.20221102164332",
"scratch-storage": "2.0.2",
"scratch-svg-renderer": "0.2.0-prerelease.20221120235613",
- "scratch-vm": "1.3.14",
+ "scratch-vm": "1.3.18",
"startaudiocontext": "1.2.1",
"style-loader": "^0.23.0",
"text-encoding": "0.7.0",
@@ -23433,6 +23367,24 @@
"symbol-observable": "^1.0.3"
}
},
+ "node_modules/scratch-gui/node_modules/scratch-l10n": {
+ "version": "3.15.20230113032113",
+ "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-3.15.20230113032113.tgz",
+ "integrity": "sha512-q5//oIbED4o3VznMCFnbJH1vEtJwXUgWhEEHqdGGrysl/kp90X/F82YznCpCb042XpZy6FfS1X/YfcGvLRz6bA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/cli": "^7.1.2",
+ "@babel/core": "^7.1.2",
+ "@transifex/api": "4.2.5",
+ "babel-plugin-react-intl": "^3.0.1",
+ "download": "^8.0.0",
+ "transifex": "1.6.6"
+ },
+ "bin": {
+ "build-i18n-src": "scripts/build-i18n-src.js",
+ "tx-push-src": "scripts/tx-push-src.js"
+ }
+ },
"node_modules/scratch-gui/node_modules/scratch-paint": {
"version": "1.1.31",
"resolved": "https://registry.npmjs.org/scratch-paint/-/scratch-paint-1.1.31.tgz",
@@ -23515,9 +23467,9 @@
}
},
"node_modules/scratch-l10n": {
- "version": "3.15.20230110032123",
- "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-3.15.20230110032123.tgz",
- "integrity": "sha512-YSIKWDeuz/Dx1k6NiPcu7No9iq0LaVBIBSGFoIhuYTMl0ew0kUFymdMVACCuHsvI/W24s9RR5sW/hRXZlksrYQ==",
+ "version": "3.15.20230202032115",
+ "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-3.15.20230202032115.tgz",
+ "integrity": "sha512-NyCGmdYSFJAzGW8U03JQa/0dDg8VyvNh3+bNRxt2QG+gxJGK6mXB+8+h3uMMbvedDKMB28G8wEdU9pAFWc/cqA==",
"dev": true,
"dependencies": {
"@babel/cli": "^7.1.2",
@@ -23715,9 +23667,9 @@
"dev": true
},
"node_modules/scratch-vm": {
- "version": "1.3.14",
- "resolved": "https://registry.npmjs.org/scratch-vm/-/scratch-vm-1.3.14.tgz",
- "integrity": "sha512-P1l6oFzEObNP2WoO8N9bs2BqZ3ZvY/YrvzHeq14OC2i4l6BTbGX3tZiuPAAeVXTCodZKrssO/ny027jKYTqfkg==",
+ "version": "1.3.18",
+ "resolved": "https://registry.npmjs.org/scratch-vm/-/scratch-vm-1.3.18.tgz",
+ "integrity": "sha512-qL/WYZqsvVPc2vXTjdQOxXfuXwm5eY9989yC2jw1JWYvU6WkOr2oCbu0BHaY9FLP2A0XYJ+i8CEPju+zeay2RA==",
"dev": true,
"dependencies": {
"@vernier/godirect": "1.5.0",
@@ -33018,63 +32970,6 @@
"integrity": "sha512-cphYw/y/l36UJ8fv/LXyK+lHlxMXtoydJUsgA4u5QnaUaSZYepuSHik6PewJGT4qvaPwT5ImvHWwX2kElWXvoQ==",
"dev": true
},
- "@sentry/browser": {
- "version": "4.4.2",
- "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-4.4.2.tgz",
- "integrity": "sha512-km5p3hPz+aoY4UiEvYxAdRJAbIK30urZSuMs/3zAUVe+8Zij0IHjHmdi9JtrMqpn+rAcWCxtRmFSYlkiKjdSUg==",
- "requires": {
- "@sentry/core": "4.4.2",
- "@sentry/types": "4.4.2",
- "@sentry/utils": "4.4.2",
- "tslib": "^1.9.3"
- }
- },
- "@sentry/core": {
- "version": "4.4.2",
- "resolved": "https://registry.npmjs.org/@sentry/core/-/core-4.4.2.tgz",
- "integrity": "sha512-hJyAodTCf4sZfVdf41Rtuzj4EsyzYq5rdMZ+zc2Vinwdf8D0/brHe91fHeO0CKXEb2P0wJsrjwMidG/ccq/M8A==",
- "requires": {
- "@sentry/hub": "4.4.2",
- "@sentry/minimal": "4.4.2",
- "@sentry/types": "4.4.2",
- "@sentry/utils": "4.4.2",
- "tslib": "^1.9.3"
- }
- },
- "@sentry/hub": {
- "version": "4.4.2",
- "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-4.4.2.tgz",
- "integrity": "sha512-oe9ytXkTWyD+QmOpVzHAqTbRV4Hc0ee2Nt6HvrDtRmlXzQxfvTWG2F8KYT6w8kzqg5klnuRpnsmgTTV3KuNBVQ==",
- "requires": {
- "@sentry/types": "4.4.2",
- "@sentry/utils": "4.4.2",
- "tslib": "^1.9.3"
- }
- },
- "@sentry/minimal": {
- "version": "4.4.2",
- "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-4.4.2.tgz",
- "integrity": "sha512-GEZZiNvVgqFAESZhAe3vjwTInn13lI2bSI3ItQN4RUWKL/W4n/fwVoDJbkb1U8aWxanuMnRDEpKwyQv6zYTZfw==",
- "requires": {
- "@sentry/hub": "4.4.2",
- "@sentry/types": "4.4.2",
- "tslib": "^1.9.3"
- }
- },
- "@sentry/types": {
- "version": "4.4.2",
- "resolved": "https://registry.npmjs.org/@sentry/types/-/types-4.4.2.tgz",
- "integrity": "sha512-QyQd6PKKIyjJgaq/RQjsxPJEWbXcuiWZ9RvSnhBjS5jj53HEzkM1qkbAFqlYHJ1DTJJ1EuOM4+aTmGzHe93zuA=="
- },
- "@sentry/utils": {
- "version": "4.4.2",
- "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-4.4.2.tgz",
- "integrity": "sha512-j/Ad8G1abHlJdD2q7aWWbSOSeWB5M5v1R1VKL8YPlwEbSvvmEQWePhBKFI0qlnKd2ObdUQsj86pHEXJRSFNfCw==",
- "requires": {
- "@sentry/types": "4.4.2",
- "tslib": "^1.9.3"
- }
- },
"@sindresorhus/is": {
"version": "0.7.0",
"resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz",
@@ -49072,15 +48967,6 @@
"object-assign": "^4.1.1",
"react-is": "^16.8.1"
}
- },
- "scheduler": {
- "version": "0.19.1",
- "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz",
- "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==",
- "requires": {
- "loose-envify": "^1.1.0",
- "object-assign": "^4.1.1"
- }
}
}
},
@@ -51097,21 +50983,37 @@
}
},
"scratch-blocks": {
- "version": "0.1.0-prerelease.20230110085824",
- "resolved": "https://registry.npmjs.org/scratch-blocks/-/scratch-blocks-0.1.0-prerelease.20230110085824.tgz",
- "integrity": "sha512-GHoE6UH67bB5OLRrPFl/cMHiq7fed0R111sS2QtjxRPLz40uXAvKYE6xphFxYY4z2bvOz1KM0Ya1sg0zsBYMIw==",
+ "version": "0.1.0-prerelease.20230113103241",
+ "resolved": "https://registry.npmjs.org/scratch-blocks/-/scratch-blocks-0.1.0-prerelease.20230113103241.tgz",
+ "integrity": "sha512-bQgjkm54gr820GLZ4E9mYlKYTVdDnt5DcA6BOImiFgyBScdKfRnycuh0cMGJnJeQ1JcyVEX1uezre8Wix91mWQ==",
"dev": true,
"requires": {
"exports-loader": "0.7.0",
"google-closure-library": "20190301.0.0",
"imports-loader": "0.8.0",
- "scratch-l10n": "3.15.20230110032123"
+ "scratch-l10n": "3.15.20230113032113"
+ },
+ "dependencies": {
+ "scratch-l10n": {
+ "version": "3.15.20230113032113",
+ "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-3.15.20230113032113.tgz",
+ "integrity": "sha512-q5//oIbED4o3VznMCFnbJH1vEtJwXUgWhEEHqdGGrysl/kp90X/F82YznCpCb042XpZy6FfS1X/YfcGvLRz6bA==",
+ "dev": true,
+ "requires": {
+ "@babel/cli": "^7.1.2",
+ "@babel/core": "^7.1.2",
+ "@transifex/api": "4.2.5",
+ "babel-plugin-react-intl": "^3.0.1",
+ "download": "^8.0.0",
+ "transifex": "1.6.6"
+ }
+ }
}
},
"scratch-gui": {
- "version": "1.3.5",
- "resolved": "https://registry.npmjs.org/scratch-gui/-/scratch-gui-1.3.5.tgz",
- "integrity": "sha512-EOgNxudEtwNm9USdou9uWvrPlhUXffctEvRyScGxmkvtkhag4sA1zxFuJEAldUj0TDcUbFwKDaIzqZsmvNcHTg==",
+ "version": "1.3.10",
+ "resolved": "https://registry.npmjs.org/scratch-gui/-/scratch-gui-1.3.10.tgz",
+ "integrity": "sha512-mtPpJ8PP1M0uuLqA0SU+7hTP21uYm/mK7ixuqNPeaFgLjVTxLm7q9w8PKIetmYeRr6hiQXrqZOQ8YSAPp2NH3A==",
"dev": true,
"requires": {
"arraybuffer-loader": "^1.0.6",
@@ -51162,14 +51064,14 @@
"redux": "3.7.2",
"redux-throttle": "0.1.1",
"scratch-audio": "0.1.0-prerelease.20221123180128",
- "scratch-blocks": "0.1.0-prerelease.20230110085824",
- "scratch-l10n": "3.15.20230110032123",
+ "scratch-blocks": "0.1.0-prerelease.20230113103241",
+ "scratch-l10n": "3.15.20230113032113",
"scratch-paint": "1.1.31",
"scratch-render": "0.1.0-prerelease.20221121051603",
"scratch-render-fonts": "1.0.0-prerelease.20221102164332",
"scratch-storage": "2.0.2",
"scratch-svg-renderer": "0.2.0-prerelease.20221120235613",
- "scratch-vm": "1.3.14",
+ "scratch-vm": "1.3.18",
"startaudiocontext": "1.2.1",
"style-loader": "^0.23.0",
"text-encoding": "0.7.0",
@@ -51392,6 +51294,20 @@
"symbol-observable": "^1.0.3"
}
},
+ "scratch-l10n": {
+ "version": "3.15.20230113032113",
+ "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-3.15.20230113032113.tgz",
+ "integrity": "sha512-q5//oIbED4o3VznMCFnbJH1vEtJwXUgWhEEHqdGGrysl/kp90X/F82YznCpCb042XpZy6FfS1X/YfcGvLRz6bA==",
+ "dev": true,
+ "requires": {
+ "@babel/cli": "^7.1.2",
+ "@babel/core": "^7.1.2",
+ "@transifex/api": "4.2.5",
+ "babel-plugin-react-intl": "^3.0.1",
+ "download": "^8.0.0",
+ "transifex": "1.6.6"
+ }
+ },
"scratch-paint": {
"version": "1.1.31",
"resolved": "https://registry.npmjs.org/scratch-paint/-/scratch-paint-1.1.31.tgz",
@@ -51456,9 +51372,9 @@
}
},
"scratch-l10n": {
- "version": "3.15.20230110032123",
- "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-3.15.20230110032123.tgz",
- "integrity": "sha512-YSIKWDeuz/Dx1k6NiPcu7No9iq0LaVBIBSGFoIhuYTMl0ew0kUFymdMVACCuHsvI/W24s9RR5sW/hRXZlksrYQ==",
+ "version": "3.15.20230202032115",
+ "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-3.15.20230202032115.tgz",
+ "integrity": "sha512-NyCGmdYSFJAzGW8U03JQa/0dDg8VyvNh3+bNRxt2QG+gxJGK6mXB+8+h3uMMbvedDKMB28G8wEdU9pAFWc/cqA==",
"dev": true,
"requires": {
"@babel/cli": "^7.1.2",
@@ -51653,9 +51569,9 @@
"dev": true
},
"scratch-vm": {
- "version": "1.3.14",
- "resolved": "https://registry.npmjs.org/scratch-vm/-/scratch-vm-1.3.14.tgz",
- "integrity": "sha512-P1l6oFzEObNP2WoO8N9bs2BqZ3ZvY/YrvzHeq14OC2i4l6BTbGX3tZiuPAAeVXTCodZKrssO/ny027jKYTqfkg==",
+ "version": "1.3.18",
+ "resolved": "https://registry.npmjs.org/scratch-vm/-/scratch-vm-1.3.18.tgz",
+ "integrity": "sha512-qL/WYZqsvVPc2vXTjdQOxXfuXwm5eY9989yC2jw1JWYvU6WkOr2oCbu0BHaY9FLP2A0XYJ+i8CEPju+zeay2RA==",
"dev": true,
"requires": {
"@vernier/godirect": "1.5.0",
diff --git a/package.json b/package.json
index 788b79ca7..4e168b5ba 100644
--- a/package.json
+++ b/package.json
@@ -44,7 +44,6 @@
},
"homepage": "https://github.com/llk/scratch-www#readme",
"dependencies": {
- "@sentry/browser": "4.4.2",
"bunyan": "1.8.15",
"clipboard-copy": "2.0.1",
"express": "4.16.1",
@@ -128,14 +127,15 @@
"react-slick": "0.16.0",
"react-string-replace": "0.4.1",
"react-telephone-input": "4.3.4",
+ "react-test-renderer": "16.14.0",
"redux": "3.5.2",
"redux-mock-store": "1.5.4",
"redux-thunk": "2.0.1",
"regenerator-runtime": "0.13.9",
"sass": "1.49.7",
"sass-loader": "10.2.1",
- "scratch-gui": "1.3.5",
- "scratch-l10n": "3.15.20230110032123",
+ "scratch-gui": "1.3.10",
+ "scratch-l10n": "3.15.20230202032115",
"selenium-webdriver": "4.1.0",
"slick-carousel": "1.6.0",
"style-loader": "0.12.3",
diff --git a/src/components/errorboundary/errorboundary.jsx b/src/components/errorboundary/errorboundary.jsx
index a1c320e36..182592934 100644
--- a/src/components/errorboundary/errorboundary.jsx
+++ b/src/components/errorboundary/errorboundary.jsx
@@ -1,6 +1,5 @@
const PropTypes = require('prop-types');
const React = require('react');
-const Sentry = require('@sentry/browser');
const CrashMessageComponent = require('../crashmessage/crashmessage.jsx');
import log from '../../lib/log.js';
@@ -9,28 +8,37 @@ class ErrorBoundary extends React.Component {
constructor (props) {
super(props);
this.state = {
- hasError: false,
- errorId: null
+ error: null,
+ errorInfo: null
};
}
+ /**
+ * Handle an error caught by this ErrorBoundary component.
+ * @param {Error} error - the error that was caught.
+ * @param {React.ErrorInfo} errorInfo - the React error info associated with the error.
+ */
componentDidCatch (error, errorInfo) {
- // Display fallback UI
- Sentry.withScope(scope => {
- scope.setTag('project', 'scratch-www');
- if (this.props.componentName) {
- scope.setTag('component', this.props.componentName);
- }
- Object.keys(errorInfo).forEach(key => {
- scope.setExtra(key, errorInfo[key]);
+ error = error || {
+ stack: 'Unknown stack',
+ message: 'Unknown error'
+ };
+ errorInfo = errorInfo || {
+ componentStack: 'Unknown component stack'
+ };
+
+ // only remember the first error: later errors might just be side effects of that first one
+ if (!this.state.error) {
+ // store error & errorInfo for debugging
+ this.setState({
+ error,
+ errorInfo
});
- Sentry.captureException(error);
- });
- this.setState({
- hasError: true,
- errorId: Sentry.lastEventId()
- });
- log.error(`Unhandled Error: ${error}, info: ${errorInfo}`);
+ }
+
+ // report every error in the console
+ const componentInfo = this.props.componentName ? ` in ${this.props.componentName}` : '';
+ log.error(`Unhandled Error${componentInfo}: ${error.stack}\nComponent stack: ${errorInfo.componentStack}`);
}
handleBack () {
@@ -38,10 +46,9 @@ class ErrorBoundary extends React.Component {
}
render () {
- if (this.state.hasError) {
+ if (this.state.error) {
return (
);
diff --git a/src/components/extension-landing/extension-landing.scss b/src/components/extension-landing/extension-landing.scss
index a9182d592..7d0748d37 100644
--- a/src/components/extension-landing/extension-landing.scss
+++ b/src/components/extension-landing/extension-landing.scss
@@ -106,6 +106,7 @@
display: flex;
margin-bottom: 2rem;
color: $ui-white;
+ width: 100%;
img {
padding-right: .5rem;
diff --git a/src/lib/sentry.js b/src/lib/sentry.js
deleted file mode 100644
index b16cd03a9..000000000
--- a/src/lib/sentry.js
+++ /dev/null
@@ -1,18 +0,0 @@
-const initSentry = () => {
- // initialize Sentry instance, making sure it hasn't been initialized already
- if (!window.Sentry && `${process.env.SENTRY_DSN}` !== '') {
- const Sentry = require('@sentry/browser');
-
- Sentry.init({
- dsn: `${process.env.SENTRY_DSN}`,
- // Do not collect global onerror, only collect specifically from React error boundaries.
- // TryCatch plugin also includes errors from setTimeouts (i.e. the VM)
- integrations: integrations => integrations.filter(i =>
- !(i.name === 'GlobalHandlers' || i.name === 'TryCatch'))
- });
-
- window.Sentry = Sentry; // Allow GUI access to Sentry via window
- }
-};
-
-module.exports = initSentry;
diff --git a/src/views/ev3/ev3.jsx b/src/views/ev3/ev3.jsx
index 8c08a30c4..43c75be9f 100644
--- a/src/views/ev3/ev3.jsx
+++ b/src/views/ev3/ev3.jsx
@@ -39,7 +39,7 @@ class EV3 extends ExtensionLanding {
renderCopy={
LEGO MINDSTORMS EV3
(
diff --git a/src/views/preview/embed-view.jsx b/src/views/preview/embed-view.jsx
index 5ef630a53..9aad84fb6 100644
--- a/src/views/preview/embed-view.jsx
+++ b/src/views/preview/embed-view.jsx
@@ -14,9 +14,6 @@ const previewActions = require('../../redux/preview.js');
const GUI = require('scratch-gui');
const IntlGUI = injectIntl(GUI.default);
-const initSentry = require('../../lib/sentry.js');
-initSentry();
-
class EmbedView extends React.Component {
constructor (props) {
super(props);
diff --git a/src/views/preview/project-view.jsx b/src/views/preview/project-view.jsx
index 00c0cdd18..fab4edb48 100644
--- a/src/views/preview/project-view.jsx
+++ b/src/views/preview/project-view.jsx
@@ -39,9 +39,7 @@ const IntlGUI = injectIntl(GUI.default);
const localStorageAvailable = 'localStorage' in window && window.localStorage !== null;
-const initSentry = require('../../lib/sentry.js');
const xhr = require('xhr');
-initSentry();
class Preview extends React.Component {
constructor (props) {
diff --git a/src/views/preview/stats.scss b/src/views/preview/stats.scss
index b2bded497..c33e768c8 100644
--- a/src/views/preview/stats.scss
+++ b/src/views/preview/stats.scss
@@ -55,7 +55,6 @@
cursor: pointer;
&:before {
- opacity: .5;
background-image: url("/svgs/project/love-gray.svg");
}
}
@@ -63,7 +62,6 @@
.project-loves.loved {
&:before {
- opacity: 1;
background-image: url("/svgs/project/love-red.svg");
}
}
@@ -73,7 +71,6 @@
cursor: pointer;
&:before {
- opacity: .5;
background-image: url("/svgs/project/fav-gray.svg");
}
}
@@ -81,7 +78,6 @@
.project-favorites.favorited {
&:before {
- opacity: 1;
background-image: url("/svgs/project/fav-yellow.svg");
}
}
@@ -89,7 +85,6 @@
.project-remixes {
&:before {
- opacity: .5;
background-image: url("/svgs/project/remix-gray.svg");
}
}
@@ -97,7 +92,6 @@
.project-views {
&:before {
- opacity: .5;
background-image: url("/svgs/project/views-gray.svg");
}
}
diff --git a/static/svgs/project/fav-gray.svg b/static/svgs/project/fav-gray.svg
index 40fff7b6d..3e64ce6d2 100644
--- a/static/svgs/project/fav-gray.svg
+++ b/static/svgs/project/fav-gray.svg
@@ -1,10 +1 @@
-
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/static/svgs/project/love-gray.svg b/static/svgs/project/love-gray.svg
index fe6a0ec3d..c6fa2e0b2 100644
--- a/static/svgs/project/love-gray.svg
+++ b/static/svgs/project/love-gray.svg
@@ -1,10 +1 @@
-
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/static/svgs/project/remix-gray.svg b/static/svgs/project/remix-gray.svg
index 0701630be..a92d28e8a 100644
--- a/static/svgs/project/remix-gray.svg
+++ b/static/svgs/project/remix-gray.svg
@@ -1,10 +1 @@
-
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/static/svgs/project/views-gray.svg b/static/svgs/project/views-gray.svg
index e159580e4..2cee40f8b 100644
--- a/static/svgs/project/views-gray.svg
+++ b/static/svgs/project/views-gray.svg
@@ -1,13 +1 @@
-
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/test/unit/components/errorboundary.test.jsx b/test/unit/components/errorboundary.test.jsx
index fbcaf2006..812d90029 100644
--- a/test/unit/components/errorboundary.test.jsx
+++ b/test/unit/components/errorboundary.test.jsx
@@ -1,76 +1,24 @@
import React from 'react';
const {mountWithIntl} = require('../../helpers/intl-helpers.jsx');
-jest.mock('@sentry/browser', () => {
- const setExtra = jest.fn();
- const setTag = jest.fn();
-
- const makeScope = (setExtraParam, setTagParam) => {
- const thisScope = {
- setExtra: setExtraParam,
- setTag: setTagParam
- };
- return thisScope;
- };
- const Sentry = {
- captureException: jest.fn(),
- lastEventId: function () {
- return 0;
- },
- setExtra: setExtra,
- setTag: setTag,
- withScope: jest.fn(cb => {
- cb(makeScope(setExtra, setTag));
- })
- };
- return Sentry;
-});
-
-const Sentry = require('@sentry/browser');
+import CrashMessageComponent from '../../../src/components/crashmessage/crashmessage.jsx';
import ErrorBoundary from '../../../src/components/errorboundary/errorboundary.jsx';
+const ChildComponent = () => hello
;
+
describe('ErrorBoundary', () => {
- let errorBoundaryWrapper;
- const ChildClass = () => (
-
- Children here
-
- );
+ test('ErrorBoundary shows children before error and CrashMessageComponent after', () => {
+ const child = ;
+ const wrapper = mountWithIntl({child});
+ const childWrapper = wrapper.childAt(0);
- beforeEach(() => {
- errorBoundaryWrapper = mountWithIntl(
-
-
-
- );
- });
+ expect(wrapper.containsMatchingElement(child)).toBeTruthy();
+ expect(wrapper.containsMatchingElement()).toBeFalsy();
- test('calling ErrorBoundary\'s componentDidCatch() calls Sentry.withScope()', () => {
- const errorBoundaryInstance = errorBoundaryWrapper.instance();
- errorBoundaryInstance.componentDidCatch('error', {});
- expect(Sentry.withScope).toHaveBeenCalled();
- });
+ childWrapper.simulateError(new Error('fake error for testing purposes'));
- test('calling ErrorBoundary\'s componentDidCatch() calls Sentry.captureException()', () => {
- const errorBoundaryInstance = errorBoundaryWrapper.instance();
- errorBoundaryInstance.componentDidCatch('error', {});
- expect(Sentry.captureException).toHaveBeenCalledWith('error');
- });
-
- test('throwing error under ErrorBoundary calls Sentry.withScope()', () => {
- const child = errorBoundaryWrapper.find('#childClass');
- expect(child.exists()).toEqual(true);
- child.simulateError({}, {});
- expect(Sentry.withScope).toHaveBeenCalled();
- });
-
- test('ErrorBoundary with name prop causes Sentry to setTag with that name', () => {
- const child = errorBoundaryWrapper.find('#childClass');
- expect(child.exists()).toEqual(true);
- child.simulateError({});
- expect(Sentry.setTag).toHaveBeenCalledWith('component', 'TestEBName');
+ expect(wrapper.containsMatchingElement(child)).toBeFalsy();
+ expect(wrapper.containsMatchingElement()).toBeTruthy();
});
});
diff --git a/webpack.config.js b/webpack.config.js
index d4a6ab31a..c31b9aa69 100644
--- a/webpack.config.js
+++ b/webpack.config.js
@@ -230,8 +230,7 @@ module.exports = {
'process.env.CLOUDDATA_HOST': '"' + (process.env.CLOUDDATA_HOST || 'clouddata.scratch.mit.edu') + '"',
'process.env.PROJECT_HOST': '"' + (process.env.PROJECT_HOST || 'https://projects.scratch.mit.edu') + '"',
'process.env.STATIC_HOST': '"' + (process.env.STATIC_HOST || 'https://uploads.scratch.mit.edu') + '"',
- 'process.env.SCRATCH_ENV': '"' + (process.env.SCRATCH_ENV || 'development') + '"',
- 'process.env.SENTRY_DSN': '"' + (process.env.SENTRY_DSN || '') + '"'
+ 'process.env.SCRATCH_ENV': '"' + (process.env.SCRATCH_ENV || 'development') + '"'
})
])
.concat(process.env.ANALYZE_BUNDLE === 'true' ? [