diff --git a/package-lock.json b/package-lock.json index 2c1c5fa34..efddbd6b6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,7 +21,7 @@ "react-router-dom": "5.2.0", "react-twitter-embed": "^3.0.3", "react-use": "^17.3.1", - "scratch-parser": "5.0.0", + "scratch-parser": "5.1.0", "scratch-storage": "2.0.2" }, "devDependencies": { @@ -99,8 +99,8 @@ "regenerator-runtime": "0.13.9", "sass": "1.49.7", "sass-loader": "10.2.1", - "scratch-gui": "1.0.48", - "scratch-l10n": "3.15.20221108032110", + "scratch-gui": "1.1.32", + "scratch-l10n": "3.15.20221201032213", "selenium-webdriver": "4.1.0", "slick-carousel": "1.6.0", "style-loader": "0.12.3", @@ -23058,9 +23058,9 @@ } }, "node_modules/scratch-audio": { - "version": "0.1.0-prerelease.20200528195344", - "resolved": "https://registry.npmjs.org/scratch-audio/-/scratch-audio-0.1.0-prerelease.20200528195344.tgz", - "integrity": "sha512-BY1IiMMBj0WDs7jdYnOzBHE88AX3ltjs2XfINJ1VrIE4xn2vZvPgJAyw6ZCc2FDPRwTWLpCdhnlA1TBdaKKdiQ==", + "version": "0.1.0-prerelease.20221123180128", + "resolved": "https://registry.npmjs.org/scratch-audio/-/scratch-audio-0.1.0-prerelease.20221123180128.tgz", + "integrity": "sha512-yj7mSkHmKxQVdBalAew1UjfTthOoTs3pejhh8Tl65KcC3X4+fLbmY1F3woYSrZbXxPtYUZTKyrcwlCh8r1DQjg==", "dev": true, "dependencies": { "audio-context": "1.0.1", @@ -23084,21 +23084,21 @@ } }, "node_modules/scratch-blocks": { - "version": "0.1.0-prerelease.20221024060953", - "resolved": "https://registry.npmjs.org/scratch-blocks/-/scratch-blocks-0.1.0-prerelease.20221024060953.tgz", - "integrity": "sha512-M4OWIPV9yVDGJS0qXfGqriyGVHP2u2zjUa9QyHAv2E5IAVn8KbRb+pjJ4WNHXnAZG9Dfb+rBq5n3BqJ9uObDxQ==", + "version": "0.1.0-prerelease.20221129081817", + "resolved": "https://registry.npmjs.org/scratch-blocks/-/scratch-blocks-0.1.0-prerelease.20221129081817.tgz", + "integrity": "sha512-t/bAA3oZZJMAV3WERdm35cBBUHj7GUZaYhuS5UU23vSoMm5tmcIIz4KYbTBMuujOcodfT1jJ+flJ6s3VRI8ggQ==", "dev": true, "dependencies": { "exports-loader": "0.7.0", "google-closure-library": "20190301.0.0", "imports-loader": "0.8.0", - "scratch-l10n": "3.15.20221024032103" + "scratch-l10n": "3.15.20221129032252" } }, "node_modules/scratch-blocks/node_modules/scratch-l10n": { - "version": "3.15.20221024032103", - "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-3.15.20221024032103.tgz", - "integrity": "sha512-Rntiu90azd27jaaRsKAeDgr96Qez8fl2yvJrEBMOK5fOX2AjiP9L3HKAolOA/vnhM5fvMbGFeymDbKaDb/x3Yg==", + "version": "3.15.20221129032252", + "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-3.15.20221129032252.tgz", + "integrity": "sha512-7GsIFuctIjWULB6pO0GqswOwe4/ujZrsNGxUUZ7TXSFwdVyVXhDX9WYu/7Kln3WVrs2AhicVz8WP5yjFOdZs7w==", "dev": true, "dependencies": { "@babel/cli": "^7.1.2", @@ -23114,9 +23114,9 @@ } }, "node_modules/scratch-gui": { - "version": "1.0.48", - "resolved": "https://registry.npmjs.org/scratch-gui/-/scratch-gui-1.0.48.tgz", - "integrity": "sha512-cbmbocO59OYs0Wafc6TYVCUuK54HhjRpAKxlSyWHqGrojNvRBlMAbqlK9CGzQj7h+he/0ZfqCdLeGsjPtLPnqQ==", + "version": "1.1.32", + "resolved": "https://registry.npmjs.org/scratch-gui/-/scratch-gui-1.1.32.tgz", + "integrity": "sha512-4QO8B11ShROWNFtgZXQZ4uYs0qPaEKC8lVVPSNNHS7c0a2eUIQ30kmiy5Ukxvoz2TYIuPToIApsTU96MFBfbuQ==", "dev": true, "dependencies": { "arraybuffer-loader": "^1.0.6", @@ -23166,15 +23166,15 @@ "react-virtualized": "9.20.1", "redux": "3.7.2", "redux-throttle": "0.1.1", - "scratch-audio": "0.1.0-prerelease.20200528195344", - "scratch-blocks": "0.1.0-prerelease.20221024060953", - "scratch-l10n": "3.15.20221024032103", - "scratch-paint": "1.1.29", - "scratch-render": "0.1.0-prerelease.20221024201900", - "scratch-render-fonts": "1.0.0-prerelease.20221024190656", + "scratch-audio": "0.1.0-prerelease.20221123180128", + "scratch-blocks": "0.1.0-prerelease.20221129081817", + "scratch-l10n": "3.15.20221129032252", + "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.20221024201850", - "scratch-vm": "1.2.52", + "scratch-svg-renderer": "0.2.0-prerelease.20221120235613", + "scratch-vm": "1.2.54", "startaudiocontext": "1.2.1", "style-loader": "^0.23.0", "text-encoding": "0.7.0", @@ -23452,9 +23452,9 @@ } }, "node_modules/scratch-gui/node_modules/scratch-l10n": { - "version": "3.15.20221024032103", - "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-3.15.20221024032103.tgz", - "integrity": "sha512-Rntiu90azd27jaaRsKAeDgr96Qez8fl2yvJrEBMOK5fOX2AjiP9L3HKAolOA/vnhM5fvMbGFeymDbKaDb/x3Yg==", + "version": "3.15.20221129032252", + "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-3.15.20221129032252.tgz", + "integrity": "sha512-7GsIFuctIjWULB6pO0GqswOwe4/ujZrsNGxUUZ7TXSFwdVyVXhDX9WYu/7Kln3WVrs2AhicVz8WP5yjFOdZs7w==", "dev": true, "dependencies": { "@babel/cli": "^7.1.2", @@ -23470,9 +23470,9 @@ } }, "node_modules/scratch-gui/node_modules/scratch-paint": { - "version": "1.1.29", - "resolved": "https://registry.npmjs.org/scratch-paint/-/scratch-paint-1.1.29.tgz", - "integrity": "sha512-IgJGnA3+WrLLDveLMYDl9Z3RZCPAeRDLDI7r3QRMZSdvpZW46/ddG+dO0YfYVQHekgAf9IHaevCKV/9PNOHxPw==", + "version": "1.1.31", + "resolved": "https://registry.npmjs.org/scratch-paint/-/scratch-paint-1.1.31.tgz", + "integrity": "sha512-yfKgYJVsNmBHQoSh3bZNjcVQ78qAIgQeX820fe5LthuMMn7DE1syUwD56IPFJWhGrR0ykp8Fsf038bbxNuZZfw==", "dev": true, "dependencies": { "@scratch/paper": "0.11.20200728195508", @@ -23504,23 +23504,6 @@ "integrity": "sha512-DTt3GhOUDKhh4ONwIJW4lmhyotQmV2LjNlGK/J2hkwUcqcbKkCLAdJPtxQnxnlc7SR3f1CEXCyMmc7WLUsWbNA==", "dev": true }, - "node_modules/scratch-gui/node_modules/scratch-svg-renderer": { - "version": "0.2.0-prerelease.20221024201850", - "resolved": "https://registry.npmjs.org/scratch-svg-renderer/-/scratch-svg-renderer-0.2.0-prerelease.20221024201850.tgz", - "integrity": "sha512-aeNC0axSAfk/A6ZOLx08aKPWyoq8ulYTexD4RgbJ4K2ksT4cXIUXzzbUWptj7iHnx3mdFXeFmIhqpc9ty5GVig==", - "dev": true, - "dependencies": { - "base64-js": "1.2.1", - "base64-loader": "1.0.0", - "dompurify": "2.2.7", - "fastestsmallesttextencoderdecoder": "^1.0.22", - "minilog": "3.1.0", - "transformation-matrix": "1.15.0" - }, - "peerDependencies": { - "scratch-render-fonts": "^1.0.0-prerelease" - } - }, "node_modules/scratch-gui/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -23568,9 +23551,9 @@ } }, "node_modules/scratch-l10n": { - "version": "3.15.20221108032110", - "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-3.15.20221108032110.tgz", - "integrity": "sha512-FG0LINwlDgGw9d/VM6XArhsgKCkOgtJPvvlHJGEGkTpiQ3zZfN+Evkvfqejywewq7nOK2QBerPFA1RPQOdDfIw==", + "version": "3.15.20221201032213", + "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-3.15.20221201032213.tgz", + "integrity": "sha512-cNi88TwZs0MGMEDUTiZ//5+RNYXl5fgkNmi8FXGK+zURPI4sxM2gGelv7SoLVbaaDVYuis4LGhq/TPR6DR+OyQ==", "dev": true, "dependencies": { "@babel/cli": "^7.1.2", @@ -23586,9 +23569,9 @@ } }, "node_modules/scratch-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/scratch-parser/-/scratch-parser-5.0.0.tgz", - "integrity": "sha512-7kjxoxivLgYYvmAJVLOOWnca4CigwuCpgjy9+6UuxOMgSZKO1xqIjxIADupabmh1ZLZZDVe45DBM/CQTdtVDkw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/scratch-parser/-/scratch-parser-5.1.0.tgz", + "integrity": "sha512-6B6aaEV3TmA2kxSO2u5qLr84f6rhLgUxz276aFYrUyv6ekCWegEUpkKBHnOC1oCAl1ySpVtFBNXh3S110TDadw==", "dependencies": { "ajv": "6.3.0", "jszip": "3.1.5", @@ -23601,7 +23584,7 @@ "node_modules/scratch-parser/node_modules/ajv": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.3.0.tgz", - "integrity": "sha1-FlCkERTvAFdMrBC4Ay2PTBSBLac=", + "integrity": "sha512-6TQywaGYtRub2fqHkSXfVANlhfja2nbF33wCCHnt3aQstOrtd9jsQGiRUTIOlkEqcxpzRd2akfnqvBBPmLxs8g==", "dependencies": { "fast-deep-equal": "^1.0.0", "fast-json-stable-stringify": "^2.0.0", @@ -23609,9 +23592,9 @@ } }, "node_modules/scratch-render": { - "version": "0.1.0-prerelease.20221024201900", - "resolved": "https://registry.npmjs.org/scratch-render/-/scratch-render-0.1.0-prerelease.20221024201900.tgz", - "integrity": "sha512-6dfu8J3x8rsm6RUMQ+Jq4nunJuCX/iCm6Me+NqFpHivx25OPWYF7frczJ7+UtoluBts3eSLfywOr1fQF6KaBNw==", + "version": "0.1.0-prerelease.20221121051603", + "resolved": "https://registry.npmjs.org/scratch-render/-/scratch-render-0.1.0-prerelease.20221121051603.tgz", + "integrity": "sha512-+PmRxh3Ms5+ichCinmg9Nl7jYwYZvGrlOGNLwxGZSYv+Ve96RqMPJAdpyv0ctOzELoYnMalFGZwUWmdMAJLE5Q==", "dev": true, "dependencies": { "grapheme-breaker": "0.3.2", @@ -23621,7 +23604,7 @@ "minilog": "3.1.0", "raw-loader": "^0.5.1", "scratch-storage": "^1.0.0", - "scratch-svg-renderer": "0.2.0-prerelease.20210727023023", + "scratch-svg-renderer": "0.2.0-prerelease.20221120235613", "twgl.js": "4.4.0" }, "peerDependencies": { @@ -23629,9 +23612,9 @@ } }, "node_modules/scratch-render-fonts": { - "version": "1.0.0-prerelease.20221024190656", - "resolved": "https://registry.npmjs.org/scratch-render-fonts/-/scratch-render-fonts-1.0.0-prerelease.20221024190656.tgz", - "integrity": "sha512-ZN2K7wKh8sJrzTZ61AwTTMwrm2AB/jsiHLeF8M1n0A0SoRaBfB7iBYv6cwvW2ZN+pnUBClHAb7bT9/KRlExfFg==", + "version": "1.0.0-prerelease.20221102164332", + "resolved": "https://registry.npmjs.org/scratch-render-fonts/-/scratch-render-fonts-1.0.0-prerelease.20221102164332.tgz", + "integrity": "sha512-22MbRDGUSArVEoHatg5rt7f/H0wWhMrcyN6HD0OQJeDqdlO3qSSX9/qvdzNJGYWwZkhrdJWcI5JGD1YuJfefmw==", "dev": true, "dependencies": { "base64-loader": "1.0.0" @@ -23730,14 +23713,15 @@ } }, "node_modules/scratch-svg-renderer": { - "version": "0.2.0-prerelease.20210727023023", - "resolved": "https://registry.npmjs.org/scratch-svg-renderer/-/scratch-svg-renderer-0.2.0-prerelease.20210727023023.tgz", - "integrity": "sha512-vEGZFFPm03LsHeRnIVQoJBoM3dV23daZCHWM0Yb0Rwa1xvymqTWHXRx8ryL5Q94TyceuguqPVAsE66n5S/0fdQ==", + "version": "0.2.0-prerelease.20221120235613", + "resolved": "https://registry.npmjs.org/scratch-svg-renderer/-/scratch-svg-renderer-0.2.0-prerelease.20221120235613.tgz", + "integrity": "sha512-aC7P37PgYYPQyC6pyxKeNAzgKeOfTdymOdGgaRLp5YpaGoLPHLrRXC6nHc4arhUk51Y9cZ46PPnfYEVw7QqOeg==", "dev": true, "dependencies": { "base64-js": "1.2.1", "base64-loader": "1.0.0", "dompurify": "2.2.7", + "fastestsmallesttextencoderdecoder": "^1.0.22", "minilog": "3.1.0", "transformation-matrix": "1.15.0" }, @@ -23767,9 +23751,9 @@ "dev": true }, "node_modules/scratch-vm": { - "version": "1.2.52", - "resolved": "https://registry.npmjs.org/scratch-vm/-/scratch-vm-1.2.52.tgz", - "integrity": "sha512-EaR4txpZhL/QF95IyTRnQ0ef37tYIzTdRTe7lT4T9+RaPVVVv6bsUsC5l0XL1e/01KZpTiw2WVf+YE0OwrjfFg==", + "version": "1.2.54", + "resolved": "https://registry.npmjs.org/scratch-vm/-/scratch-vm-1.2.54.tgz", + "integrity": "sha512-lg6Ay+JhqZ9hjL3o+vp9hQmksAURYQC6xcEgeIfbKWIyZGOndOA6VLTarJ+5uiGwphMb8SBlWpG2fBPHiAgKRg==", "dev": true, "dependencies": { "@vernier/godirect": "1.5.0", @@ -23794,6 +23778,17 @@ "scratch-svg-renderer": "^0.2.0-prerelease" } }, + "node_modules/scratch-vm/node_modules/ajv": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.3.0.tgz", + "integrity": "sha512-6TQywaGYtRub2fqHkSXfVANlhfja2nbF33wCCHnt3aQstOrtd9jsQGiRUTIOlkEqcxpzRd2akfnqvBBPmLxs8g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, "node_modules/scratch-vm/node_modules/htmlparser2": { "version": "3.10.0", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.0.tgz", @@ -23879,6 +23874,20 @@ "node": ">= 4" } }, + "node_modules/scratch-vm/node_modules/scratch-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/scratch-parser/-/scratch-parser-5.0.0.tgz", + "integrity": "sha512-7kjxoxivLgYYvmAJVLOOWnca4CigwuCpgjy9+6UuxOMgSZKO1xqIjxIADupabmh1ZLZZDVe45DBM/CQTdtVDkw==", + "dev": true, + "dependencies": { + "ajv": "6.3.0", + "jszip": "3.1.5", + "pify": "4.0.1" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/scratch-vm/node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -51121,9 +51130,9 @@ } }, "scratch-audio": { - "version": "0.1.0-prerelease.20200528195344", - "resolved": "https://registry.npmjs.org/scratch-audio/-/scratch-audio-0.1.0-prerelease.20200528195344.tgz", - "integrity": "sha512-BY1IiMMBj0WDs7jdYnOzBHE88AX3ltjs2XfINJ1VrIE4xn2vZvPgJAyw6ZCc2FDPRwTWLpCdhnlA1TBdaKKdiQ==", + "version": "0.1.0-prerelease.20221123180128", + "resolved": "https://registry.npmjs.org/scratch-audio/-/scratch-audio-0.1.0-prerelease.20221123180128.tgz", + "integrity": "sha512-yj7mSkHmKxQVdBalAew1UjfTthOoTs3pejhh8Tl65KcC3X4+fLbmY1F3woYSrZbXxPtYUZTKyrcwlCh8r1DQjg==", "dev": true, "requires": { "audio-context": "1.0.1", @@ -51149,21 +51158,21 @@ } }, "scratch-blocks": { - "version": "0.1.0-prerelease.20221024060953", - "resolved": "https://registry.npmjs.org/scratch-blocks/-/scratch-blocks-0.1.0-prerelease.20221024060953.tgz", - "integrity": "sha512-M4OWIPV9yVDGJS0qXfGqriyGVHP2u2zjUa9QyHAv2E5IAVn8KbRb+pjJ4WNHXnAZG9Dfb+rBq5n3BqJ9uObDxQ==", + "version": "0.1.0-prerelease.20221129081817", + "resolved": "https://registry.npmjs.org/scratch-blocks/-/scratch-blocks-0.1.0-prerelease.20221129081817.tgz", + "integrity": "sha512-t/bAA3oZZJMAV3WERdm35cBBUHj7GUZaYhuS5UU23vSoMm5tmcIIz4KYbTBMuujOcodfT1jJ+flJ6s3VRI8ggQ==", "dev": true, "requires": { "exports-loader": "0.7.0", "google-closure-library": "20190301.0.0", "imports-loader": "0.8.0", - "scratch-l10n": "3.15.20221024032103" + "scratch-l10n": "3.15.20221129032252" }, "dependencies": { "scratch-l10n": { - "version": "3.15.20221024032103", - "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-3.15.20221024032103.tgz", - "integrity": "sha512-Rntiu90azd27jaaRsKAeDgr96Qez8fl2yvJrEBMOK5fOX2AjiP9L3HKAolOA/vnhM5fvMbGFeymDbKaDb/x3Yg==", + "version": "3.15.20221129032252", + "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-3.15.20221129032252.tgz", + "integrity": "sha512-7GsIFuctIjWULB6pO0GqswOwe4/ujZrsNGxUUZ7TXSFwdVyVXhDX9WYu/7Kln3WVrs2AhicVz8WP5yjFOdZs7w==", "dev": true, "requires": { "@babel/cli": "^7.1.2", @@ -51177,9 +51186,9 @@ } }, "scratch-gui": { - "version": "1.0.48", - "resolved": "https://registry.npmjs.org/scratch-gui/-/scratch-gui-1.0.48.tgz", - "integrity": "sha512-cbmbocO59OYs0Wafc6TYVCUuK54HhjRpAKxlSyWHqGrojNvRBlMAbqlK9CGzQj7h+he/0ZfqCdLeGsjPtLPnqQ==", + "version": "1.1.32", + "resolved": "https://registry.npmjs.org/scratch-gui/-/scratch-gui-1.1.32.tgz", + "integrity": "sha512-4QO8B11ShROWNFtgZXQZ4uYs0qPaEKC8lVVPSNNHS7c0a2eUIQ30kmiy5Ukxvoz2TYIuPToIApsTU96MFBfbuQ==", "dev": true, "requires": { "arraybuffer-loader": "^1.0.6", @@ -51229,15 +51238,15 @@ "react-virtualized": "9.20.1", "redux": "3.7.2", "redux-throttle": "0.1.1", - "scratch-audio": "0.1.0-prerelease.20200528195344", - "scratch-blocks": "0.1.0-prerelease.20221024060953", - "scratch-l10n": "3.15.20221024032103", - "scratch-paint": "1.1.29", - "scratch-render": "0.1.0-prerelease.20221024201900", - "scratch-render-fonts": "1.0.0-prerelease.20221024190656", + "scratch-audio": "0.1.0-prerelease.20221123180128", + "scratch-blocks": "0.1.0-prerelease.20221129081817", + "scratch-l10n": "3.15.20221129032252", + "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.20221024201850", - "scratch-vm": "1.2.52", + "scratch-svg-renderer": "0.2.0-prerelease.20221120235613", + "scratch-vm": "1.2.54", "startaudiocontext": "1.2.1", "style-loader": "^0.23.0", "text-encoding": "0.7.0", @@ -51461,9 +51470,9 @@ } }, "scratch-l10n": { - "version": "3.15.20221024032103", - "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-3.15.20221024032103.tgz", - "integrity": "sha512-Rntiu90azd27jaaRsKAeDgr96Qez8fl2yvJrEBMOK5fOX2AjiP9L3HKAolOA/vnhM5fvMbGFeymDbKaDb/x3Yg==", + "version": "3.15.20221129032252", + "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-3.15.20221129032252.tgz", + "integrity": "sha512-7GsIFuctIjWULB6pO0GqswOwe4/ujZrsNGxUUZ7TXSFwdVyVXhDX9WYu/7Kln3WVrs2AhicVz8WP5yjFOdZs7w==", "dev": true, "requires": { "@babel/cli": "^7.1.2", @@ -51475,9 +51484,9 @@ } }, "scratch-paint": { - "version": "1.1.29", - "resolved": "https://registry.npmjs.org/scratch-paint/-/scratch-paint-1.1.29.tgz", - "integrity": "sha512-IgJGnA3+WrLLDveLMYDl9Z3RZCPAeRDLDI7r3QRMZSdvpZW46/ddG+dO0YfYVQHekgAf9IHaevCKV/9PNOHxPw==", + "version": "1.1.31", + "resolved": "https://registry.npmjs.org/scratch-paint/-/scratch-paint-1.1.31.tgz", + "integrity": "sha512-yfKgYJVsNmBHQoSh3bZNjcVQ78qAIgQeX820fe5LthuMMn7DE1syUwD56IPFJWhGrR0ykp8Fsf038bbxNuZZfw==", "dev": true, "requires": { "@scratch/paper": "0.11.20200728195508", @@ -51498,20 +51507,6 @@ } } }, - "scratch-svg-renderer": { - "version": "0.2.0-prerelease.20221024201850", - "resolved": "https://registry.npmjs.org/scratch-svg-renderer/-/scratch-svg-renderer-0.2.0-prerelease.20221024201850.tgz", - "integrity": "sha512-aeNC0axSAfk/A6ZOLx08aKPWyoq8ulYTexD4RgbJ4K2ksT4cXIUXzzbUWptj7iHnx3mdFXeFmIhqpc9ty5GVig==", - "dev": true, - "requires": { - "base64-js": "1.2.1", - "base64-loader": "1.0.0", - "dompurify": "2.2.7", - "fastestsmallesttextencoderdecoder": "^1.0.22", - "minilog": "3.1.0", - "transformation-matrix": "1.15.0" - } - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -51552,9 +51547,9 @@ } }, "scratch-l10n": { - "version": "3.15.20221108032110", - "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-3.15.20221108032110.tgz", - "integrity": "sha512-FG0LINwlDgGw9d/VM6XArhsgKCkOgtJPvvlHJGEGkTpiQ3zZfN+Evkvfqejywewq7nOK2QBerPFA1RPQOdDfIw==", + "version": "3.15.20221201032213", + "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-3.15.20221201032213.tgz", + "integrity": "sha512-cNi88TwZs0MGMEDUTiZ//5+RNYXl5fgkNmi8FXGK+zURPI4sxM2gGelv7SoLVbaaDVYuis4LGhq/TPR6DR+OyQ==", "dev": true, "requires": { "@babel/cli": "^7.1.2", @@ -51566,9 +51561,9 @@ } }, "scratch-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/scratch-parser/-/scratch-parser-5.0.0.tgz", - "integrity": "sha512-7kjxoxivLgYYvmAJVLOOWnca4CigwuCpgjy9+6UuxOMgSZKO1xqIjxIADupabmh1ZLZZDVe45DBM/CQTdtVDkw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/scratch-parser/-/scratch-parser-5.1.0.tgz", + "integrity": "sha512-6B6aaEV3TmA2kxSO2u5qLr84f6rhLgUxz276aFYrUyv6ekCWegEUpkKBHnOC1oCAl1ySpVtFBNXh3S110TDadw==", "requires": { "ajv": "6.3.0", "jszip": "3.1.5", @@ -51578,7 +51573,7 @@ "ajv": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.3.0.tgz", - "integrity": "sha1-FlCkERTvAFdMrBC4Ay2PTBSBLac=", + "integrity": "sha512-6TQywaGYtRub2fqHkSXfVANlhfja2nbF33wCCHnt3aQstOrtd9jsQGiRUTIOlkEqcxpzRd2akfnqvBBPmLxs8g==", "requires": { "fast-deep-equal": "^1.0.0", "fast-json-stable-stringify": "^2.0.0", @@ -51588,9 +51583,9 @@ } }, "scratch-render": { - "version": "0.1.0-prerelease.20221024201900", - "resolved": "https://registry.npmjs.org/scratch-render/-/scratch-render-0.1.0-prerelease.20221024201900.tgz", - "integrity": "sha512-6dfu8J3x8rsm6RUMQ+Jq4nunJuCX/iCm6Me+NqFpHivx25OPWYF7frczJ7+UtoluBts3eSLfywOr1fQF6KaBNw==", + "version": "0.1.0-prerelease.20221121051603", + "resolved": "https://registry.npmjs.org/scratch-render/-/scratch-render-0.1.0-prerelease.20221121051603.tgz", + "integrity": "sha512-+PmRxh3Ms5+ichCinmg9Nl7jYwYZvGrlOGNLwxGZSYv+Ve96RqMPJAdpyv0ctOzELoYnMalFGZwUWmdMAJLE5Q==", "dev": true, "requires": { "grapheme-breaker": "0.3.2", @@ -51600,7 +51595,7 @@ "minilog": "3.1.0", "raw-loader": "^0.5.1", "scratch-storage": "^1.0.0", - "scratch-svg-renderer": "0.2.0-prerelease.20210727023023", + "scratch-svg-renderer": "0.2.0-prerelease.20221120235613", "twgl.js": "4.4.0" }, "dependencies": { @@ -51642,9 +51637,9 @@ } }, "scratch-render-fonts": { - "version": "1.0.0-prerelease.20221024190656", - "resolved": "https://registry.npmjs.org/scratch-render-fonts/-/scratch-render-fonts-1.0.0-prerelease.20221024190656.tgz", - "integrity": "sha512-ZN2K7wKh8sJrzTZ61AwTTMwrm2AB/jsiHLeF8M1n0A0SoRaBfB7iBYv6cwvW2ZN+pnUBClHAb7bT9/KRlExfFg==", + "version": "1.0.0-prerelease.20221102164332", + "resolved": "https://registry.npmjs.org/scratch-render-fonts/-/scratch-render-fonts-1.0.0-prerelease.20221102164332.tgz", + "integrity": "sha512-22MbRDGUSArVEoHatg5rt7f/H0wWhMrcyN6HD0OQJeDqdlO3qSSX9/qvdzNJGYWwZkhrdJWcI5JGD1YuJfefmw==", "dev": true, "requires": { "base64-loader": "1.0.0" @@ -51712,14 +51707,15 @@ } }, "scratch-svg-renderer": { - "version": "0.2.0-prerelease.20210727023023", - "resolved": "https://registry.npmjs.org/scratch-svg-renderer/-/scratch-svg-renderer-0.2.0-prerelease.20210727023023.tgz", - "integrity": "sha512-vEGZFFPm03LsHeRnIVQoJBoM3dV23daZCHWM0Yb0Rwa1xvymqTWHXRx8ryL5Q94TyceuguqPVAsE66n5S/0fdQ==", + "version": "0.2.0-prerelease.20221120235613", + "resolved": "https://registry.npmjs.org/scratch-svg-renderer/-/scratch-svg-renderer-0.2.0-prerelease.20221120235613.tgz", + "integrity": "sha512-aC7P37PgYYPQyC6pyxKeNAzgKeOfTdymOdGgaRLp5YpaGoLPHLrRXC6nHc4arhUk51Y9cZ46PPnfYEVw7QqOeg==", "dev": true, "requires": { "base64-js": "1.2.1", "base64-loader": "1.0.0", "dompurify": "2.2.7", + "fastestsmallesttextencoderdecoder": "^1.0.22", "minilog": "3.1.0", "transformation-matrix": "1.15.0" }, @@ -51748,9 +51744,9 @@ "dev": true }, "scratch-vm": { - "version": "1.2.52", - "resolved": "https://registry.npmjs.org/scratch-vm/-/scratch-vm-1.2.52.tgz", - "integrity": "sha512-EaR4txpZhL/QF95IyTRnQ0ef37tYIzTdRTe7lT4T9+RaPVVVv6bsUsC5l0XL1e/01KZpTiw2WVf+YE0OwrjfFg==", + "version": "1.2.54", + "resolved": "https://registry.npmjs.org/scratch-vm/-/scratch-vm-1.2.54.tgz", + "integrity": "sha512-lg6Ay+JhqZ9hjL3o+vp9hQmksAURYQC6xcEgeIfbKWIyZGOndOA6VLTarJ+5uiGwphMb8SBlWpG2fBPHiAgKRg==", "dev": true, "requires": { "@vernier/godirect": "1.5.0", @@ -51772,6 +51768,17 @@ "worker-loader": "^1.1.1" }, "dependencies": { + "ajv": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.3.0.tgz", + "integrity": "sha512-6TQywaGYtRub2fqHkSXfVANlhfja2nbF33wCCHnt3aQstOrtd9jsQGiRUTIOlkEqcxpzRd2akfnqvBBPmLxs8g==", + "dev": true, + "requires": { + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, "htmlparser2": { "version": "3.10.0", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.0.tgz", @@ -51834,6 +51841,17 @@ "ajv-keywords": "^3.1.0" } }, + "scratch-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/scratch-parser/-/scratch-parser-5.0.0.tgz", + "integrity": "sha512-7kjxoxivLgYYvmAJVLOOWnca4CigwuCpgjy9+6UuxOMgSZKO1xqIjxIADupabmh1ZLZZDVe45DBM/CQTdtVDkw==", + "dev": true, + "requires": { + "ajv": "6.3.0", + "jszip": "3.1.5", + "pify": "4.0.1" + } + }, "string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", diff --git a/package.json b/package.json index 80a195eb2..9ce560c23 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,7 @@ "react-router-dom": "5.2.0", "react-twitter-embed": "^3.0.3", "react-use": "^17.3.1", - "scratch-parser": "5.0.0", + "scratch-parser": "5.1.0", "scratch-storage": "2.0.2" }, "devDependencies": { @@ -134,8 +134,8 @@ "regenerator-runtime": "0.13.9", "sass": "1.49.7", "sass-loader": "10.2.1", - "scratch-gui": "1.0.48", - "scratch-l10n": "3.15.20221108032110", + "scratch-gui": "1.1.32", + "scratch-l10n": "3.15.20221201032213", "selenium-webdriver": "4.1.0", "slick-carousel": "1.6.0", "style-loader": "0.12.3", diff --git a/src/components/extension-landing/extension-landing.scss b/src/components/extension-landing/extension-landing.scss index f4f4fbfcf..a9182d592 100644 --- a/src/components/extension-landing/extension-landing.scss +++ b/src/components/extension-landing/extension-landing.scss @@ -258,7 +258,47 @@ } } - div.cards + div.faq { + .hardware-cards { + display: grid; + grid-template-columns: 1fr 1fr 1fr; + gap: 3em; + + // 1 column + @media #{$medium-and-smaller} { + grid-template-columns: 1fr; + } + } + + .hardware-card { + border: 1px solid $ui-border; + border-radius: .5rem; + background-color: $ui-white; + overflow: hidden; + flex-basis: 0; + flex-grow: 1; + } + + .hardware-card-image { + background-color: $ui-blue-10percent; + padding: 1rem 0 1rem; + + img { + display: block; + margin: 0 auto; + height: 100px; + max-width: 100%; + } + } + + .hardware-card-info { + padding: 1rem; + + p { + margin: .2rem 0; + } + } + + div.cards+div.faq { padding-top: 2rem; } diff --git a/src/components/extension-landing/extension-requirements.jsx b/src/components/extension-landing/extension-requirements.jsx index efe498921..ce9281396 100644 --- a/src/components/extension-landing/extension-requirements.jsx +++ b/src/components/extension-landing/extension-requirements.jsx @@ -12,62 +12,77 @@ const ExtensionRequirements = props => ( - {props.bluetoothStandard ? ( - - - - Windows 10 version 1709+ - - - - macOS 10.13+ - - - - - ChromeOS - - - - Android 6.0+ - - - - - Bluetooth - - - - Scratch Link - - - ) : props.children} + {!props.hideWindows && ( + + + Windows 10 version 1709+ + + )} + {!props.hideMac && ( + + + macOS 10.13+ + + )} + {!props.hideChromeOS && ( + + + ChromeOS + + )} + {!props.hideAndroid && ( + + + Android 6.0+ + + )} + {!props.hideBluetooth && ( + + + Bluetooth + + )} + {!props.hideScratchLink && ( + + + Scratch Link + + )} ); ExtensionRequirements.propTypes = { - bluetoothStandard: PropTypes.bool, - children: PropTypes.node + hideAndroid: PropTypes.bool, + hideBluetooth: PropTypes.bool, + hideChromeOS: PropTypes.bool, + hideMac: PropTypes.bool, + hideScratchLink: PropTypes.bool, + hideWindows: PropTypes.bool }; ExtensionRequirements.defaultProps = { - bluetoothStandard: false + hideAndroid: false, + hideBluetooth: false, + hideChromeOS: false, + hideMac: false, + hideScratchLink: false, + hideWindows: false }; module.exports = ExtensionRequirements; diff --git a/src/components/extension-landing/hardware-card.jsx b/src/components/extension-landing/hardware-card.jsx new file mode 100644 index 000000000..d3f250e1a --- /dev/null +++ b/src/components/extension-landing/hardware-card.jsx @@ -0,0 +1,32 @@ +const PropTypes = require('prop-types'); +const React = require('react'); + +const HardwareCard = props => ( + +
+ {props.imageAlt} +
+
+

{props.title}

+

{props.description}

+
+
+); + +HardwareCard.propTypes = { + cardUrl: PropTypes.string, + description: PropTypes.string, + imageAlt: PropTypes.string, + imageSrc: PropTypes.string, + title: PropTypes.string +}; + +module.exports = HardwareCard; diff --git a/src/components/os-chooser/os-chooser.jsx b/src/components/os-chooser/os-chooser.jsx index c2821080a..232a363c8 100644 --- a/src/components/os-chooser/os-chooser.jsx +++ b/src/components/os-chooser/os-chooser.jsx @@ -15,49 +15,68 @@ const OSChooser = props => (
- - - - + {!props.hideWindows && ( + + )} + {!props.hideMac && ( + + )} + {!props.hideChromeOS && ( + + )} + {!props.hideAndroid && ( + + )}
); OSChooser.propTypes = { currentOS: PropTypes.string, - handleSetOS: PropTypes.func + handleSetOS: PropTypes.func, + hideAndroid: PropTypes.bool, + hideChromeOS: PropTypes.bool, + hideMac: PropTypes.bool, + hideWindows: PropTypes.bool +}; + +OSChooser.defaultProps = { + hideAndroid: false, + hideChromeOS: false, + hideMac: false, + hideWindows: false }; const wrappedOSChooser = injectIntl(OSChooser); diff --git a/src/lib/project-info.js b/src/lib/project-info.js index ac16d29be..30b82e777 100644 --- a/src/lib/project-info.js +++ b/src/lib/project-info.js @@ -20,7 +20,8 @@ module.exports = { const stage = project.targets[0]; return Object.values(stage.variables) .some(variable => variable.length === 3); // 3 entries if cloud var - } + }, + videoSensing: project => (project.extensions || []).includes('videoSensing') }, 2: { extensions: () => [], // Showing extension chip not implemented for scratch2 projects @@ -30,6 +31,11 @@ module.exports = { // Block traversing is complicated in scratch2 projects... // This check should work even if you have sprites named getUserName, etc. JSON.stringify(project).indexOf('["getUserName"]') !== -1, - cloudData: project => project.info.hasCloudData + cloudData: project => project.info.hasCloudData, + videoSensing: project => { + const stringifiedProject = JSON.stringify(project); + return ['senseVideoMotion', 'setVideoState', 'setVideoTransparency', 'whenSensorGreaterThan'] + .some(opcode => stringifiedProject.includes(`["${opcode}"`)); + } } }; diff --git a/src/routes.json b/src/routes.json index 560430aaf..a780f20cb 100644 --- a/src/routes.json +++ b/src/routes.json @@ -298,6 +298,19 @@ "view": "download/scratch2/download", "title": "Scratch 2.0" }, + { + "name": "download-scratch-link", + "pattern": "^/download/scratch-link/?(\\?.*)?$", + "routeAlias": "/download/scratch-link", + "view": "download/scratch-link/download", + "title": "Scratch Link Download" + }, + { + "name": "download-scratch-link-redirect", + "pattern": "^/download/link/?(\\?.*)?$", + "routeAlias": "/download/link", + "redirect": "/download/scratch-link" + }, { "name": "search", "pattern": "^/search/:projects/?$", diff --git a/src/views/boost/boost.jsx b/src/views/boost/boost.jsx index b96565a4d..87c70c0e0 100644 --- a/src/views/boost/boost.jsx +++ b/src/views/boost/boost.jsx @@ -59,7 +59,7 @@ class Boost extends ExtensionLanding { src="/images/boost/boost-header.svg" />} renderRequirements={ - + } /> { + const [os, setOS] = useState(detectOS()); + + return ( +
+
+ + + +

{intl.formatMessage({id:{intl.formatMessage({id: 'scratchLink.headerTitle'})}

+ + +
+ +
+
+ +
+
+
+ + {(isDownloaded(os)) && ( + + )} + +

+

+
+ + + + + +
+
+ + {isDownloaded(os) && ( + +

+

+ + + + ), + macOSVersionLink: ( + + + + ) + }} + /> +

+

+
+ )} +

+

+ +

+
+
+ ); +}; + +ScratchLink.propTypes = { + intl: intlShape.isRequired +}; + +const WrappedScratchLink = injectIntl(ScratchLink); + +render(, document.getElementById('app')); diff --git a/src/views/download/scratch-link/download.scss b/src/views/download/scratch-link/download.scss new file mode 100644 index 000000000..1f87f12b8 --- /dev/null +++ b/src/views/download/scratch-link/download.scss @@ -0,0 +1,25 @@ +@import "../../../colors"; + +.link { + .extension-header { + background-color: $ui-aqua; + + .inner { + flex-direction: row; + + .extension-info { + flex-direction: column; + align-items: flex-start; + margin-bottom: 0; + + .extension-copy { + margin-bottom: 3em; + } + } + + .extension-image { + margin: auto; + } + } + } +} diff --git a/src/views/download/scratch-link/l10n.json b/src/views/download/scratch-link/l10n.json new file mode 100644 index 000000000..0d2ac3b18 --- /dev/null +++ b/src/views/download/scratch-link/l10n.json @@ -0,0 +1,24 @@ +{ + "scratchLink.headerText": "Scratch Link allows you to connect hardware to interact with your Scratch projects. Open new possibilities by combining your digital projects with the physical world.", + "scratchLink.headerTitle": "Scratch Link", + "scratchLink.linkLogo": "Scratch Link logo", + "scratchLink.troubleshootingTitle": "Troubleshooting", + "scratchLink.checkOSVersionTitle": "Make sure your operating system is compatible with Scratch Link", + "scratchLink.checkOSVersionText": "The minimum operating system versions are listed at the top of this page. See instructions for checking your version of {winOSVersionLink} or {macOSVersionLink}.", + "scratchLink.winOSVersionLinkText": "Windows", + "scratchLink.macOSVersionLinkText": "Mac OS", + "scratchLink.closeScratchCopiesTitle": "Close other copies of Scratch", + "scratchLink.closeScratchCopiesText": "Only one copy of Scratch can connect with Scratch Link at a time. If you have Scratch open in other browser tabs, close it and try again.", + "scratchLink.thingsToTry": "Things to Try", + "scratchLink.compatibleDevices": "Compatible with Scratch Link", + "scratchLink.microbitTitle": "micro:bit", + "scratchLink.microbitDescription": "micro:bit is a tiny circuit board designed to help kids learn to code and create with technology.", + "scratchLink.ev3Title": "LEGO MINDSTORMS EV3", + "scratchLink.ev3Description": "LEGO MINDSTORMS Education EV3 is an invention kit with motors and sensors you can use to build interactive robotic creations.", + "scratchLink.wedoTitle": "LEGO Education WeDo 2.0", + "scratchLink.wedoDescription": "LEGO Education WeDo 2.0 is an introductory invention kit you can use to build interactive robots and other creations.", + "scratchLink.boostTitle": "LEGO BOOST", + "scratchLink.boostDescription": "The LEGO BOOST kit brings your LEGO creations to life with powerful motors, a color sensor and more.", + "scratchLink.vernierTitle": "Vernier Force & Acceleration", + "scratchLink.vernierDescription": "The Vernier Go Direct Force & Acceleration sensor is a powerful scientific tool that unlocks new ways to connect the physical world to your Scratch projects." +} diff --git a/src/views/ev3/ev3.jsx b/src/views/ev3/ev3.jsx index 1ccb98b25..8c08a30c4 100644 --- a/src/views/ev3/ev3.jsx +++ b/src/views/ev3/ev3.jsx @@ -63,7 +63,7 @@ class EV3 extends ExtensionLanding { videoId="0huu6wfiki" />} renderRequirements={ - + } /> } renderRequirements={ - + } /> } renderRequirements={ - + } /> - {showCloudDataAlert && ( - - - - )} - {showUsernameBlockAlert && ( - - - - )} +
+ {showCloudDataAlert && ( + + + + )} + {showCloudDataAndVideoAlert && ( + + + + )} + {showUsernameBlockAlert && ( + + + + )} +
(

- +

( key="frameless-desktop" minWidth={frameless.desktop} > - + - +
- +
- + - +
- +
- + - +
- +
diff --git a/src/views/splash/l10n.json b/src/views/splash/l10n.json index f1b54772c..097e8e2e4 100644 --- a/src/views/splash/l10n.json +++ b/src/views/splash/l10n.json @@ -39,6 +39,7 @@ "teacherbanner.faqButton": "Teacher Account FAQ", "hocbanner.title": "Get Creative with Coding!", + "hocbanner.titleTellStory": "Tell Your Story with Scratch!", "hocbanner.moreActivities": "See more activities", "hocbanner.imagine": "Imagine a World", "hocbanner.codeACartoon": "Code a Cartoon", @@ -46,6 +47,8 @@ "hocbanner.makeItFly": "Make It Fly", "hocbanner.makeMusic": "Make Music", "hocbanner.chaseGame": "Make a Chase Game", + "hocbanner.createAStory": "Create a Story", + "hocbanner.animateACharacter": "Animate a Character", "welcome.welcomeToScratch": "Welcome to Scratch!", "welcome.learn": "Learn how to make a project in Scratch", diff --git a/src/views/splash/splash.jsx b/src/views/splash/splash.jsx index b465baa17..1cf5d9122 100644 --- a/src/views/splash/splash.jsx +++ b/src/views/splash/splash.jsx @@ -13,8 +13,11 @@ const Page = require('../../components/page/www/page.jsx'); const SplashPresentation = require('./presentation.jsx'); const SCRATCH_WEEK_START_TIME = 1621224000000; // 2021-05-17 00:00:00 -- No end time for now -const HOC_START_TIME = 1638144000000; // 2021-11-29 00:00:00 GMT in ms -const HOC_END_TIME = 1639353600000; // 2021-12-13 00:00:00 GMT in ms +// const HOC_START_TIME = 1638144000000; // 2021-11-29 00:00:00 GMT in ms +// const HOC_END_TIME = 1639353600000; // 2021-12-13 00:00:00 GMT in ms + +const HOC_START_TIME = 1668574800000; // 2022-11-16 00:00:00 GMT in ms +const HOC_END_TIME = 1670821200000; // 2022-12-12 00:00:00 GMT in ms class Splash extends React.Component { constructor (props) { diff --git a/src/views/wedo2/wedo2.jsx b/src/views/wedo2/wedo2.jsx index 1d674faf8..c50549ade 100644 --- a/src/views/wedo2/wedo2.jsx +++ b/src/views/wedo2/wedo2.jsx @@ -60,7 +60,7 @@ class Wedo2 extends ExtensionLanding { /> } renderRequirements={ - + } /> + + + + + + + + + + + + + + + + + + + diff --git a/static/images/ideas/activities/talking-thumb.jpg b/static/images/ideas/activities/talking-thumb.jpg new file mode 100644 index 000000000..6425a1aa7 Binary files /dev/null and b/static/images/ideas/activities/talking-thumb.jpg differ diff --git a/static/images/scratchlink/scratch-link-logo.svg b/static/images/scratchlink/scratch-link-logo.svg new file mode 100644 index 000000000..eb5c98b86 --- /dev/null +++ b/static/images/scratchlink/scratch-link-logo.svg @@ -0,0 +1,14 @@ + + + + Master 1024x1024 + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/test/unit/components/extension-requirements.test.jsx b/test/unit/components/extension-requirements.test.jsx new file mode 100644 index 000000000..22b566c0e --- /dev/null +++ b/test/unit/components/extension-requirements.test.jsx @@ -0,0 +1,29 @@ +import React from 'react'; +import {mountWithIntl} from '../../helpers/intl-helpers.jsx'; +import ExtensionRequirements from '../../../src/components/extension-landing/extension-requirements'; + +describe('ExtensionRequirements', () => { + + test('shows default extension requirements', () => { + const component = mountWithIntl(); + + const requirements = component.find('.extension-requirements span').map(span => span.text()); + + expect(requirements).toEqual( + ['Windows 10 version 1709+', 'macOS 10.13+', 'ChromeOS', 'Android 6.0+', 'Bluetooth', 'Scratch Link'] + ); + }); + + test('hides requirements', () => { + const component = mountWithIntl(); + + expect(component.find('.extension-requirements span').length).toEqual(0); + }); +}); diff --git a/test/unit/components/os-chooser.test.jsx b/test/unit/components/os-chooser.test.jsx new file mode 100644 index 000000000..7658eb876 --- /dev/null +++ b/test/unit/components/os-chooser.test.jsx @@ -0,0 +1,32 @@ +import React from 'react'; +import {mountWithIntl} from '../../helpers/intl-helpers.jsx'; +import OSChooser from '../../../src/components/os-chooser/os-chooser'; + +describe('OSChooser', () => { + test('calls callback when OS is selected', () => { + const onSetOs = jest.fn(); + const component = mountWithIntl(); + + component.find('button').last() + .simulate('click'); + + expect(onSetOs).toBeCalledWith('Android'); + }); + + test('has all 4 operating systems', () => { + const component = mountWithIntl(); + + expect(component.find('button').length).toEqual(4); + }); + + test('hides operating systems', () => { + const component = mountWithIntl(); + + expect(component.find('button').length).toEqual(0); + }); +}); diff --git a/test/unit/lib/project-info.test.js b/test/unit/lib/project-info.test.js new file mode 100644 index 000000000..afa278176 --- /dev/null +++ b/test/unit/lib/project-info.test.js @@ -0,0 +1,322 @@ +/* eslint-disable no-use-before-define */ +const projectInfo = require('../../../src/lib/project-info'); + +describe('unit test lib/project-info.js', () => { + test('videoSensing returns true for a version 3 project with video', () => { + const result = projectInfo[videoVersion3.projectVersion].videoSensing(videoVersion3); + expect(result).toEqual(true); + }); + + test('videoSensing returns false for a version 3 project with no video', () => { + const result = projectInfo[noVideoVersion3.projectVersion].videoSensing(noVideoVersion3); + expect(result).toEqual(false); + }); + + test('videoSensing returns true for a version 2 project with video', () => { + const result = projectInfo[videoVersion2.projectVersion].videoSensing(videoVersion2); + expect(result).toEqual(true); + }); +}); + +const videoVersion3 = { + targets: [ + { + isStage: true, + name: 'Stage', + variables: { + '`jEk@4|i[#Fk?(8x)AV.-my variable': [ + 'my variable', + '0' + ] + }, + lists: {}, + broadcasts: {}, + blocks: { + 'FJz[,QI8`P^5;FEjdBhc': { + opcode: 'event_whenflagclicked', + next: 'f8q%j#X8sU#C+E1z|-oF', + parent: null, + inputs: {}, + fields: {}, + shadow: false, + topLevel: true, + x: 255, + y: 171 + }, + 'f8q%j#X8sU#C+E1z|-oF': { + opcode: 'videoSensing_videoToggle', + next: null, + parent: 'FJz[,QI8`P^5;FEjdBhc', + inputs: { + VIDEO_STATE: [ + 1, + 'a2$KXEUlr`=IW!MX8(M7' + ] + }, + fields: {}, + shadow: false, + topLevel: false + }, + 'a2$KXEUlr`=IW!MX8(M7': { + opcode: 'videoSensing_menu_VIDEO_STATE', + next: null, + parent: 'f8q%j#X8sU#C+E1z|-oF', + inputs: {}, + fields: { + VIDEO_STATE: [ + 'on', + null + ] + }, + shadow: true, + topLevel: false + } + }, + comments: {}, + currentCostume: 0, + costumes: [ + { + name: 'backdrop1', + dataFormat: 'svg', + assetId: 'cd21514d0531fdffb22204e0ec5ed84a', + md5ext: 'cd21514d0531fdffb22204e0ec5ed84a.svg', + rotationCenterX: 240, + rotationCenterY: 180 + } + ], + sounds: [ + { + name: 'pop', + assetId: '83a9787d4cb6f3b7632b4ddfebf74367', + dataFormat: 'wav', + format: '', + rate: 48000, + sampleCount: 1123, + md5ext: '83a9787d4cb6f3b7632b4ddfebf74367.wav' + } + ], + volume: 100, + layerOrder: 0, + tempo: 60, + videoTransparency: 50, + videoState: 'on', + textToSpeechLanguage: null + } + ], + monitors: [ + { + id: '`jEk@4|i[#Fk?(8x)AV.-my variable', + mode: 'default', + opcode: 'data_variable', + params: { + VARIABLE: 'my variable' + }, + spriteName: null, + value: '0', + width: 0, + height: 0, + x: 7, + y: 17, + visible: false, + sliderMin: 0, + sliderMax: 100, + isDiscrete: true + } + ], + extensions: [ + 'videoSensing' + ], + meta: { + semver: '3.0.0', + vm: '1.2.48', + // eslint-disable-next-line max-len + agent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36' + }, + projectVersion: 3 +}; + +const noVideoVersion3 = { + targets: [ + { + isStage: true, + name: 'Stage', + variables: { + '`jEk@4|i[#Fk?(8x)AV.-my variable': [ + 'my variable', + '0' + ] + }, + lists: {}, + broadcasts: {}, + blocks: { + 'FJz[,QI8`P^5;FEjdBhc': { + opcode: 'event_whenflagclicked', + next: '`CA90wtKfX0xa.mK80[|', + parent: null, + inputs: {}, + fields: {}, + shadow: false, + topLevel: true, + x: 255, + y: 171 + }, + '`CA90wtKfX0xa.mK80[|': { + opcode: 'data_setvariableto', + next: null, + parent: 'FJz[,QI8`P^5;FEjdBhc', + inputs: { + VALUE: [ + 1, + [ + 10, + '0' + ] + ] + }, + fields: { + VARIABLE: [ + 'my variable', + '`jEk@4|i[#Fk?(8x)AV.-my variable' + ] + }, + shadow: false, + topLevel: false + } + }, + comments: {}, + currentCostume: 0, + costumes: [ + { + name: 'backdrop1', + dataFormat: 'svg', + assetId: 'cd21514d0531fdffb22204e0ec5ed84a', + md5ext: 'cd21514d0531fdffb22204e0ec5ed84a.svg', + rotationCenterX: 240, + rotationCenterY: 180 + } + ], + sounds: [ + { + name: 'pop', + assetId: '83a9787d4cb6f3b7632b4ddfebf74367', + dataFormat: 'wav', + format: '', + rate: 48000, + sampleCount: 1123, + md5ext: '83a9787d4cb6f3b7632b4ddfebf74367.wav' + } + ], + volume: 100, + layerOrder: 0, + tempo: 60, + videoTransparency: 50, + videoState: 'on', + textToSpeechLanguage: null + } + ], + monitors: [ + { + id: '`jEk@4|i[#Fk?(8x)AV.-my variable', + mode: 'default', + opcode: 'data_variable', + params: { + VARIABLE: 'my variable' + }, + spriteName: null, + value: '0', + width: 0, + height: 0, + x: 7, + y: 17, + visible: false, + sliderMin: 0, + sliderMax: 100, + isDiscrete: true + } + ], + extensions: [], + meta: { + semver: '3.0.0', + vm: '1.2.48', + // eslint-disable-next-line max-len + agent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36' + }, + projectVersion: 3 +}; + +const videoVersion2 = { + objName: 'Stage', + sounds: [{ + soundName: 'pop', + soundID: 1, + md5: '83a9787d4cb6f3b7632b4ddfebf74367.wav', + sampleCount: 258, + rate: 11025, + format: '' + }], + costumes: [{ + costumeName: 'backdrop1', + baseLayerID: 3, + baseLayerMD5: '739b5e2a2435f6e1ec2993791b423146.png', + bitmapResolution: 1, + rotationCenterX: 240, + rotationCenterY: 180 + }], + currentCostumeIndex: 0, + penLayerMD5: '5c81a336fab8be57adc039a8a2b33ca9.png', + penLayerID: 0, + tempoBPM: 60, + videoAlpha: 0.5, + children: [{ + objName: 'Sprite1', + scripts: [[62, + 85, + [['whenGreenFlag'], ['doForever', [['say:', ['senseVideoMotion', 'motion', 'this sprite']]]]]], + [70, 216, [['setVideoState', 'on']]], + [66, 281, [['setVideoTransparency', 50]]]], + sounds: [{ + soundName: 'meow', + soundID: 0, + md5: '83c36d806dc92327b9e7049a565c6bff.wav', + sampleCount: 18688, + rate: 22050, + format: '' + }], + costumes: [{ + costumeName: 'costume1', + baseLayerID: 1, + baseLayerMD5: 'f9a1c175dbe2e5dee472858dd30d16bb.svg', + bitmapResolution: 1, + rotationCenterX: 47, + rotationCenterY: 55 + }, + { + costumeName: 'costume2', + baseLayerID: 2, + baseLayerMD5: '6e8bd9ae68fdb02b7e1e3df656a75635.svg', + bitmapResolution: 1, + rotationCenterX: 47, + rotationCenterY: 55 + }], + currentCostumeIndex: 0, + scratchX: 0, + scratchY: 0, + scale: 1, + direction: 90, + rotationStyle: 'normal', + isDraggable: false, + indexInLibrary: 1, + visible: true, + spriteInfo: { + } + }], + info: { + userAgent: 'Scratch 2.0 Offline Editor', + flashVersion: 'WIN 33,1,1,743', + spriteCount: 1, + videoOn: false, + scriptCount: 1, + swfVersion: 'v461' + }, + projectVersion: 2 +};