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 @@ - - - - fav-gray - Created with Sketch. - - - - - \ 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 @@ - - - - love-gray - Created with Sketch. - - - - - \ 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 @@ - - - - remix-gray - Created with Sketch. - - - - - \ 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 @@ - - - - views-gray - Created with Sketch. - - - - - - - - \ 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' ? [