From e0e3a0c34206a6bc7a27bd6b6834c0959f92102f Mon Sep 17 00:00:00 2001 From: Joel Gritter Date: Thu, 18 Feb 2021 13:37:12 -0500 Subject: [PATCH 01/59] MacOS version string update "Mac OSX 10.4 or later" -> "Mac OSX 10.4 through 10.14" Fixes gh-4913 --- src/views/scratch_1.4/l10n.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/scratch_1.4/l10n.json b/src/views/scratch_1.4/l10n.json index 15d2665b2..21e3d2fc4 100644 --- a/src/views/scratch_1.4/l10n.json +++ b/src/views/scratch_1.4/l10n.json @@ -4,7 +4,7 @@ "onePointFour.introNote": "{noteLabel} You can still share projects from 1.4 to the Scratch website. However, projects created in newer versions of Scratch cannot be opened in 1.4.", "onePointFour.downloads": "Downloads", "onePointFour.macTitle": "Mac OS X", - "onePointFour.macBody": "Compatible with Mac OSX 10.4 or later", + "onePointFour.macBody": "Compatible with Mac OSX 10.4 through 10.14", "onePointFour.windowsTitle": "Windows", "onePointFour.windowsBody": "Compatible with Windows 2000, XP, Vista, 7, and 8", "onePointFour.windowsNetworkInstaller": "installer", From 27dafac7f04318312725fe18132c02e8372cdc7b Mon Sep 17 00:00:00 2001 From: Paul Kaplan Date: Thu, 4 Feb 2021 14:30:20 -0500 Subject: [PATCH 02/59] Move comments out of project reducer --- src/redux/comments.js | 336 ++++++++++++++++++++++++ src/redux/preview.js | 296 --------------------- src/views/preview/preview.jsx | 2 + src/views/preview/project-view.jsx | 27 +- test/unit-legacy/redux/comments-test.js | 151 +++++++++++ test/unit-legacy/redux/preview-test.js | 120 --------- 6 files changed, 503 insertions(+), 429 deletions(-) create mode 100644 src/redux/comments.js create mode 100644 test/unit-legacy/redux/comments-test.js diff --git a/src/redux/comments.js b/src/redux/comments.js new file mode 100644 index 000000000..539cf02ad --- /dev/null +++ b/src/redux/comments.js @@ -0,0 +1,336 @@ +const keyMirror = require('keymirror'); +const eachLimit = require('async/eachLimit'); +const mergeWith = require('lodash.mergewith'); +const uniqBy = require('lodash.uniqby'); + +const api = require('../lib/api'); +const log = require('../lib/log'); + +const COMMENT_LIMIT = 20; + +module.exports.Status = keyMirror({ + FETCHED: null, + NOT_FETCHED: null, + FETCHING: null, + ERROR: null +}); + +module.exports.getInitialState = () => ({ + status: { + comments: module.exports.Status.NOT_FETCHED + }, + comments: [], + replies: {}, + moreCommentsToLoad: false +}); + +module.exports.commentsReducer = (state, action) => { + if (typeof state === 'undefined') { + state = module.exports.getInitialState(); + } + + switch (action.type) { + case 'RESET_TO_INTIAL_STATE': + return module.exports.getInitialState(); + case 'RESET_COMMENTS': + return Object.assign({}, state, { + comments: [], + replies: {} + }); + case 'SET_COMMENT_FETCH_STATUS': + return Object.assign({}, state, { + status: Object.assign({}, state.status, { + [action.infoType]: action.status + }) + }); + case 'SET_COMMENTS': + return Object.assign({}, state, { + comments: uniqBy(state.comments.concat(action.items), 'id') + }); + case 'UPDATE_COMMENT': + if (action.topLevelCommentId) { + return Object.assign({}, state, { + replies: Object.assign({}, state.replies, { + [action.topLevelCommentId]: state.replies[action.topLevelCommentId].map(comment => { + if (comment.id === action.commentId) { + return Object.assign({}, comment, action.comment); + } + return comment; + }) + }) + }); + } + + return Object.assign({}, state, { + comments: state.comments.map(comment => { + if (comment.id === action.commentId) { + return Object.assign({}, comment, action.comment); + } + return comment; + }) + }); + case 'ADD_NEW_COMMENT': + if (action.topLevelCommentId) { + return Object.assign({}, state, { + replies: Object.assign({}, state.replies, { + // Replies to comments go at the end of the thread + [action.topLevelCommentId]: state.replies[action.topLevelCommentId].concat(action.comment) + }) + }); + } + + // Reply to the top level project, put the reply at the beginning + return Object.assign({}, state, { + comments: [action.comment, ...state.comments], + replies: Object.assign({}, state.replies, {[action.comment.id]: []}) + }); + case 'UPDATE_ALL_REPLIES': + return Object.assign({}, state, { + replies: Object.assign({}, state.replies, { + [action.commentId]: state.replies[action.commentId].map(reply => + Object.assign({}, reply, action.comment) + ) + }) + }); + case 'SET_REPLIES': + return Object.assign({}, state, { + // Append new replies to the state.replies structure + replies: mergeWith({}, state.replies, action.replies, (replies, newReplies) => ( + uniqBy((replies || []).concat(newReplies || []), 'id') + )), + // Also set the `moreRepliesToLoad` property on the top-level comments + comments: state.comments.map(comment => { + if (action.replies[comment.id]) { + return Object.assign({}, comment, { + moreRepliesToLoad: action.replies[comment.id].length === COMMENT_LIMIT + }); + } + return comment; + }) + }); + case 'SET_MORE_COMMENTS_TO_LOAD': + return Object.assign({}, state, { + moreCommentsToLoad: action.moreCommentsToLoad + }); + default: + return state; + } +}; + +module.exports.setFetchStatus = (type, status) => ({ + type: 'SET_COMMENT_FETCH_STATUS', + infoType: type, + status: status +}); + +module.exports.setComments = items => ({ + type: 'SET_COMMENTS', + items: items +}); + +module.exports.setReplies = replies => ({ + type: 'SET_REPLIES', + replies: replies +}); + +module.exports.setCommentDeleted = (commentId, topLevelCommentId) => ({ + type: 'UPDATE_COMMENT', + commentId: commentId, + topLevelCommentId: topLevelCommentId, + comment: { + visibility: 'deleted' + } +}); + +module.exports.setRepliesDeleted = commentId => ({ + type: 'UPDATE_ALL_REPLIES', + commentId: commentId, + comment: { + visibility: 'deleted' + } +}); + +module.exports.setCommentReported = (commentId, topLevelCommentId) => ({ + type: 'UPDATE_COMMENT', + commentId: commentId, + topLevelCommentId: topLevelCommentId, + comment: { + visibility: 'reported' + } +}); + +module.exports.setCommentRestored = (commentId, topLevelCommentId) => ({ + type: 'UPDATE_COMMENT', + commentId: commentId, + topLevelCommentId: topLevelCommentId, + comment: { + visibility: 'visible' + } +}); + +module.exports.setRepliesRestored = commentId => ({ + type: 'UPDATE_ALL_REPLIES', + commentId: commentId, + comment: { + visibility: 'visible' + } +}); + +module.exports.addNewComment = (comment, topLevelCommentId) => ({ + type: 'ADD_NEW_COMMENT', + comment: comment, + topLevelCommentId: topLevelCommentId +}); + +module.exports.setMoreCommentsToLoad = moreCommentsToLoad => ({ + type: 'SET_MORE_COMMENTS_TO_LOAD', + moreCommentsToLoad: moreCommentsToLoad +}); + +module.exports.resetComments = () => ({ + type: 'RESET_COMMENTS' +}); + +module.exports.getTopLevelComments = (id, offset, ownerUsername, isAdmin, token) => (dispatch => { + dispatch(module.exports.setFetchStatus('comments', module.exports.Status.FETCHING)); + api({ + uri: `${isAdmin ? '/admin' : `/users/${ownerUsername}`}/projects/${id}/comments`, + authentication: token ? token : null, + params: {offset: offset || 0, limit: COMMENT_LIMIT} + }, (err, body, res) => { + if (err) { + dispatch(module.exports.setFetchStatus('comments', module.exports.Status.ERROR)); + dispatch(module.exports.setError(err)); + return; + } + if (typeof body === 'undefined' || res.statusCode >= 400) { // NotFound + dispatch(module.exports.setFetchStatus('comments', module.exports.Status.ERROR)); + dispatch(module.exports.setError('No comment info')); + return; + } + dispatch(module.exports.setFetchStatus('comments', module.exports.Status.FETCHED)); + dispatch(module.exports.setComments(body)); + dispatch(module.exports.getReplies(id, body.map(comment => comment.id), 0, ownerUsername, isAdmin, token)); + + // If we loaded a full page of comments, assume there are more to load. + // This will be wrong (1 / COMMENT_LIMIT) of the time, but does not require + // any more server query complexity, so seems worth it. In the case of a project with + // number of comments divisible by the COMMENT_LIMIT, the load more button will be + // clickable, but upon clicking it will go away. + dispatch(module.exports.setMoreCommentsToLoad(body.length === COMMENT_LIMIT)); + }); +}); + +module.exports.getCommentById = (projectId, commentId, ownerUsername, isAdmin, token) => (dispatch => { + dispatch(module.exports.setFetchStatus('comments', module.exports.Status.FETCHING)); + api({ + uri: `${isAdmin ? '/admin' : `/users/${ownerUsername}`}/projects/${projectId}/comments/${commentId}`, + authentication: token ? token : null + }, (err, body, res) => { + if (err) { + dispatch(module.exports.setFetchStatus('comments', module.exports.Status.ERROR)); + dispatch(module.exports.setError(err)); + return; + } + if (!body || res.statusCode >= 400) { // NotFound + dispatch(module.exports.setFetchStatus('comments', module.exports.Status.ERROR)); + dispatch(module.exports.setError('No comment info')); + return; + } + + if (body.parent_id) { + // If the comment is a reply, load the parent + return dispatch(module.exports.getCommentById(projectId, body.parent_id, ownerUsername, isAdmin, token)); + } + + // If the comment is not a reply, show it as top level and load replies + dispatch(module.exports.setFetchStatus('comments', module.exports.Status.FETCHED)); + dispatch(module.exports.setComments([body])); + dispatch(module.exports.getReplies(projectId, [body.id], 0, ownerUsername, isAdmin, token)); + }); +}); + +module.exports.getReplies = (projectId, commentIds, offset, ownerUsername, isAdmin, token) => (dispatch => { + dispatch(module.exports.setFetchStatus('replies', module.exports.Status.FETCHING)); + const fetchedReplies = {}; + eachLimit(commentIds, 10, (parentId, callback) => { + api({ + uri: `${isAdmin ? '/admin' : `/users/${ownerUsername}`}/projects/${projectId}/comments/${parentId}/replies`, + authentication: token ? token : null, + params: {offset: offset || 0, limit: COMMENT_LIMIT} + }, (err, body, res) => { + if (err) { + return callback(`Error fetching comment replies: ${err}`); + } + if (typeof body === 'undefined' || res.statusCode >= 400) { // NotFound + return callback('No comment reply information'); + } + fetchedReplies[parentId] = body; + callback(null, body); + }); + }, err => { + if (err) { + dispatch(module.exports.setFetchStatus('replies', module.exports.Status.ERROR)); + dispatch(module.exports.setError(err)); + return; + } + dispatch(module.exports.setFetchStatus('replies', module.exports.Status.FETCHED)); + dispatch(module.exports.setReplies(fetchedReplies)); + }); +}); + +module.exports.deleteComment = (projectId, commentId, topLevelCommentId, token) => (dispatch => { + /* TODO fetching/fetched/error states updates for comment deleting */ + api({ + uri: `/proxy/comments/project/${projectId}/comment/${commentId}`, + authentication: token, + withCredentials: true, + method: 'DELETE', + useCsrf: true + }, (err, body, res) => { + if (err || res.statusCode !== 200) { + log.error(err || res.body); + return; + } + dispatch(module.exports.setCommentDeleted(commentId, topLevelCommentId)); + if (!topLevelCommentId) { + dispatch(module.exports.setRepliesDeleted(commentId)); + } + }); +}); + +module.exports.reportComment = (projectId, commentId, topLevelCommentId, token) => (dispatch => { + api({ + uri: `/proxy/project/${projectId}/comment/${commentId}/report`, + authentication: token, + withCredentials: true, + method: 'POST', + useCsrf: true + }, (err, body, res) => { + if (err || res.statusCode !== 200) { + log.error(err || res.body); + return; + } + // TODO use the reportId in the response for unreporting functionality + dispatch(module.exports.setCommentReported(commentId, topLevelCommentId)); + }); +}); + +module.exports.restoreComment = (projectId, commentId, topLevelCommentId, token) => (dispatch => { + api({ + uri: `/proxy/admin/project/${projectId}/comment/${commentId}/undelete`, + authentication: token, + withCredentials: true, + method: 'PUT', + useCsrf: true + }, (err, body, res) => { + if (err || res.statusCode !== 200) { + log.error(err || res.body); + return; + } + dispatch(module.exports.setCommentRestored(commentId, topLevelCommentId)); + if (!topLevelCommentId) { + dispatch(module.exports.setRepliesRestored(commentId)); + } + }); +}); diff --git a/src/redux/preview.js b/src/redux/preview.js index 7239eba47..e4c7c74be 100644 --- a/src/redux/preview.js +++ b/src/redux/preview.js @@ -1,14 +1,9 @@ const defaults = require('lodash.defaults'); const keyMirror = require('keymirror'); -const eachLimit = require('async/eachLimit'); -const mergeWith = require('lodash.mergewith'); -const uniqBy = require('lodash.uniqby'); const api = require('../lib/api'); const log = require('../lib/log'); -const COMMENT_LIMIT = 20; - module.exports.Status = keyMirror({ FETCHED: null, NOT_FETCHED: null, @@ -19,7 +14,6 @@ module.exports.Status = keyMirror({ module.exports.getInitialState = () => ({ status: { project: module.exports.Status.NOT_FETCHED, - comments: module.exports.Status.NOT_FETCHED, faved: module.exports.Status.NOT_FETCHED, loved: module.exports.Status.NOT_FETCHED, original: module.exports.Status.NOT_FETCHED, @@ -32,9 +26,6 @@ module.exports.getInitialState = () => ({ studioRequests: {} }, projectInfo: {}, - remixes: [], - comments: [], - replies: {}, faved: false, loved: false, original: {}, @@ -42,7 +33,6 @@ module.exports.getInitialState = () => ({ projectStudios: [], curatedStudios: [], currentStudioIds: [], - moreCommentsToLoad: false, projectNotAvailable: false, visibilityInfo: {} }); @@ -96,76 +86,6 @@ module.exports.previewReducer = (state, action) => { item !== action.studioId )) }); - case 'RESET_COMMENTS': - return Object.assign({}, state, { - comments: [], - replies: {} - }); - case 'SET_COMMENTS': - return Object.assign({}, state, { - comments: uniqBy(state.comments.concat(action.items), 'id') - }); - case 'UPDATE_COMMENT': - if (action.topLevelCommentId) { - return Object.assign({}, state, { - replies: Object.assign({}, state.replies, { - [action.topLevelCommentId]: state.replies[action.topLevelCommentId].map(comment => { - if (comment.id === action.commentId) { - return Object.assign({}, comment, action.comment); - } - return comment; - }) - }) - }); - } - - return Object.assign({}, state, { - comments: state.comments.map(comment => { - if (comment.id === action.commentId) { - return Object.assign({}, comment, action.comment); - } - return comment; - }) - }); - case 'ADD_NEW_COMMENT': - if (action.topLevelCommentId) { - return Object.assign({}, state, { - replies: Object.assign({}, state.replies, { - // Replies to comments go at the end of the thread - [action.topLevelCommentId]: state.replies[action.topLevelCommentId].concat(action.comment) - }) - }); - } - - // Reply to the top level project, put the reply at the beginning - return Object.assign({}, state, { - comments: [action.comment, ...state.comments], - replies: Object.assign({}, state.replies, {[action.comment.id]: []}) - }); - case 'UPDATE_ALL_REPLIES': - return Object.assign({}, state, { - replies: Object.assign({}, state.replies, { - [action.commentId]: state.replies[action.commentId].map(reply => - Object.assign({}, reply, action.comment) - ) - }) - }); - case 'SET_REPLIES': - return Object.assign({}, state, { - // Append new replies to the state.replies structure - replies: mergeWith({}, state.replies, action.replies, (replies, newReplies) => ( - uniqBy((replies || []).concat(newReplies || []), 'id') - )), - // Also set the `moreRepliesToLoad` property on the top-level comments - comments: state.comments.map(comment => { - if (action.replies[comment.id]) { - return Object.assign({}, comment, { - moreRepliesToLoad: action.replies[comment.id].length === COMMENT_LIMIT - }); - } - return comment; - }) - }); case 'SET_LOVED': return Object.assign({}, state, { loved: action.info @@ -182,10 +102,6 @@ module.exports.previewReducer = (state, action) => { state = JSON.parse(JSON.stringify(state)); state.status.studioRequests[action.studioId] = action.status; return state; - case 'SET_MORE_COMMENTS_TO_LOAD': - return Object.assign({}, state, { - moreCommentsToLoad: action.moreCommentsToLoad - }); case 'SET_VISIBILITY_INFO': return Object.assign({}, state, { visibilityInfo: action.visibilityInfo @@ -247,16 +163,6 @@ module.exports.setProjectStudios = items => ({ items: items }); -module.exports.setComments = items => ({ - type: 'SET_COMMENTS', - items: items -}); - -module.exports.setReplies = replies => ({ - type: 'SET_REPLIES', - replies: replies -}); - module.exports.setCuratedStudios = items => ({ type: 'SET_CURATED_STUDIOS', items: items @@ -284,64 +190,6 @@ module.exports.setStudioFetchStatus = (studioId, status) => ({ status: status }); -module.exports.setCommentDeleted = (commentId, topLevelCommentId) => ({ - type: 'UPDATE_COMMENT', - commentId: commentId, - topLevelCommentId: topLevelCommentId, - comment: { - visibility: 'deleted' - } -}); - -module.exports.setRepliesDeleted = commentId => ({ - type: 'UPDATE_ALL_REPLIES', - commentId: commentId, - comment: { - visibility: 'deleted' - } -}); - -module.exports.setCommentReported = (commentId, topLevelCommentId) => ({ - type: 'UPDATE_COMMENT', - commentId: commentId, - topLevelCommentId: topLevelCommentId, - comment: { - visibility: 'reported' - } -}); - -module.exports.setCommentRestored = (commentId, topLevelCommentId) => ({ - type: 'UPDATE_COMMENT', - commentId: commentId, - topLevelCommentId: topLevelCommentId, - comment: { - visibility: 'visible' - } -}); - -module.exports.setRepliesRestored = commentId => ({ - type: 'UPDATE_ALL_REPLIES', - commentId: commentId, - comment: { - visibility: 'visible' - } -}); - -module.exports.addNewComment = (comment, topLevelCommentId) => ({ - type: 'ADD_NEW_COMMENT', - comment: comment, - topLevelCommentId: topLevelCommentId -}); - -module.exports.setMoreCommentsToLoad = moreCommentsToLoad => ({ - type: 'SET_MORE_COMMENTS_TO_LOAD', - moreCommentsToLoad: moreCommentsToLoad -}); - -module.exports.resetComments = () => ({ - type: 'RESET_COMMENTS' -}); - module.exports.setVisibilityInfo = visibilityInfo => ({ type: 'SET_VISIBILITY_INFO', visibilityInfo: visibilityInfo @@ -462,94 +310,6 @@ module.exports.getFavedStatus = (id, username, token) => (dispatch => { }); }); -module.exports.getTopLevelComments = (id, offset, ownerUsername, isAdmin, token) => (dispatch => { - dispatch(module.exports.setFetchStatus('comments', module.exports.Status.FETCHING)); - api({ - uri: `${isAdmin ? '/admin' : `/users/${ownerUsername}`}/projects/${id}/comments`, - authentication: token ? token : null, - params: {offset: offset || 0, limit: COMMENT_LIMIT} - }, (err, body, res) => { - if (err) { - dispatch(module.exports.setFetchStatus('comments', module.exports.Status.ERROR)); - dispatch(module.exports.setError(err)); - return; - } - if (typeof body === 'undefined' || res.statusCode >= 400) { // NotFound - dispatch(module.exports.setFetchStatus('comments', module.exports.Status.ERROR)); - dispatch(module.exports.setError('No comment info')); - return; - } - dispatch(module.exports.setFetchStatus('comments', module.exports.Status.FETCHED)); - dispatch(module.exports.setComments(body)); - dispatch(module.exports.getReplies(id, body.map(comment => comment.id), 0, ownerUsername, isAdmin, token)); - - // If we loaded a full page of comments, assume there are more to load. - // This will be wrong (1 / COMMENT_LIMIT) of the time, but does not require - // any more server query complexity, so seems worth it. In the case of a project with - // number of comments divisible by the COMMENT_LIMIT, the load more button will be - // clickable, but upon clicking it will go away. - dispatch(module.exports.setMoreCommentsToLoad(body.length === COMMENT_LIMIT)); - }); -}); - -module.exports.getCommentById = (projectId, commentId, ownerUsername, isAdmin, token) => (dispatch => { - dispatch(module.exports.setFetchStatus('comments', module.exports.Status.FETCHING)); - api({ - uri: `${isAdmin ? '/admin' : `/users/${ownerUsername}`}/projects/${projectId}/comments/${commentId}`, - authentication: token ? token : null - }, (err, body, res) => { - if (err) { - dispatch(module.exports.setFetchStatus('comments', module.exports.Status.ERROR)); - dispatch(module.exports.setError(err)); - return; - } - if (!body || res.statusCode >= 400) { // NotFound - dispatch(module.exports.setFetchStatus('comments', module.exports.Status.ERROR)); - dispatch(module.exports.setError('No comment info')); - return; - } - - if (body.parent_id) { - // If the comment is a reply, load the parent - return dispatch(module.exports.getCommentById(projectId, body.parent_id, ownerUsername, isAdmin, token)); - } - - // If the comment is not a reply, show it as top level and load replies - dispatch(module.exports.setFetchStatus('comments', module.exports.Status.FETCHED)); - dispatch(module.exports.setComments([body])); - dispatch(module.exports.getReplies(projectId, [body.id], 0, ownerUsername, isAdmin, token)); - }); -}); - -module.exports.getReplies = (projectId, commentIds, offset, ownerUsername, isAdmin, token) => (dispatch => { - dispatch(module.exports.setFetchStatus('replies', module.exports.Status.FETCHING)); - const fetchedReplies = {}; - eachLimit(commentIds, 10, (parentId, callback) => { - api({ - uri: `${isAdmin ? '/admin' : `/users/${ownerUsername}`}/projects/${projectId}/comments/${parentId}/replies`, - authentication: token ? token : null, - params: {offset: offset || 0, limit: COMMENT_LIMIT} - }, (err, body, res) => { - if (err) { - return callback(`Error fetching comment replies: ${err}`); - } - if (typeof body === 'undefined' || res.statusCode >= 400) { // NotFound - return callback('No comment reply information'); - } - fetchedReplies[parentId] = body; - callback(null, body); - }); - }, err => { - if (err) { - dispatch(module.exports.setFetchStatus('replies', module.exports.Status.ERROR)); - dispatch(module.exports.setError(err)); - return; - } - dispatch(module.exports.setFetchStatus('replies', module.exports.Status.FETCHED)); - dispatch(module.exports.setReplies(fetchedReplies)); - }); -}); - module.exports.setFavedStatus = (faved, id, username, token) => (dispatch => { dispatch(module.exports.setFetchStatus('faved', module.exports.Status.FETCHING)); if (faved) { @@ -882,62 +642,6 @@ module.exports.updateProject = (id, jsonData, username, token) => (dispatch => { }); }); -module.exports.deleteComment = (projectId, commentId, topLevelCommentId, token) => (dispatch => { - /* TODO fetching/fetched/error states updates for comment deleting */ - api({ - uri: `/proxy/comments/project/${projectId}/comment/${commentId}`, - authentication: token, - withCredentials: true, - method: 'DELETE', - useCsrf: true - }, (err, body, res) => { - if (err || res.statusCode !== 200) { - log.error(err || res.body); - return; - } - dispatch(module.exports.setCommentDeleted(commentId, topLevelCommentId)); - if (!topLevelCommentId) { - dispatch(module.exports.setRepliesDeleted(commentId)); - } - }); -}); - -module.exports.reportComment = (projectId, commentId, topLevelCommentId, token) => (dispatch => { - api({ - uri: `/proxy/project/${projectId}/comment/${commentId}/report`, - authentication: token, - withCredentials: true, - method: 'POST', - useCsrf: true - }, (err, body, res) => { - if (err || res.statusCode !== 200) { - log.error(err || res.body); - return; - } - // TODO use the reportId in the response for unreporting functionality - dispatch(module.exports.setCommentReported(commentId, topLevelCommentId)); - }); -}); - -module.exports.restoreComment = (projectId, commentId, topLevelCommentId, token) => (dispatch => { - api({ - uri: `/proxy/admin/project/${projectId}/comment/${commentId}/undelete`, - authentication: token, - withCredentials: true, - method: 'PUT', - useCsrf: true - }, (err, body, res) => { - if (err || res.statusCode !== 200) { - log.error(err || res.body); - return; - } - dispatch(module.exports.setCommentRestored(commentId, topLevelCommentId)); - if (!topLevelCommentId) { - dispatch(module.exports.setRepliesRestored(commentId)); - } - }); -}); - module.exports.shareProject = (projectId, token) => (dispatch => { dispatch(module.exports.setFetchStatus('project', module.exports.Status.FETCHING)); api({ diff --git a/src/views/preview/preview.jsx b/src/views/preview/preview.jsx index 3da330c3c..8864b5a3a 100644 --- a/src/views/preview/preview.jsx +++ b/src/views/preview/preview.jsx @@ -5,6 +5,7 @@ const Page = require('../../components/page/www/page.jsx'); const render = require('../../lib/render.jsx'); const previewActions = require('../../redux/preview.js'); +const commentsActions = require('../../redux/comments.js'); const isSupportedBrowser = require('../../lib/supported-browser').default; const UnsupportedBrowser = require('./unsupported-browser.jsx'); @@ -16,6 +17,7 @@ if (isSupportedBrowser()) { document.getElementById('app'), { preview: previewActions.previewReducer, + comments: commentsActions.commentsReducer, ...ProjectView.guiReducers }, { diff --git a/src/views/preview/project-view.jsx b/src/views/preview/project-view.jsx index f540c2f8c..f3ed4de6f 100644 --- a/src/views/preview/project-view.jsx +++ b/src/views/preview/project-view.jsx @@ -29,6 +29,7 @@ const Meta = require('./meta.jsx'); const sessionActions = require('../../redux/session.js'); const navigationActions = require('../../redux/navigation.js'); const previewActions = require('../../redux/preview.js'); +const commentsActions = require('../../redux/comments.js'); const frameless = require('../../lib/frameless'); @@ -998,7 +999,7 @@ const mapStateToProps = state => { canShare: userOwnsProject && state.permissions.social, canToggleComments: userOwnsProject || isAdmin, canUseBackpack: isLoggedIn, - comments: state.preview.comments, + comments: state.comments.comments, enableCommunity: projectInfoPresent, faved: state.preview.faved, favedLoaded: state.preview.status.faved === previewActions.Status.FETCHED, @@ -1013,7 +1014,7 @@ const mapStateToProps = state => { isShared: isShared, loved: state.preview.loved, lovedLoaded: state.preview.status.loved === previewActions.Status.FETCHED, - moreCommentsToLoad: state.preview.moreCommentsToLoad, + moreCommentsToLoad: state.commentsmoreCommentsToLoad, original: state.preview.original, parent: state.preview.parent, playerMode: state.scratchGui.mode.isPlayerOnly, @@ -1022,7 +1023,7 @@ const mapStateToProps = state => { projectStudios: state.preview.projectStudios, registrationOpen: state.navigation.registrationOpen, remixes: state.preview.remixes, - replies: state.preview.replies, + replies: state.comments.replies, sessionStatus: state.session.status, // check if used useScratch3Registration: state.navigation.useScratch3Registration, user: state.session.session.user, @@ -1034,16 +1035,16 @@ const mapStateToProps = state => { const mapDispatchToProps = dispatch => ({ handleAddComment: (comment, topLevelCommentId) => { - dispatch(previewActions.addNewComment(comment, topLevelCommentId)); + dispatch(commentsActions.addNewComment(comment, topLevelCommentId)); }, handleDeleteComment: (projectId, commentId, topLevelCommentId, token) => { - dispatch(previewActions.deleteComment(projectId, commentId, topLevelCommentId, token)); + dispatch(commentsActions.deleteComment(projectId, commentId, topLevelCommentId, token)); }, handleReportComment: (projectId, commentId, topLevelCommentId, token) => { - dispatch(previewActions.reportComment(projectId, commentId, topLevelCommentId, token)); + dispatch(commentsActions.reportComment(projectId, commentId, topLevelCommentId, token)); }, handleRestoreComment: (projectId, commentId, topLevelCommentId, token) => { - dispatch(previewActions.restoreComment(projectId, commentId, topLevelCommentId, token)); + dispatch(commentsActions.restoreComment(projectId, commentId, topLevelCommentId, token)); }, handleOpenRegistration: event => { event.preventDefault(); @@ -1061,8 +1062,8 @@ const mapDispatchToProps = dispatch => ({ dispatch(navigationActions.toggleLoginOpen()); }, handleSeeAllComments: (id, ownerUsername, isAdmin, token) => { - dispatch(previewActions.resetComments()); - dispatch(previewActions.getTopLevelComments(id, 0, ownerUsername, isAdmin, token)); + dispatch(commentsActions.resetComments()); + dispatch(commentsActions.getTopLevelComments(id, 0, ownerUsername, isAdmin, token)); }, handleUpdateProjectThumbnail: (id, blob) => { dispatch(previewActions.updateProjectThumbnail(id, blob)); @@ -1093,13 +1094,13 @@ const mapDispatchToProps = dispatch => ({ } }, getTopLevelComments: (id, offset, ownerUsername, isAdmin, token) => { - dispatch(previewActions.getTopLevelComments(id, offset, ownerUsername, isAdmin, token)); + dispatch(commentsActions.getTopLevelComments(id, offset, ownerUsername, isAdmin, token)); }, getCommentById: (projectId, commentId, ownerUsername, isAdmin, token) => { - dispatch(previewActions.getCommentById(projectId, commentId, ownerUsername, isAdmin, token)); + dispatch(commentsActions.getCommentById(projectId, commentId, ownerUsername, isAdmin, token)); }, getMoreReplies: (projectId, commentId, offset, ownerUsername, isAdmin, token) => { - dispatch(previewActions.getReplies(projectId, [commentId], offset, ownerUsername, isAdmin, token)); + dispatch(commentsActions.getReplies(projectId, [commentId], offset, ownerUsername, isAdmin, token)); }, getFavedStatus: (id, username, token) => { dispatch(previewActions.getFavedStatus(id, username, token)); @@ -1136,7 +1137,7 @@ const mapDispatchToProps = dispatch => ({ }, remixProject: () => { dispatch(GUI.remixProject()); - dispatch(previewActions.resetComments()); + dispatch(commentsActions.resetComments()); }, setPlayer: player => { dispatch(GUI.setPlayer(player)); diff --git a/test/unit-legacy/redux/comments-test.js b/test/unit-legacy/redux/comments-test.js new file mode 100644 index 000000000..5c72233eb --- /dev/null +++ b/test/unit-legacy/redux/comments-test.js @@ -0,0 +1,151 @@ +const tap = require('tap'); +const Comments = require('../../../src/redux/comments'); +const initialState = Comments.getInitialState(); +const reducer = Comments.commentsReducer; + +let state; + +tap.tearDown(() => process.nextTick(process.exit)); + +tap.test('Reducer', t => { + t.type(reducer, 'function'); + t.type(initialState, 'object'); + + // Reducers should return their default state when called without state + let undefinedState; + t.deepEqual(initialState, reducer(undefinedState, {type: 'fake action'})); + t.end(); +}); + +tap.test('setFetchStatus', t => { + // initial value + t.equal(initialState.status.comments, Comments.Status.NOT_FETCHED); + + state = reducer(initialState, Comments.setFetchStatus('comments', Comments.Status.FETCHING)); + t.equal(state.status.comments, Comments.Status.FETCHING); + + state = reducer(state, Comments.setFetchStatus('comments', Comments.Status.FETCHED)); + t.equal(state.status.comments, Comments.Status.FETCHED); + + t.end(); +}); + +tap.test('setComments', t => { + // Initial value + t.deepEqual(initialState.comments, []); + + state = reducer(initialState, Comments.setComments([{id: 1}, {id: 2}])); + state = reducer(state, Comments.setComments([{id: 3}, {id: 4}])); + t.deepEqual(state.comments, [{id: 1}, {id: 2}, {id: 3}, {id: 4}]); + + t.end(); +}); + +const commentState = { + comments: [ + {id: 'id1', visibility: 'visible'}, + {id: 'id2', visibility: 'visible'}, + {id: 'id3', visibility: 'visible'} + ], + replies: { + id1: [ + {id: 'id4', visibility: 'visible'}, + {id: 'id5', visibility: 'visible'} + ] + } +}; + +tap.test('setComments, discards duplicates', t => { + state = reducer(commentState, Comments.setComments([{id: 'id1'}])); + // Does not increase the number of comments, still 3 + t.equal(state.comments.length, 3); + t.end(); +}); + +tap.test('setCommentDeleted, top level comment', t => { + state = reducer(commentState, Comments.setCommentDeleted('id2')); + t.equal(state.comments[1].visibility, 'deleted'); + t.end(); +}); + +tap.test('setCommentDeleted, reply comment', t => { + state = reducer(commentState, Comments.setCommentDeleted('id4', 'id1')); + t.equal(state.replies.id1[0].visibility, 'deleted'); + t.end(); +}); + +tap.test('setRepliesDeleted/Restored', t => { + state = reducer(commentState, Comments.setRepliesDeleted('id1')); + t.equal(state.replies.id1[0].visibility, 'deleted'); + t.equal(state.replies.id1[1].visibility, 'deleted'); + + state = reducer(state, Comments.setRepliesRestored('id1')); + t.equal(state.replies.id1[0].visibility, 'visible'); + t.equal(state.replies.id1[1].visibility, 'visible'); + t.end(); +}); + +tap.test('setCommentReported, top level comment', t => { + state = reducer(commentState, Comments.setCommentReported('id2')); + t.equal(state.comments[1].visibility, 'reported'); + t.end(); +}); + +tap.test('setCommentReported, reply comment', t => { + state = reducer(commentState, Comments.setCommentReported('id4', 'id1')); + t.equal(state.replies.id1[0].visibility, 'reported'); + t.end(); +}); + +tap.test('addNewComment, top level comment', t => { + state = reducer(commentState, Comments.addNewComment({id: 'new comment'})); + // Adds comment to beginning of list + t.equal(state.comments[0].id, 'new comment'); + t.end(); +}); + +tap.test('addNewComment, reply comment', t => { + state = reducer(commentState, Comments.addNewComment({id: 'new comment'}, 'id1')); + // Adds replies to the end of the replies list + t.equal(state.replies.id1[2].id, 'new comment'); + t.end(); +}); + +tap.test('setReplies', t => { + // setReplies should append new replies + state = reducer(commentState, Comments.setReplies({ + id1: {id: 'id6'} + })); + t.equal(state.replies.id1[2].id, 'id6'); + t.equal(state.comments[0].moreRepliesToLoad, false); + + // setReplies should ignore duplicates, do the same as above again + t.equal(state.replies.id1.length, 3); + state = reducer(state, Comments.setReplies({id1: {id: 'id6'}})); + t.equal(state.replies.id1.length, 3); + + // setReplies can add replies to a comment that didn't have any + state = reducer(state, Comments.setReplies({ + id2: {id: 'id7'} + })); + t.equal(state.replies.id1.length, 3); + t.equal(state.replies.id2.length, 1); + t.equal(state.replies.id2[0].id, 'id7'); + t.equal(state.comments[0].moreRepliesToLoad, false); + t.equal(state.comments[1].moreRepliesToLoad, false); + + // Getting 20 (COMMENT_LIMIT) replies sets moreRepliesToLoad to true + state = reducer(state, Comments.setReplies({ + id3: (new Array(20)).map((_, i) => ({id: `id${i + 1}`})) + })); + t.equal(state.comments[0].moreRepliesToLoad, false); + t.equal(state.comments[1].moreRepliesToLoad, false); + t.equal(state.comments[2].moreRepliesToLoad, true); + + // Getting one more reply sets moreRepliesToLoad back to false + state = reducer(state, Comments.setReplies({ + id3: {id: 'id21'} + })); + t.equal(state.comments[2].moreRepliesToLoad, false); + t.end(); +}); diff --git a/test/unit-legacy/redux/preview-test.js b/test/unit-legacy/redux/preview-test.js index 24a91ce84..f1fa0488d 100644 --- a/test/unit-legacy/redux/preview-test.js +++ b/test/unit-legacy/redux/preview-test.js @@ -54,123 +54,3 @@ tap.test('updateProjectInfo', t => { }); t.end(); }); - -tap.test('setComments', t => { - // Initial value - t.deepEqual(initialState.comments, []); - - state = reducer(initialState, Preview.setComments([{id: 1}, {id: 2}])); - state = reducer(state, Preview.setComments([{id: 3}, {id: 4}])); - t.deepEqual(state.comments, [{id: 1}, {id: 2}, {id: 3}, {id: 4}]); - - t.end(); -}); - -const commentState = { - comments: [ - {id: 'id1', visibility: 'visible'}, - {id: 'id2', visibility: 'visible'}, - {id: 'id3', visibility: 'visible'} - ], - replies: { - id1: [ - {id: 'id4', visibility: 'visible'}, - {id: 'id5', visibility: 'visible'} - ] - } -}; - -tap.test('setComments, discards duplicates', t => { - state = reducer(commentState, Preview.setComments([{id: 'id1'}])); - // Does not increase the number of comments, still 3 - t.equal(state.comments.length, 3); - t.end(); -}); - -tap.test('setCommentDeleted, top level comment', t => { - state = reducer(commentState, Preview.setCommentDeleted('id2')); - t.equal(state.comments[1].visibility, 'deleted'); - t.end(); -}); - -tap.test('setCommentDeleted, reply comment', t => { - state = reducer(commentState, Preview.setCommentDeleted('id4', 'id1')); - t.equal(state.replies.id1[0].visibility, 'deleted'); - t.end(); -}); - -tap.test('setRepliesDeleted/Restored', t => { - state = reducer(commentState, Preview.setRepliesDeleted('id1')); - t.equal(state.replies.id1[0].visibility, 'deleted'); - t.equal(state.replies.id1[1].visibility, 'deleted'); - - state = reducer(state, Preview.setRepliesRestored('id1')); - t.equal(state.replies.id1[0].visibility, 'visible'); - t.equal(state.replies.id1[1].visibility, 'visible'); - t.end(); -}); - -tap.test('setCommentReported, top level comment', t => { - state = reducer(commentState, Preview.setCommentReported('id2')); - t.equal(state.comments[1].visibility, 'reported'); - t.end(); -}); - -tap.test('setCommentReported, reply comment', t => { - state = reducer(commentState, Preview.setCommentReported('id4', 'id1')); - t.equal(state.replies.id1[0].visibility, 'reported'); - t.end(); -}); - -tap.test('addNewComment, top level comment', t => { - state = reducer(commentState, Preview.addNewComment({id: 'new comment'})); - // Adds comment to beginning of list - t.equal(state.comments[0].id, 'new comment'); - t.end(); -}); - -tap.test('addNewComment, reply comment', t => { - state = reducer(commentState, Preview.addNewComment({id: 'new comment'}, 'id1')); - // Adds replies to the end of the replies list - t.equal(state.replies.id1[2].id, 'new comment'); - t.end(); -}); - -tap.test('setReplies', t => { - // setReplies should append new replies - state = reducer(commentState, Preview.setReplies({ - id1: {id: 'id6'} - })); - t.equal(state.replies.id1[2].id, 'id6'); - t.equal(state.comments[0].moreRepliesToLoad, false); - - // setReplies should ignore duplicates, do the same as above again - t.equal(state.replies.id1.length, 3); - state = reducer(state, Preview.setReplies({id1: {id: 'id6'}})); - t.equal(state.replies.id1.length, 3); - - // setReplies can add replies to a comment that didn't have any - state = reducer(state, Preview.setReplies({ - id2: {id: 'id7'} - })); - t.equal(state.replies.id1.length, 3); - t.equal(state.replies.id2.length, 1); - t.equal(state.replies.id2[0].id, 'id7'); - t.equal(state.comments[0].moreRepliesToLoad, false); - t.equal(state.comments[1].moreRepliesToLoad, false); - - // Getting 20 (COMMENT_LIMIT) replies sets moreRepliesToLoad to true - state = reducer(state, Preview.setReplies({ - id3: (new Array(20)).map((_, i) => ({id: `id${i + 1}`})) - })); - t.equal(state.comments[0].moreRepliesToLoad, false); - t.equal(state.comments[1].moreRepliesToLoad, false); - t.equal(state.comments[2].moreRepliesToLoad, true); - - // Getting one more reply sets moreRepliesToLoad back to false - state = reducer(state, Preview.setReplies({ - id3: {id: 'id21'} - })); - t.equal(state.comments[2].moreRepliesToLoad, false); - t.end(); -}); From 8b2bb5fe928e6e25047f182afba3cbd295c1dd7a Mon Sep 17 00:00:00 2001 From: Paul Kaplan Date: Mon, 8 Mar 2021 12:15:23 -0500 Subject: [PATCH 03/59] Include legacy unit tests when running test:unit --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 4d5d65651..0ff4a6908 100644 --- a/package.json +++ b/package.json @@ -15,8 +15,8 @@ "test:smoke:sauce": "SMOKE_REMOTE=true tap ./test/integration-legacy/smoke-testing/*.js --timeout=60000 --no-coverage -R classic", "test:unit": "npm run test:unit:jest && npm run test:unit:tap", "test:unit:jest": "jest ./test/unit/ && jest ./test/localization/*.test.js", - "test:unit:tap": "tap ./test/{unit-legacy,localization-legacy}/*.js --no-coverage -R classic", - "test:coverage": "tap ./test/{unit-legacy,localization-legacy}/*.js --coverage --coverage-report=lcov", + "test:unit:tap": "tap ./test/{unit-legacy,localization-legacy} --no-coverage -R classic", + "test:coverage": "tap ./test/{unit-legacy,localization-legacy} --coverage --coverage-report=lcov", "build": "npm run clean && npm run translate && NODE_OPTIONS=--max_old_space_size=8000 webpack --bail", "clean": "rm -rf ./build && rm -rf ./intl && mkdir -p build && mkdir -p intl", "deploy": "npm run deploy:s3 && npm run deploy:fastly", From 49e62afa8b8d9b421e60fa79ea351ff41995e0ab Mon Sep 17 00:00:00 2001 From: Paul Kaplan Date: Mon, 8 Mar 2021 12:27:32 -0500 Subject: [PATCH 04/59] Fix typo in mapStateToProps --- src/views/preview/project-view.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/preview/project-view.jsx b/src/views/preview/project-view.jsx index f3ed4de6f..43b1e83a7 100644 --- a/src/views/preview/project-view.jsx +++ b/src/views/preview/project-view.jsx @@ -1014,7 +1014,7 @@ const mapStateToProps = state => { isShared: isShared, loved: state.preview.loved, lovedLoaded: state.preview.status.loved === previewActions.Status.FETCHED, - moreCommentsToLoad: state.commentsmoreCommentsToLoad, + moreCommentsToLoad: state.comments.moreCommentsToLoad, original: state.preview.original, parent: state.preview.parent, playerMode: state.scratchGui.mode.isPlayerOnly, From acbda599e56e46d97f9010496312496adca9ccaf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zoe=CC=88=20Bentley?= Date: Wed, 17 Mar 2021 16:04:55 -0400 Subject: [PATCH 05/59] Fixed other place where date appears --- src/views/conference/2020/index/index.jsx | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/views/conference/2020/index/index.jsx b/src/views/conference/2020/index/index.jsx index 6574cd6f4..711510a48 100644 --- a/src/views/conference/2020/index/index.jsx +++ b/src/views/conference/2020/index/index.jsx @@ -51,13 +51,6 @@ const ConferenceSplash = () => ( value={new Date(2021, 6, 22)} year="numeric" /> - {' - '} - From ac6b4616ba344c745d4039c07b9d0b3e9e817fcb Mon Sep 17 00:00:00 2001 From: Paul Kaplan Date: Thu, 18 Mar 2021 11:19:47 -0400 Subject: [PATCH 06/59] Split project specific comment actions --- src/redux/comments.js | 144 ---------------------- src/redux/project-comment-actions.js | 173 +++++++++++++++++++++++++++ src/views/preview/project-view.jsx | 15 +-- 3 files changed, 181 insertions(+), 151 deletions(-) create mode 100644 src/redux/project-comment-actions.js diff --git a/src/redux/comments.js b/src/redux/comments.js index 539cf02ad..3eea11cc1 100644 --- a/src/redux/comments.js +++ b/src/redux/comments.js @@ -190,147 +190,3 @@ module.exports.setMoreCommentsToLoad = moreCommentsToLoad => ({ module.exports.resetComments = () => ({ type: 'RESET_COMMENTS' }); - -module.exports.getTopLevelComments = (id, offset, ownerUsername, isAdmin, token) => (dispatch => { - dispatch(module.exports.setFetchStatus('comments', module.exports.Status.FETCHING)); - api({ - uri: `${isAdmin ? '/admin' : `/users/${ownerUsername}`}/projects/${id}/comments`, - authentication: token ? token : null, - params: {offset: offset || 0, limit: COMMENT_LIMIT} - }, (err, body, res) => { - if (err) { - dispatch(module.exports.setFetchStatus('comments', module.exports.Status.ERROR)); - dispatch(module.exports.setError(err)); - return; - } - if (typeof body === 'undefined' || res.statusCode >= 400) { // NotFound - dispatch(module.exports.setFetchStatus('comments', module.exports.Status.ERROR)); - dispatch(module.exports.setError('No comment info')); - return; - } - dispatch(module.exports.setFetchStatus('comments', module.exports.Status.FETCHED)); - dispatch(module.exports.setComments(body)); - dispatch(module.exports.getReplies(id, body.map(comment => comment.id), 0, ownerUsername, isAdmin, token)); - - // If we loaded a full page of comments, assume there are more to load. - // This will be wrong (1 / COMMENT_LIMIT) of the time, but does not require - // any more server query complexity, so seems worth it. In the case of a project with - // number of comments divisible by the COMMENT_LIMIT, the load more button will be - // clickable, but upon clicking it will go away. - dispatch(module.exports.setMoreCommentsToLoad(body.length === COMMENT_LIMIT)); - }); -}); - -module.exports.getCommentById = (projectId, commentId, ownerUsername, isAdmin, token) => (dispatch => { - dispatch(module.exports.setFetchStatus('comments', module.exports.Status.FETCHING)); - api({ - uri: `${isAdmin ? '/admin' : `/users/${ownerUsername}`}/projects/${projectId}/comments/${commentId}`, - authentication: token ? token : null - }, (err, body, res) => { - if (err) { - dispatch(module.exports.setFetchStatus('comments', module.exports.Status.ERROR)); - dispatch(module.exports.setError(err)); - return; - } - if (!body || res.statusCode >= 400) { // NotFound - dispatch(module.exports.setFetchStatus('comments', module.exports.Status.ERROR)); - dispatch(module.exports.setError('No comment info')); - return; - } - - if (body.parent_id) { - // If the comment is a reply, load the parent - return dispatch(module.exports.getCommentById(projectId, body.parent_id, ownerUsername, isAdmin, token)); - } - - // If the comment is not a reply, show it as top level and load replies - dispatch(module.exports.setFetchStatus('comments', module.exports.Status.FETCHED)); - dispatch(module.exports.setComments([body])); - dispatch(module.exports.getReplies(projectId, [body.id], 0, ownerUsername, isAdmin, token)); - }); -}); - -module.exports.getReplies = (projectId, commentIds, offset, ownerUsername, isAdmin, token) => (dispatch => { - dispatch(module.exports.setFetchStatus('replies', module.exports.Status.FETCHING)); - const fetchedReplies = {}; - eachLimit(commentIds, 10, (parentId, callback) => { - api({ - uri: `${isAdmin ? '/admin' : `/users/${ownerUsername}`}/projects/${projectId}/comments/${parentId}/replies`, - authentication: token ? token : null, - params: {offset: offset || 0, limit: COMMENT_LIMIT} - }, (err, body, res) => { - if (err) { - return callback(`Error fetching comment replies: ${err}`); - } - if (typeof body === 'undefined' || res.statusCode >= 400) { // NotFound - return callback('No comment reply information'); - } - fetchedReplies[parentId] = body; - callback(null, body); - }); - }, err => { - if (err) { - dispatch(module.exports.setFetchStatus('replies', module.exports.Status.ERROR)); - dispatch(module.exports.setError(err)); - return; - } - dispatch(module.exports.setFetchStatus('replies', module.exports.Status.FETCHED)); - dispatch(module.exports.setReplies(fetchedReplies)); - }); -}); - -module.exports.deleteComment = (projectId, commentId, topLevelCommentId, token) => (dispatch => { - /* TODO fetching/fetched/error states updates for comment deleting */ - api({ - uri: `/proxy/comments/project/${projectId}/comment/${commentId}`, - authentication: token, - withCredentials: true, - method: 'DELETE', - useCsrf: true - }, (err, body, res) => { - if (err || res.statusCode !== 200) { - log.error(err || res.body); - return; - } - dispatch(module.exports.setCommentDeleted(commentId, topLevelCommentId)); - if (!topLevelCommentId) { - dispatch(module.exports.setRepliesDeleted(commentId)); - } - }); -}); - -module.exports.reportComment = (projectId, commentId, topLevelCommentId, token) => (dispatch => { - api({ - uri: `/proxy/project/${projectId}/comment/${commentId}/report`, - authentication: token, - withCredentials: true, - method: 'POST', - useCsrf: true - }, (err, body, res) => { - if (err || res.statusCode !== 200) { - log.error(err || res.body); - return; - } - // TODO use the reportId in the response for unreporting functionality - dispatch(module.exports.setCommentReported(commentId, topLevelCommentId)); - }); -}); - -module.exports.restoreComment = (projectId, commentId, topLevelCommentId, token) => (dispatch => { - api({ - uri: `/proxy/admin/project/${projectId}/comment/${commentId}/undelete`, - authentication: token, - withCredentials: true, - method: 'PUT', - useCsrf: true - }, (err, body, res) => { - if (err || res.statusCode !== 200) { - log.error(err || res.body); - return; - } - dispatch(module.exports.setCommentRestored(commentId, topLevelCommentId)); - if (!topLevelCommentId) { - dispatch(module.exports.setRepliesRestored(commentId)); - } - }); -}); diff --git a/src/redux/project-comment-actions.js b/src/redux/project-comment-actions.js new file mode 100644 index 000000000..857a4df1a --- /dev/null +++ b/src/redux/project-comment-actions.js @@ -0,0 +1,173 @@ +const eachLimit = require('async/eachLimit'); + +const api = require('../lib/api'); +const log = require('../lib/log'); + +const COMMENT_LIMIT = 20; + +const { + Status, + setFetchStatus, + setCommentDeleted, + setCommentReported, + setCommentRestored, + setMoreCommentsToLoad, + setComments, + setError, + setReplies, + setRepliesDeleted, + setRepliesRestored +} = require('../redux/comments.js'); + +const getTopLevelComments = (id, offset, ownerUsername, isAdmin, token) => (dispatch => { + dispatch(setFetchStatus('comments', Status.FETCHING)); + api({ + uri: `${isAdmin ? '/admin' : `/users/${ownerUsername}`}/projects/${id}/comments`, + authentication: token ? token : null, + params: {offset: offset || 0, limit: COMMENT_LIMIT} + }, (err, body, res) => { + if (err) { + dispatch(setFetchStatus('comments', Status.ERROR)); + dispatch(setError(err)); + return; + } + if (typeof body === 'undefined' || res.statusCode >= 400) { // NotFound + dispatch(setFetchStatus('comments', Status.ERROR)); + dispatch(setError('No comment info')); + return; + } + dispatch(setFetchStatus('comments', Status.FETCHED)); + dispatch(setComments(body)); + dispatch(getReplies(id, body.map(comment => comment.id), 0, ownerUsername, isAdmin, token)); + + // If we loaded a full page of comments, assume there are more to load. + // This will be wrong (1 / COMMENT_LIMIT) of the time, but does not require + // any more server query complexity, so seems worth it. In the case of a project with + // number of comments divisible by the COMMENT_LIMIT, the load more button will be + // clickable, but upon clicking it will go away. + dispatch(setMoreCommentsToLoad(body.length === COMMENT_LIMIT)); + }); +}); + +const getCommentById = (projectId, commentId, ownerUsername, isAdmin, token) => (dispatch => { + dispatch(setFetchStatus('comments', Status.FETCHING)); + api({ + uri: `${isAdmin ? '/admin' : `/users/${ownerUsername}`}/projects/${projectId}/comments/${commentId}`, + authentication: token ? token : null + }, (err, body, res) => { + if (err) { + dispatch(setFetchStatus('comments', Status.ERROR)); + dispatch(setError(err)); + return; + } + if (!body || res.statusCode >= 400) { // NotFound + dispatch(setFetchStatus('comments', Status.ERROR)); + dispatch(setError('No comment info')); + return; + } + + if (body.parent_id) { + // If the comment is a reply, load the parent + return dispatch(getCommentById(projectId, body.parent_id, ownerUsername, isAdmin, token)); + } + + // If the comment is not a reply, show it as top level and load replies + dispatch(setFetchStatus('comments', Status.FETCHED)); + dispatch(setComments([body])); + dispatch(getReplies(projectId, [body.id], 0, ownerUsername, isAdmin, token)); + }); +}); + +const getReplies = (projectId, commentIds, offset, ownerUsername, isAdmin, token) => (dispatch => { + dispatch(setFetchStatus('replies', Status.FETCHING)); + const fetchedReplies = {}; + eachLimit(commentIds, 10, (parentId, callback) => { + api({ + uri: `${isAdmin ? '/admin' : `/users/${ownerUsername}`}/projects/${projectId}/comments/${parentId}/replies`, + authentication: token ? token : null, + params: {offset: offset || 0, limit: COMMENT_LIMIT} + }, (err, body, res) => { + if (err) { + return callback(`Error fetching comment replies: ${err}`); + } + if (typeof body === 'undefined' || res.statusCode >= 400) { // NotFound + return callback('No comment reply information'); + } + fetchedReplies[parentId] = body; + callback(null, body); + }); + }, err => { + if (err) { + dispatch(setFetchStatus('replies', Status.ERROR)); + dispatch(setError(err)); + return; + } + dispatch(setFetchStatus('replies', Status.FETCHED)); + dispatch(setReplies(fetchedReplies)); + }); +}); + +const deleteComment = (projectId, commentId, topLevelCommentId, token) => (dispatch => { + /* TODO fetching/fetched/error states updates for comment deleting */ + api({ + uri: `/proxy/comments/project/${projectId}/comment/${commentId}`, + authentication: token, + withCredentials: true, + method: 'DELETE', + useCsrf: true + }, (err, body, res) => { + if (err || res.statusCode !== 200) { + log.error(err || res.body); + return; + } + dispatch(setCommentDeleted(commentId, topLevelCommentId)); + if (!topLevelCommentId) { + dispatch(setRepliesDeleted(commentId)); + } + }); +}); + +const reportComment = (projectId, commentId, topLevelCommentId, token) => (dispatch => { + api({ + uri: `/proxy/project/${projectId}/comment/${commentId}/report`, + authentication: token, + withCredentials: true, + method: 'POST', + useCsrf: true + }, (err, body, res) => { + if (err || res.statusCode !== 200) { + log.error(err || res.body); + return; + } + // TODO use the reportId in the response for unreporting functionality + dispatch(setCommentReported(commentId, topLevelCommentId)); + }); +}); + +const restoreComment = (projectId, commentId, topLevelCommentId, token) => (dispatch => { + api({ + uri: `/proxy/admin/project/${projectId}/comment/${commentId}/undelete`, + authentication: token, + withCredentials: true, + method: 'PUT', + useCsrf: true + }, (err, body, res) => { + if (err || res.statusCode !== 200) { + log.error(err || res.body); + return; + } + dispatch(setCommentRestored(commentId, topLevelCommentId)); + if (!topLevelCommentId) { + dispatch(setRepliesRestored(commentId)); + } + }); +}); + +module.exports = { + getTopLevelComments, + getCommentById, + getReplies, + deleteComment, + reportComment, + restoreComment +}; \ No newline at end of file diff --git a/src/views/preview/project-view.jsx b/src/views/preview/project-view.jsx index 43b1e83a7..88927878e 100644 --- a/src/views/preview/project-view.jsx +++ b/src/views/preview/project-view.jsx @@ -30,6 +30,7 @@ const sessionActions = require('../../redux/session.js'); const navigationActions = require('../../redux/navigation.js'); const previewActions = require('../../redux/preview.js'); const commentsActions = require('../../redux/comments.js'); +const projectCommentActions = require('../../redux/project-comment-actions.js'); const frameless = require('../../lib/frameless'); @@ -1038,13 +1039,13 @@ const mapDispatchToProps = dispatch => ({ dispatch(commentsActions.addNewComment(comment, topLevelCommentId)); }, handleDeleteComment: (projectId, commentId, topLevelCommentId, token) => { - dispatch(commentsActions.deleteComment(projectId, commentId, topLevelCommentId, token)); + dispatch(projectCommentActions.deleteComment(projectId, commentId, topLevelCommentId, token)); }, handleReportComment: (projectId, commentId, topLevelCommentId, token) => { - dispatch(commentsActions.reportComment(projectId, commentId, topLevelCommentId, token)); + dispatch(projectCommentActions.reportComment(projectId, commentId, topLevelCommentId, token)); }, handleRestoreComment: (projectId, commentId, topLevelCommentId, token) => { - dispatch(commentsActions.restoreComment(projectId, commentId, topLevelCommentId, token)); + dispatch(projectCommentActions.restoreComment(projectId, commentId, topLevelCommentId, token)); }, handleOpenRegistration: event => { event.preventDefault(); @@ -1063,7 +1064,7 @@ const mapDispatchToProps = dispatch => ({ }, handleSeeAllComments: (id, ownerUsername, isAdmin, token) => { dispatch(commentsActions.resetComments()); - dispatch(commentsActions.getTopLevelComments(id, 0, ownerUsername, isAdmin, token)); + dispatch(projectCommentActions.getTopLevelComments(id, 0, ownerUsername, isAdmin, token)); }, handleUpdateProjectThumbnail: (id, blob) => { dispatch(previewActions.updateProjectThumbnail(id, blob)); @@ -1094,13 +1095,13 @@ const mapDispatchToProps = dispatch => ({ } }, getTopLevelComments: (id, offset, ownerUsername, isAdmin, token) => { - dispatch(commentsActions.getTopLevelComments(id, offset, ownerUsername, isAdmin, token)); + dispatch(projectCommentActions.getTopLevelComments(id, offset, ownerUsername, isAdmin, token)); }, getCommentById: (projectId, commentId, ownerUsername, isAdmin, token) => { - dispatch(commentsActions.getCommentById(projectId, commentId, ownerUsername, isAdmin, token)); + dispatch(projectCommentActions.getCommentById(projectId, commentId, ownerUsername, isAdmin, token)); }, getMoreReplies: (projectId, commentId, offset, ownerUsername, isAdmin, token) => { - dispatch(commentsActions.getReplies(projectId, [commentId], offset, ownerUsername, isAdmin, token)); + dispatch(projectCommentActions.getReplies(projectId, [commentId], offset, ownerUsername, isAdmin, token)); }, getFavedStatus: (id, username, token) => { dispatch(previewActions.getFavedStatus(id, username, token)); From 4029f431b386a5e92c1708a9703e52936e521fc8 Mon Sep 17 00:00:00 2001 From: Paul Kaplan Date: Thu, 18 Mar 2021 11:42:01 -0400 Subject: [PATCH 07/59] Fix linting --- src/redux/comments.js | 4 -- src/redux/project-comment-actions.js | 60 ++++++++++++++-------------- 2 files changed, 30 insertions(+), 34 deletions(-) diff --git a/src/redux/comments.js b/src/redux/comments.js index 3eea11cc1..1ce577c55 100644 --- a/src/redux/comments.js +++ b/src/redux/comments.js @@ -1,11 +1,7 @@ const keyMirror = require('keymirror'); -const eachLimit = require('async/eachLimit'); const mergeWith = require('lodash.mergewith'); const uniqBy = require('lodash.uniqby'); -const api = require('../lib/api'); -const log = require('../lib/log'); - const COMMENT_LIMIT = 20; module.exports.Status = keyMirror({ diff --git a/src/redux/project-comment-actions.js b/src/redux/project-comment-actions.js index 857a4df1a..a5c573546 100644 --- a/src/redux/project-comment-actions.js +++ b/src/redux/project-comment-actions.js @@ -19,6 +19,35 @@ const { setRepliesRestored } = require('../redux/comments.js'); +const getReplies = (projectId, commentIds, offset, ownerUsername, isAdmin, token) => (dispatch => { + dispatch(setFetchStatus('replies', Status.FETCHING)); + const fetchedReplies = {}; + eachLimit(commentIds, 10, (parentId, callback) => { + api({ + uri: `${isAdmin ? '/admin' : `/users/${ownerUsername}`}/projects/${projectId}/comments/${parentId}/replies`, + authentication: token ? token : null, + params: {offset: offset || 0, limit: COMMENT_LIMIT} + }, (err, body, res) => { + if (err) { + return callback(`Error fetching comment replies: ${err}`); + } + if (typeof body === 'undefined' || res.statusCode >= 400) { // NotFound + return callback('No comment reply information'); + } + fetchedReplies[parentId] = body; + callback(null, body); + }); + }, err => { + if (err) { + dispatch(setFetchStatus('replies', Status.ERROR)); + dispatch(setError(err)); + return; + } + dispatch(setFetchStatus('replies', Status.FETCHED)); + dispatch(setReplies(fetchedReplies)); + }); +}); + const getTopLevelComments = (id, offset, ownerUsername, isAdmin, token) => (dispatch => { dispatch(setFetchStatus('comments', Status.FETCHING)); api({ @@ -78,35 +107,6 @@ const getCommentById = (projectId, commentId, ownerUsername, isAdmin, token) => }); }); -const getReplies = (projectId, commentIds, offset, ownerUsername, isAdmin, token) => (dispatch => { - dispatch(setFetchStatus('replies', Status.FETCHING)); - const fetchedReplies = {}; - eachLimit(commentIds, 10, (parentId, callback) => { - api({ - uri: `${isAdmin ? '/admin' : `/users/${ownerUsername}`}/projects/${projectId}/comments/${parentId}/replies`, - authentication: token ? token : null, - params: {offset: offset || 0, limit: COMMENT_LIMIT} - }, (err, body, res) => { - if (err) { - return callback(`Error fetching comment replies: ${err}`); - } - if (typeof body === 'undefined' || res.statusCode >= 400) { // NotFound - return callback('No comment reply information'); - } - fetchedReplies[parentId] = body; - callback(null, body); - }); - }, err => { - if (err) { - dispatch(setFetchStatus('replies', Status.ERROR)); - dispatch(setError(err)); - return; - } - dispatch(setFetchStatus('replies', Status.FETCHED)); - dispatch(setReplies(fetchedReplies)); - }); -}); - const deleteComment = (projectId, commentId, topLevelCommentId, token) => (dispatch => { /* TODO fetching/fetched/error states updates for comment deleting */ api({ @@ -170,4 +170,4 @@ module.exports = { deleteComment, reportComment, restoreComment -}; \ No newline at end of file +}; From fd7b2ce41b0574ebefd5d43b28f8cb848b0788c5 Mon Sep 17 00:00:00 2001 From: Paul Kaplan Date: Thu, 18 Mar 2021 15:18:55 -0400 Subject: [PATCH 08/59] Replace remixes which was removed by mistake --- src/redux/preview.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/redux/preview.js b/src/redux/preview.js index e4c7c74be..dc11478ed 100644 --- a/src/redux/preview.js +++ b/src/redux/preview.js @@ -26,6 +26,7 @@ module.exports.getInitialState = () => ({ studioRequests: {} }, projectInfo: {}, + remixes: [], faved: false, loved: false, original: {}, From 10f9194f61bb650a1fce584af6858d1547b792da Mon Sep 17 00:00:00 2001 From: Eric Rosenbaum Date: Mon, 22 Mar 2021 17:24:18 -0400 Subject: [PATCH 09/59] fix form and carousel enough to display them --- src/components/carousel/carousel.json | 30 ++++++++++++++++----------- src/views/components/components.jsx | 16 +++++++------- 2 files changed, 26 insertions(+), 20 deletions(-) diff --git a/src/components/carousel/carousel.json b/src/components/carousel/carousel.json index 16742f743..88cf9e0b5 100644 --- a/src/components/carousel/carousel.json +++ b/src/components/carousel/carousel.json @@ -4,47 +4,53 @@ "type": "project", "title": "Project", "thumbnailUrl": "", - "creator": "", - "href": "#" + "author": "", + "href": "#", + "stats": {"loves": 0, "remixes": 0} }, { "id": 2, "type": "project", "title": "Project", "thumbnailUrl": "", - "creator": "", - "href": "#" + "author": "", + "href": "#", + "stats": {"loves": 0, "remixes": 0} }, { "id": 3, "type": "project", "title": "Project", "thumbnailUrl": "", - "creator": "", - "href": "#" + "author": "", + "href": "#", + "stats": {"loves": 0, "remixes": 0} }, { "id": 4, "type": "project", "title": "Project", "thumbnailUrl": "", - "creator": "", - "href": "#" + "author": "", + "href": "#", + "stats": {"loves": 0, "remixes": 0} }, { "id": 5, "type": "project", "title": "Project", "thumbnailUrl": "", - "creator": "", - "href": "#" + "author": "", + "href": "#", + "stats": {"loves": 0, "remixes": 0} }, { "id": 6, "type": "project", "title": "Project", "thumbnailUrl": "", - "creator": "", - "href": "#" + "author": "", + "href": "#", + "stats": {"loves": 0, "remixes": 0} } ] diff --git a/src/views/components/components.jsx b/src/views/components/components.jsx index 1e01bc4cc..96b6c1ebf 100644 --- a/src/views/components/components.jsx +++ b/src/views/components/components.jsx @@ -5,6 +5,7 @@ const Page = require('../../components/page/www/page.jsx'); const Box = require('../../components/box/box.jsx'); const Button = require('../../components/forms/button.jsx'); const Carousel = require('../../components/carousel/carousel.jsx'); +const Form = require('../../components/forms/form.jsx'); const Input = require('../../components/forms/input.jsx'); const Spinner = require('../../components/spinner/spinner.jsx'); @@ -16,11 +17,13 @@ const Components = () => (

Button

Form

- +
+ +

Box Component

(

Carousel Component

- - -

This is a blue Spinner

Date: Mon, 22 Mar 2021 17:27:52 -0400 Subject: [PATCH 10/59] re-add the carousel component in a box --- src/views/components/components.jsx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/views/components/components.jsx b/src/views/components/components.jsx index 96b6c1ebf..92d342adc 100644 --- a/src/views/components/components.jsx +++ b/src/views/components/components.jsx @@ -35,6 +35,9 @@ const Components = () => (

Carousel Component

+ + +

This is a blue Spinner

Date: Tue, 23 Mar 2021 03:42:30 +0000 Subject: [PATCH 11/59] Bump scratch-l10n from 3.11.20210322031531 to 3.11.20210323031446 Bumps [scratch-l10n](https://github.com/LLK/scratch-l10n) from 3.11.20210322031531 to 3.11.20210323031446. - [Release notes](https://github.com/LLK/scratch-l10n/releases) - [Commits](https://github.com/LLK/scratch-l10n/compare/3.11.20210322031531...3.11.20210323031446) Signed-off-by: dependabot-preview[bot] --- package-lock.json | 554 +++++++++++++++++++++++----------------------- 1 file changed, 283 insertions(+), 271 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0f1b8b269..4de8ae559 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,6 +15,207 @@ "turntable-camera-controller": "^3.0.0" } }, + "@babel/cli": { + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.13.10.tgz", + "integrity": "sha512-lYSBC7B4B9hJ7sv0Ojx1BrGhuzCoOIYfLjd+Xpd4rOzdS+a47yi8voV8vFkfjlZR1N5qZO7ixOCbobUdT304PQ==", + "dev": true, + "requires": { + "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents", + "chokidar": "^3.4.0", + "commander": "^4.0.1", + "convert-source-map": "^1.1.0", + "fs-readdir-recursive": "^1.1.0", + "glob": "^7.0.0", + "lodash": "^4.17.19", + "make-dir": "^2.1.0", + "slash": "^2.0.0", + "source-map": "^0.5.0" + }, + "dependencies": { + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "optional": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "optional": true + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "optional": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "chokidar": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "dev": true, + "optional": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.3.1", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + } + }, + "commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "optional": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "optional": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "optional": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "optional": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "optional": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "optional": true + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "optional": true + }, + "readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "dev": true, + "optional": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "optional": true, + "requires": { + "is-number": "^7.0.0" + } + } + } + }, "@babel/code-frame": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", @@ -25,9 +226,9 @@ } }, "@babel/compat-data": { - "version": "7.13.11", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.13.11.tgz", - "integrity": "sha512-BwKEkO+2a67DcFeS3RLl0Z3Gs2OvdXewuWjc1Hfokhb5eQWP9YRYH1/+VrVZvql2CfjOiNGqSAFOYt4lsqTHzg==", + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.13.12.tgz", + "integrity": "sha512-3eJJ841uKxeV8dcN/2yGEUy+RfgQspPEgQat85umsE1rotuquQ2AbIub4S6j7c50a2d+4myc+zSlnXeIHrOnhQ==", "dev": true }, "@babel/core": { @@ -115,9 +316,9 @@ } }, "@babel/parser": { - "version": "7.13.11", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.11.tgz", - "integrity": "sha512-PhuoqeHoO9fc4ffMEVk4qb/w/s2iOSWohvbHxLtxui0eBg3Lg5gN1U8wp1V1u61hOWkPQJJyJzGH6Y+grwkq8Q==", + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.12.tgz", + "integrity": "sha512-4T7Pb244rxH24yR116LAuJ+adxXXnHhZaLJjegJVKSdoNCe4x1eDBaud5YIcQFcqzsaD5BHvJw5BQ0AZapdCRw==", "dev": true }, "@babel/template": { @@ -149,9 +350,9 @@ } }, "@babel/types": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.0.tgz", - "integrity": "sha512-hE+HE8rnG1Z6Wzo+MhaKE5lM5eMx71T4EHJgku2E3xIfaULhDcxiiRxUYgwX8qwP1BBSlag+TdGOt6JAidIZTA==", + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.12.tgz", + "integrity": "sha512-K4nY2xFN4QMvQwkQ+zmBDp6ANMbVNw6BbxWmYA4qNjhR9W+Lj/8ky5MEY2Me5r+B2c6/v6F53oMndG+f9s3IiA==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.12.11", @@ -318,9 +519,9 @@ } }, "electron-to-chromium": { - "version": "1.3.693", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.693.tgz", - "integrity": "sha512-vUdsE8yyeu30RecppQtI+XTz2++LWLVEIYmzeCaCRLSdtKZ2eXqdJcrs85KwLiPOPVc6PELgWyXBsfqIvzGZag==", + "version": "1.3.694", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.694.tgz", + "integrity": "sha512-8YJ/OZjbK5luOd27dmk34B47oa/zNGRHrKTEmfO3qPns1kFAJ36Lb+OtYzNlCoXtkPYuDbX0ztofuL7ArMHJkQ==", "dev": true }, "semver": { @@ -352,18 +553,18 @@ } }, "@babel/helper-member-expression-to-functions": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.0.tgz", - "integrity": "sha512-yvRf8Ivk62JwisqV1rFRMxiSMDGnN6KH1/mDMmIrij4jztpQNRoHqqMG3U6apYbGRPJpgPalhva9Yd06HlUxJQ==", + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz", + "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==", "dev": true, "requires": { - "@babel/types": "^7.13.0" + "@babel/types": "^7.13.12" }, "dependencies": { "@babel/types": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.0.tgz", - "integrity": "sha512-hE+HE8rnG1Z6Wzo+MhaKE5lM5eMx71T4EHJgku2E3xIfaULhDcxiiRxUYgwX8qwP1BBSlag+TdGOt6JAidIZTA==", + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.12.tgz", + "integrity": "sha512-K4nY2xFN4QMvQwkQ+zmBDp6ANMbVNw6BbxWmYA4qNjhR9W+Lj/8ky5MEY2Me5r+B2c6/v6F53oMndG+f9s3IiA==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.12.11", @@ -386,18 +587,18 @@ } }, "@babel/helper-module-imports": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.13.tgz", - "integrity": "sha512-NGmfvRp9Rqxy0uHSSVP+SRIW1q31a7Ji10cLBcqSDUngGentY4FRiHOFZFE1CLU5eiL0oE8reH7Tg1y99TDM/g==", + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", + "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", "dev": true, "requires": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.13.12" }, "dependencies": { "@babel/types": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.0.tgz", - "integrity": "sha512-hE+HE8rnG1Z6Wzo+MhaKE5lM5eMx71T4EHJgku2E3xIfaULhDcxiiRxUYgwX8qwP1BBSlag+TdGOt6JAidIZTA==", + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.12.tgz", + "integrity": "sha512-K4nY2xFN4QMvQwkQ+zmBDp6ANMbVNw6BbxWmYA4qNjhR9W+Lj/8ky5MEY2Me5r+B2c6/v6F53oMndG+f9s3IiA==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.12.11", @@ -420,20 +621,19 @@ } }, "@babel/helper-module-transforms": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.13.0.tgz", - "integrity": "sha512-Ls8/VBwH577+pw7Ku1QkUWIyRRNHpYlts7+qSqBBFCW3I8QteB9DxfcZ5YJpOwH6Ihe/wn8ch7fMGOP1OhEIvw==", + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.13.12.tgz", + "integrity": "sha512-7zVQqMO3V+K4JOOj40kxiCrMf6xlQAkewBB0eu2b03OO/Q21ZutOzjpfD79A5gtE/2OWi1nv625MrDlGlkbknQ==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-replace-supers": "^7.13.0", - "@babel/helper-simple-access": "^7.12.13", + "@babel/helper-module-imports": "^7.13.12", + "@babel/helper-replace-supers": "^7.13.12", + "@babel/helper-simple-access": "^7.13.12", "@babel/helper-split-export-declaration": "^7.12.13", "@babel/helper-validator-identifier": "^7.12.11", "@babel/template": "^7.12.13", "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.0", - "lodash": "^4.17.19" + "@babel/types": "^7.13.12" }, "dependencies": { "@babel/code-frame": { @@ -497,9 +697,9 @@ } }, "@babel/parser": { - "version": "7.13.11", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.11.tgz", - "integrity": "sha512-PhuoqeHoO9fc4ffMEVk4qb/w/s2iOSWohvbHxLtxui0eBg3Lg5gN1U8wp1V1u61hOWkPQJJyJzGH6Y+grwkq8Q==", + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.12.tgz", + "integrity": "sha512-4T7Pb244rxH24yR116LAuJ+adxXXnHhZaLJjegJVKSdoNCe4x1eDBaud5YIcQFcqzsaD5BHvJw5BQ0AZapdCRw==", "dev": true }, "@babel/template": { @@ -531,9 +731,9 @@ } }, "@babel/types": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.0.tgz", - "integrity": "sha512-hE+HE8rnG1Z6Wzo+MhaKE5lM5eMx71T4EHJgku2E3xIfaULhDcxiiRxUYgwX8qwP1BBSlag+TdGOt6JAidIZTA==", + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.12.tgz", + "integrity": "sha512-K4nY2xFN4QMvQwkQ+zmBDp6ANMbVNw6BbxWmYA4qNjhR9W+Lj/8ky5MEY2Me5r+B2c6/v6F53oMndG+f9s3IiA==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.12.11", @@ -627,9 +827,9 @@ }, "dependencies": { "@babel/types": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.0.tgz", - "integrity": "sha512-hE+HE8rnG1Z6Wzo+MhaKE5lM5eMx71T4EHJgku2E3xIfaULhDcxiiRxUYgwX8qwP1BBSlag+TdGOt6JAidIZTA==", + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.12.tgz", + "integrity": "sha512-K4nY2xFN4QMvQwkQ+zmBDp6ANMbVNw6BbxWmYA4qNjhR9W+Lj/8ky5MEY2Me5r+B2c6/v6F53oMndG+f9s3IiA==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.12.11", @@ -658,15 +858,15 @@ "dev": true }, "@babel/helper-replace-supers": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.0.tgz", - "integrity": "sha512-Segd5me1+Pz+rmN/NFBOplMbZG3SqRJOBlY+mA0SxAv6rjj7zJqr1AVr3SfzUVTLCv7ZLU5FycOM/SBGuLPbZw==", + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz", + "integrity": "sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.13.0", + "@babel/helper-member-expression-to-functions": "^7.13.12", "@babel/helper-optimise-call-expression": "^7.12.13", "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.0" + "@babel/types": "^7.13.12" }, "dependencies": { "@babel/code-frame": { @@ -730,9 +930,9 @@ } }, "@babel/parser": { - "version": "7.13.11", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.11.tgz", - "integrity": "sha512-PhuoqeHoO9fc4ffMEVk4qb/w/s2iOSWohvbHxLtxui0eBg3Lg5gN1U8wp1V1u61hOWkPQJJyJzGH6Y+grwkq8Q==", + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.12.tgz", + "integrity": "sha512-4T7Pb244rxH24yR116LAuJ+adxXXnHhZaLJjegJVKSdoNCe4x1eDBaud5YIcQFcqzsaD5BHvJw5BQ0AZapdCRw==", "dev": true }, "@babel/template": { @@ -764,9 +964,9 @@ } }, "@babel/types": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.0.tgz", - "integrity": "sha512-hE+HE8rnG1Z6Wzo+MhaKE5lM5eMx71T4EHJgku2E3xIfaULhDcxiiRxUYgwX8qwP1BBSlag+TdGOt6JAidIZTA==", + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.12.tgz", + "integrity": "sha512-K4nY2xFN4QMvQwkQ+zmBDp6ANMbVNw6BbxWmYA4qNjhR9W+Lj/8ky5MEY2Me5r+B2c6/v6F53oMndG+f9s3IiA==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.12.11", @@ -851,18 +1051,18 @@ } }, "@babel/helper-simple-access": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.13.tgz", - "integrity": "sha512-0ski5dyYIHEfwpWGx5GPWhH35j342JaflmCeQmsPWcrOQDtCN6C1zKAVRFVbK53lPW2c9TsuLLSUDf0tIGJ5hA==", + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz", + "integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==", "dev": true, "requires": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.13.12" }, "dependencies": { "@babel/types": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.0.tgz", - "integrity": "sha512-hE+HE8rnG1Z6Wzo+MhaKE5lM5eMx71T4EHJgku2E3xIfaULhDcxiiRxUYgwX8qwP1BBSlag+TdGOt6JAidIZTA==", + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.12.tgz", + "integrity": "sha512-K4nY2xFN4QMvQwkQ+zmBDp6ANMbVNw6BbxWmYA4qNjhR9W+Lj/8ky5MEY2Me5r+B2c6/v6F53oMndG+f9s3IiA==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.12.11", @@ -977,9 +1177,9 @@ } }, "@babel/parser": { - "version": "7.13.11", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.11.tgz", - "integrity": "sha512-PhuoqeHoO9fc4ffMEVk4qb/w/s2iOSWohvbHxLtxui0eBg3Lg5gN1U8wp1V1u61hOWkPQJJyJzGH6Y+grwkq8Q==", + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.12.tgz", + "integrity": "sha512-4T7Pb244rxH24yR116LAuJ+adxXXnHhZaLJjegJVKSdoNCe4x1eDBaud5YIcQFcqzsaD5BHvJw5BQ0AZapdCRw==", "dev": true }, "@babel/template": { @@ -1011,9 +1211,9 @@ } }, "@babel/types": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.0.tgz", - "integrity": "sha512-hE+HE8rnG1Z6Wzo+MhaKE5lM5eMx71T4EHJgku2E3xIfaULhDcxiiRxUYgwX8qwP1BBSlag+TdGOt6JAidIZTA==", + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.12.tgz", + "integrity": "sha512-K4nY2xFN4QMvQwkQ+zmBDp6ANMbVNw6BbxWmYA4qNjhR9W+Lj/8ky5MEY2Me5r+B2c6/v6F53oMndG+f9s3IiA==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.12.11", @@ -21164,6 +21364,19 @@ "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", "dev": true }, + "scratch-l10n": { + "version": "3.11.20210322031531", + "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-3.11.20210322031531.tgz", + "integrity": "sha512-Z+1QdCa5FysWP0ceDiiuf3gqJmzrOmW6zdQY8vm7ArFuczJpgi1hsdhRcnN7+aFzCMPA2eCP+Cs4/KASQMti2A==", + "dev": true, + "requires": { + "@babel/cli": "^7.1.2", + "@babel/core": "^7.1.2", + "babel-plugin-react-intl": "^3.0.1", + "react-intl": "^2.8.0", + "transifex": "1.6.6" + } + }, "scratch-storage": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-1.3.3.tgz", @@ -21231,9 +21444,9 @@ } }, "scratch-l10n": { - "version": "3.11.20210322031531", - "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-3.11.20210322031531.tgz", - "integrity": "sha512-Z+1QdCa5FysWP0ceDiiuf3gqJmzrOmW6zdQY8vm7ArFuczJpgi1hsdhRcnN7+aFzCMPA2eCP+Cs4/KASQMti2A==", + "version": "3.11.20210323031446", + "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-3.11.20210323031446.tgz", + "integrity": "sha512-Qgk5iERKTzI2ltk4AJPgZCCBVu9DWgxzKUKtdEbb35dXB1fXx0szBOMWpev16zkjEG+tuLadNSIRa6/yQtEdNg==", "dev": true, "requires": { "@babel/cli": "^7.1.2", @@ -21241,207 +21454,6 @@ "babel-plugin-react-intl": "^3.0.1", "react-intl": "^2.8.0", "transifex": "1.6.6" - }, - "dependencies": { - "@babel/cli": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.13.10.tgz", - "integrity": "sha512-lYSBC7B4B9hJ7sv0Ojx1BrGhuzCoOIYfLjd+Xpd4rOzdS+a47yi8voV8vFkfjlZR1N5qZO7ixOCbobUdT304PQ==", - "dev": true, - "requires": { - "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents", - "chokidar": "^3.4.0", - "commander": "^4.0.1", - "convert-source-map": "^1.1.0", - "fs-readdir-recursive": "^1.1.0", - "glob": "^7.0.0", - "lodash": "^4.17.19", - "make-dir": "^2.1.0", - "slash": "^2.0.0", - "source-map": "^0.5.0" - } - }, - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "dev": true, - "optional": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "optional": true - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "optional": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "chokidar": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", - "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", - "dev": true, - "optional": true, - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.3.1", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" - } - }, - "commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "optional": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "optional": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "optional": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true, - "optional": true - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "optional": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "optional": true - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "optional": true - }, - "readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", - "dev": true, - "optional": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "optional": true, - "requires": { - "is-number": "^7.0.0" - } - } } }, "scratch-paint": { From 507292530a4c3ec8c993b3d8b31aa35a70153cd3 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 23 Mar 2021 13:50:18 +0000 Subject: [PATCH 12/59] Bump scratch-gui Bumps [scratch-gui](https://github.com/LLK/scratch-gui) from 0.1.0-prerelease.20210322040541 to 0.1.0-prerelease.20210323041806. - [Release notes](https://github.com/LLK/scratch-gui/releases) - [Commits](https://github.com/LLK/scratch-gui/compare/0.1.0-prerelease.20210322040541...0.1.0-prerelease.20210323041806) Signed-off-by: dependabot-preview[bot] --- package-lock.json | 43 +++++++++++++++---------------------------- package.json | 2 +- 2 files changed, 16 insertions(+), 29 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4de8ae559..ec7741dd5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20909,9 +20909,9 @@ } }, "scratch-blocks": { - "version": "0.1.0-prerelease.20210319032844", - "resolved": "https://registry.npmjs.org/scratch-blocks/-/scratch-blocks-0.1.0-prerelease.20210319032844.tgz", - "integrity": "sha512-kfI/JKO2Zk0kQS74/wUVgrZzQP2Efd9xkHRXUyJhqgFPHVR0TdAhJGpvzCj6A7AnWZDLnUc+FjzPPzVuRowR2A==", + "version": "0.1.0-prerelease.20210323034543", + "resolved": "https://registry.npmjs.org/scratch-blocks/-/scratch-blocks-0.1.0-prerelease.20210323034543.tgz", + "integrity": "sha512-MSdNZh4mwNMC9EPLMbDI5Run58d82cLA/mGhoCp/BPcwTvDdeaELqDFzqfUjBAC/WsF3tT2HKPOwveRY5yzhwA==", "dev": true, "requires": { "exports-loader": "0.6.3", @@ -20919,9 +20919,9 @@ } }, "scratch-gui": { - "version": "0.1.0-prerelease.20210322040541", - "resolved": "https://registry.npmjs.org/scratch-gui/-/scratch-gui-0.1.0-prerelease.20210322040541.tgz", - "integrity": "sha512-thrxJGCDfB0w6YlFRUmdHr8C4we6jL4vc4x16a1kMD4ICbAwPZ3RvzNjttkA2Kcu5pg/S/y97l5DjyHlXkv8TQ==", + "version": "0.1.0-prerelease.20210323041806", + "resolved": "https://registry.npmjs.org/scratch-gui/-/scratch-gui-0.1.0-prerelease.20210323041806.tgz", + "integrity": "sha512-oSHdNuj8xMFa4gU0cLw8g+odgk5fEIVC2ud/6mTQjOmYp+aPjP7AiM/mppuTsnTHrPDIwVZK4z4IkzmrlTI/Qw==", "dev": true, "requires": { "arraybuffer-loader": "^1.0.6", @@ -20972,14 +20972,14 @@ "redux": "3.7.2", "redux-throttle": "0.1.1", "scratch-audio": "0.1.0-prerelease.20200528195344", - "scratch-blocks": "0.1.0-prerelease.20210319032844", - "scratch-l10n": "3.11.20210322031531", + "scratch-blocks": "0.1.0-prerelease.20210323034543", + "scratch-l10n": "3.11.20210323031446", "scratch-paint": "0.2.0-prerelease.20210319222931", "scratch-render": "0.1.0-prerelease.20210317200605", "scratch-render-fonts": "1.0.0-prerelease.20200507182347", "scratch-storage": "1.3.3", "scratch-svg-renderer": "0.2.0-prerelease.20210317184701", - "scratch-vm": "0.2.0-prerelease.20210319111230", + "scratch-vm": "0.2.0-prerelease.20210322113444", "startaudiocontext": "1.2.1", "style-loader": "^0.23.0", "text-encoding": "0.7.0", @@ -21142,9 +21142,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.3.693", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.693.tgz", - "integrity": "sha512-vUdsE8yyeu30RecppQtI+XTz2++LWLVEIYmzeCaCRLSdtKZ2eXqdJcrs85KwLiPOPVc6PELgWyXBsfqIvzGZag==", + "version": "1.3.695", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.695.tgz", + "integrity": "sha512-lz66RliUqLHU1Ojxx1A4QUxKydjiQ79Y4dZyPobs2Dmxj5aVL2TM3KoQ2Gs7HS703Bfny+ukI3KOxwAB0xceHQ==", "dev": true }, "has-flag": { @@ -21364,19 +21364,6 @@ "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", "dev": true }, - "scratch-l10n": { - "version": "3.11.20210322031531", - "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-3.11.20210322031531.tgz", - "integrity": "sha512-Z+1QdCa5FysWP0ceDiiuf3gqJmzrOmW6zdQY8vm7ArFuczJpgi1hsdhRcnN7+aFzCMPA2eCP+Cs4/KASQMti2A==", - "dev": true, - "requires": { - "@babel/cli": "^7.1.2", - "@babel/core": "^7.1.2", - "babel-plugin-react-intl": "^3.0.1", - "react-intl": "^2.8.0", - "transifex": "1.6.6" - } - }, "scratch-storage": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-1.3.3.tgz", @@ -21694,9 +21681,9 @@ "dev": true }, "scratch-vm": { - "version": "0.2.0-prerelease.20210319111230", - "resolved": "https://registry.npmjs.org/scratch-vm/-/scratch-vm-0.2.0-prerelease.20210319111230.tgz", - "integrity": "sha512-mppeo3vmQTWK3HZnAGlpLM6sSKkXocfOrXX91zaO88D7q9Mam36oWoHQCrQ6QVY7L5Y2OLytxpCXCrSYSYw9UA==", + "version": "0.2.0-prerelease.20210322113444", + "resolved": "https://registry.npmjs.org/scratch-vm/-/scratch-vm-0.2.0-prerelease.20210322113444.tgz", + "integrity": "sha512-YuhResDl2l9nPUw2TTupCB7Qsmsem8vVOsPVq5UZMrnLg0ojFrqZHm47S84cK+e6uZMCPTTknkjDxFEIBzJzAA==", "dev": true, "requires": { "@vernier/godirect": "1.5.0", diff --git a/package.json b/package.json index 5c9ae5db1..2fb41722e 100644 --- a/package.json +++ b/package.json @@ -125,7 +125,7 @@ "redux-mock-store": "^1.2.3", "redux-thunk": "2.0.1", "sass-loader": "6.0.6", - "scratch-gui": "0.1.0-prerelease.20210322040541", + "scratch-gui": "0.1.0-prerelease.20210323041806", "scratch-l10n": "latest", "selenium-webdriver": "3.6.0", "slick-carousel": "1.6.0", From 138ed7339e2ddafca2f523d3e43ff0727ef930df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zoe=CC=88=20Bentley?= Date: Wed, 17 Mar 2021 16:04:55 -0400 Subject: [PATCH 13/59] Fixed other place where date appears --- src/views/conference/2020/index/index.jsx | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/views/conference/2020/index/index.jsx b/src/views/conference/2020/index/index.jsx index a2041a6be..78689fc9b 100644 --- a/src/views/conference/2020/index/index.jsx +++ b/src/views/conference/2020/index/index.jsx @@ -51,13 +51,6 @@ const ConferenceSplash = () => ( value={new Date(2021, 6, 22)} year="numeric" /> - {' - '} - From ccab9566b8d8e5574a4f904ec827f327c9cb2e1e Mon Sep 17 00:00:00 2001 From: seotts Date: Tue, 23 Mar 2021 11:00:01 -0400 Subject: [PATCH 14/59] Show different modal message when muted in the past --- src/l10n.json | 2 - src/views/preview/comment/compose-comment.jsx | 35 ++++++++--------- src/views/preview/l10n.json | 2 + test/unit/components/compose-comment.test.jsx | 38 ++++++++++++++++--- 4 files changed, 50 insertions(+), 27 deletions(-) diff --git a/src/l10n.json b/src/l10n.json index bdc2313d6..24c37e562 100644 --- a/src/l10n.json +++ b/src/l10n.json @@ -327,8 +327,6 @@ "comments.isBad": "Hmm...the bad word detector thinks there is a problem with your comment. Please change it and remember to be respectful.", "comments.hasChatSite": "Uh oh! The comment contains a link to a website with unmoderated chat. For safety reasons, please do not link to these sites!", "comments.isSpam": "Hmm, seems like you've posted the same comment a bunch of times. Please don't spam.", - "comments.isMuted": "Hmm, the filterbot is pretty sure your recent comments weren't ok for Scratch, so your account has been muted for the rest of the day. :/", - "comments.isUnconstructive": "Hmm, the filterbot thinks your comment may be mean or disrespectful. Remember, most projects on Scratch are made by people who are just learning how to program.", "comments.isDisallowed": "Hmm, it looks like comments have been turned off for this page. :/", "comments.isIPMuted": "Sorry, the Scratch Team had to prevent your network from sharing comments or projects because it was used to break our community guidelines too many times. You can still share comments and projects from another network. If you'd like to appeal this block, you can contact appeals@scratch.mit.edu and reference Case Number {appealId}.", "comments.isTooLong": "That comment is too long! Please find a way to shorten your text.", diff --git a/src/views/preview/comment/compose-comment.jsx b/src/views/preview/comment/compose-comment.jsx index 2627334ed..921967163 100644 --- a/src/views/preview/comment/compose-comment.jsx +++ b/src/views/preview/comment/compose-comment.jsx @@ -224,42 +224,43 @@ class ComposeComment extends React.Component { MuteModal.steps.MUTE_INFO : MuteModal.steps.COMMENT_ISSUE; } - getMuteMessageInfo () { + getMuteMessageInfo (justMuted) { // return the ids for the messages that are shown for this mute type // If mute modals have more than one unique "step" we could pass an array of steps const messageInfo = { pii: { name: 'pii', - commentType: 'comment.type.pii', - commentTypePast: 'comment.type.pii.past', + commentType: justMuted ? 'comment.type.pii' : 'comment.type.pii.past', muteStepHeader: 'comment.pii.header', muteStepContent: ['comment.pii.content1', 'comment.pii.content2', 'comment.pii.content3'] }, unconstructive: { name: 'unconstructive', - commentType: 'comment.type.unconstructive', - commentTypePast: 'comment.type.unconstructive.past', + commentType: justMuted ? 'comment.type.unconstructive' : 'comment.type.unconstructive.past', muteStepHeader: 'comment.unconstructive.header', - muteStepContent: ['comment.unconstructive.content1', 'comment.unconstructive.content2'] + muteStepContent: [ + justMuted ? 'comment.unconstructive.content1' : 'comment.unconstructive.content1.past', + 'comment.unconstructive.content2' + ] }, vulgarity: { name: 'vulgarity', - commentType: 'comment.type.vulgarity', - commentTypePast: 'comment.type.vulgarity.past', + commentType: justMuted ? 'comment.type.vulgarity' : 'comment.type.vulgarity.past', muteStepHeader: 'comment.vulgarity.header', - muteStepContent: ['comment.vulgarity.content1', 'comment.vulgarity.content2'] + muteStepContent: [ + justMuted ? 'comment.vulgarity.content1' : 'comment.vulgarity.content1.past', + 'comment.vulgarity.content2' + ] }, spam: { name: 'spam', - commentType: 'comment.type.spam', - commentTypePast: 'comment.type.spam.past', + commentType: justMuted ? 'comment.type.spam' : 'comment.type.spam.past', muteStepHeader: 'comment.spam.header', muteStepContent: ['comment.spam.content1', 'comment.spam.content2'] }, general: { name: 'general', - commentType: 'comment.type.general', - commentTypePast: 'comment.type.general.past', + commentType: justMuted ? 'comment.type.general' : 'comment.type.general.past', muteStepHeader: 'comment.general.header', muteStepContent: ['comment.general.content1'] } @@ -291,11 +292,7 @@ class ComposeComment extends React.Component {

@@ -404,7 +401,7 @@ class ComposeComment extends React.Component { useStandardSizes className="mod-mute" commentContent={this.state.message} - muteModalMessages={this.getMuteMessageInfo()} + muteModalMessages={this.getMuteMessageInfo(this.state.status === ComposeStatus.REJECTED_MUTE)} shouldCloseOnOverlayClick={false} showFeedback={ this.state.status === ComposeStatus.REJECTED_MUTE diff --git a/src/views/preview/l10n.json b/src/views/preview/l10n.json index df117e0f8..01826dde9 100644 --- a/src/views/preview/l10n.json +++ b/src/views/preview/l10n.json @@ -60,11 +60,13 @@ "comment.type.unconstructive.past": "It appears that one of your recent comments was saying something that might have been hurtful.", "comment.unconstructive.header": "We encourage you to be supportive when commenting on other people’s projects", "comment.unconstructive.content1": "It appears that your comment was saying something that might have been hurtful.", + "comment.unconstructive.content1.past": "It appears that one of your recent comments was saying something that might have been hurtful.", "comment.unconstructive.content2": "If you think something could be better, you can say something you like about the project, and make a suggestion about how to improve it.", "comment.type.vulgarity": "Your most recent comment appeared to include a bad word.", "comment.type.vulgarity.past": "It appears that one of your recent comments contained a bad word.", "comment.vulgarity.header": "We encourage you to use language that’s appropriate for all ages.", "comment.vulgarity.content1": "It appears that your comment contains a bad word.", + "comment.vulgarity.content1.past": "It appears that one of your recent comments contained a bad word.", "comment.vulgarity.content2": "Scratch has users of all ages, so it’s important to use language that is appropriate for all Scratchers.", "comment.type.spam": "Your most recent comment appeared to contain advertising, text art, or a chain message.", "comment.type.spam.past": "It appears that one of your recent comments contained advertising, text art, or a chain message.", diff --git a/test/unit/components/compose-comment.test.jsx b/test/unit/components/compose-comment.test.jsx index 226d80062..a23c4b507 100644 --- a/test/unit/components/compose-comment.test.jsx +++ b/test/unit/components/compose-comment.test.jsx @@ -555,20 +555,46 @@ describe('Compose Comment test', () => { global.Date.now = realDateNow; }); - test('getMuteMessageInfo: muteType set', () => { + test('getMuteMessageInfo: muteType set and just got muted', () => { const commentInstance = getComposeCommentWrapper({}).instance(); commentInstance.setState({muteType: 'unconstructive'}); - expect(commentInstance.getMuteMessageInfo().commentType).toBe('comment.type.unconstructive'); + expect(commentInstance.getMuteMessageInfo(true).commentType).toBe('comment.type.unconstructive'); + expect(commentInstance.getMuteMessageInfo(true).muteStepContent[0]).toBe('comment.unconstructive.content1'); }); - test('getMuteMessageInfo: muteType not set', () => { + test('getMuteMessageInfo: muteType set and already muted', () => { const commentInstance = getComposeCommentWrapper({}).instance(); - expect(commentInstance.getMuteMessageInfo().commentType).toBe('comment.type.general'); + commentInstance.setState({muteType: 'pii'}); + expect(commentInstance.getMuteMessageInfo(false).commentType).toBe('comment.type.pii.past'); + // PII has the same content1 regardless of whether you were just muted + expect(commentInstance.getMuteMessageInfo(false).muteStepContent[0]).toBe('comment.pii.content1'); + + commentInstance.setState({muteType: 'vulgarity'}); + expect(commentInstance.getMuteMessageInfo(false).commentType).toBe('comment.type.vulgarity.past'); + expect(commentInstance.getMuteMessageInfo(false).muteStepContent[0]).toBe('comment.vulgarity.content1.past'); }); - test('getMuteMessageInfo: muteType set to something we don\'t have messages for', () => { + test('getMuteMessageInfo: muteType not set and just got muted', () => { + const commentInstance = getComposeCommentWrapper({}).instance(); + expect(commentInstance.getMuteMessageInfo(true).commentType).toBe('comment.type.general'); + // general has the same content1 regardless of whether you were just muted + expect(commentInstance.getMuteMessageInfo(true).muteStepContent[0]).toBe('comment.general.content1'); + }); + + test('getMuteMessageInfo: muteType not set and already muted', () => { + const commentInstance = getComposeCommentWrapper({}).instance(); + expect(commentInstance.getMuteMessageInfo(false).commentType).toBe('comment.type.general.past'); + }); + + test('getMuteMessageInfo: muteType set to something we don\'t have messages for and just got muted', () => { const commentInstance = getComposeCommentWrapper({}).instance(); commentInstance.setState({muteType: 'spaghetti'}); - expect(commentInstance.getMuteMessageInfo().commentType).toBe('comment.type.general'); + expect(commentInstance.getMuteMessageInfo(true).commentType).toBe('comment.type.general'); + }); + + test('getMuteMessageInfo: muteType set to something we don\'t have messages for and already muted', () => { + const commentInstance = getComposeCommentWrapper({}).instance(); + commentInstance.setState({muteType: 'spaghetti'}); + expect(commentInstance.getMuteMessageInfo(false).commentType).toBe('comment.type.general.past'); }); }); From 60bf05fbbfe41c94104bb424b0dff34b501d6ae9 Mon Sep 17 00:00:00 2001 From: seotts Date: Tue, 23 Mar 2021 15:45:03 -0400 Subject: [PATCH 15/59] Reuse l10n strings instead of duplicating them --- src/views/preview/comment/compose-comment.jsx | 4 ++-- src/views/preview/l10n.json | 2 -- test/unit/components/compose-comment.test.jsx | 2 +- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/views/preview/comment/compose-comment.jsx b/src/views/preview/comment/compose-comment.jsx index 921967163..77b1c9199 100644 --- a/src/views/preview/comment/compose-comment.jsx +++ b/src/views/preview/comment/compose-comment.jsx @@ -239,7 +239,7 @@ class ComposeComment extends React.Component { commentType: justMuted ? 'comment.type.unconstructive' : 'comment.type.unconstructive.past', muteStepHeader: 'comment.unconstructive.header', muteStepContent: [ - justMuted ? 'comment.unconstructive.content1' : 'comment.unconstructive.content1.past', + justMuted ? 'comment.unconstructive.content1' : 'comment.type.unconstructive.past', 'comment.unconstructive.content2' ] }, @@ -248,7 +248,7 @@ class ComposeComment extends React.Component { commentType: justMuted ? 'comment.type.vulgarity' : 'comment.type.vulgarity.past', muteStepHeader: 'comment.vulgarity.header', muteStepContent: [ - justMuted ? 'comment.vulgarity.content1' : 'comment.vulgarity.content1.past', + justMuted ? 'comment.vulgarity.content1' : 'comment.type.vulgarity.past', 'comment.vulgarity.content2' ] }, diff --git a/src/views/preview/l10n.json b/src/views/preview/l10n.json index 01826dde9..df117e0f8 100644 --- a/src/views/preview/l10n.json +++ b/src/views/preview/l10n.json @@ -60,13 +60,11 @@ "comment.type.unconstructive.past": "It appears that one of your recent comments was saying something that might have been hurtful.", "comment.unconstructive.header": "We encourage you to be supportive when commenting on other people’s projects", "comment.unconstructive.content1": "It appears that your comment was saying something that might have been hurtful.", - "comment.unconstructive.content1.past": "It appears that one of your recent comments was saying something that might have been hurtful.", "comment.unconstructive.content2": "If you think something could be better, you can say something you like about the project, and make a suggestion about how to improve it.", "comment.type.vulgarity": "Your most recent comment appeared to include a bad word.", "comment.type.vulgarity.past": "It appears that one of your recent comments contained a bad word.", "comment.vulgarity.header": "We encourage you to use language that’s appropriate for all ages.", "comment.vulgarity.content1": "It appears that your comment contains a bad word.", - "comment.vulgarity.content1.past": "It appears that one of your recent comments contained a bad word.", "comment.vulgarity.content2": "Scratch has users of all ages, so it’s important to use language that is appropriate for all Scratchers.", "comment.type.spam": "Your most recent comment appeared to contain advertising, text art, or a chain message.", "comment.type.spam.past": "It appears that one of your recent comments contained advertising, text art, or a chain message.", diff --git a/test/unit/components/compose-comment.test.jsx b/test/unit/components/compose-comment.test.jsx index a23c4b507..c8e8aa194 100644 --- a/test/unit/components/compose-comment.test.jsx +++ b/test/unit/components/compose-comment.test.jsx @@ -571,7 +571,7 @@ describe('Compose Comment test', () => { commentInstance.setState({muteType: 'vulgarity'}); expect(commentInstance.getMuteMessageInfo(false).commentType).toBe('comment.type.vulgarity.past'); - expect(commentInstance.getMuteMessageInfo(false).muteStepContent[0]).toBe('comment.vulgarity.content1.past'); + expect(commentInstance.getMuteMessageInfo(false).muteStepContent[0]).toBe('comment.type.vulgarity.past'); }); test('getMuteMessageInfo: muteType not set and just got muted', () => { From 523b31c3790b75bd85c74abbd9e6c4452ed3bb10 Mon Sep 17 00:00:00 2001 From: BryceLTaylor Date: Tue, 23 Mar 2021 16:01:09 -0400 Subject: [PATCH 16/59] circleci deploy to staging with circle instead of travis --- .circleci/config.yml | 77 +++++++++++++++++++++----------------------- .travis.yml | 11 +------ 2 files changed, 38 insertions(+), 50 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index bed3adadd..ddfc25bec 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -134,7 +134,7 @@ jobs: # <<: *integration_tap workflows: - build-staging-production: # build-test-deploy + build-test-deploy: jobs: - build-staging: context: @@ -154,42 +154,39 @@ workflows: branches: only: - master - # - deploy-staging: - # context: - # - scratch-www-all - # - scratch-www-staging - # requires: - # - build-staging - # filters: - # branches: - # only: - # - develop - # - /^hotfix\/.*/ - # - /^release\/.*/ - # - circleCI-configure-tests - # - integration-staging-jest: - # context: - # - scratch-www-all - # - scratch-www-staging - # requires: - # - deploy-staging - # filters: - # branches: - # only: - # - develop - # - /^hotfix\/.*/ - # - /^release\/.*/ - # - circleCI-configure-tests - # - integration-staging-tap: - # context: - # - scratch-www-all - # - scratch-www-staging - # requires: - # - deploy-staging - # filters: - # branches: - # only: - # - develop - # - /^hotfix\/.*/ - # - /^release\/.*/ - # - circleCI-configure-tests + - deploy-staging: + context: + - scratch-www-all + - scratch-www-staging + requires: + - build-staging + filters: + branches: + only: + - develop + - /^hotfix\/.*/ + - /^release\/.*/ + - integration-staging-jest: + context: + - scratch-www-all + - scratch-www-staging + requires: + - deploy-staging + filters: + branches: + only: + - develop + - /^hotfix\/.*/ + - /^release\/.*/ + - integration-staging-tap: + context: + - scratch-www-all + - scratch-www-staging + requires: + - deploy-staging + filters: + branches: + only: + - develop + - /^hotfix\/.*/ + - /^release\/.*/ diff --git a/.travis.yml b/.travis.yml index 57ebce798..8cfbb4e82 100644 --- a/.travis.yml +++ b/.travis.yml @@ -114,15 +114,6 @@ jobs: include: - stage: test deploy: - - provider: script - skip_cleanup: $SKIP_CLEANUP - script: npm run deploy - on: - repo: LLK/scratch-www - branch: - - develop - - hotfix/* - - release/* - provider: script skip_cleanup: $SKIP_CLEANUP script: npm run deploy @@ -138,6 +129,6 @@ stages: - name: test if: type != cron - name: smoke - if: type NOT IN (cron, pull_request) AND (branch =~ /^(develop|master|release\/|hotfix\/)/) + if: type NOT IN (cron, pull_request) AND (branch =~ /^(master)/) - name: update translations if: branch == develop AND type == cron From f6f1095d936740bec52f65e68162804a1402d675 Mon Sep 17 00:00:00 2001 From: seotts Date: Tue, 23 Mar 2021 16:33:24 -0400 Subject: [PATCH 17/59] add justMuted variable, fix linting --- src/views/preview/comment/compose-comment.jsx | 6 +++- test/unit/components/compose-comment.test.jsx | 29 ++++++++++++------- 2 files changed, 23 insertions(+), 12 deletions(-) diff --git a/src/views/preview/comment/compose-comment.jsx b/src/views/preview/comment/compose-comment.jsx index 77b1c9199..c6baa356e 100644 --- a/src/views/preview/comment/compose-comment.jsx +++ b/src/views/preview/comment/compose-comment.jsx @@ -292,7 +292,11 @@ class ComposeComment extends React.Component {

diff --git a/test/unit/components/compose-comment.test.jsx b/test/unit/components/compose-comment.test.jsx index c8e8aa194..ddd0ff4ae 100644 --- a/test/unit/components/compose-comment.test.jsx +++ b/test/unit/components/compose-comment.test.jsx @@ -556,45 +556,52 @@ describe('Compose Comment test', () => { }); test('getMuteMessageInfo: muteType set and just got muted', () => { + const justMuted = true; const commentInstance = getComposeCommentWrapper({}).instance(); commentInstance.setState({muteType: 'unconstructive'}); - expect(commentInstance.getMuteMessageInfo(true).commentType).toBe('comment.type.unconstructive'); - expect(commentInstance.getMuteMessageInfo(true).muteStepContent[0]).toBe('comment.unconstructive.content1'); + expect(commentInstance.getMuteMessageInfo(justMuted).commentType).toBe('comment.type.unconstructive'); + expect(commentInstance.getMuteMessageInfo(justMuted) + .muteStepContent[0]).toBe('comment.unconstructive.content1'); }); test('getMuteMessageInfo: muteType set and already muted', () => { + const justMuted = false; const commentInstance = getComposeCommentWrapper({}).instance(); commentInstance.setState({muteType: 'pii'}); - expect(commentInstance.getMuteMessageInfo(false).commentType).toBe('comment.type.pii.past'); + expect(commentInstance.getMuteMessageInfo(justMuted).commentType).toBe('comment.type.pii.past'); // PII has the same content1 regardless of whether you were just muted - expect(commentInstance.getMuteMessageInfo(false).muteStepContent[0]).toBe('comment.pii.content1'); + expect(commentInstance.getMuteMessageInfo(justMuted).muteStepContent[0]).toBe('comment.pii.content1'); commentInstance.setState({muteType: 'vulgarity'}); - expect(commentInstance.getMuteMessageInfo(false).commentType).toBe('comment.type.vulgarity.past'); - expect(commentInstance.getMuteMessageInfo(false).muteStepContent[0]).toBe('comment.type.vulgarity.past'); + expect(commentInstance.getMuteMessageInfo(justMuted).commentType).toBe('comment.type.vulgarity.past'); + expect(commentInstance.getMuteMessageInfo(justMuted).muteStepContent[0]).toBe('comment.type.vulgarity.past'); }); test('getMuteMessageInfo: muteType not set and just got muted', () => { + const justMuted = true; const commentInstance = getComposeCommentWrapper({}).instance(); - expect(commentInstance.getMuteMessageInfo(true).commentType).toBe('comment.type.general'); + expect(commentInstance.getMuteMessageInfo(justMuted).commentType).toBe('comment.type.general'); // general has the same content1 regardless of whether you were just muted - expect(commentInstance.getMuteMessageInfo(true).muteStepContent[0]).toBe('comment.general.content1'); + expect(commentInstance.getMuteMessageInfo(justMuted).muteStepContent[0]).toBe('comment.general.content1'); }); test('getMuteMessageInfo: muteType not set and already muted', () => { + const justMuted = false; const commentInstance = getComposeCommentWrapper({}).instance(); - expect(commentInstance.getMuteMessageInfo(false).commentType).toBe('comment.type.general.past'); + expect(commentInstance.getMuteMessageInfo(justMuted).commentType).toBe('comment.type.general.past'); }); test('getMuteMessageInfo: muteType set to something we don\'t have messages for and just got muted', () => { + const justMuted = true; const commentInstance = getComposeCommentWrapper({}).instance(); commentInstance.setState({muteType: 'spaghetti'}); - expect(commentInstance.getMuteMessageInfo(true).commentType).toBe('comment.type.general'); + expect(commentInstance.getMuteMessageInfo(justMuted).commentType).toBe('comment.type.general'); }); test('getMuteMessageInfo: muteType set to something we don\'t have messages for and already muted', () => { + const justMuted = false; const commentInstance = getComposeCommentWrapper({}).instance(); commentInstance.setState({muteType: 'spaghetti'}); - expect(commentInstance.getMuteMessageInfo(false).commentType).toBe('comment.type.general.past'); + expect(commentInstance.getMuteMessageInfo(justMuted).commentType).toBe('comment.type.general.past'); }); }); From 9466a7b75b8058bf356f8eee2ac6cc862bd1ae66 Mon Sep 17 00:00:00 2001 From: Eric Rosenbaum Date: Tue, 23 Mar 2021 16:58:38 -0400 Subject: [PATCH 18/59] add grid --- src/components/grid/grid.json | 80 +++++++++++++++++------------ src/views/components/components.jsx | 6 +++ 2 files changed, 54 insertions(+), 32 deletions(-) diff --git a/src/components/grid/grid.json b/src/components/grid/grid.json index c48b916b2..bc357594d 100644 --- a/src/components/grid/grid.json +++ b/src/components/grid/grid.json @@ -4,127 +4,143 @@ "type": "project", "title": "Project", "thumbnailUrl": "", - "creator": "", - "href": "#" + "author": {"username": "username"}, + "href": "#", + "stats": {} }, { "id": 2, "type": "project", "title": "Project", "thumbnailUrl": "", - "creator": "", - "href": "#" + "author": {"username": "username"}, + "href": "#", + "stats": {} }, { "id": 3, "type": "project", "title": "Project", "thumbnailUrl": "", - "creator": "", - "href": "#" + "author": {"username": "username"}, + "href": "#", + "stats": {} }, { "id": 4, "type": "project", "title": "Project", "thumbnailUrl": "", - "creator": "", - "href": "#" + "author": {"username": "username"}, + "href": "#", + "stats": {} }, { "id": 5, "type": "project", "title": "Project", "thumbnailUrl": "", - "creator": "", - "href": "#" + "author": {"username": "username"}, + "href": "#", + "stats": {} }, { "id": 6, "type": "project", "title": "Project", "thumbnailUrl": "", - "creator": "", - "href": "#" + "author": {"username": "username"}, + "href": "#", + "stats": {} }, { "id": 7, "type": "project", "title": "Project", "thumbnailUrl": "", - "creator": "", - "href": "#" + "author": {"username": "username"}, + "href": "#", + "stats": {} }, { "id": 8, "type": "project", "title": "Project", "thumbnailUrl": "", - "creator": "", - "href": "#" + "author": {"username": "username"}, + "href": "#", + "stats": {} }, { "id": 9, "type": "project", "title": "Project", "thumbnailUrl": "", - "creator": "", - "href": "#" + "author": {"username": "username"}, + "href": "#", + "stats": {} }, { "id": 10, "type": "project", "title": "Project", "thumbnailUrl": "", - "creator": "", - "href": "#" + "author": {"username": "username"}, + "href": "#", + "stats": {} }, { "id": 11, "type": "project", "title": "Project", "thumbnailUrl": "", - "creator": "", - "href": "#" + "author": {"username": "username"}, + "href": "#", + "stats": {} }, { "id": 12, "type": "project", "title": "Project", "thumbnailUrl": "", - "creator": "", - "href": "#" + "author": {"username": "username"}, + "href": "#", + "stats": {} }, { "id": 13, "type": "project", "title": "Project", "thumbnailUrl": "", - "creator": "", - "href": "#" + "author": {"username": "username"}, + "href": "#", + "stats": {} }, { "id": 14, "type": "project", "title": "Project", "thumbnailUrl": "", - "creator": "", - "href": "#" + "author": {"username": "username"}, + "href": "#", + "stats": {} }, { "id": 15, "type": "project", "title": "Project", "thumbnailUrl": "", - "creator": "", - "href": "#" + "author": {"username": "username"}, + "href": "#", + "stats": {} }, { "id": 16, "type": "project", "title": "Project", "thumbnailUrl": "", - "creator": "", - "href": "#" + "author": {"username": "username"}, + "href": "#", + "stats": {} } ] diff --git a/src/views/components/components.jsx b/src/views/components/components.jsx index 92d342adc..b8096e7bb 100644 --- a/src/views/components/components.jsx +++ b/src/views/components/components.jsx @@ -8,12 +8,18 @@ const Carousel = require('../../components/carousel/carousel.jsx'); const Form = require('../../components/forms/form.jsx'); const Input = require('../../components/forms/input.jsx'); const Spinner = require('../../components/spinner/spinner.jsx'); +const Grid = require('../../components/grid/grid.jsx'); +const TextArea = require('../../components/forms/textarea.jsx'); require('./components.scss'); const Components = () => (

+

Grid

+

Button

Form

From eb691f36dd44a7c1dc928794af578d06e74f6a96 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 24 Mar 2021 03:33:53 +0000 Subject: [PATCH 19/59] Bump scratch-l10n from 3.11.20210323031446 to 3.11.20210324031512 Bumps [scratch-l10n](https://github.com/LLK/scratch-l10n) from 3.11.20210323031446 to 3.11.20210324031512. - [Release notes](https://github.com/LLK/scratch-l10n/releases) - [Commits](https://github.com/LLK/scratch-l10n/compare/3.11.20210323031446...3.11.20210324031512) Signed-off-by: dependabot-preview[bot] --- package-lock.json | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index ec7741dd5..c67c5916c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -519,9 +519,9 @@ } }, "electron-to-chromium": { - "version": "1.3.694", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.694.tgz", - "integrity": "sha512-8YJ/OZjbK5luOd27dmk34B47oa/zNGRHrKTEmfO3qPns1kFAJ36Lb+OtYzNlCoXtkPYuDbX0ztofuL7ArMHJkQ==", + "version": "1.3.697", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.697.tgz", + "integrity": "sha512-VTAS+IWwGlfaL7VtfUMzFeV55PT/HglNFqQ6eW9E3PfjvPqhZfqJj+8dd9zrqrJYcouUfCgQw0OIse85Dz9V9Q==", "dev": true }, "semver": { @@ -21364,6 +21364,19 @@ "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", "dev": true }, + "scratch-l10n": { + "version": "3.11.20210323031446", + "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-3.11.20210323031446.tgz", + "integrity": "sha512-Qgk5iERKTzI2ltk4AJPgZCCBVu9DWgxzKUKtdEbb35dXB1fXx0szBOMWpev16zkjEG+tuLadNSIRa6/yQtEdNg==", + "dev": true, + "requires": { + "@babel/cli": "^7.1.2", + "@babel/core": "^7.1.2", + "babel-plugin-react-intl": "^3.0.1", + "react-intl": "^2.8.0", + "transifex": "1.6.6" + } + }, "scratch-storage": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-1.3.3.tgz", @@ -21431,9 +21444,9 @@ } }, "scratch-l10n": { - "version": "3.11.20210323031446", - "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-3.11.20210323031446.tgz", - "integrity": "sha512-Qgk5iERKTzI2ltk4AJPgZCCBVu9DWgxzKUKtdEbb35dXB1fXx0szBOMWpev16zkjEG+tuLadNSIRa6/yQtEdNg==", + "version": "3.11.20210324031512", + "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-3.11.20210324031512.tgz", + "integrity": "sha512-dyv2cjNWVHrL78XpW64uF2azYaUhMKLjfJVH6vSCPJxm3EKCvO6EoaUSlIAwhsGoMwgfxWZ8D74+IaifGJfnCQ==", "dev": true, "requires": { "@babel/cli": "^7.1.2", From 917f7901cad746b2b1362e48e10653e4bd416591 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 24 Mar 2021 10:49:59 +0000 Subject: [PATCH 20/59] Bump scratch-gui Bumps [scratch-gui](https://github.com/LLK/scratch-gui) from 0.1.0-prerelease.20210323041806 to 0.1.0-prerelease.20210323153928. - [Release notes](https://github.com/LLK/scratch-gui/releases) - [Commits](https://github.com/LLK/scratch-gui/compare/0.1.0-prerelease.20210323041806...0.1.0-prerelease.20210323153928) Signed-off-by: dependabot-preview[bot] --- package-lock.json | 20 ++++++++++---------- package.json | 2 +- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/package-lock.json b/package-lock.json index c67c5916c..402b7c6ab 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20919,9 +20919,9 @@ } }, "scratch-gui": { - "version": "0.1.0-prerelease.20210323041806", - "resolved": "https://registry.npmjs.org/scratch-gui/-/scratch-gui-0.1.0-prerelease.20210323041806.tgz", - "integrity": "sha512-oSHdNuj8xMFa4gU0cLw8g+odgk5fEIVC2ud/6mTQjOmYp+aPjP7AiM/mppuTsnTHrPDIwVZK4z4IkzmrlTI/Qw==", + "version": "0.1.0-prerelease.20210323153928", + "resolved": "https://registry.npmjs.org/scratch-gui/-/scratch-gui-0.1.0-prerelease.20210323153928.tgz", + "integrity": "sha512-mIvW6Y+VQUlIn1nMaUIXelkhraMQ//xtMN6SnHdKLNqcmE8XEdgw74jEqpZjv+MJabkMWjJSk/VimLNCy1AtpQ==", "dev": true, "requires": { "arraybuffer-loader": "^1.0.6", @@ -20979,7 +20979,7 @@ "scratch-render-fonts": "1.0.0-prerelease.20200507182347", "scratch-storage": "1.3.3", "scratch-svg-renderer": "0.2.0-prerelease.20210317184701", - "scratch-vm": "0.2.0-prerelease.20210322113444", + "scratch-vm": "0.2.0-prerelease.20210323151451", "startaudiocontext": "1.2.1", "style-loader": "^0.23.0", "text-encoding": "0.7.0", @@ -21142,9 +21142,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.3.695", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.695.tgz", - "integrity": "sha512-lz66RliUqLHU1Ojxx1A4QUxKydjiQ79Y4dZyPobs2Dmxj5aVL2TM3KoQ2Gs7HS703Bfny+ukI3KOxwAB0xceHQ==", + "version": "1.3.698", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.698.tgz", + "integrity": "sha512-VEXDzYblnlT+g8Q3gedwzgKOso1evkeJzV8lih7lV8mL8eAnGVnKyC3KsFT6S+R5PQO4ffdr1PI16/ElibY/kQ==", "dev": true }, "has-flag": { @@ -21694,9 +21694,9 @@ "dev": true }, "scratch-vm": { - "version": "0.2.0-prerelease.20210322113444", - "resolved": "https://registry.npmjs.org/scratch-vm/-/scratch-vm-0.2.0-prerelease.20210322113444.tgz", - "integrity": "sha512-YuhResDl2l9nPUw2TTupCB7Qsmsem8vVOsPVq5UZMrnLg0ojFrqZHm47S84cK+e6uZMCPTTknkjDxFEIBzJzAA==", + "version": "0.2.0-prerelease.20210323151451", + "resolved": "https://registry.npmjs.org/scratch-vm/-/scratch-vm-0.2.0-prerelease.20210323151451.tgz", + "integrity": "sha512-TfjW8BLw+0lECRpXRGqd23Z+tMEVud6wZQa0Wxl9DzGMPo+EGgUgjeGU/PenmCAkY7Kl9NPl8m5qOiGEsRFpOw==", "dev": true, "requires": { "@vernier/godirect": "1.5.0", diff --git a/package.json b/package.json index 2fb41722e..42bfa3c4c 100644 --- a/package.json +++ b/package.json @@ -125,7 +125,7 @@ "redux-mock-store": "^1.2.3", "redux-thunk": "2.0.1", "sass-loader": "6.0.6", - "scratch-gui": "0.1.0-prerelease.20210323041806", + "scratch-gui": "0.1.0-prerelease.20210323153928", "scratch-l10n": "latest", "selenium-webdriver": "3.6.0", "slick-carousel": "1.6.0", From ae04b5da919ce220151c95b271d658f9647cc5d0 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 24 Mar 2021 12:33:28 +0000 Subject: [PATCH 21/59] Bump scratch-gui Bumps [scratch-gui](https://github.com/LLK/scratch-gui) from 0.1.0-prerelease.20210323153928 to 0.1.0-prerelease.20210324120840. - [Release notes](https://github.com/LLK/scratch-gui/releases) - [Commits](https://github.com/LLK/scratch-gui/compare/0.1.0-prerelease.20210323153928...0.1.0-prerelease.20210324120840) Signed-off-by: dependabot-preview[bot] --- package-lock.json | 37 ++++++++++++------------------------- package.json | 2 +- 2 files changed, 13 insertions(+), 26 deletions(-) diff --git a/package-lock.json b/package-lock.json index 402b7c6ab..551eb5ee0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20909,9 +20909,9 @@ } }, "scratch-blocks": { - "version": "0.1.0-prerelease.20210323034543", - "resolved": "https://registry.npmjs.org/scratch-blocks/-/scratch-blocks-0.1.0-prerelease.20210323034543.tgz", - "integrity": "sha512-MSdNZh4mwNMC9EPLMbDI5Run58d82cLA/mGhoCp/BPcwTvDdeaELqDFzqfUjBAC/WsF3tT2HKPOwveRY5yzhwA==", + "version": "0.1.0-prerelease.20210324033606", + "resolved": "https://registry.npmjs.org/scratch-blocks/-/scratch-blocks-0.1.0-prerelease.20210324033606.tgz", + "integrity": "sha512-zCf7mN64RLME1tA9t2HcDEnf5h5+ziMyksbQj3gsWOUylYLrrYksMBw7wprVEMdPBJwz+4HhpcpkkrCQV1NVnw==", "dev": true, "requires": { "exports-loader": "0.6.3", @@ -20919,9 +20919,9 @@ } }, "scratch-gui": { - "version": "0.1.0-prerelease.20210323153928", - "resolved": "https://registry.npmjs.org/scratch-gui/-/scratch-gui-0.1.0-prerelease.20210323153928.tgz", - "integrity": "sha512-mIvW6Y+VQUlIn1nMaUIXelkhraMQ//xtMN6SnHdKLNqcmE8XEdgw74jEqpZjv+MJabkMWjJSk/VimLNCy1AtpQ==", + "version": "0.1.0-prerelease.20210324120840", + "resolved": "https://registry.npmjs.org/scratch-gui/-/scratch-gui-0.1.0-prerelease.20210324120840.tgz", + "integrity": "sha512-6KLZfZdJLAMLBDJo/LC6f0ckUg0CefE941NvBiNmV2XOIAoMPe5gq/eX3C1JT6BDLAFw4ogw4+K1KmQX/PYibw==", "dev": true, "requires": { "arraybuffer-loader": "^1.0.6", @@ -20972,14 +20972,14 @@ "redux": "3.7.2", "redux-throttle": "0.1.1", "scratch-audio": "0.1.0-prerelease.20200528195344", - "scratch-blocks": "0.1.0-prerelease.20210323034543", - "scratch-l10n": "3.11.20210323031446", + "scratch-blocks": "0.1.0-prerelease.20210324033606", + "scratch-l10n": "3.11.20210324031512", "scratch-paint": "0.2.0-prerelease.20210319222931", "scratch-render": "0.1.0-prerelease.20210317200605", "scratch-render-fonts": "1.0.0-prerelease.20200507182347", "scratch-storage": "1.3.3", "scratch-svg-renderer": "0.2.0-prerelease.20210317184701", - "scratch-vm": "0.2.0-prerelease.20210323151451", + "scratch-vm": "0.2.0-prerelease.20210324111836", "startaudiocontext": "1.2.1", "style-loader": "^0.23.0", "text-encoding": "0.7.0", @@ -21364,19 +21364,6 @@ "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", "dev": true }, - "scratch-l10n": { - "version": "3.11.20210323031446", - "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-3.11.20210323031446.tgz", - "integrity": "sha512-Qgk5iERKTzI2ltk4AJPgZCCBVu9DWgxzKUKtdEbb35dXB1fXx0szBOMWpev16zkjEG+tuLadNSIRa6/yQtEdNg==", - "dev": true, - "requires": { - "@babel/cli": "^7.1.2", - "@babel/core": "^7.1.2", - "babel-plugin-react-intl": "^3.0.1", - "react-intl": "^2.8.0", - "transifex": "1.6.6" - } - }, "scratch-storage": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-1.3.3.tgz", @@ -21694,9 +21681,9 @@ "dev": true }, "scratch-vm": { - "version": "0.2.0-prerelease.20210323151451", - "resolved": "https://registry.npmjs.org/scratch-vm/-/scratch-vm-0.2.0-prerelease.20210323151451.tgz", - "integrity": "sha512-TfjW8BLw+0lECRpXRGqd23Z+tMEVud6wZQa0Wxl9DzGMPo+EGgUgjeGU/PenmCAkY7Kl9NPl8m5qOiGEsRFpOw==", + "version": "0.2.0-prerelease.20210324111836", + "resolved": "https://registry.npmjs.org/scratch-vm/-/scratch-vm-0.2.0-prerelease.20210324111836.tgz", + "integrity": "sha512-vOayLHJJ3ZYS2XUIVPnIMZmaW/JuazC9x32Lc/i64ZxPsQjO8pANgeUN/8A5LdEc5ZO2YG2I3JWRBLnK6o+LEw==", "dev": true, "requires": { "@vernier/godirect": "1.5.0", diff --git a/package.json b/package.json index 42bfa3c4c..26842b593 100644 --- a/package.json +++ b/package.json @@ -125,7 +125,7 @@ "redux-mock-store": "^1.2.3", "redux-thunk": "2.0.1", "sass-loader": "6.0.6", - "scratch-gui": "0.1.0-prerelease.20210323153928", + "scratch-gui": "0.1.0-prerelease.20210324120840", "scratch-l10n": "latest", "selenium-webdriver": "3.6.0", "slick-carousel": "1.6.0", From d02ddef8e7f16d94c40f35e7dfb80da348dab809 Mon Sep 17 00:00:00 2001 From: Paul Kaplan Date: Wed, 24 Mar 2021 14:38:41 -0400 Subject: [PATCH 22/59] Remove single nesting requirement that was preventing tests from running --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 26842b593..2a5d46674 100644 --- a/package.json +++ b/package.json @@ -19,9 +19,9 @@ "test:unit:jest": "npm run test:unit:jest:unit && npm run test:unit:jest:localization", "test:unit:jest:unit": "jest ./test/unit/ --reporters=default", "test:unit:jest:localization": "jest ./test/localization/*.test.js --reporters=default", - "test:unit:tap": "tap ./test/{unit-legacy,localization-legacy}/*.js --no-coverage -R classic", + "test:unit:tap": "tap ./test/{unit-legacy,localization-legacy}/ --no-coverage -R classic", "test:unit:convertReportToXunit": "tap ./test/results/unit-raw.tap --no-coverage -R xunit > ./test/results/unit-tap-results.xml", - "test:coverage": "tap ./test/{unit-legacy,localization-legacy}/*.js --coverage --coverage-report=lcov", + "test:coverage": "tap ./test/{unit-legacy,localization-legacy}/ --coverage --coverage-report=lcov", "build": "npm run clean && npm run translate && NODE_OPTIONS=--max_old_space_size=8000 webpack --bail", "clean": "rm -rf ./build && rm -rf ./intl && mkdir -p build && mkdir -p intl", "deploy": "npm run deploy:s3 && npm run deploy:fastly", From 8a33d1c5a54c91e2cdc05ed2d7548f85a2237869 Mon Sep 17 00:00:00 2001 From: Paul Kaplan Date: Wed, 24 Mar 2021 14:48:05 -0400 Subject: [PATCH 23/59] Re-export missing base comment actions to simplify --- src/redux/project-comment-actions.js | 9 ++++++++- src/views/preview/preview.jsx | 4 ++-- src/views/preview/project-view.jsx | 7 +++---- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/redux/project-comment-actions.js b/src/redux/project-comment-actions.js index a5c573546..6a4e6c354 100644 --- a/src/redux/project-comment-actions.js +++ b/src/redux/project-comment-actions.js @@ -6,6 +6,8 @@ const log = require('../lib/log'); const COMMENT_LIMIT = 20; const { + addNewComment, + resetComments, Status, setFetchStatus, setCommentDeleted, @@ -169,5 +171,10 @@ module.exports = { getReplies, deleteComment, reportComment, - restoreComment + restoreComment, + + // Re-export these specific action creators directly so the implementer + // does not need to go to two places for comment actions + addNewComment, + resetComments }; diff --git a/src/views/preview/preview.jsx b/src/views/preview/preview.jsx index 8864b5a3a..05d484503 100644 --- a/src/views/preview/preview.jsx +++ b/src/views/preview/preview.jsx @@ -5,7 +5,7 @@ const Page = require('../../components/page/www/page.jsx'); const render = require('../../lib/render.jsx'); const previewActions = require('../../redux/preview.js'); -const commentsActions = require('../../redux/comments.js'); +const commentActions = require('../../redux/comments.js'); const isSupportedBrowser = require('../../lib/supported-browser').default; const UnsupportedBrowser = require('./unsupported-browser.jsx'); @@ -17,7 +17,7 @@ if (isSupportedBrowser()) { document.getElementById('app'), { preview: previewActions.previewReducer, - comments: commentsActions.commentsReducer, + comments: commentActions.commentsReducer, ...ProjectView.guiReducers }, { diff --git a/src/views/preview/project-view.jsx b/src/views/preview/project-view.jsx index 88927878e..2dc34e4cb 100644 --- a/src/views/preview/project-view.jsx +++ b/src/views/preview/project-view.jsx @@ -29,7 +29,6 @@ const Meta = require('./meta.jsx'); const sessionActions = require('../../redux/session.js'); const navigationActions = require('../../redux/navigation.js'); const previewActions = require('../../redux/preview.js'); -const commentsActions = require('../../redux/comments.js'); const projectCommentActions = require('../../redux/project-comment-actions.js'); const frameless = require('../../lib/frameless'); @@ -1036,7 +1035,7 @@ const mapStateToProps = state => { const mapDispatchToProps = dispatch => ({ handleAddComment: (comment, topLevelCommentId) => { - dispatch(commentsActions.addNewComment(comment, topLevelCommentId)); + dispatch(projectCommentActions.addNewComment(comment, topLevelCommentId)); }, handleDeleteComment: (projectId, commentId, topLevelCommentId, token) => { dispatch(projectCommentActions.deleteComment(projectId, commentId, topLevelCommentId, token)); @@ -1063,7 +1062,7 @@ const mapDispatchToProps = dispatch => ({ dispatch(navigationActions.toggleLoginOpen()); }, handleSeeAllComments: (id, ownerUsername, isAdmin, token) => { - dispatch(commentsActions.resetComments()); + dispatch(projectCommentActions.resetComments()); dispatch(projectCommentActions.getTopLevelComments(id, 0, ownerUsername, isAdmin, token)); }, handleUpdateProjectThumbnail: (id, blob) => { @@ -1138,7 +1137,7 @@ const mapDispatchToProps = dispatch => ({ }, remixProject: () => { dispatch(GUI.remixProject()); - dispatch(commentsActions.resetComments()); + dispatch(projectCommentActions.resetComments()); }, setPlayer: player => { dispatch(GUI.setPlayer(player)); From 82d759e30aa237d665279aca1486fc86a65f6491 Mon Sep 17 00:00:00 2001 From: Eric Rosenbaum Date: Wed, 24 Mar 2021 16:12:37 -0400 Subject: [PATCH 24/59] =?UTF-8?q?grid=20displays=20=E2=80=9CProject=20Titl?= =?UTF-8?q?e=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/grid/grid.json | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/components/grid/grid.json b/src/components/grid/grid.json index bc357594d..38be552d8 100644 --- a/src/components/grid/grid.json +++ b/src/components/grid/grid.json @@ -2,7 +2,7 @@ { "id": 1, "type": "project", - "title": "Project", + "title": "Project Title", "thumbnailUrl": "", "author": {"username": "username"}, "href": "#", @@ -11,7 +11,7 @@ { "id": 2, "type": "project", - "title": "Project", + "title": "Project Title", "thumbnailUrl": "", "author": {"username": "username"}, "href": "#", @@ -20,7 +20,7 @@ { "id": 3, "type": "project", - "title": "Project", + "title": "Project Title", "thumbnailUrl": "", "author": {"username": "username"}, "href": "#", @@ -29,7 +29,7 @@ { "id": 4, "type": "project", - "title": "Project", + "title": "Project Title", "thumbnailUrl": "", "author": {"username": "username"}, "href": "#", @@ -38,7 +38,7 @@ { "id": 5, "type": "project", - "title": "Project", + "title": "Project Title", "thumbnailUrl": "", "author": {"username": "username"}, "href": "#", @@ -47,7 +47,7 @@ { "id": 6, "type": "project", - "title": "Project", + "title": "Project Title", "thumbnailUrl": "", "author": {"username": "username"}, "href": "#", @@ -56,7 +56,7 @@ { "id": 7, "type": "project", - "title": "Project", + "title": "Project Title", "thumbnailUrl": "", "author": {"username": "username"}, "href": "#", @@ -65,7 +65,7 @@ { "id": 8, "type": "project", - "title": "Project", + "title": "Project Title", "thumbnailUrl": "", "author": {"username": "username"}, "href": "#", @@ -74,7 +74,7 @@ { "id": 9, "type": "project", - "title": "Project", + "title": "Project Title", "thumbnailUrl": "", "author": {"username": "username"}, "href": "#", @@ -83,7 +83,7 @@ { "id": 10, "type": "project", - "title": "Project", + "title": "Project Title", "thumbnailUrl": "", "author": {"username": "username"}, "href": "#", @@ -92,7 +92,7 @@ { "id": 11, "type": "project", - "title": "Project", + "title": "Project Title", "thumbnailUrl": "", "author": {"username": "username"}, "href": "#", @@ -101,7 +101,7 @@ { "id": 12, "type": "project", - "title": "Project", + "title": "Project Title", "thumbnailUrl": "", "author": {"username": "username"}, "href": "#", @@ -110,7 +110,7 @@ { "id": 13, "type": "project", - "title": "Project", + "title": "Project Title", "thumbnailUrl": "", "author": {"username": "username"}, "href": "#", @@ -119,7 +119,7 @@ { "id": 14, "type": "project", - "title": "Project", + "title": "Project Title", "thumbnailUrl": "", "author": {"username": "username"}, "href": "#", @@ -128,7 +128,7 @@ { "id": 15, "type": "project", - "title": "Project", + "title": "Project Title", "thumbnailUrl": "", "author": {"username": "username"}, "href": "#", @@ -137,7 +137,7 @@ { "id": 16, "type": "project", - "title": "Project", + "title": "Project Title", "thumbnailUrl": "", "author": {"username": "username"}, "href": "#", From 8b98820495deffc651702187dc9d5cacb8628b9e Mon Sep 17 00:00:00 2001 From: Eric Rosenbaum Date: Wed, 24 Mar 2021 16:12:47 -0400 Subject: [PATCH 25/59] Add nav bubbles --- src/views/components/components.jsx | 19 +++++++++++++++++++ src/views/components/components.scss | 7 +++++++ 2 files changed, 26 insertions(+) diff --git a/src/views/components/components.jsx b/src/views/components/components.jsx index b8096e7bb..1cd10181f 100644 --- a/src/views/components/components.jsx +++ b/src/views/components/components.jsx @@ -10,12 +10,31 @@ const Input = require('../../components/forms/input.jsx'); const Spinner = require('../../components/spinner/spinner.jsx'); const Grid = require('../../components/grid/grid.jsx'); const TextArea = require('../../components/forms/textarea.jsx'); +const SubNavigation = require('../../components/subnavigation/subnavigation.jsx'); require('./components.scss'); const Components = () => (
+

Nav Bubbles

+ + +
  • + cats +
  • +
    + +
  • + also cats +
  • +
    + +
  • + not cats +
  • +
    +

    Grid

    Date: Thu, 25 Mar 2021 03:31:55 +0000 Subject: [PATCH 26/59] Bump scratch-l10n from 3.11.20210324031512 to 3.11.20210325031604 Bumps [scratch-l10n](https://github.com/LLK/scratch-l10n) from 3.11.20210324031512 to 3.11.20210325031604. - [Release notes](https://github.com/LLK/scratch-l10n/releases) - [Commits](https://github.com/LLK/scratch-l10n/compare/3.11.20210324031512...3.11.20210325031604) Signed-off-by: dependabot-preview[bot] --- package-lock.json | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 551eb5ee0..cf959e0ed 100644 --- a/package-lock.json +++ b/package-lock.json @@ -519,9 +519,9 @@ } }, "electron-to-chromium": { - "version": "1.3.697", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.697.tgz", - "integrity": "sha512-VTAS+IWwGlfaL7VtfUMzFeV55PT/HglNFqQ6eW9E3PfjvPqhZfqJj+8dd9zrqrJYcouUfCgQw0OIse85Dz9V9Q==", + "version": "1.3.699", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.699.tgz", + "integrity": "sha512-fjt43CPXdPYwD9ybmKbNeLwZBmCVdLY2J5fGZub7/eMPuiqQznOGNXv/wurnpXIlE7ScHnvG9Zi+H4/i6uMKmw==", "dev": true }, "semver": { @@ -21364,6 +21364,19 @@ "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", "dev": true }, + "scratch-l10n": { + "version": "3.11.20210324031512", + "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-3.11.20210324031512.tgz", + "integrity": "sha512-dyv2cjNWVHrL78XpW64uF2azYaUhMKLjfJVH6vSCPJxm3EKCvO6EoaUSlIAwhsGoMwgfxWZ8D74+IaifGJfnCQ==", + "dev": true, + "requires": { + "@babel/cli": "^7.1.2", + "@babel/core": "^7.1.2", + "babel-plugin-react-intl": "^3.0.1", + "react-intl": "^2.8.0", + "transifex": "1.6.6" + } + }, "scratch-storage": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-1.3.3.tgz", @@ -21431,9 +21444,9 @@ } }, "scratch-l10n": { - "version": "3.11.20210324031512", - "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-3.11.20210324031512.tgz", - "integrity": "sha512-dyv2cjNWVHrL78XpW64uF2azYaUhMKLjfJVH6vSCPJxm3EKCvO6EoaUSlIAwhsGoMwgfxWZ8D74+IaifGJfnCQ==", + "version": "3.11.20210325031604", + "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-3.11.20210325031604.tgz", + "integrity": "sha512-PrDJEORFdjXeTOldV/uLkEuJRpfHgnKGB7aZKsRGi4dLrte7jFRubut5nyacl3wMIV6l/+ewRxG/pjo2+XU6Vg==", "dev": true, "requires": { "@babel/cli": "^7.1.2", From a400128024b02325babb4d3f936b4403d5030e66 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 25 Mar 2021 10:51:06 +0000 Subject: [PATCH 27/59] Bump scratch-gui Bumps [scratch-gui](https://github.com/LLK/scratch-gui) from 0.1.0-prerelease.20210324120840 to 0.1.0-prerelease.20210325034601. - [Release notes](https://github.com/LLK/scratch-gui/releases) - [Commits](https://github.com/LLK/scratch-gui/compare/0.1.0-prerelease.20210324120840...0.1.0-prerelease.20210325034601) Signed-off-by: dependabot-preview[bot] --- package-lock.json | 27 +++++++-------------------- package.json | 2 +- 2 files changed, 8 insertions(+), 21 deletions(-) diff --git a/package-lock.json b/package-lock.json index cf959e0ed..a55fa6f82 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20919,9 +20919,9 @@ } }, "scratch-gui": { - "version": "0.1.0-prerelease.20210324120840", - "resolved": "https://registry.npmjs.org/scratch-gui/-/scratch-gui-0.1.0-prerelease.20210324120840.tgz", - "integrity": "sha512-6KLZfZdJLAMLBDJo/LC6f0ckUg0CefE941NvBiNmV2XOIAoMPe5gq/eX3C1JT6BDLAFw4ogw4+K1KmQX/PYibw==", + "version": "0.1.0-prerelease.20210325034601", + "resolved": "https://registry.npmjs.org/scratch-gui/-/scratch-gui-0.1.0-prerelease.20210325034601.tgz", + "integrity": "sha512-DZgQkjscNHCqzwhA5CQEbIXtlmMZmxLi+Zd6g9i0XZUfNzksnS2JU5fivc+niDwFbKZWQVln3hHP/9RemgyCcA==", "dev": true, "requires": { "arraybuffer-loader": "^1.0.6", @@ -20973,7 +20973,7 @@ "redux-throttle": "0.1.1", "scratch-audio": "0.1.0-prerelease.20200528195344", "scratch-blocks": "0.1.0-prerelease.20210324033606", - "scratch-l10n": "3.11.20210324031512", + "scratch-l10n": "3.11.20210325031604", "scratch-paint": "0.2.0-prerelease.20210319222931", "scratch-render": "0.1.0-prerelease.20210317200605", "scratch-render-fonts": "1.0.0-prerelease.20200507182347", @@ -21142,9 +21142,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.3.698", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.698.tgz", - "integrity": "sha512-VEXDzYblnlT+g8Q3gedwzgKOso1evkeJzV8lih7lV8mL8eAnGVnKyC3KsFT6S+R5PQO4ffdr1PI16/ElibY/kQ==", + "version": "1.3.699", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.699.tgz", + "integrity": "sha512-fjt43CPXdPYwD9ybmKbNeLwZBmCVdLY2J5fGZub7/eMPuiqQznOGNXv/wurnpXIlE7ScHnvG9Zi+H4/i6uMKmw==", "dev": true }, "has-flag": { @@ -21364,19 +21364,6 @@ "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", "dev": true }, - "scratch-l10n": { - "version": "3.11.20210324031512", - "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-3.11.20210324031512.tgz", - "integrity": "sha512-dyv2cjNWVHrL78XpW64uF2azYaUhMKLjfJVH6vSCPJxm3EKCvO6EoaUSlIAwhsGoMwgfxWZ8D74+IaifGJfnCQ==", - "dev": true, - "requires": { - "@babel/cli": "^7.1.2", - "@babel/core": "^7.1.2", - "babel-plugin-react-intl": "^3.0.1", - "react-intl": "^2.8.0", - "transifex": "1.6.6" - } - }, "scratch-storage": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-1.3.3.tgz", diff --git a/package.json b/package.json index 26842b593..0b9205378 100644 --- a/package.json +++ b/package.json @@ -125,7 +125,7 @@ "redux-mock-store": "^1.2.3", "redux-thunk": "2.0.1", "sass-loader": "6.0.6", - "scratch-gui": "0.1.0-prerelease.20210324120840", + "scratch-gui": "0.1.0-prerelease.20210325034601", "scratch-l10n": "latest", "selenium-webdriver": "3.6.0", "slick-carousel": "1.6.0", From 703691d9048ee0890455765cceff3cea87488e4e Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 26 Mar 2021 03:25:17 +0000 Subject: [PATCH 28/59] Bump scratch-l10n from 3.11.20210325031604 to 3.11.20210326031542 Bumps [scratch-l10n](https://github.com/LLK/scratch-l10n) from 3.11.20210325031604 to 3.11.20210326031542. - [Release notes](https://github.com/LLK/scratch-l10n/releases) - [Commits](https://github.com/LLK/scratch-l10n/compare/3.11.20210325031604...3.11.20210326031542) Signed-off-by: dependabot-preview[bot] --- package-lock.json | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index a55fa6f82..90cc2bf95 100644 --- a/package-lock.json +++ b/package-lock.json @@ -519,9 +519,9 @@ } }, "electron-to-chromium": { - "version": "1.3.699", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.699.tgz", - "integrity": "sha512-fjt43CPXdPYwD9ybmKbNeLwZBmCVdLY2J5fGZub7/eMPuiqQznOGNXv/wurnpXIlE7ScHnvG9Zi+H4/i6uMKmw==", + "version": "1.3.700", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.700.tgz", + "integrity": "sha512-wQtaxVZzpOeCjW1CGuC5W3bYjE2jglvk076LcTautBOB9UtHztty7wNzjVsndiMcSsdUsdMy5w76w5J1U7OPTQ==", "dev": true }, "semver": { @@ -21364,6 +21364,19 @@ "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", "dev": true }, + "scratch-l10n": { + "version": "3.11.20210325031604", + "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-3.11.20210325031604.tgz", + "integrity": "sha512-PrDJEORFdjXeTOldV/uLkEuJRpfHgnKGB7aZKsRGi4dLrte7jFRubut5nyacl3wMIV6l/+ewRxG/pjo2+XU6Vg==", + "dev": true, + "requires": { + "@babel/cli": "^7.1.2", + "@babel/core": "^7.1.2", + "babel-plugin-react-intl": "^3.0.1", + "react-intl": "^2.8.0", + "transifex": "1.6.6" + } + }, "scratch-storage": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-1.3.3.tgz", @@ -21431,9 +21444,9 @@ } }, "scratch-l10n": { - "version": "3.11.20210325031604", - "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-3.11.20210325031604.tgz", - "integrity": "sha512-PrDJEORFdjXeTOldV/uLkEuJRpfHgnKGB7aZKsRGi4dLrte7jFRubut5nyacl3wMIV6l/+ewRxG/pjo2+XU6Vg==", + "version": "3.11.20210326031542", + "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-3.11.20210326031542.tgz", + "integrity": "sha512-CEN4Sio5ecgkKhTG1lhLWtBnWlVF8RHfj0u3DOpqQ/gAND0KkfEJMyYLj3vheKL7yJ0qn+XP9ZmS5kNUYa7kRw==", "dev": true, "requires": { "@babel/cli": "^7.1.2", From a7546342b2b6dca957fb01b88b1ec4b1bec5d978 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 26 Mar 2021 04:21:54 +0000 Subject: [PATCH 29/59] Bump @formatjs/intl-locale from 2.4.20 to 2.4.21 Bumps [@formatjs/intl-locale](https://github.com/formatjs/formatjs) from 2.4.20 to 2.4.21. - [Release notes](https://github.com/formatjs/formatjs/releases) - [Commits](https://github.com/formatjs/formatjs/compare/@formatjs/intl-locale@2.4.20...@formatjs/intl-locale@2.4.21) Signed-off-by: dependabot-preview[bot] --- package-lock.json | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 90cc2bf95..d5e6a54a7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1454,9 +1454,9 @@ } }, "@formatjs/intl-getcanonicallocales": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/@formatjs/intl-getcanonicallocales/-/intl-getcanonicallocales-1.5.7.tgz", - "integrity": "sha512-raPV3Dw7CBC9kPvKdgxkVGgwzYBsQDDG9qXGWblpj/zR+ZJ6Q2V+Co5jZhrviy6lq3qaM2T1Itc0ibvvil1tBw==", + "version": "1.5.8", + "resolved": "https://registry.npmjs.org/@formatjs/intl-getcanonicallocales/-/intl-getcanonicallocales-1.5.8.tgz", + "integrity": "sha512-6GEIfCsZ+wd/K8bixP5h0Ep5aOjMgHlM51TeznlcNoiOHPP4gOrkxggh2Y2G5lnk71Ocyi93/+d0oKJI3J0jzw==", "dev": true, "requires": { "cldr-core": "38", @@ -1472,17 +1472,26 @@ } }, "@formatjs/intl-locale": { - "version": "2.4.20", - "resolved": "https://registry.npmjs.org/@formatjs/intl-locale/-/intl-locale-2.4.20.tgz", - "integrity": "sha512-ZrVFxKab+W6jFP6WEYsNW0b7IlGYnCS20fdLN6u0LwPCPYRP5oqHBl0FFVD2+aNnQ1T/21Aol54fCr5LdN/49Q==", + "version": "2.4.21", + "resolved": "https://registry.npmjs.org/@formatjs/intl-locale/-/intl-locale-2.4.21.tgz", + "integrity": "sha512-AH7d6XaLq1pXZ/AQ4dRNveKmA0juCCN3hFdpBvVA3XT4EMXIVkERh8PSa7xKgZThgXJwSLCZgKAeaARDzmhFRA==", "dev": true, "requires": { - "@formatjs/ecma402-abstract": "1.6.3", - "@formatjs/intl-getcanonicallocales": "1.5.7", + "@formatjs/ecma402-abstract": "1.6.4", + "@formatjs/intl-getcanonicallocales": "1.5.8", "cldr-core": "38", "tslib": "^2.1.0" }, "dependencies": { + "@formatjs/ecma402-abstract": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.6.4.tgz", + "integrity": "sha512-ukFjGD9dLsxcD9D5AEshJqQElPQeUAlTALT/lzIV6OcYojyuU81gw/uXDUOrs6XW79jtOJwQDkLqHbCJBJMOTw==", + "dev": true, + "requires": { + "tslib": "^2.1.0" + } + }, "tslib": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", From d2494ce8cf6d0292a02c1905cb79b436be632e76 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 26 Mar 2021 04:22:05 +0000 Subject: [PATCH 30/59] Bump @formatjs/intl-relativetimeformat from 8.1.3 to 8.1.4 Bumps [@formatjs/intl-relativetimeformat](https://github.com/formatjs/formatjs) from 8.1.3 to 8.1.4. - [Release notes](https://github.com/formatjs/formatjs/releases) - [Commits](https://github.com/formatjs/formatjs/compare/@formatjs/intl-relativetimeformat@8.1.3...@formatjs/intl-relativetimeformat@8.1.4) Signed-off-by: dependabot-preview[bot] --- package-lock.json | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 90cc2bf95..ca9378575 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1510,15 +1510,24 @@ } }, "@formatjs/intl-relativetimeformat": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/@formatjs/intl-relativetimeformat/-/intl-relativetimeformat-8.1.3.tgz", - "integrity": "sha512-uUbtr4NRKgHK66bxO98RQlXypfRA5cto6nsFpgwe5wf1SWLBqxcNoo+zdAIftdvHnxPC4QH6oykMf2aYLm+pbA==", + "version": "8.1.4", + "resolved": "https://registry.npmjs.org/@formatjs/intl-relativetimeformat/-/intl-relativetimeformat-8.1.4.tgz", + "integrity": "sha512-uDDXOWtxen+SOsTXxu/jggQFEqY63a+26N+ggosHAdkKlYc2C1j6zuP6Uarxe65HQcTteXB/tTamAmQo+0t8jA==", "dev": true, "requires": { - "@formatjs/ecma402-abstract": "1.6.3", + "@formatjs/ecma402-abstract": "1.6.4", "tslib": "^2.1.0" }, "dependencies": { + "@formatjs/ecma402-abstract": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.6.4.tgz", + "integrity": "sha512-ukFjGD9dLsxcD9D5AEshJqQElPQeUAlTALT/lzIV6OcYojyuU81gw/uXDUOrs6XW79jtOJwQDkLqHbCJBJMOTw==", + "dev": true, + "requires": { + "tslib": "^2.1.0" + } + }, "tslib": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", From 62f4fa87292d2874ea7a36fe7eb26ff15dfb8c53 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 26 Mar 2021 04:22:12 +0000 Subject: [PATCH 31/59] Bump @formatjs/intl-pluralrules from 4.0.12 to 4.0.13 Bumps [@formatjs/intl-pluralrules](https://github.com/formatjs/formatjs) from 4.0.12 to 4.0.13. - [Release notes](https://github.com/formatjs/formatjs/releases) - [Commits](https://github.com/formatjs/formatjs/compare/@formatjs/intl-pluralrules@4.0.12...@formatjs/intl-pluralrules@4.0.13) Signed-off-by: dependabot-preview[bot] --- package-lock.json | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 90cc2bf95..d2d9ecd03 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1492,15 +1492,24 @@ } }, "@formatjs/intl-pluralrules": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/@formatjs/intl-pluralrules/-/intl-pluralrules-4.0.12.tgz", - "integrity": "sha512-jXXsWGQbBMvuhvxuG1AXBMMNMS1ZphSt/rWsGo6bE3KyWmddJnnVokeUD8E2sTtXoCJZoGUQkOxxjFa/gGLyxw==", + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/@formatjs/intl-pluralrules/-/intl-pluralrules-4.0.13.tgz", + "integrity": "sha512-ePoC1zmSzvyxXnrhPkysAQMIWr1JO5Hbz8yRv9ARgz6rD68k+wfD743AiHY/yjlahnXaqHDTd7e07xwrbzAsgQ==", "dev": true, "requires": { - "@formatjs/ecma402-abstract": "1.6.3", + "@formatjs/ecma402-abstract": "1.6.4", "tslib": "^2.1.0" }, "dependencies": { + "@formatjs/ecma402-abstract": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.6.4.tgz", + "integrity": "sha512-ukFjGD9dLsxcD9D5AEshJqQElPQeUAlTALT/lzIV6OcYojyuU81gw/uXDUOrs6XW79jtOJwQDkLqHbCJBJMOTw==", + "dev": true, + "requires": { + "tslib": "^2.1.0" + } + }, "tslib": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", From f1e8edbd518d63a947e388e3747c7a569189d772 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sat, 27 Mar 2021 03:21:25 +0000 Subject: [PATCH 32/59] Bump scratch-l10n from 3.11.20210326031542 to 3.11.20210327031512 Bumps [scratch-l10n](https://github.com/LLK/scratch-l10n) from 3.11.20210326031542 to 3.11.20210327031512. - [Release notes](https://github.com/LLK/scratch-l10n/releases) - [Commits](https://github.com/LLK/scratch-l10n/compare/3.11.20210326031542...3.11.20210327031512) Signed-off-by: dependabot-preview[bot] --- package-lock.json | 23 +++-------------------- 1 file changed, 3 insertions(+), 20 deletions(-) diff --git a/package-lock.json b/package-lock.json index d7605b379..a676515c3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1436,23 +1436,6 @@ } } }, - "@formatjs/ecma402-abstract": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.6.3.tgz", - "integrity": "sha512-7ijswObmYXabVy5GvcpKG29jbyJ9rGtFdRBdmdQvoDmMo0PwlOl/L08GtrjA4YWLAZ0j2owb2YrRLGNAvLBk+Q==", - "dev": true, - "requires": { - "tslib": "^2.1.0" - }, - "dependencies": { - "tslib": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", - "dev": true - } - } - }, "@formatjs/intl-getcanonicallocales": { "version": "1.5.8", "resolved": "https://registry.npmjs.org/@formatjs/intl-getcanonicallocales/-/intl-getcanonicallocales-1.5.8.tgz", @@ -21471,9 +21454,9 @@ } }, "scratch-l10n": { - "version": "3.11.20210326031542", - "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-3.11.20210326031542.tgz", - "integrity": "sha512-CEN4Sio5ecgkKhTG1lhLWtBnWlVF8RHfj0u3DOpqQ/gAND0KkfEJMyYLj3vheKL7yJ0qn+XP9ZmS5kNUYa7kRw==", + "version": "3.11.20210327031512", + "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-3.11.20210327031512.tgz", + "integrity": "sha512-+fskucB42bExv5owK7oPY+SJNOwy6cKm/2b1FdKrXoKF80gw5W+Ww4MRSg8z9qXk6wLKFAZhPhjDLvFxSD5ccA==", "dev": true, "requires": { "@babel/cli": "^7.1.2", From ed6baed56a1678a21bfc7c80328d20cccc81be7a Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sun, 28 Mar 2021 03:21:10 +0000 Subject: [PATCH 33/59] Bump scratch-l10n from 3.11.20210327031512 to 3.11.20210328031444 Bumps [scratch-l10n](https://github.com/LLK/scratch-l10n) from 3.11.20210327031512 to 3.11.20210328031444. - [Release notes](https://github.com/LLK/scratch-l10n/releases) - [Commits](https://github.com/LLK/scratch-l10n/compare/3.11.20210327031512...3.11.20210328031444) Signed-off-by: dependabot-preview[bot] --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index a676515c3..8e4f64d5b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21454,9 +21454,9 @@ } }, "scratch-l10n": { - "version": "3.11.20210327031512", - "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-3.11.20210327031512.tgz", - "integrity": "sha512-+fskucB42bExv5owK7oPY+SJNOwy6cKm/2b1FdKrXoKF80gw5W+Ww4MRSg8z9qXk6wLKFAZhPhjDLvFxSD5ccA==", + "version": "3.11.20210328031444", + "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-3.11.20210328031444.tgz", + "integrity": "sha512-Oa0vYd6dIUyTMCC0sp5eJ3kosMW5nYB5Y5v4H1u3TQL0iCej7jKX5Wk8+4IgD5yXQTiJk9NuIt7TaU6d0EF99A==", "dev": true, "requires": { "@babel/cli": "^7.1.2", From f3e0d84037e0789fdd6f4f0c32ea096eb1afdc1d Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 29 Mar 2021 03:59:41 +0000 Subject: [PATCH 34/59] Bump scratch-l10n from 3.11.20210328031444 to 3.11.20210329031438 Bumps [scratch-l10n](https://github.com/LLK/scratch-l10n) from 3.11.20210328031444 to 3.11.20210329031438. - [Release notes](https://github.com/LLK/scratch-l10n/releases) - [Commits](https://github.com/LLK/scratch-l10n/compare/3.11.20210328031444...3.11.20210329031438) Signed-off-by: dependabot-preview[bot] --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8e4f64d5b..db4301784 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21454,9 +21454,9 @@ } }, "scratch-l10n": { - "version": "3.11.20210328031444", - "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-3.11.20210328031444.tgz", - "integrity": "sha512-Oa0vYd6dIUyTMCC0sp5eJ3kosMW5nYB5Y5v4H1u3TQL0iCej7jKX5Wk8+4IgD5yXQTiJk9NuIt7TaU6d0EF99A==", + "version": "3.11.20210329031438", + "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-3.11.20210329031438.tgz", + "integrity": "sha512-/XnUW5Q7xaxvlNTBChrqyQjSM0jpk3SQfdlbM/76qO8D7vWOTCAyaCbQ05v/Wnm9V8QqWqlp3+e1yNWa4k4c+Q==", "dev": true, "requires": { "@babel/cli": "^7.1.2", From bbd9e2fa3d4faa1867f963afe487fa9a42a2d544 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 29 Mar 2021 13:15:27 +0000 Subject: [PATCH 35/59] Bump scratch-gui Bumps [scratch-gui](https://github.com/LLK/scratch-gui) from 0.1.0-prerelease.20210325034601 to 0.1.0-prerelease.20210329042543. - [Release notes](https://github.com/LLK/scratch-gui/releases) - [Commits](https://github.com/LLK/scratch-gui/compare/0.1.0-prerelease.20210325034601...0.1.0-prerelease.20210329042543) Signed-off-by: dependabot-preview[bot] --- package-lock.json | 51 ++++++++++++++++++----------------------------- package.json | 2 +- 2 files changed, 20 insertions(+), 33 deletions(-) diff --git a/package-lock.json b/package-lock.json index db4301784..bdcc334cd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20919,9 +20919,9 @@ } }, "scratch-blocks": { - "version": "0.1.0-prerelease.20210324033606", - "resolved": "https://registry.npmjs.org/scratch-blocks/-/scratch-blocks-0.1.0-prerelease.20210324033606.tgz", - "integrity": "sha512-zCf7mN64RLME1tA9t2HcDEnf5h5+ziMyksbQj3gsWOUylYLrrYksMBw7wprVEMdPBJwz+4HhpcpkkrCQV1NVnw==", + "version": "0.1.0-prerelease.20210329040105", + "resolved": "https://registry.npmjs.org/scratch-blocks/-/scratch-blocks-0.1.0-prerelease.20210329040105.tgz", + "integrity": "sha512-5cUw6z0y3s/j7W8p/7oiGBjRun8FGTW04gMkiJmQx7AbRLLEJEsYnJg+sVwbnhr/qXnGst3gKEGKpZ90YOA4Dg==", "dev": true, "requires": { "exports-loader": "0.6.3", @@ -20929,9 +20929,9 @@ } }, "scratch-gui": { - "version": "0.1.0-prerelease.20210325034601", - "resolved": "https://registry.npmjs.org/scratch-gui/-/scratch-gui-0.1.0-prerelease.20210325034601.tgz", - "integrity": "sha512-DZgQkjscNHCqzwhA5CQEbIXtlmMZmxLi+Zd6g9i0XZUfNzksnS2JU5fivc+niDwFbKZWQVln3hHP/9RemgyCcA==", + "version": "0.1.0-prerelease.20210329042543", + "resolved": "https://registry.npmjs.org/scratch-gui/-/scratch-gui-0.1.0-prerelease.20210329042543.tgz", + "integrity": "sha512-cZlDhPRkQC9L47AW1ASiXZxQ64zXhgGZ/0TG4kR+0wjh/FFV0Lh7qMyC4XNetY7Dk20ZJyqd52JHdnfCO4iIOw==", "dev": true, "requires": { "arraybuffer-loader": "^1.0.6", @@ -20982,10 +20982,10 @@ "redux": "3.7.2", "redux-throttle": "0.1.1", "scratch-audio": "0.1.0-prerelease.20200528195344", - "scratch-blocks": "0.1.0-prerelease.20210324033606", - "scratch-l10n": "3.11.20210325031604", + "scratch-blocks": "0.1.0-prerelease.20210329040105", + "scratch-l10n": "3.11.20210329031438", "scratch-paint": "0.2.0-prerelease.20210319222931", - "scratch-render": "0.1.0-prerelease.20210317200605", + "scratch-render": "0.1.0-prerelease.20210325231800", "scratch-render-fonts": "1.0.0-prerelease.20200507182347", "scratch-storage": "1.3.3", "scratch-svg-renderer": "0.2.0-prerelease.20210317184701", @@ -21152,9 +21152,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.3.699", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.699.tgz", - "integrity": "sha512-fjt43CPXdPYwD9ybmKbNeLwZBmCVdLY2J5fGZub7/eMPuiqQznOGNXv/wurnpXIlE7ScHnvG9Zi+H4/i6uMKmw==", + "version": "1.3.701", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.701.tgz", + "integrity": "sha512-Zd9ofdIMYHYhG1gvnejQDvC/kqSeXQvtXF0yRURGxgwGqDZm9F9Fm3dYFnm5gyuA7xpXfBlzVLN1sz0FjxpKfw==", "dev": true }, "has-flag": { @@ -21374,19 +21374,6 @@ "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", "dev": true }, - "scratch-l10n": { - "version": "3.11.20210325031604", - "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-3.11.20210325031604.tgz", - "integrity": "sha512-PrDJEORFdjXeTOldV/uLkEuJRpfHgnKGB7aZKsRGi4dLrte7jFRubut5nyacl3wMIV6l/+ewRxG/pjo2+XU6Vg==", - "dev": true, - "requires": { - "@babel/cli": "^7.1.2", - "@babel/core": "^7.1.2", - "babel-plugin-react-intl": "^3.0.1", - "react-intl": "^2.8.0", - "transifex": "1.6.6" - } - }, "scratch-storage": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-1.3.3.tgz", @@ -21480,7 +21467,7 @@ "minilog": "3.1.0", "parse-color": "1.0.0", "prop-types": "^15.5.10", - "scratch-render-fonts": "^1.0.0-prerelease.20200507182347" + "scratch-render-fonts": "^1.0.0-prerelease.20210325224822" }, "dependencies": { "lodash.omit": { @@ -21505,9 +21492,9 @@ } }, "scratch-render-fonts": { - "version": "1.0.0-prerelease.20200507182347", - "resolved": "https://registry.npmjs.org/scratch-render-fonts/-/scratch-render-fonts-1.0.0-prerelease.20200507182347.tgz", - "integrity": "sha512-tVt2s7lxsBhme9WKIZTnluMerdJVGEc80QSrDdIIzUvHXGCIYkLh6j7ytwXcyq2UsA34d93op9+I9Bh1SPkQkA==", + "version": "1.0.0-prerelease.20210325224822", + "resolved": "https://registry.npmjs.org/scratch-render-fonts/-/scratch-render-fonts-1.0.0-prerelease.20210325224822.tgz", + "integrity": "sha512-N68YRKGEbFvMAhfNFEluDuWFXUCbO9ezRahqJKwCFpEQuhgQ9tmA+y+GZ5ETQwI/e9M1tHAfX/8DxK5yBdQT1A==", "dev": true, "requires": { "base64-loader": "1.0.0" @@ -21538,9 +21525,9 @@ } }, "scratch-render": { - "version": "0.1.0-prerelease.20210317200605", - "resolved": "https://registry.npmjs.org/scratch-render/-/scratch-render-0.1.0-prerelease.20210317200605.tgz", - "integrity": "sha512-HbWHTOX9X/jlZw0HINKfHkZ8H7GHiyqR8Cj3jKowHrH2r8bTn7K8DfT3Ql81fepMxVqqeKFPPnpvHwvDEaYWKg==", + "version": "0.1.0-prerelease.20210325231800", + "resolved": "https://registry.npmjs.org/scratch-render/-/scratch-render-0.1.0-prerelease.20210325231800.tgz", + "integrity": "sha512-hjiIHRR8SuP/8UKKZ4O+TIJaCZ2wSN6uoEM49jwNjZecAaflBvd5t/OLL3NFQp3q7Ra6ncDi+B7URy7WRdm2fg==", "dev": true, "requires": { "grapheme-breaker": "0.3.2", diff --git a/package.json b/package.json index 0b9205378..51fd674f0 100644 --- a/package.json +++ b/package.json @@ -125,7 +125,7 @@ "redux-mock-store": "^1.2.3", "redux-thunk": "2.0.1", "sass-loader": "6.0.6", - "scratch-gui": "0.1.0-prerelease.20210325034601", + "scratch-gui": "0.1.0-prerelease.20210329042543", "scratch-l10n": "latest", "selenium-webdriver": "3.6.0", "slick-carousel": "1.6.0", From adec52eaef4aa92adf627c826e3697d75245cd3a Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 29 Mar 2021 16:26:25 +0000 Subject: [PATCH 36/59] [Security] Bump y18n from 3.2.1 to 3.2.2 Bumps [y18n](https://github.com/yargs/y18n) from 3.2.1 to 3.2.2. **This update includes a security fix.** - [Release notes](https://github.com/yargs/y18n/releases) - [Changelog](https://github.com/yargs/y18n/blob/master/CHANGELOG.md) - [Commits](https://github.com/yargs/y18n/commits) Signed-off-by: dependabot-preview[bot] --- package-lock.json | 48 +++++++++++++++-------------------------------- 1 file changed, 15 insertions(+), 33 deletions(-) diff --git a/package-lock.json b/package-lock.json index bdcc334cd..b41313ee9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4710,12 +4710,6 @@ "requires": { "glob": "^7.1.3" } - }, - "y18n": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", - "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", - "dev": true } } }, @@ -12675,6 +12669,12 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, + "y18n": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", + "dev": true + }, "yargs": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.1.0.tgz", @@ -13421,6 +13421,12 @@ "signal-exit": "^3.0.2" } }, + "y18n": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", + "dev": true + }, "yargs": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.1.0.tgz", @@ -16257,12 +16263,6 @@ "strip-ansi": "^5.0.0" } }, - "y18n": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", - "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", - "dev": true - }, "yargs": { "version": "13.3.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", @@ -20807,12 +20807,6 @@ "strip-ansi": "^5.0.0" } }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true - }, "yargs": { "version": "13.3.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", @@ -25233,12 +25227,6 @@ "xtend": "~4.0.1" } }, - "y18n": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", - "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", - "dev": true - }, "yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", @@ -27795,12 +27783,6 @@ "strip-ansi": "^5.0.0" } }, - "y18n": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", - "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", - "dev": true - }, "yargs": { "version": "13.3.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", @@ -28169,9 +28151,9 @@ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" }, "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", + "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", "dev": true }, "yallist": { From 5359e6f5cdf1f07eb8ccd5cb77c41012eba984cc Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 30 Mar 2021 03:44:01 +0000 Subject: [PATCH 37/59] Bump scratch-l10n from 3.11.20210329031438 to 3.11.20210330031505 Bumps [scratch-l10n](https://github.com/LLK/scratch-l10n) from 3.11.20210329031438 to 3.11.20210330031505. - [Release notes](https://github.com/LLK/scratch-l10n/releases) - [Commits](https://github.com/LLK/scratch-l10n/compare/3.11.20210329031438...3.11.20210330031505) Signed-off-by: dependabot-preview[bot] --- package-lock.json | 198 ++++++++++++++++++++++++---------------------- 1 file changed, 103 insertions(+), 95 deletions(-) diff --git a/package-lock.json b/package-lock.json index b41313ee9..f19be5dda 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,9 +16,9 @@ } }, "@babel/cli": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.13.10.tgz", - "integrity": "sha512-lYSBC7B4B9hJ7sv0Ojx1BrGhuzCoOIYfLjd+Xpd4rOzdS+a47yi8voV8vFkfjlZR1N5qZO7ixOCbobUdT304PQ==", + "version": "7.13.14", + "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.13.14.tgz", + "integrity": "sha512-zmEFV8WBRsW+mPQumO1/4b34QNALBVReaiHJOkxhUsdo/AvYM62c+SKSuLi2aZ42t3ocK6OI0uwUXRvrIbREZw==", "dev": true, "requires": { "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents", @@ -232,25 +232,24 @@ "dev": true }, "@babel/core": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.13.10.tgz", - "integrity": "sha512-bfIYcT0BdKeAZrovpMqX2Mx5NrgAckGbwT982AkdS5GNfn3KMGiprlBAtmBcFZRUmpaufS6WZFP8trvx8ptFDw==", + "version": "7.13.14", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.13.14.tgz", + "integrity": "sha512-wZso/vyF4ki0l0znlgM4inxbdrUvCb+cVz8grxDq+6C9k6qbqoIJteQOKicaKjCipU3ISV+XedCqpL2RJJVehA==", "dev": true, "requires": { "@babel/code-frame": "^7.12.13", "@babel/generator": "^7.13.9", - "@babel/helper-compilation-targets": "^7.13.10", - "@babel/helper-module-transforms": "^7.13.0", + "@babel/helper-compilation-targets": "^7.13.13", + "@babel/helper-module-transforms": "^7.13.14", "@babel/helpers": "^7.13.10", - "@babel/parser": "^7.13.10", + "@babel/parser": "^7.13.13", "@babel/template": "^7.12.13", - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.0", + "@babel/traverse": "^7.13.13", + "@babel/types": "^7.13.14", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.1.2", - "lodash": "^4.17.19", "semver": "^6.3.0", "source-map": "^0.5.0" }, @@ -316,9 +315,9 @@ } }, "@babel/parser": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.12.tgz", - "integrity": "sha512-4T7Pb244rxH24yR116LAuJ+adxXXnHhZaLJjegJVKSdoNCe4x1eDBaud5YIcQFcqzsaD5BHvJw5BQ0AZapdCRw==", + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.13.tgz", + "integrity": "sha512-OhsyMrqygfk5v8HmWwOzlYjJrtLaFhF34MrfG/Z73DgYCI6ojNUTUp2TYbtnjo8PegeJp12eamsNettCQjKjVw==", "dev": true }, "@babel/template": { @@ -333,26 +332,25 @@ } }, "@babel/traverse": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.0.tgz", - "integrity": "sha512-xys5xi5JEhzC3RzEmSGrs/b3pJW/o87SypZ+G/PhaE7uqVQNv/jlmVIBXuoh5atqQ434LfXV+sf23Oxj0bchJQ==", + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.13.tgz", + "integrity": "sha512-CblEcwmXKR6eP43oQGG++0QMTtCjAsa3frUuzHoiIJWpaIIi8dwMyEFUJoXRLxagGqCK+jALRwIO+o3R9p/uUg==", "dev": true, "requires": { "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.13.0", + "@babel/generator": "^7.13.9", "@babel/helper-function-name": "^7.12.13", "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/parser": "^7.13.0", - "@babel/types": "^7.13.0", + "@babel/parser": "^7.13.13", + "@babel/types": "^7.13.13", "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" + "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.12.tgz", - "integrity": "sha512-K4nY2xFN4QMvQwkQ+zmBDp6ANMbVNw6BbxWmYA4qNjhR9W+Lj/8ky5MEY2Me5r+B2c6/v6F53oMndG+f9s3IiA==", + "version": "7.13.14", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.14.tgz", + "integrity": "sha512-A2aa3QTkWoyqsZZFl56MLUsfmh7O0gN41IPvXAE/++8ojpbz12SszD7JEGYVdn4f9Kt4amIei07swF1h4AqmmQ==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.12.11", @@ -494,12 +492,12 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.10.tgz", - "integrity": "sha512-/Xju7Qg1GQO4mHZ/Kcs6Au7gfafgZnwm+a7sy/ow/tV1sHeraRUHbjdat8/UvDor4Tez+siGKDk6zIKtCPKVJA==", + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.13.tgz", + "integrity": "sha512-q1kcdHNZehBwD9jYPh3WyXcsFERi39X4I59I3NadciWtNDyZ6x+GboOxncFK0kXlKIv6BJm5acncehXWUjWQMQ==", "dev": true, "requires": { - "@babel/compat-data": "^7.13.8", + "@babel/compat-data": "^7.13.12", "@babel/helper-validator-option": "^7.12.17", "browserslist": "^4.14.5", "semver": "^6.3.0" @@ -519,9 +517,9 @@ } }, "electron-to-chromium": { - "version": "1.3.700", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.700.tgz", - "integrity": "sha512-wQtaxVZzpOeCjW1CGuC5W3bYjE2jglvk076LcTautBOB9UtHztty7wNzjVsndiMcSsdUsdMy5w76w5J1U7OPTQ==", + "version": "1.3.702", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.702.tgz", + "integrity": "sha512-qJVUKFWQnF6wP7MmTngDkmm8/KPzaiTXNFOAg5j7DSa6J7kPou7mTBqC8jpUOxauQWwHR3pn4dMRdV8IE1xdtA==", "dev": true }, "semver": { @@ -562,9 +560,9 @@ }, "dependencies": { "@babel/types": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.12.tgz", - "integrity": "sha512-K4nY2xFN4QMvQwkQ+zmBDp6ANMbVNw6BbxWmYA4qNjhR9W+Lj/8ky5MEY2Me5r+B2c6/v6F53oMndG+f9s3IiA==", + "version": "7.13.14", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.14.tgz", + "integrity": "sha512-A2aa3QTkWoyqsZZFl56MLUsfmh7O0gN41IPvXAE/++8ojpbz12SszD7JEGYVdn4f9Kt4amIei07swF1h4AqmmQ==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.12.11", @@ -596,9 +594,9 @@ }, "dependencies": { "@babel/types": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.12.tgz", - "integrity": "sha512-K4nY2xFN4QMvQwkQ+zmBDp6ANMbVNw6BbxWmYA4qNjhR9W+Lj/8ky5MEY2Me5r+B2c6/v6F53oMndG+f9s3IiA==", + "version": "7.13.14", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.14.tgz", + "integrity": "sha512-A2aa3QTkWoyqsZZFl56MLUsfmh7O0gN41IPvXAE/++8ojpbz12SszD7JEGYVdn4f9Kt4amIei07swF1h4AqmmQ==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.12.11", @@ -621,9 +619,9 @@ } }, "@babel/helper-module-transforms": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.13.12.tgz", - "integrity": "sha512-7zVQqMO3V+K4JOOj40kxiCrMf6xlQAkewBB0eu2b03OO/Q21ZutOzjpfD79A5gtE/2OWi1nv625MrDlGlkbknQ==", + "version": "7.13.14", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.13.14.tgz", + "integrity": "sha512-QuU/OJ0iAOSIatyVZmfqB0lbkVP0kDRiKj34xy+QNsnVZi/PA6BoSoreeqnxxa9EHFAIL0R9XOaAR/G9WlIy5g==", "dev": true, "requires": { "@babel/helper-module-imports": "^7.13.12", @@ -632,8 +630,8 @@ "@babel/helper-split-export-declaration": "^7.12.13", "@babel/helper-validator-identifier": "^7.12.11", "@babel/template": "^7.12.13", - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.12" + "@babel/traverse": "^7.13.13", + "@babel/types": "^7.13.14" }, "dependencies": { "@babel/code-frame": { @@ -697,9 +695,9 @@ } }, "@babel/parser": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.12.tgz", - "integrity": "sha512-4T7Pb244rxH24yR116LAuJ+adxXXnHhZaLJjegJVKSdoNCe4x1eDBaud5YIcQFcqzsaD5BHvJw5BQ0AZapdCRw==", + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.13.tgz", + "integrity": "sha512-OhsyMrqygfk5v8HmWwOzlYjJrtLaFhF34MrfG/Z73DgYCI6ojNUTUp2TYbtnjo8PegeJp12eamsNettCQjKjVw==", "dev": true }, "@babel/template": { @@ -714,26 +712,25 @@ } }, "@babel/traverse": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.0.tgz", - "integrity": "sha512-xys5xi5JEhzC3RzEmSGrs/b3pJW/o87SypZ+G/PhaE7uqVQNv/jlmVIBXuoh5atqQ434LfXV+sf23Oxj0bchJQ==", + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.13.tgz", + "integrity": "sha512-CblEcwmXKR6eP43oQGG++0QMTtCjAsa3frUuzHoiIJWpaIIi8dwMyEFUJoXRLxagGqCK+jALRwIO+o3R9p/uUg==", "dev": true, "requires": { "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.13.0", + "@babel/generator": "^7.13.9", "@babel/helper-function-name": "^7.12.13", "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/parser": "^7.13.0", - "@babel/types": "^7.13.0", + "@babel/parser": "^7.13.13", + "@babel/types": "^7.13.13", "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" + "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.12.tgz", - "integrity": "sha512-K4nY2xFN4QMvQwkQ+zmBDp6ANMbVNw6BbxWmYA4qNjhR9W+Lj/8ky5MEY2Me5r+B2c6/v6F53oMndG+f9s3IiA==", + "version": "7.13.14", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.14.tgz", + "integrity": "sha512-A2aa3QTkWoyqsZZFl56MLUsfmh7O0gN41IPvXAE/++8ojpbz12SszD7JEGYVdn4f9Kt4amIei07swF1h4AqmmQ==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.12.11", @@ -827,9 +824,9 @@ }, "dependencies": { "@babel/types": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.12.tgz", - "integrity": "sha512-K4nY2xFN4QMvQwkQ+zmBDp6ANMbVNw6BbxWmYA4qNjhR9W+Lj/8ky5MEY2Me5r+B2c6/v6F53oMndG+f9s3IiA==", + "version": "7.13.14", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.14.tgz", + "integrity": "sha512-A2aa3QTkWoyqsZZFl56MLUsfmh7O0gN41IPvXAE/++8ojpbz12SszD7JEGYVdn4f9Kt4amIei07swF1h4AqmmQ==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.12.11", @@ -930,9 +927,9 @@ } }, "@babel/parser": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.12.tgz", - "integrity": "sha512-4T7Pb244rxH24yR116LAuJ+adxXXnHhZaLJjegJVKSdoNCe4x1eDBaud5YIcQFcqzsaD5BHvJw5BQ0AZapdCRw==", + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.13.tgz", + "integrity": "sha512-OhsyMrqygfk5v8HmWwOzlYjJrtLaFhF34MrfG/Z73DgYCI6ojNUTUp2TYbtnjo8PegeJp12eamsNettCQjKjVw==", "dev": true }, "@babel/template": { @@ -947,26 +944,25 @@ } }, "@babel/traverse": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.0.tgz", - "integrity": "sha512-xys5xi5JEhzC3RzEmSGrs/b3pJW/o87SypZ+G/PhaE7uqVQNv/jlmVIBXuoh5atqQ434LfXV+sf23Oxj0bchJQ==", + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.13.tgz", + "integrity": "sha512-CblEcwmXKR6eP43oQGG++0QMTtCjAsa3frUuzHoiIJWpaIIi8dwMyEFUJoXRLxagGqCK+jALRwIO+o3R9p/uUg==", "dev": true, "requires": { "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.13.0", + "@babel/generator": "^7.13.9", "@babel/helper-function-name": "^7.12.13", "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/parser": "^7.13.0", - "@babel/types": "^7.13.0", + "@babel/parser": "^7.13.13", + "@babel/types": "^7.13.13", "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" + "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.12.tgz", - "integrity": "sha512-K4nY2xFN4QMvQwkQ+zmBDp6ANMbVNw6BbxWmYA4qNjhR9W+Lj/8ky5MEY2Me5r+B2c6/v6F53oMndG+f9s3IiA==", + "version": "7.13.14", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.14.tgz", + "integrity": "sha512-A2aa3QTkWoyqsZZFl56MLUsfmh7O0gN41IPvXAE/++8ojpbz12SszD7JEGYVdn4f9Kt4amIei07swF1h4AqmmQ==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.12.11", @@ -1060,9 +1056,9 @@ }, "dependencies": { "@babel/types": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.12.tgz", - "integrity": "sha512-K4nY2xFN4QMvQwkQ+zmBDp6ANMbVNw6BbxWmYA4qNjhR9W+Lj/8ky5MEY2Me5r+B2c6/v6F53oMndG+f9s3IiA==", + "version": "7.13.14", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.14.tgz", + "integrity": "sha512-A2aa3QTkWoyqsZZFl56MLUsfmh7O0gN41IPvXAE/++8ojpbz12SszD7JEGYVdn4f9Kt4amIei07swF1h4AqmmQ==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.12.11", @@ -1177,9 +1173,9 @@ } }, "@babel/parser": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.12.tgz", - "integrity": "sha512-4T7Pb244rxH24yR116LAuJ+adxXXnHhZaLJjegJVKSdoNCe4x1eDBaud5YIcQFcqzsaD5BHvJw5BQ0AZapdCRw==", + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.13.tgz", + "integrity": "sha512-OhsyMrqygfk5v8HmWwOzlYjJrtLaFhF34MrfG/Z73DgYCI6ojNUTUp2TYbtnjo8PegeJp12eamsNettCQjKjVw==", "dev": true }, "@babel/template": { @@ -1194,26 +1190,25 @@ } }, "@babel/traverse": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.0.tgz", - "integrity": "sha512-xys5xi5JEhzC3RzEmSGrs/b3pJW/o87SypZ+G/PhaE7uqVQNv/jlmVIBXuoh5atqQ434LfXV+sf23Oxj0bchJQ==", + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.13.tgz", + "integrity": "sha512-CblEcwmXKR6eP43oQGG++0QMTtCjAsa3frUuzHoiIJWpaIIi8dwMyEFUJoXRLxagGqCK+jALRwIO+o3R9p/uUg==", "dev": true, "requires": { "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.13.0", + "@babel/generator": "^7.13.9", "@babel/helper-function-name": "^7.12.13", "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/parser": "^7.13.0", - "@babel/types": "^7.13.0", + "@babel/parser": "^7.13.13", + "@babel/types": "^7.13.13", "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" + "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.12.tgz", - "integrity": "sha512-K4nY2xFN4QMvQwkQ+zmBDp6ANMbVNw6BbxWmYA4qNjhR9W+Lj/8ky5MEY2Me5r+B2c6/v6F53oMndG+f9s3IiA==", + "version": "7.13.14", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.14.tgz", + "integrity": "sha512-A2aa3QTkWoyqsZZFl56MLUsfmh7O0gN41IPvXAE/++8ojpbz12SszD7JEGYVdn4f9Kt4amIei07swF1h4AqmmQ==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.12.11", @@ -21368,6 +21363,19 @@ "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", "dev": true }, + "scratch-l10n": { + "version": "3.11.20210329031438", + "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-3.11.20210329031438.tgz", + "integrity": "sha512-/XnUW5Q7xaxvlNTBChrqyQjSM0jpk3SQfdlbM/76qO8D7vWOTCAyaCbQ05v/Wnm9V8QqWqlp3+e1yNWa4k4c+Q==", + "dev": true, + "requires": { + "@babel/cli": "^7.1.2", + "@babel/core": "^7.1.2", + "babel-plugin-react-intl": "^3.0.1", + "react-intl": "^2.8.0", + "transifex": "1.6.6" + } + }, "scratch-storage": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-1.3.3.tgz", @@ -21435,9 +21443,9 @@ } }, "scratch-l10n": { - "version": "3.11.20210329031438", - "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-3.11.20210329031438.tgz", - "integrity": "sha512-/XnUW5Q7xaxvlNTBChrqyQjSM0jpk3SQfdlbM/76qO8D7vWOTCAyaCbQ05v/Wnm9V8QqWqlp3+e1yNWa4k4c+Q==", + "version": "3.11.20210330031505", + "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-3.11.20210330031505.tgz", + "integrity": "sha512-yI1/ElyEtPlTNSyTrfEQTaQ+b6681kmlLhWpRHOgGPfSJTSYMFO36aFVtuyuJkcGoALLdwrulqbgCDqLIpHVLA==", "dev": true, "requires": { "@babel/cli": "^7.1.2", From a3360e2ecdd0a335e6698a9eb72e408dde23b2c8 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 30 Mar 2021 10:41:20 +0000 Subject: [PATCH 38/59] Bump scratch-gui Bumps [scratch-gui](https://github.com/LLK/scratch-gui) from 0.1.0-prerelease.20210329042543 to 0.1.0-prerelease.20210330054904. - [Release notes](https://github.com/LLK/scratch-gui/releases) - [Commits](https://github.com/LLK/scratch-gui/compare/0.1.0-prerelease.20210329042543...0.1.0-prerelease.20210330054904) Signed-off-by: dependabot-preview[bot] --- package-lock.json | 35 +++++++++++------------------------ package.json | 2 +- 2 files changed, 12 insertions(+), 25 deletions(-) diff --git a/package-lock.json b/package-lock.json index f19be5dda..54bb496b1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20908,9 +20908,9 @@ } }, "scratch-blocks": { - "version": "0.1.0-prerelease.20210329040105", - "resolved": "https://registry.npmjs.org/scratch-blocks/-/scratch-blocks-0.1.0-prerelease.20210329040105.tgz", - "integrity": "sha512-5cUw6z0y3s/j7W8p/7oiGBjRun8FGTW04gMkiJmQx7AbRLLEJEsYnJg+sVwbnhr/qXnGst3gKEGKpZ90YOA4Dg==", + "version": "0.1.0-prerelease.20210330034520", + "resolved": "https://registry.npmjs.org/scratch-blocks/-/scratch-blocks-0.1.0-prerelease.20210330034520.tgz", + "integrity": "sha512-qedVoZCAoMveNC+z97dNv2zH5FQDVDRMlV3l+lKWs5j94Wy64pLfVCzyxGBwwMNcSsHWmE7JSVADSMSuge5d2w==", "dev": true, "requires": { "exports-loader": "0.6.3", @@ -20918,9 +20918,9 @@ } }, "scratch-gui": { - "version": "0.1.0-prerelease.20210329042543", - "resolved": "https://registry.npmjs.org/scratch-gui/-/scratch-gui-0.1.0-prerelease.20210329042543.tgz", - "integrity": "sha512-cZlDhPRkQC9L47AW1ASiXZxQ64zXhgGZ/0TG4kR+0wjh/FFV0Lh7qMyC4XNetY7Dk20ZJyqd52JHdnfCO4iIOw==", + "version": "0.1.0-prerelease.20210330054904", + "resolved": "https://registry.npmjs.org/scratch-gui/-/scratch-gui-0.1.0-prerelease.20210330054904.tgz", + "integrity": "sha512-rJauyFK8EQoZLaTZO06+yjzXLnsVX3JIf5nhsBjCc5HBO6judAhGlvUpulC+G35qDKcEfiUZL7ZKrBTiOU3DJw==", "dev": true, "requires": { "arraybuffer-loader": "^1.0.6", @@ -20971,8 +20971,8 @@ "redux": "3.7.2", "redux-throttle": "0.1.1", "scratch-audio": "0.1.0-prerelease.20200528195344", - "scratch-blocks": "0.1.0-prerelease.20210329040105", - "scratch-l10n": "3.11.20210329031438", + "scratch-blocks": "0.1.0-prerelease.20210330034520", + "scratch-l10n": "3.11.20210330031505", "scratch-paint": "0.2.0-prerelease.20210319222931", "scratch-render": "0.1.0-prerelease.20210325231800", "scratch-render-fonts": "1.0.0-prerelease.20200507182347", @@ -21141,9 +21141,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.3.701", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.701.tgz", - "integrity": "sha512-Zd9ofdIMYHYhG1gvnejQDvC/kqSeXQvtXF0yRURGxgwGqDZm9F9Fm3dYFnm5gyuA7xpXfBlzVLN1sz0FjxpKfw==", + "version": "1.3.702", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.702.tgz", + "integrity": "sha512-qJVUKFWQnF6wP7MmTngDkmm8/KPzaiTXNFOAg5j7DSa6J7kPou7mTBqC8jpUOxauQWwHR3pn4dMRdV8IE1xdtA==", "dev": true }, "has-flag": { @@ -21363,19 +21363,6 @@ "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", "dev": true }, - "scratch-l10n": { - "version": "3.11.20210329031438", - "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-3.11.20210329031438.tgz", - "integrity": "sha512-/XnUW5Q7xaxvlNTBChrqyQjSM0jpk3SQfdlbM/76qO8D7vWOTCAyaCbQ05v/Wnm9V8QqWqlp3+e1yNWa4k4c+Q==", - "dev": true, - "requires": { - "@babel/cli": "^7.1.2", - "@babel/core": "^7.1.2", - "babel-plugin-react-intl": "^3.0.1", - "react-intl": "^2.8.0", - "transifex": "1.6.6" - } - }, "scratch-storage": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-1.3.3.tgz", diff --git a/package.json b/package.json index 2e04b9a7b..b3e7028f5 100644 --- a/package.json +++ b/package.json @@ -125,7 +125,7 @@ "redux-mock-store": "^1.2.3", "redux-thunk": "2.0.1", "sass-loader": "6.0.6", - "scratch-gui": "0.1.0-prerelease.20210329042543", + "scratch-gui": "0.1.0-prerelease.20210330054904", "scratch-l10n": "latest", "selenium-webdriver": "3.6.0", "slick-carousel": "1.6.0", From 33b7d87840892578504f52cbcb8b54cc94625043 Mon Sep 17 00:00:00 2001 From: Eric Rosenbaum Date: Tue, 30 Mar 2021 10:52:57 -0400 Subject: [PATCH 39/59] update grid json --- src/components/grid/grid.json | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/components/grid/grid.json b/src/components/grid/grid.json index 38be552d8..1ffff707f 100644 --- a/src/components/grid/grid.json +++ b/src/components/grid/grid.json @@ -4,7 +4,7 @@ "type": "project", "title": "Project Title", "thumbnailUrl": "", - "author": {"username": "username"}, + "author": {"username": "project creator"}, "href": "#", "stats": {} }, @@ -13,7 +13,7 @@ "type": "project", "title": "Project Title", "thumbnailUrl": "", - "author": {"username": "username"}, + "author": {"username": "project creator"}, "href": "#", "stats": {} }, @@ -22,7 +22,7 @@ "type": "project", "title": "Project Title", "thumbnailUrl": "", - "author": {"username": "username"}, + "author": {"username": "project creator"}, "href": "#", "stats": {} }, @@ -31,7 +31,7 @@ "type": "project", "title": "Project Title", "thumbnailUrl": "", - "author": {"username": "username"}, + "author": {"username": "project creator"}, "href": "#", "stats": {} }, @@ -40,7 +40,7 @@ "type": "project", "title": "Project Title", "thumbnailUrl": "", - "author": {"username": "username"}, + "author": {"username": "project creator"}, "href": "#", "stats": {} }, @@ -49,7 +49,7 @@ "type": "project", "title": "Project Title", "thumbnailUrl": "", - "author": {"username": "username"}, + "author": {"username": "project creator"}, "href": "#", "stats": {} }, @@ -58,7 +58,7 @@ "type": "project", "title": "Project Title", "thumbnailUrl": "", - "author": {"username": "username"}, + "author": {"username": "project creator"}, "href": "#", "stats": {} }, @@ -67,7 +67,7 @@ "type": "project", "title": "Project Title", "thumbnailUrl": "", - "author": {"username": "username"}, + "author": {"username": "project creator"}, "href": "#", "stats": {} }, @@ -76,7 +76,7 @@ "type": "project", "title": "Project Title", "thumbnailUrl": "", - "author": {"username": "username"}, + "author": {"username": "project creator"}, "href": "#", "stats": {} }, @@ -85,7 +85,7 @@ "type": "project", "title": "Project Title", "thumbnailUrl": "", - "author": {"username": "username"}, + "author": {"username": "project creator"}, "href": "#", "stats": {} }, @@ -94,7 +94,7 @@ "type": "project", "title": "Project Title", "thumbnailUrl": "", - "author": {"username": "username"}, + "author": {"username": "project creator"}, "href": "#", "stats": {} }, @@ -103,7 +103,7 @@ "type": "project", "title": "Project Title", "thumbnailUrl": "", - "author": {"username": "username"}, + "author": {"username": "project creator"}, "href": "#", "stats": {} }, @@ -112,7 +112,7 @@ "type": "project", "title": "Project Title", "thumbnailUrl": "", - "author": {"username": "username"}, + "author": {"username": "project creator"}, "href": "#", "stats": {} }, @@ -121,7 +121,7 @@ "type": "project", "title": "Project Title", "thumbnailUrl": "", - "author": {"username": "username"}, + "author": {"username": "project creator"}, "href": "#", "stats": {} }, @@ -130,7 +130,7 @@ "type": "project", "title": "Project Title", "thumbnailUrl": "", - "author": {"username": "username"}, + "author": {"username": "project creator"}, "href": "#", "stats": {} }, @@ -139,7 +139,7 @@ "type": "project", "title": "Project Title", "thumbnailUrl": "", - "author": {"username": "username"}, + "author": {"username": "project creator"}, "href": "#", "stats": {} } From 2ff5e8d8fb8c220cfd0574225129c1c1ce765d3d Mon Sep 17 00:00:00 2001 From: Eric Rosenbaum Date: Tue, 30 Mar 2021 10:53:06 -0400 Subject: [PATCH 40/59] styling --- src/views/components/components.jsx | 76 +++++++++++++++++++--------- src/views/components/components.scss | 14 +++-- 2 files changed, 61 insertions(+), 29 deletions(-) diff --git a/src/views/components/components.jsx b/src/views/components/components.jsx index 1cd10181f..b543d864e 100644 --- a/src/views/components/components.jsx +++ b/src/views/components/components.jsx @@ -11,6 +11,7 @@ const Spinner = require('../../components/spinner/spinner.jsx'); const Grid = require('../../components/grid/grid.jsx'); const TextArea = require('../../components/forms/textarea.jsx'); const SubNavigation = require('../../components/subnavigation/subnavigation.jsx'); +const Select = require('../../components/forms/select.jsx'); require('./components.scss'); @@ -18,37 +19,62 @@ const Components = () => (

    Nav Bubbles

    - - -
  • - cats -
  • -
    - -
  • - also cats -
  • -
    - -
  • - not cats -
  • -
    -
    +

    Grid

    Button

    - +

    Form

    -
    - -
    +
    +
    + +
    +

    Box Component

    Date: Tue, 30 Mar 2021 15:41:52 -0400 Subject: [PATCH 41/59] add text area --- src/views/components/components.jsx | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/views/components/components.jsx b/src/views/components/components.jsx index b543d864e..fe7dca821 100644 --- a/src/views/components/components.jsx +++ b/src/views/components/components.jsx @@ -73,6 +73,11 @@ const Components = () => ( maxLength="30" name="test" /> +