diff --git a/.babelrc b/.babelrc index 4f187e61f..015bfa9b8 100644 --- a/.babelrc +++ b/.babelrc @@ -1,9 +1,8 @@ { "presets": ["@babel/preset-env", "@babel/preset-react"], "plugins": [ - ["react-intl", { - "messagesDir": "./tmp/messages/", - "enforceDescriptions": false + ["formatjs", { + "ast": true }], "transform-object-assign", "transform-flow-strip-types", diff --git a/.gitignore b/.gitignore index e090202c1..38865cae4 100644 --- a/.gitignore +++ b/.gitignore @@ -17,5 +17,7 @@ prod/ package-lock.json /run_server.bat -/run_export_strings.bat +/run_manage_translations.bat /etc/env.json +/bin/server.js.LICENSE.txt +/yarn-error.log diff --git a/bin/manageTranslations.js b/bin/manageTranslations.js index c2c39b80f..20ea7fb8a 100644 --- a/bin/manageTranslations.js +++ b/bin/manageTranslations.js @@ -1,15 +1,208 @@ -import manageTranslations from 'react-intl-translations-manager'; +/* eslint no-console: "off" */ import fs from 'fs'; +import { extract } from '@formatjs/cli'; +import glob from 'glob'; +import 'colors'; +// global config parameters +const searchPattern = './src/**/*.js'; +const refLanguage = 'en'; // the language stored in default messages +const otherLanguages = ['cs']; // translations const translationsDirectory = './src/locales/'; -manageTranslations({ - messagesDirectory: './tmp/messages', - translationsDirectory, - languages: ['en', 'cs'], - detectDuplicateIds: false, -}); +/** + * Use formatjs to extract messages from all source files. + * @returns {object} where keys are IDs and values are messages + */ +async function extractMessages() { + // extract messages from all src files + const files = glob.sync(searchPattern); + console.log(`Extracting messages from ${files.length} files...`); + const extractedAsString = await extract(files, {}); + const extractedJson = JSON.parse(extractedAsString); + console.log(`Total ${Object.keys(extractedJson).length} messages extracted.`); -const enData = JSON.parse(fs.readFileSync(translationsDirectory + 'en.json', 'utf8')); -const whiteList = Object.keys(enData); -fs.writeFileSync(translationsDirectory + 'whitelist_en.json', JSON.stringify(whiteList, null, 2)); + const extracted = {}; + Object.keys(extractedJson).forEach(key => { + extracted[key] = extractedJson[key].defaultMessage; + }); + return extracted; +} + +/** + * Load messages from existing json file + * @param {string} language (en, cs ...) + * @returns {object} where keys are IDs and values are messages + */ +function loadMessages(language) { + const fileName = `${translationsDirectory}/${language}.json`; + if (!fs.existsSync(fileName)) { + console.warn(`File ${fileName} does not exist!`); + return {}; + } + + const rawData = fs.readFileSync(fileName, 'utf8'); + return JSON.parse(rawData); +} + +/** + * Save messages into json language file. + * @param {string} language + * @param {object} messages where keys are IDs and values are messages + */ +function saveMessages(language, messages) { + const fileName = `${translationsDirectory}/${language}.json`; + const sortedMessages = {}; + Object.keys(messages) + .sort() + .forEach(key => { + sortedMessages[key] = messages[key]; + }); + + fs.writeFileSync(fileName, JSON.stringify(sortedMessages, null, 2)); +} + +/** + * Load whitelist (list of not-translated keys). + * @param {string} language + * @returns {Set} of whitelisted message IDs + */ +function loadWhitelist(language) { + const fileName = `${translationsDirectory}/whitelist_${language}.json`; + const whitelist = new Set(); + + if (fs.existsSync(fileName)) { + const rawData = fs.readFileSync(fileName, 'utf8'); + JSON.parse(rawData).forEach(key => { + whitelist.add(key); + }); + } else { + console.warn(`File ${fileName} does not exist!`); + } + + return whitelist; +} + +/** + * Save whitelist into json file. + * @param {string} language + * @param {Set} whitelist + */ +function saveWhitelist(language, whitelist) { + const fileName = `${translationsDirectory}/whitelist_${language}.json`; + const whitelistArray = Array.from(whitelist).sort(); + fs.writeFileSync(fileName, JSON.stringify(whitelistArray, null, 2)); +} + +/** + * Compare extracted messages with existing messages and create lists of newly created keys, modified keys + * deleted keys, and possibly keys that were not translated yet. + * If whitelist is present, noTranslated list is constructed and modified list is not. + * I.e., ref language is diff-ed without whitelist, other languages with whitelist. + * @param {object} extracted messages from source code + * @param {object} existing messages loaded from json file + * @param {Set|null} whitelist keys that are ignored when not translated + * @param {string[]} modifiedRef initial modified list (othre languages are given modified list of ref. language). + * @returns + */ +function diff(extracted, existing, whitelist = null, modifiedRef = []) { + const created = []; + let modified = [...modifiedRef]; + const notTranslated = []; + const deleted = []; + + Object.keys(extracted).forEach(key => { + if (existing[key] === undefined) { + created.push(key); + } else if (existing[key] !== extracted[key] && !whitelist) { + modified.push(key); + } else if (existing[key] === extracted[key] && whitelist && !whitelist.has(key)) { + notTranslated.push(key); + } + }); + + Object.keys(existing).forEach(key => { + if (extracted[key] === undefined) { + deleted.push(key); + } + }); + + created.sort(); + modified = modified.filter(key => existing[key] !== undefined).sort(); + deleted.sort(); + return { created, modified, notTranslated, deleted }; +} + +/** + * Use diff results to modify the messages and the whitelist. + * @param {object} messages to be updated inplace + * @param {object} extracted messages from the sources (read only) + * @param {Set} whitelist to be updated inplace + * @param {object} result of the previous diff operation + */ +function applyDiff(messages, extracted, whitelist, { created, deleted }) { + created.forEach(key => { + messages[key] = extracted[key]; + }); + deleted.forEach(key => { + delete messages[key]; + whitelist.delete(key); + }); +} + +/** + * Helper function that prints out one colored list with caption + * @param {string[]} list + * @param {string} caption + * @param {string} color + */ +function _printInfo(list, caption, color) { + if (list.length > 0) { + console.log(`\t${caption}:`); + list.forEach(key => console.log(`\t\t${key}`[color])); + console.log(); + } +} + +/** + * Print results of a diff in human-readable format. + * @param {string} language + * @param {object} result of previous diff operation + */ +function printDiffInfo(language, { created = [], modified = [], notTranslated = [], deleted = [] }) { + console.log(`[${language}] translations:`.brightWhite.bold); + + _printInfo(created, 'Newly created messages', 'brightGreen'); + _printInfo(modified, 'Modified', 'brightYellow'); + _printInfo(notTranslated, 'Not translated', 'yellow'); + _printInfo(deleted, 'Deleted', 'red'); + + if (created.length + modified.length + notTranslated.length + deleted.length === 0) { + console.log(); + console.log('\tNo modifications.'.brightGreen); + console.log(); + } +} + +/** + * Main function that do all the stuff. + */ +async function processTranslations() { + const extracted = await extractMessages(); + const refMessages = loadMessages(refLanguage); + const refDiffRes = diff(extracted, refMessages); + printDiffInfo(refLanguage, refDiffRes); + saveMessages(refLanguage, extracted); + + otherLanguages.forEach(lang => { + const messages = loadMessages(lang); + const whitelist = loadWhitelist(lang); + const diffRes = diff(extracted, messages, whitelist, refDiffRes.modified); + printDiffInfo(lang, diffRes); + applyDiff(messages, extracted, whitelist, diffRes); + saveMessages(lang, messages); + saveWhitelist(lang, whitelist); + }); +} + +processTranslations().catch(e => console.error(e)); diff --git a/package.json b/package.json index 703fc6180..48b15cb21 100644 --- a/package.json +++ b/package.json @@ -22,88 +22,88 @@ "dev": "babel-node bin/dev.js --max-old-space-size=4096", "start": "node bin/server.js", "deploy": "mkdir -p ./prod && mkdir -p ./prod/etc && cp -rf ./views ./prod && cp -rf ./bin ./prod && cp -n ./etc/env.json.example ./prod/etc/env.json && rm -f ./prod/public/bundle* && rm -f ./prod/public/style* && cp -rf ./public ./prod", - "exportStrings": "rm -rf node_modules/.cache/babel-loader/* && rm -rf tmp/messages/* && npm run build && babel-node bin/manageTranslations.js", + "manageTranslations": "babel-node bin/manageTranslations.js", "format": "prettier --config .prettierrc --write \"src/**/*.js\"" }, "dependencies": { - "@babel/plugin-transform-react-inline-elements": "^7.2.0", + "@babel/plugin-transform-react-inline-elements": "^7.14.5", + "@formatjs/intl-pluralrules": "^4.0.27", + "@formatjs/intl-relativetimeformat": "^9.1.6", "@fortawesome/fontawesome-free": "^5.15.3", "@fortawesome/fontawesome-svg-core": "^1.2.35", "@fortawesome/free-brands-svg-icons": "^5.15.3", "@fortawesome/free-regular-svg-icons": "^5.15.3", "@fortawesome/free-solid-svg-icons": "^5.15.3", "@fortawesome/react-fontawesome": "^0.1.14", - "@iktakahiro/markdown-it-katex": "^3.0.3", + "@iktakahiro/markdown-it-katex": "^4.0.1", "admin-lte": "3.1.0", - "ajv": "5.5.1", - "ajv-keywords": "2.1.1", - "babel-plugin-react-intl": "^4.1.2", + "babel-plugin-formatjs": "^10.3.0", "bluebird": "^3.3.5", "browser-cookies": "^1.0.8", - "buffer": "^5.0.7", - "chai-immutable": "^1.6.0", - "classnames": "^2.2.5", - "codemirror": "^5.58.2", + "buffer": "^6.0.3", + "chai-immutable": "^2.1.0", + "classnames": "^2.3.1", + "codemirror": "^5.62.0", "cookie-parser": "^1.4.1", "cross-fetch": "^3.1.4", "css-loader": "^5.2.6", - "deep-equal": "^2.0.1", - "ejs": "^2.6.1", + "deep-equal": "^2.0.5", + "ejs": "^3.1.6", "exenv": "^1.2.1", "express": "^4.13.4", - "file-saver": "^1.3.3", - "flat": "^4.0.0", - "flow-bin": "^0.46.0", - "font-awesome-animation": "^0.2.1", - "glob": "^7.1.2", + "file-saver": "^2.0.5", + "flat": "^5.0.2", + "font-awesome-animation": "^1.1.1", + "glob": "^7.1.7", "global": "^4.3.1", - "highlight.js": "^10.4.1", + "highlight.js": "^11.0.1", "immutable": "^3.8.2", - "jwt-decode": "^2.2.0", - "markdown-it": "^8.4.1", - "moment": "^2.24.0", - "pretty-ms": "^6.0.1", + "jwt-decode": "^3.1.2", + "markdown-it": "^12.0.6", + "moment": "^2.29.1", + "pretty-ms": "^7.0.1", "prop-types": "^15.5.8", "react": "^16.13.0", - "react-ace": "5.9.0", + "react-ace": "^9.4.1", "react-bootstrap": "1.6.1", - "react-collapse": "^4.0.2", - "react-copy-to-clipboard": "^5.0.1", + "react-collapse": "^5.1.0", + "react-copy-to-clipboard": "^5.0.3", "react-datetime": "^3.0.4", "react-dom": "^16.8.6", - "react-dropzone": "^3.5.3", + "react-dropzone": "^11.3.2", "react-height": "^3.0.0", - "react-helmet": "^5.0.3", + "react-helmet": "^6.1.0", "react-immutable-proptypes": "^2.1.0", - "react-intl": "2.4.0", + "react-intl": "5.20.3", "react-motion": "^0.5.2", "react-redux": "^7.2.0", - "react-responsive": "^8.0.1", - "react-router": "^5.0.1", - "react-router-dom": "^5.0.1", - "react-toggle": "4.1.1", - "redux": "^4.0.4", + "react-responsive": "^8.2.0", + "react-router": "^5.2.0", + "react-router-dom": "^5.2.0", + "react-toggle": "4.1.2", + "redux": "^4.1.0", "redux-actions": "^2.6.5", - "redux-form": "^8.2.4", + "redux-form": "^8.3.7", "redux-promise-middleware": "^6.1.1", "redux-storage": "^4.1.2", "redux-storage-decorator-filter": "^1.1.8", "redux-storage-engine-localstorage": "^1.1.4", "redux-thunk": "^2.3.0", "reselect": "^4.0.0", - "serialize-javascript": "^3.1.0", + "serialize-javascript": "^6.0.0", "statuscode": "0.0.0", - "validator": "^7.0.0", - "viz.js": "^1.8.0" + "validator": "^13.6.0", + "viz.js": "^2.1.2" }, "devDependencies": { "@babel/cli": "^7.14.5", "@babel/core": "^7.14.6", - "@babel/node": "^7.14.5", + "@babel/node": "^7.14.7", "@babel/plugin-proposal-class-properties": "^7.14.5", - "@babel/preset-env": "^7.14.5", + "@babel/preset-env": "^7.14.7", "@babel/preset-react": "^7.14.5", "@babel/register": "^7.14.5", + "@formatjs/cli": "^4.2.21", "async": "^3.1.0", "babel-eslint": "^10.0.2", "babel-loader": "^8.2.2", @@ -114,11 +114,11 @@ "babel-preset-stage-1": "^6.24.0", "chai": "^4.3.4", "chai-spies": "^1.0.0", - "colors": "^1.1.2", + "colors": "^1.4.0", "css-loader": "^5.2.6", "css-modules-require-hook": "^4.2.3", "dotenv": "^10.0.0", - "eslint": "^7.28.0", + "eslint": "^7.29.0", "eslint-config-prettier": "^8.3.0", "eslint-config-standard": "16.0.3", "eslint-config-standard-react": "11.0.1", @@ -137,7 +137,7 @@ "json-loader": "^0.5.4", "less": "^4.1.1", "less-loader": "^10.0.0", - "marked": "^2.1.1", + "marked": "^2.1.2", "mini-css-extract-plugin": "^1.6.0", "mocha": "^9.0.1", "mocha-lcov-reporter": "^1.3.0", @@ -150,7 +150,7 @@ "strip-loader": "^0.1.2", "style-loader": "^2.0.0", "terser-webpack-plugin": "^5.1.3", - "webpack": "^5.39.1", + "webpack": "^5.40.0", "webpack-cli": "^4.7.2", "webpack-dev-middleware": "^5.0.0", "webpack-dev-server": "^3.11.2", diff --git a/src/client.js b/src/client.js index f13891332..4c2d7f485 100644 --- a/src/client.js +++ b/src/client.js @@ -16,6 +16,44 @@ import 'admin-lte/plugins/jquery-ui/jquery-ui.min.js'; import 'admin-lte/plugins/bootstrap/js/bootstrap.bundle.min.js'; import 'admin-lte/dist/js/adminlte.js'; +// Patch for ACE editor (it has complex loading) +require('ace-builds'); +require('ace-builds/webpack-resolver'); +require('ace-builds/src-noconflict/theme-monokai'); +require('ace-builds/src-noconflict/theme-github'); +require('ace-builds/src-noconflict/mode-c_cpp'); +require('ace-builds/src-noconflict/mode-csharp'); +require('ace-builds/src-noconflict/mode-css'); +require('ace-builds/src-noconflict/mode-groovy'); +require('ace-builds/src-noconflict/mode-html'); +require('ace-builds/src-noconflict/mode-kotlin'); +require('ace-builds/src-noconflict/mode-java'); +require('ace-builds/src-noconflict/mode-javascript'); +require('ace-builds/src-noconflict/mode-makefile'); +require('ace-builds/src-noconflict/mode-pascal'); +require('ace-builds/src-noconflict/mode-php'); +require('ace-builds/src-noconflict/mode-python'); +require('ace-builds/src-noconflict/mode-rust'); +require('ace-builds/src-noconflict/mode-scala'); +require('ace-builds/src-noconflict/mode-typescript'); +require('ace-builds/src-noconflict/keybinding-vim'); + +// override of worker paths, so they load properly +const ace = require('ace-builds/src-noconflict/ace'); +const ACE_CDN_PREFIX = 'https://cdn.jsdelivr.net/npm/ace-builds@1.4.12/src-noconflict/'; +ace.config.set('basePath', ACE_CDN_PREFIX); +const KNOWN_ACE_WORKERS = { + base_worker: 'worker-base', + css_worker: 'worker-css', + html_worker: 'worker-html', + javascript_worker: 'worker-javascript', + php_worker: 'worker-php', + xml_worker: 'worker-xml', +}; +Object.keys(KNOWN_ACE_WORKERS).forEach(key => { + ace.config.setModuleUrl(`ace/mode/${key}`, `${ACE_CDN_PREFIX}${KNOWN_ACE_WORKERS[key]}.js`); +}); + // load the initial state form the server - if any let state; const ini = window.__INITIAL_STATE__; diff --git a/src/components/Assignments/Assignment/AssignmentDetails/AssignmentDetails.js b/src/components/Assignments/Assignment/AssignmentDetails/AssignmentDetails.js index 97c76d707..2343e1823 100644 --- a/src/components/Assignments/Assignment/AssignmentDetails/AssignmentDetails.js +++ b/src/components/Assignments/Assignment/AssignmentDetails/AssignmentDetails.js @@ -225,7 +225,7 @@ const AssignmentDetails = ({ {canSubmit.canSubmit ? : } - : + : {canSubmit.submittedCount} diff --git a/src/components/Assignments/Assignment/AssignmentTableRow/AssignmentTableRow.js b/src/components/Assignments/Assignment/AssignmentTableRow/AssignmentTableRow.js index f11f9d916..95f4d53f2 100644 --- a/src/components/Assignments/Assignment/AssignmentTableRow/AssignmentTableRow.js +++ b/src/components/Assignments/Assignment/AssignmentTableRow/AssignmentTableRow.js @@ -2,7 +2,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import { Link } from 'react-router-dom'; import AssignmentStatusIcon from '../AssignmentStatusIcon/AssignmentStatusIcon'; -import { FormattedMessage, intlShape, injectIntl } from 'react-intl'; +import { FormattedMessage, injectIntl } from 'react-intl'; import { OverlayTrigger, Tooltip } from 'react-bootstrap'; import withLinks from '../../../../helpers/withLinks'; @@ -185,7 +185,7 @@ AssignmentTableRow.propTypes = { groupsAccessor: PropTypes.func, discussionOpen: PropTypes.func, links: PropTypes.object, - intl: intlShape.isRequired, + intl: PropTypes.object.isRequired, }; export default injectIntl(withLinks(AssignmentTableRow)); diff --git a/src/components/Assignments/Assignment/AssignmentsTable/AssignmentsTable.js b/src/components/Assignments/Assignment/AssignmentsTable/AssignmentsTable.js index 990f81ac7..06a0cd1fc 100644 --- a/src/components/Assignments/Assignment/AssignmentsTable/AssignmentsTable.js +++ b/src/components/Assignments/Assignment/AssignmentsTable/AssignmentsTable.js @@ -2,7 +2,7 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; import { Table, Modal } from 'react-bootstrap'; -import { FormattedMessage, injectIntl, intlShape } from 'react-intl'; +import { FormattedMessage, injectIntl } from 'react-intl'; import { isReady, isLoading, getJsData } from '../../../../redux/helpers/resourceManager'; import AssignmentTableRow, { NoAssignmentTableRow, LoadingAssignmentTableRow } from '../AssignmentTableRow'; @@ -151,7 +151,7 @@ AssignmentsTable.propTypes = { showNames: PropTypes.bool, showGroups: PropTypes.bool, groupsAccessor: PropTypes.func, - intl: intlShape.isRequired, + intl: PropTypes.object.isRequired, }; export default injectIntl(AssignmentsTable); diff --git a/src/components/Assignments/ShadowAssignmentPointsTable/ShadowAssignmentPointsTable.js b/src/components/Assignments/ShadowAssignmentPointsTable/ShadowAssignmentPointsTable.js index 54b758d55..a0839bfe9 100644 --- a/src/components/Assignments/ShadowAssignmentPointsTable/ShadowAssignmentPointsTable.js +++ b/src/components/Assignments/ShadowAssignmentPointsTable/ShadowAssignmentPointsTable.js @@ -1,6 +1,6 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; -import { FormattedMessage, injectIntl, intlShape } from 'react-intl'; +import { FormattedMessage, injectIntl } from 'react-intl'; import { Table, Modal } from 'react-bootstrap'; @@ -176,7 +176,7 @@ ShadowAssignmentPointsTable.propTypes = { maxPoints: PropTypes.number.isRequired, setPoints: PropTypes.func.isRequired, removePoints: PropTypes.func.isRequired, - intl: intlShape.isRequired, + intl: PropTypes.object.isRequired, }; export default injectIntl(ShadowAssignmentPointsTable); diff --git a/src/components/Assignments/SolutionsTable/SolutionsTableRow.js b/src/components/Assignments/SolutionsTable/SolutionsTableRow.js index bfe946335..a3821c8d3 100644 --- a/src/components/Assignments/SolutionsTable/SolutionsTableRow.js +++ b/src/components/Assignments/SolutionsTable/SolutionsTableRow.js @@ -1,6 +1,6 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { FormattedMessage, FormattedNumber, injectIntl, intlShape } from 'react-intl'; +import { FormattedMessage, FormattedNumber, injectIntl } from 'react-intl'; import { Link } from 'react-router-dom'; import { OverlayTrigger, Tooltip } from 'react-bootstrap'; import classnames from 'classnames'; @@ -196,7 +196,7 @@ SolutionsTableRow.propTypes = { noteMaxlen: PropTypes.number, compact: PropTypes.bool.isRequired, links: PropTypes.object, - intl: intlShape, + intl: PropTypes.object, }; export default withLinks(injectIntl(SolutionsTableRow)); diff --git a/src/components/Exercises/FilesTable/FilesTable.js b/src/components/Exercises/FilesTable/FilesTable.js index a026b477a..f077e08bb 100644 --- a/src/components/Exercises/FilesTable/FilesTable.js +++ b/src/components/Exercises/FilesTable/FilesTable.js @@ -79,11 +79,7 @@ const FilesTable = ({ ); FilesTable.propTypes = { - description: PropTypes.oneOfType([ - PropTypes.string, - PropTypes.shape({ type: PropTypes.oneOf([FormattedMessage]) }), - PropTypes.element, - ]), + description: PropTypes.oneOfType([PropTypes.string, PropTypes.element]), uploadId: PropTypes.string.isRequired, files: PropTypes.array, usedFiles: PropTypes.instanceOf(Set), diff --git a/src/components/Groups/ResultsTable/ResultsTable.js b/src/components/Groups/ResultsTable/ResultsTable.js index 29cb14b24..75d8e6f22 100644 --- a/src/components/Groups/ResultsTable/ResultsTable.js +++ b/src/components/Groups/ResultsTable/ResultsTable.js @@ -1,7 +1,7 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import { Link } from 'react-router-dom'; -import { FormattedMessage, injectIntl, intlShape } from 'react-intl'; +import { FormattedMessage, injectIntl } from 'react-intl'; import { defaultMemoize } from 'reselect'; import { OverlayTrigger, Tooltip, Modal } from 'react-bootstrap'; @@ -413,7 +413,7 @@ class ResultsTable extends Component { show={Boolean(this.state.dialogOpen && this.state.dialogUserId)} backdrop="static" onHide={this.closeDialog} - size="large"> + size="xl"> @@ -487,7 +487,7 @@ ResultsTable.propTypes = { fetchUsersSolutions: PropTypes.func.isRequired, setShadowPoints: PropTypes.func.isRequired, removeShadowPoints: PropTypes.func.isRequired, - intl: intlShape.isRequired, + intl: PropTypes.object.isRequired, links: PropTypes.object, }; diff --git a/src/components/Pipelines/BoxForm/BoxForm.js b/src/components/Pipelines/BoxForm/BoxForm.js index a1db87631..e61889b00 100644 --- a/src/components/Pipelines/BoxForm/BoxForm.js +++ b/src/components/Pipelines/BoxForm/BoxForm.js @@ -1,6 +1,6 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; -import { FormattedMessage, FormattedHTMLMessage } from 'react-intl'; +import { FormattedMessage } from 'react-intl'; import { connect } from 'react-redux'; import { reduxForm, Field, formValueSelector } from 'redux-form'; @@ -137,11 +137,7 @@ class BoxForm extends Component { BoxForm.propTypes = { show: PropTypes.bool, - title: PropTypes.oneOfType([ - PropTypes.string, - PropTypes.shape({ type: PropTypes.oneOf([FormattedMessage]) }), - PropTypes.element, - ]).isRequired, + title: PropTypes.oneOfType([PropTypes.string, PropTypes.element]).isRequired, selectedType: PropTypes.string, boxTypes: PropTypes.array.isRequired, onSubmit: PropTypes.func.isRequired, @@ -190,7 +186,7 @@ const validate = ({ name, type, portsIn = {}, portsOut = {} }, { boxTypes, exist if (existingVariableType && existingVariableType.type !== portType) { portsInErrors[portName] = { value: ( - {text}, }} /> ), diff --git a/src/components/Pipelines/PipelineDetail/PipelineDetail.js b/src/components/Pipelines/PipelineDetail/PipelineDetail.js index 8d8002be0..24ceac0c4 100644 --- a/src/components/Pipelines/PipelineDetail/PipelineDetail.js +++ b/src/components/Pipelines/PipelineDetail/PipelineDetail.js @@ -46,7 +46,7 @@ const PipelineDetail = ({ - + diff --git a/src/components/Pipelines/PipelineVisualisation/PipelineVisualisation.js b/src/components/Pipelines/PipelineVisualisation/PipelineVisualisation.js index 9858491fc..c6dcbef0a 100644 --- a/src/components/Pipelines/PipelineVisualisation/PipelineVisualisation.js +++ b/src/components/Pipelines/PipelineVisualisation/PipelineVisualisation.js @@ -1,26 +1,36 @@ -import React from 'react'; +import React, { useState, useEffect } from 'react'; import PropTypes from 'prop-types'; +import { FormattedMessage } from 'react-intl'; import { convertGraphToSvg } from '../../../helpers/dot'; -import ClientOnly from '../../../components/helpers/ClientOnly'; import { canUseDOM } from 'exenv'; import style from './pipeline.less'; +import { LoadingIcon } from '../../icons'; const PipelineVisualisation = ({ graph }) => { - let svg = ''; if (canUseDOM) { - svg = convertGraphToSvg(graph); - } - return ( - + const [svg, setSvg] = useState(null); + useEffect(() => { + setSvg(null); + convertGraphToSvg(graph).then(result => setSvg(result)); + }, [graph]); + + return svg !== null ? (
- - ); + ) : ( +
+ + +
+ ); + } else { + return
; + } }; PipelineVisualisation.propTypes = { diff --git a/src/components/Pipelines/PipelinesList/PipelinesList.js b/src/components/Pipelines/PipelinesList/PipelinesList.js index 494d52193..aee33ea96 100644 --- a/src/components/Pipelines/PipelinesList/PipelinesList.js +++ b/src/components/Pipelines/PipelinesList/PipelinesList.js @@ -1,7 +1,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import { Table } from 'react-bootstrap'; -import { injectIntl, FormattedMessage, intlShape } from 'react-intl'; +import { injectIntl, FormattedMessage } from 'react-intl'; import PipelinesListItem from '../PipelinesListItem'; import { identity } from '../../../helpers/common'; @@ -41,7 +41,7 @@ PipelinesList.propTypes = { pipelines: PropTypes.array, heading: PropTypes.any, createActions: PropTypes.func, - intl: intlShape.isRequired, + intl: PropTypes.object.isRequired, }; export default injectIntl(PipelinesList); diff --git a/src/components/ReferenceSolutions/ReferenceSolutionDetail/ReferenceSolutionDetail.js b/src/components/ReferenceSolutions/ReferenceSolutionDetail/ReferenceSolutionDetail.js index e9153e4d0..56c582e37 100644 --- a/src/components/ReferenceSolutions/ReferenceSolutionDetail/ReferenceSolutionDetail.js +++ b/src/components/ReferenceSolutions/ReferenceSolutionDetail/ReferenceSolutionDetail.js @@ -126,18 +126,20 @@ class ReferenceSolutionDetail extends Component { )} - {files.map(file => ( - - { - e.preventDefault(); - this.openFile(file.id); - }}> - - - - ))} + {files + .sort((a, b) => a.name.localeCompare(b.name, 'en')) + .map(file => ( + + { + e.preventDefault(); + this.openFile(file.id); + }}> + + + + ))} {files.length > 1 && ( @@ -289,7 +291,16 @@ class ReferenceSolutionDetail extends Component { )} - this.hideFile()} /> + {activeSubmissionId && scoreConfigSelector && ( { diff --git a/src/components/SisIntegration/CourseLabel/CourseLabel.js b/src/components/SisIntegration/CourseLabel/CourseLabel.js index 78e97a5a8..b9f356a92 100644 --- a/src/components/SisIntegration/CourseLabel/CourseLabel.js +++ b/src/components/SisIntegration/CourseLabel/CourseLabel.js @@ -1,6 +1,6 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { FormattedMessage, injectIntl, intlShape } from 'react-intl'; +import { FormattedMessage, injectIntl } from 'react-intl'; import { OverlayTrigger, Tooltip, Badge } from 'react-bootstrap'; import Icon, { GroupIcon } from '../../icons'; @@ -103,7 +103,7 @@ CourseLabel.propTypes = { oddWeeks: PropTypes.bool, room: PropTypes.string, groupsCount: PropTypes.number, - intl: intlShape.isRequired, + intl: PropTypes.object.isRequired, }; export default injectIntl(CourseLabel); diff --git a/src/components/SisIntegration/PlantTermGroups/PlantTermGroups.js b/src/components/SisIntegration/PlantTermGroups/PlantTermGroups.js index 1409d015a..b19683262 100644 --- a/src/components/SisIntegration/PlantTermGroups/PlantTermGroups.js +++ b/src/components/SisIntegration/PlantTermGroups/PlantTermGroups.js @@ -1,7 +1,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import { Modal, Table, Alert } from 'react-bootstrap'; -import { FormattedMessage, injectIntl, intlShape } from 'react-intl'; +import { FormattedMessage, injectIntl } from 'react-intl'; import { Field, FieldArray, reduxForm } from 'redux-form'; import { defaultMemoize } from 'reselect'; @@ -200,7 +200,7 @@ PlantTermGroups.propTypes = { externalId: PropTypes.string, groups: PropTypes.array.isRequired, rootGroups: PropTypes.array.isRequired, - intl: intlShape.isRequired, + intl: PropTypes.object.isRequired, }; const validate = ({ groups, localizedTexts }) => { diff --git a/src/components/Solutions/SolutionDetail/SolutionDetail.js b/src/components/Solutions/SolutionDetail/SolutionDetail.js index 5f2281411..5111fe5f6 100644 --- a/src/components/Solutions/SolutionDetail/SolutionDetail.js +++ b/src/components/Solutions/SolutionDetail/SolutionDetail.js @@ -115,18 +115,20 @@ class SolutionDetail extends Component { otherSolutions={otherSolutions} /> - {files.map(file => ( - - { - e.preventDefault(); - this.openFile(file.id); - }}> - - - - ))} + {files + .sort((a, b) => a.name.localeCompare(b.name, 'en')) + .map(file => ( + + { + e.preventDefault(); + this.openFile(file.id); + }}> + + + + ))} {files.length > 1 && ( @@ -292,7 +294,15 @@ class SolutionDetail extends Component { )} - this.hideFile()} /> + {activeSubmissionId && scoreConfigSelector && ( {environmentsHelpUrl && (

- ( + + {caption} + + ), + }} />

)} @@ -357,7 +363,7 @@ SubmitSolution.propTypes = { isReferenceSolution: PropTypes.bool, attachedFiles: PropTypes.array, messages: PropTypes.object.isRequired, - intl: intlShape.isRequired, + intl: PropTypes.object.isRequired, }; export default injectIntl( diff --git a/src/components/Solutions/TestResults/TestResults.js b/src/components/Solutions/TestResults/TestResults.js index 20c9a0e2a..99ec7f8d1 100644 --- a/src/components/Solutions/TestResults/TestResults.js +++ b/src/components/Solutions/TestResults/TestResults.js @@ -1,6 +1,6 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { FormattedMessage, intlShape, injectIntl } from 'react-intl'; +import { FormattedMessage, injectIntl } from 'react-intl'; import Box from '../../widgets/Box'; import TestResultsTable from '../TestResultsTable'; import { defaultMemoize } from 'reselect'; @@ -45,7 +45,7 @@ TestResults.propTypes = { isJudgeLogStdoutPublic: PropTypes.bool, isJudgeLogStderrPublic: PropTypes.bool, isJudgeLogMerged: PropTypes.bool, - intl: intlShape.isRequired, + intl: PropTypes.object.isRequired, }; export default injectIntl(TestResults); diff --git a/src/components/Solutions/Upload/Upload.js b/src/components/Solutions/Upload/Upload.js index 4fd464715..d2ea557b0 100644 --- a/src/components/Solutions/Upload/Upload.js +++ b/src/components/Solutions/Upload/Upload.js @@ -1,7 +1,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import { FormattedMessage } from 'react-intl'; -import DropZone from 'react-dropzone'; +import Dropzone from 'react-dropzone'; import Button from '../../widgets/TheButton'; import UploadsTable from '../UploadsTable'; import { UploadIcon } from '../../icons'; @@ -29,17 +29,22 @@ const Upload = ({ retryUploadFile, }) => (
- -

- -

-

- -

-
+ + {({ getRootProps, getInputProps }) => ( +
+ +

+ +

+

+ +

+
+ )} +
{(uploadingFiles.length > 0 || attachedFiles.length > 0 || failedFiles.length > 0 || removedFiles.length > 0) && ( {stats && ( - )} diff --git a/src/components/buttons/DeleteButton/DeleteButton.js b/src/components/buttons/DeleteButton/DeleteButton.js index 92c6d79c4..8a3592ab1 100644 --- a/src/components/buttons/DeleteButton/DeleteButton.js +++ b/src/components/buttons/DeleteButton/DeleteButton.js @@ -103,7 +103,7 @@ const DeleteButton = ({ DeleteButtonInternal.propTypes = { id: PropTypes.string, icon: PropTypes.element, - label: PropTypes.oneOfType([PropTypes.oneOf([FormattedMessage]), PropTypes.element, PropTypes.string]), + label: PropTypes.oneOfType([PropTypes.element, PropTypes.string]), disabled: PropTypes.bool, small: PropTypes.bool, captionAsTooltip: PropTypes.bool, diff --git a/src/components/buttons/ResendEmailVerification/ResendEmailVerification.js b/src/components/buttons/ResendEmailVerification/ResendEmailVerification.js index 1a438d3ca..0fa43322e 100644 --- a/src/components/buttons/ResendEmailVerification/ResendEmailVerification.js +++ b/src/components/buttons/ResendEmailVerification/ResendEmailVerification.js @@ -1,6 +1,6 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { FormattedMessage, defineMessages, intlShape, injectIntl } from 'react-intl'; +import { FormattedMessage, defineMessages, injectIntl } from 'react-intl'; import { MailIcon, SuccessIcon, LoadingIcon, FailureIcon } from '../../icons'; import TheButton from '../../widgets/TheButton'; import { resourceStatus } from '../../../redux/helpers/resourceManager'; @@ -50,7 +50,7 @@ const ResendEmailVerification = ({ resend, state, intl: { formatMessage }, ...pr ResendEmailVerification.propTypes = { resend: PropTypes.func.isRequired, state: PropTypes.string, - intl: intlShape, + intl: PropTypes.object, }; export default injectIntl(ResendEmailVerification); diff --git a/src/components/forms/AddSisTermForm/AddSisTermForm.js b/src/components/forms/AddSisTermForm/AddSisTermForm.js index 69cc7c76d..cb00bce6b 100644 --- a/src/components/forms/AddSisTermForm/AddSisTermForm.js +++ b/src/components/forms/AddSisTermForm/AddSisTermForm.js @@ -1,6 +1,6 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { FormattedMessage, defineMessages, intlShape, injectIntl } from 'react-intl'; +import { FormattedMessage, defineMessages, injectIntl } from 'react-intl'; import { reduxForm, Field } from 'redux-form'; import { Alert } from 'react-bootstrap'; import FormBox from '../../widgets/FormBox'; @@ -86,7 +86,7 @@ AddSisTermForm.propTypes = { submitSucceeded: PropTypes.bool, submitting: PropTypes.bool, invalid: PropTypes.bool, - intl: intlShape.isRequired, + intl: PropTypes.object.isRequired, }; export default injectIntl( diff --git a/src/components/forms/Confirm/Confirm.js b/src/components/forms/Confirm/Confirm.js index 007dc9a61..d2ddcdbbe 100644 --- a/src/components/forms/Confirm/Confirm.js +++ b/src/components/forms/Confirm/Confirm.js @@ -82,11 +82,7 @@ class Confirm extends Component { } } -const stringOrFormattedMessage = PropTypes.oneOfType([ - PropTypes.string, - PropTypes.element, - PropTypes.oneOf([FormattedMessage]), -]); +const stringOrFormattedMessage = PropTypes.oneOfType([PropTypes.string, PropTypes.element]); Confirm.propTypes = { id: PropTypes.string.isRequired, diff --git a/src/components/forms/CreateExerciseForm/CreateExerciseForm.js b/src/components/forms/CreateExerciseForm/CreateExerciseForm.js index 60d5437c9..6db884165 100644 --- a/src/components/forms/CreateExerciseForm/CreateExerciseForm.js +++ b/src/components/forms/CreateExerciseForm/CreateExerciseForm.js @@ -1,6 +1,6 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; -import { injectIntl, FormattedMessage, defineMessages, intlShape } from 'react-intl'; +import { injectIntl, FormattedMessage, defineMessages } from 'react-intl'; import { Alert } from 'react-bootstrap'; import { reduxForm, Field } from 'redux-form'; @@ -87,7 +87,7 @@ CreateExerciseForm.propTypes = { invalid: PropTypes.bool, handleSubmit: PropTypes.func.isRequired, groups: PropTypes.array.isRequired, - intl: intlShape, + intl: PropTypes.object, links: PropTypes.object, }; const validate = ({ groupId }) => { diff --git a/src/components/forms/EditAssignmentForm/AssignmentFormGroupsList.js b/src/components/forms/EditAssignmentForm/AssignmentFormGroupsList.js index 830f1c759..107a7464b 100644 --- a/src/components/forms/EditAssignmentForm/AssignmentFormGroupsList.js +++ b/src/components/forms/EditAssignmentForm/AssignmentFormGroupsList.js @@ -1,6 +1,6 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { injectIntl, intlShape, FormattedMessage } from 'react-intl'; +import { injectIntl, FormattedMessage } from 'react-intl'; import { Field } from 'redux-form'; import { CheckboxField } from '../Fields'; @@ -46,7 +46,7 @@ AssignmentFormGroupsList.propTypes = { groupsAccessor: PropTypes.func.isRequired, isOpen: PropTypes.bool.isRequired, toggleOpenState: PropTypes.func, - intl: intlShape.isRequired, + intl: PropTypes.object.isRequired, }; export default injectIntl(AssignmentFormGroupsList); diff --git a/src/components/forms/EditAssignmentForm/AssignmentFormMultiassignSuccess.js b/src/components/forms/EditAssignmentForm/AssignmentFormMultiassignSuccess.js index 6af5440a8..4005af998 100644 --- a/src/components/forms/EditAssignmentForm/AssignmentFormMultiassignSuccess.js +++ b/src/components/forms/EditAssignmentForm/AssignmentFormMultiassignSuccess.js @@ -1,6 +1,6 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { injectIntl, intlShape, FormattedMessage } from 'react-intl'; +import { injectIntl, FormattedMessage } from 'react-intl'; import { Table } from 'react-bootstrap'; import { Link } from 'react-router-dom'; @@ -74,7 +74,7 @@ AssignmentFormMultiassignSuccess.propTypes = { groups: PropTypes.array.isRequired, groupsAccessor: PropTypes.func.isRequired, acknowledgeSuccess: PropTypes.func, - intl: intlShape.isRequired, + intl: PropTypes.object.isRequired, links: PropTypes.object.isRequired, }; diff --git a/src/components/forms/EditAssignmentForm/EditAssignmentForm.js b/src/components/forms/EditAssignmentForm/EditAssignmentForm.js index 951c88bc0..eb5741c5f 100644 --- a/src/components/forms/EditAssignmentForm/EditAssignmentForm.js +++ b/src/components/forms/EditAssignmentForm/EditAssignmentForm.js @@ -1,7 +1,7 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import { reduxForm, Field, FieldArray } from 'redux-form'; -import { injectIntl, intlShape, FormattedMessage } from 'react-intl'; +import { injectIntl, FormattedMessage } from 'react-intl'; import { Alert, Container, Row, Col, Form } from 'react-bootstrap'; import moment from 'moment'; import { defaultMemoize } from 'reselect'; @@ -451,7 +451,7 @@ class EditAssignmentForm extends Component {

- {text}, + }} />

@@ -174,7 +177,7 @@ EditEnvironmentConfigForm.propTypes = { invalid: PropTypes.bool, error: PropTypes.any, warning: PropTypes.any, - intl: intlShape.isRequired, + intl: PropTypes.object.isRequired, }; const validate = ({ environmentId, variables }) => { diff --git a/src/components/forms/EditEnvironmentConfigForm/EditEnvironmentConfigVariables.js b/src/components/forms/EditEnvironmentConfigForm/EditEnvironmentConfigVariables.js index 5255a1780..17cf48ed7 100644 --- a/src/components/forms/EditEnvironmentConfigForm/EditEnvironmentConfigVariables.js +++ b/src/components/forms/EditEnvironmentConfigForm/EditEnvironmentConfigVariables.js @@ -136,11 +136,7 @@ EditEnvironmentConfigVariables.propTypes = { error: PropTypes.any, warning: PropTypes.any, }).isRequired, - noItems: PropTypes.oneOfType([ - PropTypes.string, - PropTypes.element, - PropTypes.shape({ type: PropTypes.oneOf([FormattedMessage]) }), - ]), + noItems: PropTypes.oneOfType([PropTypes.string, PropTypes.element]), }; export default EditEnvironmentConfigVariables; diff --git a/src/components/forms/EditEnvironmentSimpleForm/EditEnvironmentList.js b/src/components/forms/EditEnvironmentSimpleForm/EditEnvironmentList.js index 7da30b004..14e129ffa 100644 --- a/src/components/forms/EditEnvironmentSimpleForm/EditEnvironmentList.js +++ b/src/components/forms/EditEnvironmentSimpleForm/EditEnvironmentList.js @@ -1,7 +1,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import { Field } from 'redux-form'; -import { FormattedMessage, intlShape, injectIntl } from 'react-intl'; +import { FormattedMessage, injectIntl } from 'react-intl'; import { Container, Row, Col, OverlayTrigger, Tooltip } from 'react-bootstrap'; import Button from '../../widgets/TheButton'; @@ -102,7 +102,7 @@ EditEnvironmentList.propTypes = { invertRuntimeSelectionHandler: PropTypes.func, showExclusive: PropTypes.bool, fullWidth: PropTypes.bool, - intl: intlShape.isRequired, + intl: PropTypes.object.isRequired, }; export default injectIntl(EditEnvironmentList); diff --git a/src/components/forms/EditEnvironmentSimpleForm/EditEnvironmentSimpleForm.js b/src/components/forms/EditEnvironmentSimpleForm/EditEnvironmentSimpleForm.js index 0bea319f6..b62463496 100644 --- a/src/components/forms/EditEnvironmentSimpleForm/EditEnvironmentSimpleForm.js +++ b/src/components/forms/EditEnvironmentSimpleForm/EditEnvironmentSimpleForm.js @@ -1,7 +1,7 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import { reduxForm } from 'redux-form'; -import { FormattedMessage, FormattedHTMLMessage, intlShape, injectIntl } from 'react-intl'; +import { FormattedMessage, injectIntl } from 'react-intl'; import { Alert, OverlayTrigger, Tooltip, Table } from 'react-bootstrap'; import { defaultMemoize } from 'reselect'; @@ -89,10 +89,16 @@ class EditEnvironmentSimpleForm extends Component { {environmentsHelpUrl && (
- ( + + {caption} + + ), + }} />
@@ -192,7 +198,7 @@ EditEnvironmentSimpleForm.propTypes = { initialValues: PropTypes.object, runtimeEnvironments: PropTypes.array, readOnly: PropTypes.bool, - intl: intlShape.isRequired, + intl: PropTypes.object.isRequired, }; const validate = (formData, { runtimeEnvironments }) => { diff --git a/src/components/forms/EditExerciseAdvancedConfigForm/EditExerciseAdvancedConfigForm.js b/src/components/forms/EditExerciseAdvancedConfigForm/EditExerciseAdvancedConfigForm.js index d03115759..a22e26f93 100644 --- a/src/components/forms/EditExerciseAdvancedConfigForm/EditExerciseAdvancedConfigForm.js +++ b/src/components/forms/EditExerciseAdvancedConfigForm/EditExerciseAdvancedConfigForm.js @@ -2,7 +2,7 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import { reduxForm } from 'redux-form'; import { connect } from 'react-redux'; -import { FormattedMessage, injectIntl, intlShape } from 'react-intl'; +import { FormattedMessage, injectIntl } from 'react-intl'; import { Alert, Table } from 'react-bootstrap'; import classnames from 'classnames'; @@ -124,7 +124,7 @@ EditExerciseAdvancedConfigForm.propTypes = { supplementaryFiles: PropTypes.array, rawFill: PropTypes.func.isRequired, readOnly: PropTypes.bool, - intl: intlShape.isRequired, + intl: PropTypes.object.isRequired, }; const FORM_NAME = 'editExerciseAdvancedConfig'; diff --git a/src/components/forms/EditExerciseAdvancedConfigForm/EditExerciseAdvancedConfigTest.js b/src/components/forms/EditExerciseAdvancedConfigForm/EditExerciseAdvancedConfigTest.js index bbd9fed1e..fe883c554 100644 --- a/src/components/forms/EditExerciseAdvancedConfigForm/EditExerciseAdvancedConfigTest.js +++ b/src/components/forms/EditExerciseAdvancedConfigForm/EditExerciseAdvancedConfigTest.js @@ -1,7 +1,7 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import { Field, FieldArray } from 'redux-form'; -import { FormattedMessage, injectIntl, intlShape } from 'react-intl'; +import { FormattedMessage, injectIntl } from 'react-intl'; import { defaultMemoize } from 'reselect'; import Button from '../../widgets/TheButton'; @@ -173,7 +173,7 @@ EditExerciseAdvancedConfigTest.propTypes = { testErrors: PropTypes.array, rawFill: PropTypes.object, readOnly: PropTypes.bool, - intl: intlShape.isRequired, + intl: PropTypes.object.isRequired, }; export default injectIntl(EditExerciseAdvancedConfigTest); diff --git a/src/components/forms/EditExerciseForm/EditExerciseForm.js b/src/components/forms/EditExerciseForm/EditExerciseForm.js index 96b094689..3ecd9bad8 100644 --- a/src/components/forms/EditExerciseForm/EditExerciseForm.js +++ b/src/components/forms/EditExerciseForm/EditExerciseForm.js @@ -1,7 +1,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import { reduxForm, Field, FieldArray, touch } from 'redux-form'; -import { injectIntl, intlShape, FormattedMessage, defineMessages } from 'react-intl'; +import { injectIntl, FormattedMessage, defineMessages } from 'react-intl'; import { Alert } from 'react-bootstrap'; import { defaultMemoize } from 'reselect'; @@ -130,7 +130,10 @@ const EditExerciseForm = ({ nullable label={ - +

@@ -238,7 +238,7 @@ EditExerciseSimpleConfigForm.propTypes = { environmentsWithEntryPoints: PropTypes.array.isRequired, smartFill: PropTypes.func.isRequired, readOnly: PropTypes.bool, - intl: intlShape.isRequired, + intl: PropTypes.object.isRequired, }; const validate = (formData, { exercise, supplementaryFiles }) => { diff --git a/src/components/forms/EditExerciseSimpleConfigForm/EditExerciseSimpleConfigTestCompilation.js b/src/components/forms/EditExerciseSimpleConfigForm/EditExerciseSimpleConfigTestCompilation.js index b0f0ef211..c717dbfb7 100644 --- a/src/components/forms/EditExerciseSimpleConfigForm/EditExerciseSimpleConfigTestCompilation.js +++ b/src/components/forms/EditExerciseSimpleConfigForm/EditExerciseSimpleConfigTestCompilation.js @@ -2,7 +2,7 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import { Field, FieldArray } from 'redux-form'; import { Container, Row, Col } from 'react-bootstrap'; -import { FormattedMessage, injectIntl, intlShape } from 'react-intl'; +import { FormattedMessage, injectIntl } from 'react-intl'; import EnvironmentsListItem from '../../helpers/EnvironmentsList/EnvironmentsListItem'; import { EMPTY_ARRAY } from '../../../helpers/common'; @@ -116,35 +116,36 @@ class EditExerciseSimpleConfigTestCompilation extends Component { - {env.id === ENV_JAVA_ID && ( + { + env.id === ENV_JAVA_ID && ( + /* + * A special case for Java only !!! + */ + + + } + noItems={ + + } + readOnly={readOnly} + /> + {exercise.runtimeEnvironments.length !== 1 &&
} + + ) /* - * A special case for Java only !!! + * End of special case. */ - - - } - noItems={ - - } - readOnly={readOnly} - /> - {exercise.runtimeEnvironments.length !== 1 &&
} - - ) - /* - * End of special case. - */ } @@ -250,7 +251,7 @@ EditExerciseSimpleConfigTestCompilation.propTypes = { smartFillCompilation: PropTypes.func, change: PropTypes.func.isRequired, readOnly: PropTypes.bool, - intl: intlShape.isRequired, + intl: PropTypes.object.isRequired, }; export default injectIntl(EditExerciseSimpleConfigTestCompilation); diff --git a/src/components/forms/EditExerciseSimpleConfigForm/EditExerciseSimpleConfigTestJudge.js b/src/components/forms/EditExerciseSimpleConfigForm/EditExerciseSimpleConfigTestJudge.js index 87068678d..96c85d131 100644 --- a/src/components/forms/EditExerciseSimpleConfigForm/EditExerciseSimpleConfigTestJudge.js +++ b/src/components/forms/EditExerciseSimpleConfigForm/EditExerciseSimpleConfigTestJudge.js @@ -1,7 +1,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import { Field, FieldArray } from 'redux-form'; -import { FormattedMessage, injectIntl, defineMessages, intlShape } from 'react-intl'; +import { FormattedMessage, injectIntl, defineMessages } from 'react-intl'; import { SelectField, ExpandingTextField, CheckboxField } from '../Fields'; import Confirm from '../../forms/Confirm'; @@ -200,7 +200,7 @@ EditExerciseSimpleConfigTestJudge.propTypes = { showJudgeArgs: PropTypes.bool, onlyCustomJudge: PropTypes.bool, readOnly: PropTypes.bool, - intl: intlShape.isRequired, + intl: PropTypes.object.isRequired, }; export default injectIntl(EditExerciseSimpleConfigTestJudge); diff --git a/src/components/forms/EditShadowAssignmentForm/EditShadowAssignmentForm.js b/src/components/forms/EditShadowAssignmentForm/EditShadowAssignmentForm.js index 7780f8ef5..b210367b8 100644 --- a/src/components/forms/EditShadowAssignmentForm/EditShadowAssignmentForm.js +++ b/src/components/forms/EditShadowAssignmentForm/EditShadowAssignmentForm.js @@ -57,7 +57,7 @@ const EditShadowAssignmentForm = ({ asyncValidating={asyncValidating} messages={{ submit: , - submitting: , + submitting: , success: , }} /> diff --git a/src/components/forms/EditSystemMessageForm/EditSystemMessageForm.js b/src/components/forms/EditSystemMessageForm/EditSystemMessageForm.js index 195378759..6638d1a9e 100644 --- a/src/components/forms/EditSystemMessageForm/EditSystemMessageForm.js +++ b/src/components/forms/EditSystemMessageForm/EditSystemMessageForm.js @@ -1,7 +1,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import { reduxForm, Field, FieldArray } from 'redux-form'; -import { FormattedMessage, injectIntl, intlShape } from 'react-intl'; +import { FormattedMessage, injectIntl } from 'react-intl'; import { Alert, Modal } from 'react-bootstrap'; import { defaultMemoize } from 'reselect'; @@ -142,7 +142,7 @@ EditSystemMessageForm.propTypes = { isOpen: PropTypes.bool.isRequired, onClose: PropTypes.func.isRequired, createNew: PropTypes.bool, - intl: intlShape.isRequired, + intl: PropTypes.object.isRequired, }; const validate = ({ localizedTexts, type, role, visibleFrom, visibleTo }) => { diff --git a/src/components/forms/EditUserSettingsForm/EditUserSettingsForm.js b/src/components/forms/EditUserSettingsForm/EditUserSettingsForm.js index 2e769d21e..0386aadfa 100644 --- a/src/components/forms/EditUserSettingsForm/EditUserSettingsForm.js +++ b/src/components/forms/EditUserSettingsForm/EditUserSettingsForm.js @@ -1,6 +1,6 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { FormattedMessage, defineMessages, injectIntl, intlShape } from 'react-intl'; +import { FormattedMessage, defineMessages, injectIntl } from 'react-intl'; import { reduxForm, Field } from 'redux-form'; import { Alert } from 'react-bootstrap'; import { defaultMemoize } from 'reselect'; @@ -240,7 +240,7 @@ EditUserSettingsForm.propTypes = { submitting: PropTypes.bool, anyTouched: PropTypes.bool, invalid: PropTypes.bool, - intl: intlShape.isRequired, + intl: PropTypes.object.isRequired, }; export default injectIntl( diff --git a/src/components/forms/Fields/CheckboxField.js b/src/components/forms/Fields/CheckboxField.js index f048c18b4..a4e711ec7 100644 --- a/src/components/forms/Fields/CheckboxField.js +++ b/src/components/forms/Fields/CheckboxField.js @@ -1,7 +1,5 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { FormattedMessage } from 'react-intl'; - import { FormGroup, FormCheck, OverlayTrigger, Tooltip } from 'react-bootstrap'; import OnOffCheckbox from '../OnOffCheckbox'; @@ -51,11 +49,7 @@ CheckboxField.propTypes = { }).isRequired, type: PropTypes.string, onOff: PropTypes.bool, - label: PropTypes.oneOfType([ - PropTypes.string, - PropTypes.element, - PropTypes.shape({ type: PropTypes.oneOf([FormattedMessage]) }), - ]).isRequired, + label: PropTypes.oneOfType([PropTypes.string, PropTypes.element]).isRequired, ignoreDirty: PropTypes.bool, }; diff --git a/src/components/forms/Fields/DatetimeField.js b/src/components/forms/Fields/DatetimeField.js index 3aa3d1b73..5f9fab942 100644 --- a/src/components/forms/Fields/DatetimeField.js +++ b/src/components/forms/Fields/DatetimeField.js @@ -1,6 +1,5 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; -import { FormattedMessage } from 'react-intl'; import Datetime from 'react-datetime'; import 'react-datetime/css/react-datetime.css'; @@ -72,11 +71,7 @@ class DatetimeField extends Component { DatetimeField.propTypes = { lang: PropTypes.string, type: PropTypes.string, - label: PropTypes.oneOfType([ - PropTypes.string, - PropTypes.element, - PropTypes.shape({ type: PropTypes.oneOf([FormattedMessage]) }), - ]), + label: PropTypes.oneOfType([PropTypes.string, PropTypes.element]), input: PropTypes.shape({ name: PropTypes.string.isRequired, value: PropTypes.oneOfType([PropTypes.string, PropTypes.number, PropTypes.object]), diff --git a/src/components/forms/Fields/ExpandingInputFilesField.js b/src/components/forms/Fields/ExpandingInputFilesField.js index 46b7fe60e..58443a1ee 100644 --- a/src/components/forms/Fields/ExpandingInputFilesField.js +++ b/src/components/forms/Fields/ExpandingInputFilesField.js @@ -122,21 +122,9 @@ ExpandingInputFilesField.propTypes = { error: PropTypes.any, warning: PropTypes.any, }).isRequired, - leftLabel: PropTypes.oneOfType([ - PropTypes.string, - PropTypes.element, - PropTypes.shape({ type: PropTypes.oneOf([FormattedMessage]) }), - ]), - rightLabel: PropTypes.oneOfType([ - PropTypes.string, - PropTypes.element, - PropTypes.shape({ type: PropTypes.oneOf([FormattedMessage]) }), - ]), - noItems: PropTypes.oneOfType([ - PropTypes.string, - PropTypes.element, - PropTypes.shape({ type: PropTypes.oneOf([FormattedMessage]) }), - ]), + leftLabel: PropTypes.oneOfType([PropTypes.string, PropTypes.element]), + rightLabel: PropTypes.oneOfType([PropTypes.string, PropTypes.element]), + noItems: PropTypes.oneOfType([PropTypes.string, PropTypes.element]), options: PropTypes.array, change: PropTypes.func.isRequired, readOnly: PropTypes.bool, diff --git a/src/components/forms/Fields/ExpandingSelectField.js b/src/components/forms/Fields/ExpandingSelectField.js index 0bba45e9a..7b077d011 100644 --- a/src/components/forms/Fields/ExpandingSelectField.js +++ b/src/components/forms/Fields/ExpandingSelectField.js @@ -112,16 +112,8 @@ ExpandingSelectField.propTypes = { error: PropTypes.any, warning: PropTypes.any, }).isRequired, - label: PropTypes.oneOfType([ - PropTypes.string, - PropTypes.element, - PropTypes.shape({ type: PropTypes.oneOf([FormattedMessage]) }), - ]), - noItems: PropTypes.oneOfType([ - PropTypes.string, - PropTypes.element, - PropTypes.shape({ type: PropTypes.oneOf([FormattedMessage]) }), - ]), + label: PropTypes.oneOfType([PropTypes.string, PropTypes.element]), + noItems: PropTypes.oneOfType([PropTypes.string, PropTypes.element]), options: PropTypes.array, readOnly: PropTypes.bool, }; diff --git a/src/components/forms/Fields/ExpandingTextField.js b/src/components/forms/Fields/ExpandingTextField.js index a41b3f79f..57dff4378 100644 --- a/src/components/forms/Fields/ExpandingTextField.js +++ b/src/components/forms/Fields/ExpandingTextField.js @@ -109,16 +109,8 @@ ExpandingTextField.propTypes = { error: PropTypes.any, warning: PropTypes.any, }).isRequired, - label: PropTypes.oneOfType([ - PropTypes.string, - PropTypes.element, - PropTypes.shape({ type: PropTypes.oneOf([FormattedMessage]) }), - ]), - noItems: PropTypes.oneOfType([ - PropTypes.string, - PropTypes.element, - PropTypes.shape({ type: PropTypes.oneOf([FormattedMessage]) }), - ]), + label: PropTypes.oneOfType([PropTypes.string, PropTypes.element]), + noItems: PropTypes.oneOfType([PropTypes.string, PropTypes.element]), validateEach: PropTypes.func, readOnly: PropTypes.bool, }; diff --git a/src/components/forms/Fields/MarkdownTextAreaField.js b/src/components/forms/Fields/MarkdownTextAreaField.js index 7e0313d58..ac3b1f45a 100644 --- a/src/components/forms/Fields/MarkdownTextAreaField.js +++ b/src/components/forms/Fields/MarkdownTextAreaField.js @@ -1,6 +1,6 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; -import { FormattedMessage, FormattedHTMLMessage } from 'react-intl'; +import { FormattedMessage } from 'react-intl'; import { Form, Row, Col } from 'react-bootstrap'; import Markdown from '../../widgets/Markdown'; @@ -10,7 +10,7 @@ import styles from './MarkdownTextAreaField.less'; import { canUseDOM } from 'exenv'; if (canUseDOM) { - require('brace/mode/markdown'); + require('ace-builds/src-noconflict/mode-markdown'); } class MarkdownTextAreaField extends Component { @@ -43,11 +43,15 @@ class MarkdownTextAreaField extends Component { - ( + + {caption} + + ), }} /> diff --git a/src/components/forms/Fields/PasswordStrength.js b/src/components/forms/Fields/PasswordStrength.js index c3136f22a..adfb588f8 100644 --- a/src/components/forms/Fields/PasswordStrength.js +++ b/src/components/forms/Fields/PasswordStrength.js @@ -47,23 +47,13 @@ const getTitle = level => { const PasswordStrength = ({ input: { name, value: level }, meta: { dirty }, label }) => ( {dirty && ( - + )} ); PasswordStrength.propTypes = { - label: PropTypes.oneOfType([ - PropTypes.string, - PropTypes.element, - PropTypes.shape({ type: PropTypes.oneOf([FormattedMessage]) }), - ]).isRequired, + label: PropTypes.oneOfType([PropTypes.string, PropTypes.element]).isRequired, input: PropTypes.shape({ name: PropTypes.string.isRequired, value: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired, diff --git a/src/components/forms/Fields/PipelineField.js b/src/components/forms/Fields/PipelineField.js index ed48e5592..153f20c12 100644 --- a/src/components/forms/Fields/PipelineField.js +++ b/src/components/forms/Fields/PipelineField.js @@ -35,14 +35,10 @@ PipelineField.propTypes = { value: PropTypes.oneOfType([PropTypes.string, PropTypes.array]).isRequired, onChange: PropTypes.func.isRequired, }).isRequired, - label: PropTypes.oneOfType([ - PropTypes.string, - PropTypes.element, - PropTypes.shape({ type: PropTypes.oneOf([FormattedMessage]) }), - ]).isRequired, + label: PropTypes.oneOfType([PropTypes.string, PropTypes.element]).isRequired, meta: PropTypes.shape({ touched: PropTypes.bool, - error: PropTypes.oneOfType([PropTypes.string, FormattedMessage]), + error: PropTypes.oneOfType([PropTypes.string, PropTypes.element]), }), }; diff --git a/src/components/forms/Fields/PipelineVariablesField.js b/src/components/forms/Fields/PipelineVariablesField.js index 3a15858bd..63f5d216d 100644 --- a/src/components/forms/Fields/PipelineVariablesField.js +++ b/src/components/forms/Fields/PipelineVariablesField.js @@ -91,11 +91,7 @@ PipelineVariablesField.propTypes = { name: PropTypes.string.isRequired, value: PropTypes.object, }).isRequired, - label: PropTypes.oneOfType([ - PropTypes.string, - PropTypes.element, - PropTypes.shape({ type: PropTypes.oneOf([FormattedMessage]) }), - ]).isRequired, + label: PropTypes.oneOfType([PropTypes.string, PropTypes.element]).isRequired, variables: PropTypes.array, supplementaryFiles: ImmutablePropTypes.map, intl: PropTypes.shape({ locale: PropTypes.string.isRequired }).isRequired, diff --git a/src/components/forms/Fields/PortField.js b/src/components/forms/Fields/PortField.js index 924e42140..03ee7bfd6 100644 --- a/src/components/forms/Fields/PortField.js +++ b/src/components/forms/Fields/PortField.js @@ -1,6 +1,5 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { FormattedMessage } from 'react-intl'; import { Form, FormGroup, FormControl, FormLabel, Badge } from 'react-bootstrap'; import classnames from 'classnames'; @@ -55,11 +54,7 @@ PortField.propTypes = { error: PropTypes.any, warning: PropTypes.any, }).isRequired, - label: PropTypes.oneOfType([ - PropTypes.string, - PropTypes.element, - PropTypes.shape({ type: PropTypes.oneOf([FormattedMessage]) }), - ]).isRequired, + label: PropTypes.oneOfType([PropTypes.string, PropTypes.element]).isRequired, portType: PropTypes.string.isRequired, ignoreDirty: PropTypes.bool, }; diff --git a/src/components/forms/Fields/PortsField.js b/src/components/forms/Fields/PortsField.js index e92551dd5..7d23fc876 100644 --- a/src/components/forms/Fields/PortsField.js +++ b/src/components/forms/Fields/PortsField.js @@ -15,11 +15,7 @@ const PortsField = ({ label, prefix, ports }) => ( ); PortsField.propTypes = { - label: PropTypes.oneOfType([ - PropTypes.string, - PropTypes.element, - PropTypes.shape({ type: PropTypes.oneOf([FormattedMessage]) }), - ]).isRequired, + label: PropTypes.oneOfType([PropTypes.string, PropTypes.element]).isRequired, prefix: PropTypes.string.isRequired, ports: PropTypes.array, }; diff --git a/src/components/forms/Fields/SelectField.js b/src/components/forms/Fields/SelectField.js index 749a30240..0e2838e30 100644 --- a/src/components/forms/Fields/SelectField.js +++ b/src/components/forms/Fields/SelectField.js @@ -1,6 +1,5 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { FormattedMessage } from 'react-intl'; import { Form, FormGroup, FormControl, FormLabel } from 'react-bootstrap'; import classnames from 'classnames'; @@ -72,11 +71,7 @@ SelectField.propTypes = { warning: PropTypes.any, }).isRequired, type: PropTypes.string, - label: PropTypes.oneOfType([ - PropTypes.string, - PropTypes.element, - PropTypes.shape({ type: PropTypes.oneOf([FormattedMessage]) }), - ]), + label: PropTypes.oneOfType([PropTypes.string, PropTypes.element]), options: PropTypes.array.isRequired, addEmptyOption: PropTypes.bool, emptyOptionCaption: PropTypes.string, diff --git a/src/components/forms/Fields/SourceCodeField.js b/src/components/forms/Fields/SourceCodeField.js index 82c61ba17..e13f97307 100644 --- a/src/components/forms/Fields/SourceCodeField.js +++ b/src/components/forms/Fields/SourceCodeField.js @@ -1,14 +1,13 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { FormattedMessage } from 'react-intl'; import { Form, FormGroup, FormLabel } from 'react-bootstrap'; +import { canUseDOM } from 'exenv'; -import ClientOnly from '../../helpers/ClientOnly'; import { UserSettingsContext } from '../../../helpers/contexts'; // load the ACE editor only when rendering in the browser -import { loadAceEditor, getAceModeFromExtension } from '../../helpers/AceEditorLoader'; -const AceEditor = loadAceEditor(); +import { getAceModeFromExtension } from '../../helpers/ace'; +const AceEditor = canUseDOM ? require('react-ace').default : null; const SourceCodeField = ({ input, @@ -25,7 +24,7 @@ const SourceCodeField = ({ {Boolean(label) && ( {label} )} - + {canUseDOM && (
{({ vimMode = false, darkTheme = false }) => ( @@ -53,7 +52,7 @@ const SourceCodeField = ({ )}
-
+ )} {error && {error} } {!error && warning && {warning} } {children} @@ -73,11 +72,7 @@ SourceCodeField.propTypes = { dirty: PropTypes.bool, }), tabIndex: PropTypes.number, - label: PropTypes.oneOfType([ - PropTypes.string, - PropTypes.element, - PropTypes.shape({ type: PropTypes.oneOf([FormattedMessage]) }), - ]), + label: PropTypes.oneOfType([PropTypes.string, PropTypes.element]), readOnly: PropTypes.bool, onBlur: PropTypes.func, }; diff --git a/src/components/forms/Fields/TabbedArrayField.js b/src/components/forms/Fields/TabbedArrayField.js index 4ccd12a31..671236deb 100644 --- a/src/components/forms/Fields/TabbedArrayField.js +++ b/src/components/forms/Fields/TabbedArrayField.js @@ -1,6 +1,6 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; -import { injectIntl, intlShape, FormattedMessage } from 'react-intl'; +import { injectIntl, FormattedMessage } from 'react-intl'; import { Card, Tab, Nav } from 'react-bootstrap'; import Confirm from '../Confirm'; @@ -117,7 +117,7 @@ TabbedArrayField.propTypes = { ContentComponent: PropTypes.any, emptyMessage: PropTypes.oneOfType([PropTypes.string, PropTypes.element]), removeQuestion: PropTypes.oneOfType([PropTypes.string, PropTypes.element]), - intl: intlShape.isRequired, + intl: PropTypes.object.isRequired, }; export default injectIntl(TabbedArrayField); diff --git a/src/components/forms/Fields/TagsSelectorField.js b/src/components/forms/Fields/TagsSelectorField.js index c7f72241a..07f81a050 100644 --- a/src/components/forms/Fields/TagsSelectorField.js +++ b/src/components/forms/Fields/TagsSelectorField.js @@ -1,6 +1,5 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { FormattedMessage } from 'react-intl'; import { FormLabel, Badge } from 'react-bootstrap'; import { defaultMemoize } from 'reselect'; import classnames from 'classnames'; @@ -50,16 +49,8 @@ TagsSelectorField.propTypes = { error: PropTypes.any, warning: PropTypes.any, }).isRequired, - label: PropTypes.oneOfType([ - PropTypes.string, - PropTypes.element, - PropTypes.shape({ type: PropTypes.oneOf([FormattedMessage]) }), - ]), - noItems: PropTypes.oneOfType([ - PropTypes.string, - PropTypes.element, - PropTypes.shape({ type: PropTypes.oneOf([FormattedMessage]) }), - ]), + label: PropTypes.oneOfType([PropTypes.string, PropTypes.element]), + noItems: PropTypes.oneOfType([PropTypes.string, PropTypes.element]), validateEach: PropTypes.func, }; diff --git a/src/components/forms/Fields/TextAreaField.js b/src/components/forms/Fields/TextAreaField.js index 6d41457cd..37be7cd05 100644 --- a/src/components/forms/Fields/TextAreaField.js +++ b/src/components/forms/Fields/TextAreaField.js @@ -1,6 +1,5 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { FormattedMessage } from 'react-intl'; import { Form, FormGroup, FormControl, FormLabel } from 'react-bootstrap'; import classnames from 'classnames'; @@ -44,11 +43,7 @@ TextAreaField.propTypes = { input: PropTypes.shape({ name: PropTypes.string.isRequired, }).isRequired, - label: PropTypes.oneOfType([ - PropTypes.string, - PropTypes.element, - PropTypes.shape({ type: PropTypes.oneOf([FormattedMessage]) }), - ]), + label: PropTypes.oneOfType([PropTypes.string, PropTypes.element]), children: PropTypes.any, meta: PropTypes.shape({ active: PropTypes.bool, diff --git a/src/components/forms/Fields/TextField.js b/src/components/forms/Fields/TextField.js index e73778191..64bc3aab6 100644 --- a/src/components/forms/Fields/TextField.js +++ b/src/components/forms/Fields/TextField.js @@ -1,6 +1,5 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { FormattedMessage } from 'react-intl'; import { Form, FormGroup, FormControl, FormLabel } from 'react-bootstrap'; import classnames from 'classnames'; @@ -48,11 +47,7 @@ TextField.propTypes = { error: PropTypes.any, warning: PropTypes.any, }).isRequired, - label: PropTypes.oneOfType([ - PropTypes.string, - PropTypes.element, - PropTypes.shape({ type: PropTypes.oneOf([FormattedMessage]) }), - ]), + label: PropTypes.oneOfType([PropTypes.string, PropTypes.element]), groupClassName: PropTypes.string, ignoreDirty: PropTypes.bool, }; diff --git a/src/components/forms/FilterExercisesListForm/FilterExercisesListForm.js b/src/components/forms/FilterExercisesListForm/FilterExercisesListForm.js index fbf5bd048..ad9ba8242 100644 --- a/src/components/forms/FilterExercisesListForm/FilterExercisesListForm.js +++ b/src/components/forms/FilterExercisesListForm/FilterExercisesListForm.js @@ -2,7 +2,7 @@ import React, { Component } from 'react'; import { connect } from 'react-redux'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; -import { FormattedMessage, injectIntl, intlShape } from 'react-intl'; +import { FormattedMessage, injectIntl } from 'react-intl'; import { reduxForm, Field, FieldArray, formValueSelector } from 'redux-form'; import { Alert, Container, Row, Col, Form, FormLabel } from 'react-bootstrap'; import { defaultMemoize } from 'reselect'; @@ -300,7 +300,7 @@ FilterExercisesListForm.propTypes = { envValueSelector: PropTypes.func.isRequired, runtimeEnvironments: PropTypes.array.isRequired, loggedUserId: PropTypes.string.isRequired, - intl: intlShape.isRequired, + intl: PropTypes.object.isRequired, }; export default connect((state, { rootGroup = null, form }) => ({ diff --git a/src/components/forms/FilterSystemMessagesForm/FilterSystemMessagesForm.js b/src/components/forms/FilterSystemMessagesForm/FilterSystemMessagesForm.js index d943e3156..1945086eb 100644 --- a/src/components/forms/FilterSystemMessagesForm/FilterSystemMessagesForm.js +++ b/src/components/forms/FilterSystemMessagesForm/FilterSystemMessagesForm.js @@ -1,6 +1,6 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { FormattedMessage, injectIntl, intlShape } from 'react-intl'; +import { FormattedMessage, injectIntl } from 'react-intl'; import { reduxForm, Field } from 'redux-form'; import { Container, Row, Col, Form } from 'react-bootstrap'; @@ -60,7 +60,7 @@ FilterSystemMessagesForm.propTypes = { submitFailed: PropTypes.bool, submitSucceeded: PropTypes.bool, invalid: PropTypes.bool, - intl: intlShape.isRequired, + intl: PropTypes.object.isRequired, }; export default injectIntl( diff --git a/src/components/forms/FilterUsersListForm/FilterUsersListForm.js b/src/components/forms/FilterUsersListForm/FilterUsersListForm.js index 417cc57b2..3dc90f631 100644 --- a/src/components/forms/FilterUsersListForm/FilterUsersListForm.js +++ b/src/components/forms/FilterUsersListForm/FilterUsersListForm.js @@ -1,6 +1,6 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { FormattedMessage, injectIntl, intlShape } from 'react-intl'; +import { FormattedMessage, injectIntl } from 'react-intl'; import { reduxForm, Field } from 'redux-form'; import { Alert, Container, Row, Col, Form } from 'react-bootstrap'; @@ -78,7 +78,7 @@ FilterUsersListForm.propTypes = { submitFailed: PropTypes.bool, submitSucceeded: PropTypes.bool, invalid: PropTypes.bool, - intl: intlShape.isRequired, + intl: PropTypes.object.isRequired, }; export default injectIntl( diff --git a/src/components/forms/ForkExerciseForm/ForkExerciseForm.js b/src/components/forms/ForkExerciseForm/ForkExerciseForm.js index 78fd7997d..7f3e668ed 100644 --- a/src/components/forms/ForkExerciseForm/ForkExerciseForm.js +++ b/src/components/forms/ForkExerciseForm/ForkExerciseForm.js @@ -1,7 +1,7 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; -import { injectIntl, FormattedMessage, defineMessages, intlShape } from 'react-intl'; +import { injectIntl, FormattedMessage, defineMessages } from 'react-intl'; import { Alert, Form } from 'react-bootstrap'; import { connect } from 'react-redux'; import { reduxForm, Field } from 'redux-form'; @@ -168,7 +168,7 @@ ForkExerciseForm.propTypes = { links: PropTypes.object, groups: ImmutablePropTypes.map, groupsAccessor: PropTypes.func.isRequired, - intl: intlShape, + intl: PropTypes.object, }; const validate = ({ groupId }) => { diff --git a/src/components/forms/GenerateTokenForm/GenerateTokenForm.js b/src/components/forms/GenerateTokenForm/GenerateTokenForm.js index 8bc72b6ad..83d20e423 100644 --- a/src/components/forms/GenerateTokenForm/GenerateTokenForm.js +++ b/src/components/forms/GenerateTokenForm/GenerateTokenForm.js @@ -1,6 +1,6 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { FormattedMessage, FormattedHTMLMessage, injectIntl, defineMessages, intlShape } from 'react-intl'; +import { FormattedMessage, injectIntl, defineMessages } from 'react-intl'; import { reduxForm, Field } from 'redux-form'; import { Alert, OverlayTrigger, Tooltip, Container, Row, Col } from 'react-bootstrap'; import { CopyToClipboard } from 'react-copy-to-clipboard'; @@ -188,7 +188,7 @@ GenerateTokenForm.propTypes = { submitting: PropTypes.bool, invalid: PropTypes.bool, lastToken: PropTypes.string, - intl: intlShape.isRequired, + intl: PropTypes.object.isRequired, }; const validate = ({ scopes, expiration }) => { @@ -199,16 +199,22 @@ const validate = ({ scopes, expiration }) => { if (!scopes['read-all'] && !scopes.master) { errors._error = ( - {text}, + }} /> ); } else if (scopes.master && expiration > WEEK_SEC) { errors._error = ( - {text}, + }} /> ); } @@ -219,9 +225,12 @@ const warn = ({ scopes }) => { const warnings = {}; if (scopes && scopes['read-all'] && scopes.master) { warnings._warning = ( - {text}, + }} /> ); } diff --git a/src/components/forms/LoginCASForm/LoginCASForm.js b/src/components/forms/LoginCASForm/LoginCASForm.js deleted file mode 100644 index 68743aa43..000000000 --- a/src/components/forms/LoginCASForm/LoginCASForm.js +++ /dev/null @@ -1,89 +0,0 @@ -import React from 'react'; -import PropTypes from 'prop-types'; -import { reduxForm, Field } from 'redux-form'; -import { FormattedMessage } from 'react-intl'; - -import { SuccessIcon, LoadingIcon } from '../../icons'; -import FormBox from '../../widgets/FormBox'; -import { TextField, PasswordField } from '../Fields'; - -import { Alert } from 'react-bootstrap'; -import Button from '../../widgets/TheButton'; - -const LoginCASForm = ({ invalid, handleSubmit, submitFailed: hasFailed, submitting, hasSucceeded }) => ( - } - type={hasSucceeded ? 'success' : undefined} - footer={ -
- -
- }> - {hasFailed && ( - - - - )} - - } - /> - } - /> -
-); - -LoginCASForm.propTypes = { - onSubmit: PropTypes.func.isRequired, - handleSubmit: PropTypes.func.isRequired, - submitFailed: PropTypes.bool, - submitting: PropTypes.bool, - hasSucceeded: PropTypes.bool, - invalid: PropTypes.bool, -}; - -const validate = ({ ukco, password }) => { - const errors = {}; - if (!ukco) { - errors.ukco = ( - - ); - } - - if (!password) { - errors.password = ( - - ); - } - - return errors; -}; - -export default reduxForm({ - form: 'login-cas', - validate, -})(LoginCASForm); diff --git a/src/components/forms/LoginCASForm/index.js b/src/components/forms/LoginCASForm/index.js deleted file mode 100644 index ba5dfe736..000000000 --- a/src/components/forms/LoginCASForm/index.js +++ /dev/null @@ -1,2 +0,0 @@ -import LoginCASForm from './LoginCASForm'; -export default LoginCASForm; diff --git a/src/components/forms/RelocateGroupForm/RelocateGroupForm.js b/src/components/forms/RelocateGroupForm/RelocateGroupForm.js index 22de93603..b76acba55 100644 --- a/src/components/forms/RelocateGroupForm/RelocateGroupForm.js +++ b/src/components/forms/RelocateGroupForm/RelocateGroupForm.js @@ -1,6 +1,6 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { injectIntl, FormattedMessage, intlShape } from 'react-intl'; +import { injectIntl, FormattedMessage } from 'react-intl'; import { Alert, Form } from 'react-bootstrap'; import { reduxForm, Field } from 'redux-form'; import { defaultMemoize } from 'reselect'; @@ -78,7 +78,7 @@ RelocateGroupForm.propTypes = { links: PropTypes.object, groups: PropTypes.array, groupsAccessor: PropTypes.func.isRequired, - intl: intlShape, + intl: PropTypes.object, }; export default reduxForm({ diff --git a/src/components/forms/ResetPasswordForm/ResetPasswordForm.js b/src/components/forms/ResetPasswordForm/ResetPasswordForm.js index 172d6706e..e7aeb8c77 100644 --- a/src/components/forms/ResetPasswordForm/ResetPasswordForm.js +++ b/src/components/forms/ResetPasswordForm/ResetPasswordForm.js @@ -12,7 +12,7 @@ import { EmailField } from '../Fields'; const ResetPasswordForm = ({ submitting, handleSubmit, hasFailed = false, hasSucceeded = false, invalid }) => ( } + title={} type={hasSucceeded ? 'success' : undefined} footer={
diff --git a/src/components/forms/SisBindGroupForm/SisBindGroupForm.js b/src/components/forms/SisBindGroupForm/SisBindGroupForm.js index 2b29d6f44..a2d2e7ddb 100644 --- a/src/components/forms/SisBindGroupForm/SisBindGroupForm.js +++ b/src/components/forms/SisBindGroupForm/SisBindGroupForm.js @@ -1,7 +1,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import { reduxForm, Field } from 'redux-form'; -import { FormattedMessage, injectIntl, intlShape } from 'react-intl'; +import { FormattedMessage, injectIntl } from 'react-intl'; import { Alert, Modal } from 'react-bootstrap'; import { SelectField } from '../Fields'; @@ -118,7 +118,7 @@ SisBindGroupForm.propTypes = { groupsAccessor: PropTypes.func.isRequired, course: PropTypes.object, courseGroupsCount: PropTypes.number, - intl: intlShape.isRequired, + intl: PropTypes.object.isRequired, }; const warn = ({ groupId }) => { diff --git a/src/components/forms/SisCreateGroupForm/SisCreateGroupForm.js b/src/components/forms/SisCreateGroupForm/SisCreateGroupForm.js index cc092f28b..7cada3f24 100644 --- a/src/components/forms/SisCreateGroupForm/SisCreateGroupForm.js +++ b/src/components/forms/SisCreateGroupForm/SisCreateGroupForm.js @@ -1,7 +1,7 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import { reduxForm, Field } from 'redux-form'; -import { FormattedMessage, injectIntl, intlShape } from 'react-intl'; +import { FormattedMessage, injectIntl } from 'react-intl'; import { Alert, Modal } from 'react-bootstrap'; import { SelectField } from '../Fields'; @@ -126,7 +126,7 @@ SisCreateGroupForm.propTypes = { groupsAccessor: PropTypes.func.isRequired, course: PropTypes.object, courseGroupsCount: PropTypes.number, - intl: intlShape.isRequired, + intl: PropTypes.object.isRequired, }; const warn = ({ parentGroupId }) => { diff --git a/src/components/forms/SubmitButton/SubmitButton.js b/src/components/forms/SubmitButton/SubmitButton.js index e99d5a0cb..04e91d206 100644 --- a/src/components/forms/SubmitButton/SubmitButton.js +++ b/src/components/forms/SubmitButton/SubmitButton.js @@ -125,7 +125,7 @@ SubmitButton.propTypes = { submitting: PropTypes.oneOfType([PropTypes.string, PropTypes.element]), validating: PropTypes.oneOfType([PropTypes.string, PropTypes.element]), }), - confirmQuestion: PropTypes.oneOfType([PropTypes.string, PropTypes.element, FormattedMessage]), + confirmQuestion: PropTypes.oneOfType([PropTypes.string, PropTypes.element]), }; export default SubmitButton; diff --git a/src/components/helpers/AceEditorLoader.js b/src/components/helpers/AceEditorLoader.js deleted file mode 100644 index f089d314b..000000000 --- a/src/components/helpers/AceEditorLoader.js +++ /dev/null @@ -1,47 +0,0 @@ -import { canUseDOM } from 'exenv'; - -export const loadAceEditor = () => { - let AceEditor = null; - if (canUseDOM) { - AceEditor = require('react-ace').default; - require('brace/theme/monokai'); - require('brace/theme/github'); - require('brace/mode/c_cpp'); - require('brace/mode/csharp'); - require('brace/mode/java'); - require('brace/mode/javascript'); - require('brace/mode/makefile'); - require('brace/mode/pascal'); - require('brace/mode/php'); - require('brace/mode/python'); - require('brace/keybinding/vim'); - } - return AceEditor; -}; - -export const getAceModeFromExtension = ext => { - const extMapping = { - java: 'java', - cs: 'csharp', - c: 'c_cpp', - cpp: 'c_cpp', - h: 'c_cpp', - hpp: 'c_cpp', - md: 'markdown', - markdown: 'markdown', - pas: 'pascal', - lpr: 'pascal', - py: 'python', - php: 'php', - js: 'javascript', - }; - - ext = ext.trim().toLowerCase(); - if (ext === '') { - return 'makefile'; // makefile has no extension - } else if (extMapping[ext]) { - return extMapping[ext]; // mapping found - } else { - return 'c_cpp'; // C/C++ is default - } -}; diff --git a/src/components/helpers/ClientOnly/ClientOnly.js b/src/components/helpers/ClientOnly/ClientOnly.js index 7e3112711..6d7a747d3 100644 --- a/src/components/helpers/ClientOnly/ClientOnly.js +++ b/src/components/helpers/ClientOnly/ClientOnly.js @@ -10,7 +10,7 @@ class ClientOnly extends Component { render() { if (this.state.isBrowser) { - return {this.props.children}; + return <>{this.props.children}; } else { return ; } diff --git a/src/components/helpers/SourceCodeViewer/SourceCodeViewer.js b/src/components/helpers/SourceCodeViewer/SourceCodeViewer.js index d6c22d259..8c6cdcfa7 100644 --- a/src/components/helpers/SourceCodeViewer/SourceCodeViewer.js +++ b/src/components/helpers/SourceCodeViewer/SourceCodeViewer.js @@ -1,31 +1,34 @@ import React from 'react'; import PropTypes from 'prop-types'; - +import { canUseDOM } from 'exenv'; import { UserSettingsContext } from '../../../helpers/contexts'; -import { loadAceEditor, getAceModeFromExtension } from '../../helpers/AceEditorLoader'; -const AceEditor = loadAceEditor(); +import { getAceModeFromExtension } from '../../helpers/ace'; + +const AceEditor = canUseDOM ? require('react-ace').default : null; -const SourceCodeViewer = ({ name, content = '', lineNumbers = true }) => ( - - {({ vimMode = false, darkTheme = false }) => ( - - )} - -); +const SourceCodeViewer = ({ name, content = '' }) => + canUseDOM ? ( + + {({ vimMode = false, darkTheme = false }) => ( + + )} + + ) : ( + <> + ); SourceCodeViewer.propTypes = { name: PropTypes.string.isRequired, content: PropTypes.string, - lineNumbers: PropTypes.bool, }; export default SourceCodeViewer; diff --git a/src/components/helpers/ace.js b/src/components/helpers/ace.js new file mode 100644 index 000000000..c5158dc8c --- /dev/null +++ b/src/components/helpers/ace.js @@ -0,0 +1,37 @@ +const extMapping = { + java: 'java', + css: 'css', + cs: 'csharp', + c: 'c_cpp', + cpp: 'c_cpp', + h: 'c_cpp', + hpp: 'c_cpp', + ino: 'c_cpp', + groovy: 'groovy', + html: 'html', + js: 'javascript', + kt: 'kotlin', + kts: 'kotlin', + ktm: 'kotlin', + md: 'markdown', + markdown: 'markdown', + pas: 'pascal', + lpr: 'pascal', + py: 'python', + php: 'php', + rs: 'rust', + sc: 'scala', + scala: 'scala', + ts: 'typescript', +}; + +export const getAceModeFromExtension = ext => { + ext = ext.trim().toLowerCase(); + if (ext === '') { + return 'makefile'; // makefile has no extension + } else if (extMapping[ext]) { + return extMapping[ext]; // mapping found + } else { + return 'c_cpp'; // C/C++ is default + } +}; diff --git a/src/components/layout/Page/Page.js b/src/components/layout/Page/Page.js index 858f8c9dc..2d25aa1a0 100644 --- a/src/components/layout/Page/Page.js +++ b/src/components/layout/Page/Page.js @@ -24,7 +24,7 @@ const Page = ({ failedTitle = ( - + ), failedDescription = ( diff --git a/src/components/layout/PageContent/PageContent.js b/src/components/layout/PageContent/PageContent.js index e42e287bf..1f34203ba 100644 --- a/src/components/layout/PageContent/PageContent.js +++ b/src/components/layout/PageContent/PageContent.js @@ -1,7 +1,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import Helmet from 'react-helmet'; -import { injectIntl, intlShape, FormattedMessage } from 'react-intl'; +import { injectIntl, FormattedMessage } from 'react-intl'; import { Container, Row, Col } from 'react-bootstrap'; import Breadcrumbs from '../../widgets/Breadcrumbs'; @@ -47,7 +47,7 @@ PageContent.propTypes = { description: PropTypes.oneOfType([PropTypes.string, PropTypes.element]), breadcrumbs: PropTypes.array, children: PropTypes.element, - intl: intlShape.isRequired, + intl: PropTypes.object.isRequired, }; export default injectIntl(PageContent); diff --git a/src/components/layout/Sidebar/Sidebar.js b/src/components/layout/Sidebar/Sidebar.js index ce7b70942..5044b509f 100644 --- a/src/components/layout/Sidebar/Sidebar.js +++ b/src/components/layout/Sidebar/Sidebar.js @@ -2,7 +2,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; import classnames from 'classnames'; -import { FormattedMessage, injectIntl, intlShape } from 'react-intl'; +import { FormattedMessage, injectIntl } from 'react-intl'; import { defaultMemoize } from 'reselect'; import { withRouter } from 'react-router'; import { Link } from 'react-router-dom'; @@ -229,7 +229,7 @@ Sidebar.propTypes = { instances: ImmutablePropTypes.list, small: PropTypes.bool, links: PropTypes.object, - intl: intlShape, + intl: PropTypes.object, }; export default withLinks(withRouter(injectIntl(Sidebar))); diff --git a/src/components/widgets/Box/Box.js b/src/components/widgets/Box/Box.js index f10c18628..4c92a4449 100644 --- a/src/components/widgets/Box/Box.js +++ b/src/components/widgets/Box/Box.js @@ -51,41 +51,21 @@ class Box extends Component { window.setTimeout(() => window.scrollTo(0, scrollPosition), 0); }; - renderBody() { - const { - description = null, - noPadding = false, - extraPadding = false, - children, - footer, - unlimitedHeight = false, - } = this.props; - return ( - <> - - {description &&
{description}
} -
{children}
-
- {footer && {footer}} - - ); - } - render() { const { id = null, title, + description = null, type = 'light', solid = false, collapsable = false, + noPadding = false, + extraPadding = false, + unlimitedHeight = false, customIcons = null, className = '', + children, + footer, } = this.props; const { isOpen = true } = this.state; @@ -126,11 +106,19 @@ class Box extends Component { )} - <> - {collapsable && {this.renderBody()}} - - {!collapsable && this.renderBody()} - + + + {description &&
{description}
} +
{children}
+
+ {footer && {footer}} +
); } @@ -138,16 +126,8 @@ class Box extends Component { Box.propTypes = { id: PropTypes.string, - title: PropTypes.oneOfType([ - PropTypes.string, - PropTypes.shape({ type: PropTypes.oneOf([FormattedMessage]) }), - PropTypes.element, - ]).isRequired, - description: PropTypes.oneOfType([ - PropTypes.string, - PropTypes.shape({ type: PropTypes.oneOf([FormattedMessage]) }), - PropTypes.element, - ]), + title: PropTypes.oneOfType([PropTypes.string, PropTypes.element]).isRequired, + description: PropTypes.oneOfType([PropTypes.string, PropTypes.element]), type: PropTypes.string, isOpen: PropTypes.bool, collapsable: PropTypes.bool, diff --git a/src/components/widgets/Breadcrumbs/BreadcrumbItem.js b/src/components/widgets/Breadcrumbs/BreadcrumbItem.js index 0707486f6..b6cc3ec0a 100644 --- a/src/components/widgets/Breadcrumbs/BreadcrumbItem.js +++ b/src/components/widgets/Breadcrumbs/BreadcrumbItem.js @@ -1,6 +1,5 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { FormattedMessage } from 'react-intl'; import { Link } from 'react-router-dom'; import { Breadcrumb } from 'react-bootstrap'; @@ -22,7 +21,7 @@ const BreadcrumbItem = ({ text, link = null, iconName = null, isActive = false, }; BreadcrumbItem.propTypes = { - text: PropTypes.oneOfType([PropTypes.string, PropTypes.element, FormattedMessage]).isRequired, + text: PropTypes.oneOfType([PropTypes.string, PropTypes.element]).isRequired, iconName: PropTypes.oneOfType([PropTypes.string, PropTypes.array]), link: PropTypes.oneOfType([PropTypes.string, PropTypes.func]), isActive: PropTypes.bool.isRequired, diff --git a/src/components/widgets/Comments/AddComment/AddComment.js b/src/components/widgets/Comments/AddComment/AddComment.js index 53141e307..2f5f9eb8f 100644 --- a/src/components/widgets/Comments/AddComment/AddComment.js +++ b/src/components/widgets/Comments/AddComment/AddComment.js @@ -1,6 +1,6 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; -import { FormattedMessage, FormattedHTMLMessage, injectIntl, intlShape, defineMessages } from 'react-intl'; +import { FormattedMessage, injectIntl, defineMessages } from 'react-intl'; import { Form, FormGroup, FormControl, InputGroup } from 'react-bootstrap'; import Button from '../../TheButton'; @@ -108,15 +108,21 @@ class AddComment extends Component { {isPrivate ? : } {isPrivate && ( - {text}, + }} /> )} {!isPrivate && ( - {text}, + }} /> )} @@ -128,7 +134,7 @@ class AddComment extends Component { AddComment.propTypes = { addComment: PropTypes.func, - intl: intlShape.isRequired, + intl: PropTypes.object.isRequired, }; export default injectIntl(AddComment); diff --git a/src/components/widgets/Comments/Comment/Status/Posted.js b/src/components/widgets/Comments/Comment/Status/Posted.js index 19849eecd..a2f5e2b4e 100644 --- a/src/components/widgets/Comments/Comment/Status/Posted.js +++ b/src/components/widgets/Comments/Comment/Status/Posted.js @@ -1,7 +1,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import classnames from 'classnames'; -import { FormattedRelative } from 'react-intl'; +import { FormattedRelativeTime } from 'react-intl'; const Posted = ({ right, postedAt }) => ( ( 'float-right': right, 'float-left': !right, })}> - + ); diff --git a/src/components/widgets/Comments/CommentBox/CommentBox.js b/src/components/widgets/Comments/CommentBox/CommentBox.js index cdf61ed6f..df48bf112 100644 --- a/src/components/widgets/Comments/CommentBox/CommentBox.js +++ b/src/components/widgets/Comments/CommentBox/CommentBox.js @@ -67,7 +67,7 @@ class CommentBox extends Component { } CommentBox.propTypes = { - title: PropTypes.oneOfType([PropTypes.oneOf([FormattedMessage]), PropTypes.element, PropTypes.string]), + title: PropTypes.oneOfType([PropTypes.element, PropTypes.string]), commentsCount: PropTypes.number.isRequired, footer: PropTypes.element, inModal: PropTypes.bool, diff --git a/src/components/widgets/Comments/CommentThread/CommentThread.js b/src/components/widgets/Comments/CommentThread/CommentThread.js index 867bca3f4..03ba90412 100644 --- a/src/components/widgets/Comments/CommentThread/CommentThread.js +++ b/src/components/widgets/Comments/CommentThread/CommentThread.js @@ -63,7 +63,7 @@ const CommentThread = ({ ); CommentThread.propTypes = { - title: PropTypes.oneOfType([PropTypes.oneOf([FormattedMessage]), PropTypes.element, PropTypes.string]), + title: PropTypes.oneOfType([PropTypes.element, PropTypes.string]), comments: PropTypes.array, currentUserId: PropTypes.string.isRequired, addComment: PropTypes.func, diff --git a/src/components/widgets/Comments/CommentThread/FailedCommentThread.js b/src/components/widgets/Comments/CommentThread/FailedCommentThread.js index 3b916a51e..337c7e213 100644 --- a/src/components/widgets/Comments/CommentThread/FailedCommentThread.js +++ b/src/components/widgets/Comments/CommentThread/FailedCommentThread.js @@ -10,10 +10,7 @@ const LoadingCommentThread = () => (

- +

diff --git a/src/components/widgets/DateTime/DateTime.js b/src/components/widgets/DateTime/DateTime.js index 2b9dbb7f5..615a2b06f 100644 --- a/src/components/widgets/DateTime/DateTime.js +++ b/src/components/widgets/DateTime/DateTime.js @@ -1,7 +1,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import { OverlayTrigger, Tooltip } from 'react-bootstrap'; -import { FormattedDate, FormattedTime, FormattedRelative } from 'react-intl'; +import { FormattedDate, FormattedTime, FormattedRelativeTime } from 'react-intl'; import classnames from 'classnames'; import Icon from '../../icons'; @@ -63,7 +63,7 @@ const dateTime = ({ [styles.trailingRelative]: showDate || showTime, [styles.standaloneRelative]: !showDate && !showTime, })}> - +
)} diff --git a/src/components/widgets/Footer/Footer.js b/src/components/widgets/Footer/Footer.js index 8b6a5fd5e..c7fdf49d0 100644 --- a/src/components/widgets/Footer/Footer.js +++ b/src/components/widgets/Footer/Footer.js @@ -1,24 +1,33 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { FormattedHTMLMessage } from 'react-intl'; +import { FormattedMessage } from 'react-intl'; const Footer = ({ version }) => (
- {text}, + a: caption => ( + + {caption} + + ), }} />
- ( + + {caption} + + ), year: Math.max(new Date().getFullYear(), 2018), }} /> diff --git a/src/components/widgets/InfoBox/InfoBox.js b/src/components/widgets/InfoBox/InfoBox.js index 0c332be2e..3268e268b 100644 --- a/src/components/widgets/InfoBox/InfoBox.js +++ b/src/components/widgets/InfoBox/InfoBox.js @@ -1,6 +1,6 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { FormattedMessage, FormattedNumber } from 'react-intl'; +import { FormattedMessage } from 'react-intl'; import classnames from 'classnames'; import Icon from '../../icons'; @@ -31,15 +31,10 @@ InfoBox.propTypes = { PropTypes.string, PropTypes.shape({ type: PropTypes.oneOf([FormattedMessage, GroupsName]) }), ]).isRequired, - value: PropTypes.oneOfType([ - PropTypes.number, - PropTypes.string, - PropTypes.shape({ type: PropTypes.oneOf([FormattedNumber]) }), - PropTypes.shape({ type: PropTypes.oneOf([FormattedMessage]) }), - ]), + value: PropTypes.oneOfType([PropTypes.number, PropTypes.string, PropTypes.element]), icon: PropTypes.string, spin: PropTypes.bool, - description: PropTypes.oneOfType([PropTypes.string, PropTypes.shape({ type: PropTypes.oneOf([FormattedMessage]) })]), + description: PropTypes.oneOfType([PropTypes.string, PropTypes.element]), progress: PropTypes.number, color: PropTypes.string, }; diff --git a/src/components/widgets/Markdown/Markdown.js b/src/components/widgets/Markdown/Markdown.js index 97032573d..0992d18f7 100644 --- a/src/components/widgets/Markdown/Markdown.js +++ b/src/components/widgets/Markdown/Markdown.js @@ -3,10 +3,10 @@ import PropTypes from 'prop-types'; const hljs = require('highlight.js'); const md = require('markdown-it')({ - highlight: function(str, lang) { - if (lang && hljs.getLanguage(lang)) { + highlight: function (str, language) { + if (language && hljs.getLanguage(language)) { try { - return hljs.highlight(lang, str).value; + return hljs.highlight(str, { language }).value; } catch (error) { /* just ignore the error */ } diff --git a/src/components/widgets/OptionalPopoverWrapper/OptionalPopoverWrapper.js b/src/components/widgets/OptionalPopoverWrapper/OptionalPopoverWrapper.js index 147db85b0..ae3687dda 100644 --- a/src/components/widgets/OptionalPopoverWrapper/OptionalPopoverWrapper.js +++ b/src/components/widgets/OptionalPopoverWrapper/OptionalPopoverWrapper.js @@ -1,6 +1,5 @@ import React, { useRef, useState } from 'react'; import PropTypes from 'prop-types'; -import { FormattedMessage } from 'react-intl'; import { Overlay, Popover } from 'react-bootstrap'; const HOVER = 'hover'; @@ -41,8 +40,8 @@ const OptionalPopoverWrapper = ({ }; OptionalPopoverWrapper.propTypes = { - title: PropTypes.oneOfType([PropTypes.oneOf([FormattedMessage]), PropTypes.element, PropTypes.string]), - contents: PropTypes.oneOfType([PropTypes.oneOf([FormattedMessage]), PropTypes.element, PropTypes.string]), + title: PropTypes.oneOfType([PropTypes.element, PropTypes.string]), + contents: PropTypes.oneOfType([PropTypes.element, PropTypes.string]), popoverId: PropTypes.string, placement: PropTypes.string, hide: PropTypes.bool, diff --git a/src/components/widgets/OptionalTooltipWrapper/OptionalTooltipWrapper.js b/src/components/widgets/OptionalTooltipWrapper/OptionalTooltipWrapper.js index 148e18196..77e0df8b5 100644 --- a/src/components/widgets/OptionalTooltipWrapper/OptionalTooltipWrapper.js +++ b/src/components/widgets/OptionalTooltipWrapper/OptionalTooltipWrapper.js @@ -1,6 +1,5 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { FormattedMessage } from 'react-intl'; import { OverlayTrigger, Tooltip } from 'react-bootstrap'; const OptionalTooltipWrapper = ({ tooltip, tooltipId = Date.now(), placement = 'bottom', hide = false, children }) => @@ -13,7 +12,7 @@ const OptionalTooltipWrapper = ({ tooltip, tooltipId = Date.now(), placement = ' ); OptionalTooltipWrapper.propTypes = { - tooltip: PropTypes.oneOfType([PropTypes.oneOf([FormattedMessage]), PropTypes.element, PropTypes.string]), + tooltip: PropTypes.oneOfType([PropTypes.element, PropTypes.string]), tooltipId: PropTypes.string, placement: PropTypes.string, hide: PropTypes.bool, diff --git a/src/components/widgets/Sidebar/UserPanel/UserPanel.js b/src/components/widgets/Sidebar/UserPanel/UserPanel.js index b2060885a..13b30d9e4 100644 --- a/src/components/widgets/Sidebar/UserPanel/UserPanel.js +++ b/src/components/widgets/Sidebar/UserPanel/UserPanel.js @@ -1,6 +1,6 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; -import { FormattedMessage, FormattedRelative } from 'react-intl'; +import { FormattedMessage, FormattedRelativeTime } from 'react-intl'; import { Link } from 'react-router-dom'; import { Tooltip, OverlayTrigger, Modal } from 'react-bootstrap'; @@ -70,7 +70,7 @@ class UserPanel extends Component { overlay={ {' '} - + }> ( - - - -); + simpleButton = false, + variant = 'primary', + size = null, +}) => + simpleButton ? ( + + ) : ( + + + + ); DownloadResultArchiveContainer.propTypes = { solutionId: PropTypes.string.isRequired, downloadSolutionArchive: PropTypes.func.isRequired, downloadRefSolutionArchive: PropTypes.func.isRequired, isReference: PropTypes.bool, + simpleButton: PropTypes.bool, + variant: PropTypes.string, + size: PropTypes.string, }; export default connect( diff --git a/src/containers/EvaluationProgressContainer/EvaluationProgressContainer.js b/src/containers/EvaluationProgressContainer/EvaluationProgressContainer.js index 1134b2ad7..6f4cd6677 100644 --- a/src/containers/EvaluationProgressContainer/EvaluationProgressContainer.js +++ b/src/containers/EvaluationProgressContainer/EvaluationProgressContainer.js @@ -95,7 +95,7 @@ class EvaluationProgressContainer extends Component { this.updateProgress(data); break; case 'FINISHED': - addMessage(this.formatMessage(data)); + addMessage(this.formatMessageInternal(data)); this.closeSocket(); addMessage({ wasSuccessful: true, @@ -106,7 +106,7 @@ class EvaluationProgressContainer extends Component { } }; - formatMessage = ({ + formatMessageInternal = ({ command, task_state = 'OK', // eslint-disable-line camelcase text = null, @@ -127,7 +127,7 @@ class EvaluationProgressContainer extends Component { updateProgress = task => { const { completedTask, skippedTask, failedTask } = this.props; - const msg = this.formatMessage(task); + const msg = this.formatMessageInternal(task); switch (task.task_state) { case 'COMPLETED': completedTask(msg); @@ -196,7 +196,7 @@ class EvaluationProgressContainer extends Component { finishProcessing={this.finish} onClose={this.userCloseAction} messages={List([ - this.formatMessage({ + this.formatMessageInternal({ command: 'TASK', task_state: 'SKIPPED', text: ( diff --git a/src/containers/EvaluationProgressContainer/randomMessages.js b/src/containers/EvaluationProgressContainer/randomMessages.js index a6201f810..48f6fb3e7 100644 --- a/src/containers/EvaluationProgressContainer/randomMessages.js +++ b/src/containers/EvaluationProgressContainer/randomMessages.js @@ -1,140 +1,140 @@ import { defineMessages } from 'react-intl'; export default defineMessages({ - m1: { id: 'app.randomMessages.m1', defaultMessage: 'Koupit mléko' }, - m2: { id: 'app.randomMessages.m2', defaultMessage: 'Koupit čaj' }, - m3: { id: 'app.randomMessages.m3', defaultMessage: 'Naučit se žonglovat' }, + m1: { id: 'app.randomMessages.m1', defaultMessage: 'Buy some milk' }, + m2: { id: 'app.randomMessages.m2', defaultMessage: 'Buy some tea' }, + m3: { id: 'app.randomMessages.m3', defaultMessage: 'Learn how to juggle' }, m4: { id: 'app.randomMessages.m4', - defaultMessage: 'Zmáčknout velké červené tlačítko', + defaultMessage: 'Push the big red button', }, - m5: { id: 'app.randomMessages.m5', defaultMessage: 'Dát si šlofíka' }, + m5: { id: 'app.randomMessages.m5', defaultMessage: 'Take a nap' }, m6: { id: 'app.randomMessages.m6', - defaultMessage: 'Začít už doopravdy vyhodnocovat úlohu', + defaultMessage: 'Start evaluation of student solution at last', }, - m7: { id: 'app.randomMessages.m7', defaultMessage: 'Jít si zaběhat' }, + m7: { id: 'app.randomMessages.m7', defaultMessage: 'Go for a run' }, m8: { id: 'app.randomMessages.m8', - defaultMessage: 'Dokázat Riemannovu hypotézu', + defaultMessage: 'Proove Riemann hypothesis', }, - m9: { id: 'app.randomMessages.m9', defaultMessage: 'Nakreslit hrocha' }, + m9: { id: 'app.randomMessages.m9', defaultMessage: 'Draw hippopotamus' }, m10: { id: 'app.randomMessages.m10', - defaultMessage: 'Přemýšlet nad smyslem života', + defaultMessage: 'Think about the meaning of life', }, - m11: { id: 'app.randomMessages.m11', defaultMessage: 'Dát si hrnek čaje' }, + m11: { id: 'app.randomMessages.m11', defaultMessage: 'Make a cup of tea' }, m12: { id: 'app.randomMessages.m12', - defaultMessage: 'Stresovat se blížícím se deadlinem', + defaultMessage: 'Freak out before near deadline', }, - m13: { id: 'app.randomMessages.m13', defaultMessage: 'Jít vyvenčit medvěda' }, + m13: { id: 'app.randomMessages.m13', defaultMessage: 'Take a bear for a walk' }, m14: { id: 'app.randomMessages.m14', - defaultMessage: 'Odskočit si na záchod', + defaultMessage: 'Take a leak', }, m15: { id: 'app.randomMessages.m15', - defaultMessage: 'Vygenerovat náhodné soubory na filesystému', + defaultMessage: 'Generate random files on the filesystem', }, m16: { id: 'app.randomMessages.m16', - defaultMessage: 'Provést inicializační proceduru operačního systému', + defaultMessage: 'Execute OS startup routine', }, m17: { id: 'app.randomMessages.m17', - defaultMessage: 'Natajno nahrát všechny vhodné zdrojové soubory', + defaultMessage: 'Secretly upload all feasible source files', }, m18: { id: 'app.randomMessages.m18', - defaultMessage: 'Najít TLB tabulku a zničit ji', + defaultMessage: 'Find TLB table and destroy it', }, m19: { id: 'app.randomMessages.m19', - defaultMessage: 'Stránkování vypnuto... Hodně štěstí', + defaultMessage: 'Paging switched off... Good luck', }, m20: { id: 'app.randomMessages.m20', - defaultMessage: 'Dekódování instrukce selhalo, připojen špatný procesor', + defaultMessage: 'Decoding of the instruction failed, wrong CPU connected', }, m21: { id: 'app.randomMessages.m21', - defaultMessage: 'Nalezena chyba v ReCodExu, hlavně to opravit hodně rychle', + defaultMessage: 'A bug in ReCodex has been found, try to fix it really fast', }, m22: { id: 'app.randomMessages.m22', - defaultMessage: 'Cache nenalezena, zkusit ji najít na Internetu', + defaultMessage: 'Cache not found, try to find it on the Internet', }, m23: { id: 'app.randomMessages.m23', - defaultMessage: 'HDD neodpovídá, vzbudit skřítky a zkusit to znovu', + defaultMessage: 'HDD not responding, wake up gnomes and try it again', }, m24: { id: 'app.randomMessages.m24', - defaultMessage: 'Algoritmus nefunguje, zapřemýšlet znovu...', + defaultMessage: 'Algorithm not working, rethink...', }, m25: { id: 'app.randomMessages.m25', - defaultMessage: 'Virtualizace nevirtualizuje pořádně, opravit', + defaultMessage: 'Virtualization not virtualizing properly, fix it', }, m26: { id: 'app.randomMessages.m26', - defaultMessage: 'Úloha je moc těžká, přeřadit na náš superpočítač', + defaultMessage: 'Assignment too difficult, reassign it to our supercomputer', }, m27: { id: 'app.randomMessages.m27', - defaultMessage: 'Napsat for-cyklus přímo do konzole', + defaultMessage: 'Write for-loop directly to the console', }, m28: { id: 'app.randomMessages.m28', - defaultMessage: 'Konečně zjistit, jak ukončit VIM', + defaultMessage: 'Finally discover how to terminate VIM session', }, m29: { id: 'app.randomMessages.m29', - defaultMessage: 'Opravit zahradní traktůrek', + defaultMessage: 'Repair your lawn mower', }, m30: { id: 'app.randomMessages.m30', - defaultMessage: 'Zkontrolovat vozidlo před jízdou', + defaultMessage: 'Check vehicle before ride', }, m31: { id: 'app.randomMessages.m31', - defaultMessage: 'Vytáhnout kámoše na "jedno"', + defaultMessage: 'Go out with friends', }, m32: { id: 'app.randomMessages.m32', - defaultMessage: 'Spočítat vtipy o Chucku Norrisovi', + defaultMessage: 'Count jokes about Chuck Norris', }, m33: { id: 'app.randomMessages.m33', - defaultMessage: 'Vyčistit klávesnici od zbytků jídla', + defaultMessage: 'Clean your greasy keyboard', }, m34: { id: 'app.randomMessages.m34', - defaultMessage: 'Koupit mamince kytičku', + defaultMessage: 'Buy a nice flower for your mom', }, m35: { id: 'app.randomMessages.m35', - defaultMessage: 'Podpořit oblíbený projekt', + defaultMessage: 'Support favourite project', }, m36: { id: 'app.randomMessages.m36', - defaultMessage: 'Zkusit to vypnout a zase zapnout', + defaultMessage: 'Try to turn it off and on again', }, m37: { id: 'app.randomMessages.m37', - defaultMessage: 'Nakreslit jednorožce na zeď', + defaultMessage: 'Draw an unicorn on the wall', }, }); export const extraMessages = defineMessages({ last: { id: 'app.randomMessages.last', - defaultMessage: 'Vygenerovat náhodné ohodnocení odevzdaného řešení', + defaultMessage: 'Generate random evaluation of submitted solution', }, error: { id: 'app.randomMessages.error', defaultMessage: - 'Nastala chyba při komunikaci se serverem a bohužel Vám nemůžeme ukázat, jaký ja aktuální průběh, ale nic hrozného se neděje. Výsledky budou dostupné tak jako tak již brzy po skončení vyhodnocení.', + 'Unexpected error during communication with server occured. We cannot show you actual progress of the evaluation, but do not worry. The results will be available as well after evaluation finishes.', }, }); diff --git a/src/containers/ExercisesListContainer/ExercisesListContainer.js b/src/containers/ExercisesListContainer/ExercisesListContainer.js index 11fcd6305..095990dd5 100644 --- a/src/containers/ExercisesListContainer/ExercisesListContainer.js +++ b/src/containers/ExercisesListContainer/ExercisesListContainer.js @@ -2,7 +2,7 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; import { connect } from 'react-redux'; -import { injectIntl, FormattedMessage, intlShape } from 'react-intl'; +import { injectIntl, FormattedMessage } from 'react-intl'; import { defaultMemoize } from 'reselect'; import { withRouter } from 'react-router'; @@ -34,28 +34,29 @@ const filterInitialValues = defaultMemoize( ); const transformAndSetFilterData = defaultMemoize( - (setFilters, rootGroup) => ({ search, author, tags, runtimeEnvironments }) => { - const data = {}; - if (search.trim()) { - data.search = search.trim(); + (setFilters, rootGroup) => + ({ search, author, tags, runtimeEnvironments }) => { + const data = {}; + if (search.trim()) { + data.search = search.trim(); + } + if (author) { + data.authorsIds = [author]; + } + if (rootGroup) { + data.groupsIds = [rootGroup]; + } + if (tags.length > 0) { + data.tags = tags; + } + + data.runtimeEnvironments = Object.keys(runtimeEnvironments).filter(rte => runtimeEnvironments[rte]); + if (runtimeEnvironments.length === 0) { + delete data.runtimeEnvironments; + } + + return setFilters(data); } - if (author) { - data.authorsIds = [author]; - } - if (rootGroup) { - data.groupsIds = [rootGroup]; - } - if (tags.length > 0) { - data.tags = tags; - } - - data.runtimeEnvironments = Object.keys(runtimeEnvironments).filter(rte => runtimeEnvironments[rte]); - if (runtimeEnvironments.length === 0) { - delete data.runtimeEnvironments; - } - - return setFilters(data); - } ); const getDefaultFilters = defaultMemoize(rootGroup => (rootGroup ? { groupsIds: [rootGroup] } : EMPTY_OBJ)); @@ -184,7 +185,7 @@ ExercisesListContainer.propTypes = { fetchTags: PropTypes.func.isRequired, runtimeEnvironments: ImmutablePropTypes.map.isRequired, assignExercise: PropTypes.func.isRequired, - intl: intlShape.isRequired, + intl: PropTypes.object.isRequired, links: PropTypes.object.isRequired, }; diff --git a/src/containers/ExercisesNameContainer/ExercisesNameContainer.js b/src/containers/ExercisesNameContainer/ExercisesNameContainer.js index 0248d58f7..1b54565ea 100644 --- a/src/containers/ExercisesNameContainer/ExercisesNameContainer.js +++ b/src/containers/ExercisesNameContainer/ExercisesNameContainer.js @@ -2,7 +2,7 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; import { connect } from 'react-redux'; -import { injectIntl, intlShape } from 'react-intl'; +import { injectIntl } from 'react-intl'; import { fetchExerciseIfNeeded } from '../../redux/modules/exercises'; import { exerciseSelector } from '../../redux/selectors/exercises'; @@ -42,7 +42,7 @@ ExercisesNameContainer.propTypes = { exerciseId: PropTypes.string.isRequired, exercise: ImmutablePropTypes.map, noLink: PropTypes.bool, - intl: intlShape.isRequired, + intl: PropTypes.object.isRequired, }; export default injectIntl( diff --git a/src/containers/ExternalLogin/ExternalLoginBox.js b/src/containers/ExternalLogin/ExternalLoginBox.js index 45dec2724..347f22de7 100644 --- a/src/containers/ExternalLogin/ExternalLoginBox.js +++ b/src/containers/ExternalLogin/ExternalLoginBox.js @@ -1,7 +1,7 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import { connect } from 'react-redux'; -import { FormattedMessage, FormattedHTMLMessage, intlShape, injectIntl } from 'react-intl'; +import { FormattedMessage, injectIntl } from 'react-intl'; import Button from '../../components/widgets/TheButton'; import Box from '../../components/widgets/Box'; @@ -118,32 +118,38 @@ class ExternalLoginBox extends Component {
}> -

- -

- {helpUrl && ( + <>

-

- )} - - {!pending && this.state.lastError && ( -

{getErrorMessage(formatMessage)(this.state.lastError)}

- )} - - {!pending && this.state.lastError === null && loginStatus === statusTypes.LOGIN_FAILED && ( -

- -

- )} + {helpUrl && ( +

+ {caption}, + }} + /> +

+ )} + + {!pending && this.state.lastError && ( +

+ {getErrorMessage(formatMessage)(this.state.lastError)} +

+ )} + + {!pending && this.state.lastError === null && loginStatus === statusTypes.LOGIN_FAILED && ( +

+ +

+ )} + ); } @@ -158,7 +164,7 @@ ExternalLoginBox.propTypes = { login: PropTypes.func.isRequired, fail: PropTypes.func.isRequired, afterLogin: PropTypes.func.isRequired, - intl: intlShape, + intl: PropTypes.object, }; export default connect( diff --git a/src/containers/FilesTableContainer/FilesTableContainer.js b/src/containers/FilesTableContainer/FilesTableContainer.js index e1fe26354..69d7366f0 100644 --- a/src/containers/FilesTableContainer/FilesTableContainer.js +++ b/src/containers/FilesTableContainer/FilesTableContainer.js @@ -2,7 +2,6 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import { connect } from 'react-redux'; import ImmutablePropTypes from 'react-immutable-proptypes'; -import { FormattedMessage } from 'react-intl'; import FilesTable from '../../components/Exercises/FilesTable'; import Box from '../../components/widgets/Box'; @@ -45,11 +44,7 @@ class FilesTableContainer extends Component { FilesTableContainer.propTypes = { uploadId: PropTypes.string.isRequired, - title: PropTypes.oneOfType([ - PropTypes.string, - PropTypes.shape({ type: PropTypes.oneOf([FormattedMessage]) }), - PropTypes.element, - ]).isRequired, + title: PropTypes.oneOfType([PropTypes.string, PropTypes.element]).isRequired, isOpen: PropTypes.bool, files: ImmutablePropTypes.map, usedFiles: PropTypes.instanceOf(Set), diff --git a/src/containers/LayoutContainer/LayoutContainer.js b/src/containers/LayoutContainer/LayoutContainer.js index c9374b84d..de1b9d0cb 100644 --- a/src/containers/LayoutContainer/LayoutContainer.js +++ b/src/containers/LayoutContainer/LayoutContainer.js @@ -1,7 +1,7 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import { connect } from 'react-redux'; -import { IntlProvider, addLocaleData } from 'react-intl'; +import { IntlProvider } from 'react-intl'; import moment from 'moment'; import { canUseDOM } from 'exenv'; @@ -12,7 +12,7 @@ import { toggleSize, toggleVisibility, collapse, unroll } from '../../redux/modu import { isVisible, isCollapsed } from '../../redux/selectors/sidebar'; import { isLoggedIn } from '../../redux/selectors/auth'; import { getLoggedInUserSettings } from '../../redux/selectors/users'; -import { messages, localeData } from '../../locales'; +import { messages } from '../../locales'; import { UserSettingsContext, LinksContext, UrlContext } from '../../helpers/contexts'; import { buildRoutes, getLinks } from '../../pages/routes'; @@ -85,8 +85,6 @@ class LayoutContainer extends Component { getMessages = lang => messages[lang] || messages[this.getDefaultLang()]; - getLocaleData = lang => localeData[lang] || localeData[this.getDefaultLang()]; - render() { const { lang, @@ -101,7 +99,6 @@ class LayoutContainer extends Component { setLang, } = this.props; - addLocaleData([...this.getLocaleData(lang)]); moment.locale(lang); return ( diff --git a/src/containers/MakeRemoveSupervisorButtonContainer/MakeRemoveSupervisorButtonContainer.js b/src/containers/MakeRemoveSupervisorButtonContainer/MakeRemoveSupervisorButtonContainer.js index cebf13776..861773db7 100644 --- a/src/containers/MakeRemoveSupervisorButtonContainer/MakeRemoveSupervisorButtonContainer.js +++ b/src/containers/MakeRemoveSupervisorButtonContainer/MakeRemoveSupervisorButtonContainer.js @@ -1,7 +1,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import { connect } from 'react-redux'; -import { injectIntl, intlShape } from 'react-intl'; +import { injectIntl } from 'react-intl'; import { makeSupervisor, removeSupervisor } from '../../redux/modules/groups'; import { fetchUserIfNeeded } from '../../redux/modules/users'; @@ -38,7 +38,7 @@ MakeRemoveSupervisorButtonContainer.propTypes = { makeSupervisor: PropTypes.func.isRequired, removeSupervisor: PropTypes.func.isRequired, fetchUserIfNeeded: PropTypes.func.isRequired, - intl: intlShape.isRequired, + intl: PropTypes.object.isRequired, }; const mapStateToProps = (state, { groupId, userId }) => ({ diff --git a/src/containers/PaginationContainer/PaginationContainer.js b/src/containers/PaginationContainer/PaginationContainer.js index 6a0cf9171..4112fb993 100644 --- a/src/containers/PaginationContainer/PaginationContainer.js +++ b/src/containers/PaginationContainer/PaginationContainer.js @@ -1,7 +1,7 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import { connect } from 'react-redux'; -import { FormattedMessage, injectIntl, intlShape } from 'react-intl'; +import { FormattedMessage, injectIntl } from 'react-intl'; import { Container, Row, Col, Pagination } from 'react-bootstrap'; import classnames from 'classnames'; @@ -320,7 +320,7 @@ PaginationContainer.propTypes = { setPaginationOrderBy: PropTypes.func.isRequired, setPaginationFilters: PropTypes.func.isRequired, fetchPaginated: PropTypes.func.isRequired, - intl: intlShape.isRequired, + intl: PropTypes.object.isRequired, }; export default connect( diff --git a/src/containers/ResendVerificationEmailContainer/ResendVerificationEmailContainer.js b/src/containers/ResendVerificationEmailContainer/ResendVerificationEmailContainer.js index dcfe6fcdb..8d7f81ebb 100644 --- a/src/containers/ResendVerificationEmailContainer/ResendVerificationEmailContainer.js +++ b/src/containers/ResendVerificationEmailContainer/ResendVerificationEmailContainer.js @@ -1,6 +1,6 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { intlShape, injectIntl } from 'react-intl'; +import { injectIntl } from 'react-intl'; import { connect } from 'react-redux'; import { resendVerificationEmail } from '../../redux/modules/emailVerification'; import { resendingStatusSelector } from '../../redux/selectors/emailVerification'; @@ -14,7 +14,7 @@ ResendVerificationEmailContainer.propTypes = { userId: PropTypes.string.isRequired, state: PropTypes.string, resend: PropTypes.func.isRequired, - intl: intlShape, + intl: PropTypes.object, }; export default connect( diff --git a/src/containers/SisIntegrationContainer/SisIntegrationContainer.js b/src/containers/SisIntegrationContainer/SisIntegrationContainer.js index 6ddecc1fd..1b4133dbb 100644 --- a/src/containers/SisIntegrationContainer/SisIntegrationContainer.js +++ b/src/containers/SisIntegrationContainer/SisIntegrationContainer.js @@ -1,7 +1,7 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import { connect } from 'react-redux'; -import { FormattedMessage, injectIntl, intlShape } from 'react-intl'; +import { FormattedMessage, injectIntl } from 'react-intl'; import { Link } from 'react-router-dom'; import { Card, Table } from 'react-bootstrap'; import { defaultMemoize } from 'reselect'; @@ -215,7 +215,7 @@ SisIntegrationContainer.propTypes = { sisCoursesGroups: PropTypes.func.isRequired, groupsAccessor: PropTypes.func.isRequired, links: PropTypes.object, - intl: intlShape.isRequired, + intl: PropTypes.object.isRequired, }; export default withLinks( diff --git a/src/containers/SisSupervisorGroupsContainer/SisSupervisorGroupsContainer.js b/src/containers/SisSupervisorGroupsContainer/SisSupervisorGroupsContainer.js index f1ccec7e5..8a42d483e 100644 --- a/src/containers/SisSupervisorGroupsContainer/SisSupervisorGroupsContainer.js +++ b/src/containers/SisSupervisorGroupsContainer/SisSupervisorGroupsContainer.js @@ -2,7 +2,7 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; import { connect } from 'react-redux'; -import { FormattedMessage, injectIntl, intlShape } from 'react-intl'; +import { FormattedMessage, injectIntl } from 'react-intl'; import { Table, Accordion, Card, OverlayTrigger, Tooltip, Popover } from 'react-bootstrap'; import { Link } from 'react-router-dom'; @@ -520,7 +520,7 @@ SisSupervisorGroupsContainer.propTypes = { sisPossibleParents: ImmutablePropTypes.map, groupsAccessor: PropTypes.func.isRequired, groupsResourcesAccessor: PropTypes.func.isRequired, - intl: intlShape.isRequired, + intl: PropTypes.object.isRequired, }; export default injectIntl( diff --git a/src/containers/SourceCodeViewerContainer/SourceCodeViewerContainer.js b/src/containers/SourceCodeViewerContainer/SourceCodeViewerContainer.js index 57bbdc416..ffee41b70 100644 --- a/src/containers/SourceCodeViewerContainer/SourceCodeViewerContainer.js +++ b/src/containers/SourceCodeViewerContainer/SourceCodeViewerContainer.js @@ -3,15 +3,17 @@ import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; import { connect } from 'react-redux'; import { FormattedMessage } from 'react-intl'; -import { Modal } from 'react-bootstrap'; +import { Dropdown, DropdownButton, Modal } from 'react-bootstrap'; + import Button from '../../components/widgets/TheButton'; import { DownloadIcon, LoadingIcon } from '../../components/icons'; - import { fetchFileIfNeeded, download } from '../../redux/modules/files'; import { fetchContentIfNeeded } from '../../redux/modules/filesContent'; import { getFile, getFilesContent } from '../../redux/selectors/files'; import ResourceRenderer from '../../components/helpers/ResourceRenderer'; import SourceCodeViewer from '../../components/helpers/SourceCodeViewer'; +import DownloadSolutionArchiveContainer from '../DownloadSolutionArchiveContainer'; +import UsersNameContainer from '../UsersNameContainer'; import styles from './sourceCode.less'; @@ -30,79 +32,105 @@ class SourceCodeViewerContainer extends Component { } render() { - const { show, onHide, download, file, content } = this.props; + const { + show, + onHide, + download, + file, + files, + content, + solutionId, + openAnotherFile, + isReference = false, + submittedBy = null, + } = this.props; return ( -
- - - - - - -
-
- -
- -
-
-
-
- - - -
+ + + + + + + + +
+ +
+
} resource={[file, content]}> {(file, content) => ( -
- - {file.name} - -
-
- - {(content.malformedCharacters || content.tooLarge) && ( -
- {content.malformedCharacters && ( -

- -

- )} - {content.tooLarge && ( -

- -

- )} -
- )} -
- + + + {files + .sort((a, b) => a.name.localeCompare(b.name, 'en')) + .map(f => ( + openAnotherFile(f.id)}> + {f.name} + + ))} + + + + + {files.length > 1 && ( + + )} + + {submittedBy && ( + + + + )} + + + + {(content.malformedCharacters || content.tooLarge) && ( +
+ {content.malformedCharacters && ( +

+ +

+ )} + {content.tooLarge && ( +

+ +

+ )}
-
-
-
- - - -
+ )} +
+ +
+
)} @@ -111,22 +139,30 @@ class SourceCodeViewerContainer extends Component { } SourceCodeViewerContainer.propTypes = { + solutionId: PropTypes.string.isRequired, fileId: PropTypes.string, - file: ImmutablePropTypes.map, + files: PropTypes.array.isRequired, show: PropTypes.bool, + isReference: PropTypes.bool, onHide: PropTypes.func.isRequired, + openAnotherFile: PropTypes.func.isRequired, + submittedBy: PropTypes.string, + file: ImmutablePropTypes.map, + content: ImmutablePropTypes.map, loadAsync: PropTypes.func.isRequired, download: PropTypes.func.isRequired, - content: ImmutablePropTypes.map, }; export default connect( (state, { fileId }) => ({ - file: getFile(fileId)(state), + file: fileId && getFile(fileId)(state), content: getFilesContent(fileId)(state), }), (dispatch, { fileId }) => ({ - loadAsync: () => Promise.all([dispatch(fetchFileIfNeeded(fileId)), dispatch(fetchContentIfNeeded(fileId))]), + loadAsync: () => + fileId + ? Promise.all([dispatch(fetchFileIfNeeded(fileId)), dispatch(fetchContentIfNeeded(fileId))]) + : Promise.resolve(), download: id => dispatch(download(id)), }) )(SourceCodeViewerContainer); diff --git a/src/containers/SourceCodeViewerContainer/sourceCode.less b/src/containers/SourceCodeViewerContainer/sourceCode.less index 50949cd75..27234f99f 100644 --- a/src/containers/SourceCodeViewerContainer/sourceCode.less +++ b/src/containers/SourceCodeViewerContainer/sourceCode.less @@ -1,12 +1,13 @@ .modal { - position: absolute; - width: auto; - height: auto; + position: absolute !important; + width: auto !important; + max-width: 100% !important; + height: auto !important; top: 1vmax; bottom: 1vmax; left: 1vmax; right: 1vmax; - margin: 0; + margin: 0 !important; & > :global(.modal-content) { min-height: 100%; diff --git a/src/helpers/dot.js b/src/helpers/dot.js index d6b5c25d9..b7e1a047d 100644 --- a/src/helpers/dot.js +++ b/src/helpers/dot.js @@ -1,4 +1,5 @@ -import Viz from 'viz.js/viz-lite'; +import Viz from 'viz.js'; +const { Module, render } = require('viz.js/lite.render.js'); const subnode = (node, port) => `"${node}__${port}"`; @@ -13,12 +14,14 @@ const createDotForPorts = (name, ports) => .filter(value => value.length > 0) .map(port => `${subnode(name, port)} [label="${port}"]`); -const createDotForNodeFactory = dependencies => (name, portsIn = {}, portsOut = {}, i) => { - const hasFullSupport = true; - const inputs = createDotForPorts(name, portsIn); - const outputs = createDotForPorts(name, portsOut); +const createDotForNodeFactory = + dependencies => + (name, portsIn = {}, portsOut = {}, i) => { + const hasFullSupport = true; + const inputs = createDotForPorts(name, portsIn); + const outputs = createDotForPorts(name, portsOut); - return ` + return ` subgraph cluster_${i} { label = "${name}"; id = "B-${name}"; @@ -44,7 +47,7 @@ const createDotForNodeFactory = dependencies => (name, portsIn = {}, portsOut = } ${inputs.length === 0 && outputs.length === 0 ? `"E-${name}" [label="void"]` : ''} }`; -}; + }; const createDotForDependencyFactory = nodes => (from, to, name) => { const nodeTo = nodes.find(node => node.name === to); @@ -72,5 +75,6 @@ export const convertGraphToDot = ({ nodes, dependencies }) => { export const convertGraphToSvg = graph => { const dot = graph ? convertGraphToDot(graph) : ''; - return Viz(dot); + const viz = new Viz({ Module, render }); + return viz.renderString(dot); }; diff --git a/src/helpers/withLinks.js b/src/helpers/withLinks.js index 7f500f7e4..0954af404 100644 --- a/src/helpers/withLinks.js +++ b/src/helpers/withLinks.js @@ -2,8 +2,8 @@ import React from 'react'; import { LinksContext } from '../helpers/contexts'; -const withLinks = (Inner: *) => { - const ComponentWithLinks = (props: any) => ( +const withLinks = Inner => { + const ComponentWithLinks = props => ( {links => } ); ComponentWithLinks.displayName = `withLinks(${Inner.displayName || Inner.name || 'Component'})`; diff --git a/src/locales/cs.json b/src/locales/cs.json index da5e27fb0..04d7f7964 100644 --- a/src/locales/cs.json +++ b/src/locales/cs.json @@ -281,7 +281,7 @@ "app.editEnvironmentConfig.warnings.noPipelinesVariables": "Zatím nejsou vybrané žádné pipelines. Jména proměnných proto není možné verifikovat.", "app.editEnvironmentConfig.warnings.unknownVariable": "Tato proměnná není definována v žádné pipeline.", "app.editEnvironmentSimpleForm.exclusiveEnvironment": "Exkluzivní běhové prostředí", - "app.editEnvironmentSimpleForm.linkToWiki": "Vyberte všechna běhová prostředí, která má tato úloha podporovat. Více informací o běhových prostředích naleznete na naší wiki stránce.", + "app.editEnvironmentSimpleForm.linkToWiki": "Vyberte všechna běhová prostředí, která má tato úloha podporovat. Více informací o běhových prostředích naleznete na naší wiki stránce.", "app.editEnvironmentSimpleForm.submit": "Uložit prostředí", "app.editEnvironmentSimpleForm.submitting": "Ukládám...", "app.editEnvironmentSimpleForm.success": "Konfigurace byla změněna.", @@ -792,7 +792,7 @@ "app.externalLogin.button.authenticating": "Ověřuji...", "app.externalLogin.description": "Přihlášení do ReCodExu pomocí externí autentizační služby '{name}'. Pokud ještě nemáte účet v ReCodExu, bude vám automaticky vytvořen. Pokud již máte lokální účet, bude automaticky spárován s vaší externí identitou podle e-malové adresy.", "app.externalLogin.failed": "Externí autentizace selhala.", - "app.externalLogin.help": "V případě potíží kontaktujte podporu.", + "app.externalLogin.help": "V případě potíží kontaktujte podporu.", "app.externalLogin.title": "Přihlásit se pomocí externí služby", "app.externalRegistrationForm.gdprConfirm": "Souhlasím se zpracování osobních údajů systémem ReCodex v souladu s GDPR směrnicí.", "app.externalRegistrationForm.instance": "Instance:", @@ -830,14 +830,18 @@ "app.filterExercisesListForm.selectedTags": "Vybrané nálepky:", "app.filterExercisesListForm.showAllFilters": "Zobrazit všechny filtry...", "app.filterUsersListForm.searchName": "Vyhledat podle jména", - "app.footer.copyright": "Copyright © 2016-{year} ReCodEx. Všechna práva vyhrazena.", - "app.footer.version": "Verze {version} (log změn)", + "app.footer.copyright": "Copyright © 2016-{year} ReCodEx. Všechna práva vyhrazena.", + "app.footer.version": "Verze {version} (log změn)", "app.forkExerciseForm.confirmSubmit": "Tento proces vytvoří další kopii zvolené úlohy. Duplikace dává smysl pouze v případech, kdy se pokoušíte vytvořit novou úlohu, ale nechcete začínat zcela od píky. Prosím, neduplikujte úlohy, pokud je vašim cílem pouze jejich připojení do jiné domovské skupiny. Opravdu chcete provést duplikaci?", "app.forkExerciseForm.showForkedExerciseButton": "Ukázat zduplikovanou úlohu", "app.forkExerciseForm.submit": "Zduplikovat úlohu", "app.forkExerciseForm.submitting": "Duplikování...", "app.forkExerciseForm.success": "Úloha zduplikována", "app.forkExerciseForm.successMessage": "Kopie této úlohy byla vytvořena ve zvolené skupině.", + "app.forkPipelineButton.success": "Zobrazit duplikovanou pipeline", + "app.forkPipelineForm.submit": "Zduplikovat pipeline", + "app.forkPipelineForm.submitting": "Duplikování...", + "app.forkPipelineForm.success": "Pipeline zduplikována", "app.generateTokenForm.copied": "Zkopírováno!", "app.generateTokenForm.copyToClipboard": "Kopírovat do schránky", "app.generateTokenForm.day": "1 Den", @@ -918,15 +922,12 @@ "app.hardwareGroupMetadata.wallTimeOverlay": "Omezení na wall-time limit", "app.header.languageSwitching.translationTitle": "Jazyková verze", "app.headerNotification.copiedToClippboard": "Zkopírováno do schránky.", - "app.homepage.aboutContentP1": "Projekt vznikl v rámci předmětu Softwarový projekt v roce 2016 jako náhrada za již zastaralý systém CodEx používaný na MFF UK. Projekt je zveřejněn pod MIT licencí a hostován na GitHubu. Podrobnější informace jsou k dispozici na Wiki projektu.", - "app.homepage.aboutContentP2": "Při vývoji se objevila řada témat pro studentské projekty různého typu, v případě zájmu o vylepšení tohoto systému neváhejte kontaktovat autory nebo některého z vyučujících.", "app.homepage.aboutTitle": "O projektu", "app.homepage.acknowledgementContent": "Tento projekt byl podpořen studentským fakultním grantem (SFG) Matematicko-fyzikální fakulty Univerzity Karlovy.", "app.homepage.acknowledgementTitle": "Poděkování", "app.homepage.description": "ReCodEx — úvodní stránka", "app.homepage.githubWebappRepository": "Repozitář ReCodEx Webapp", "app.homepage.help": "Nápověda", - "app.homepage.helpContent": "Pokud máte s používáním ReCodExu nějaké problémy, prosíme přečtěte si nejprve uživatelskou dokumentaci.", "app.homepage.howToGiveFeedback": "Pokud máte jakoukoliv zpětnou vazbu, ať už pozitivní nebo negativní, neváhejte založit issue na GitHubu. Pokud zakládáte zpětnou vazbu, dejte jí prosím tag 'feedback', ať můžeme rozlišit zpětnou vazbu od chyb. Budeme se snažit odpovědět a případně vyhovět potencionálním požadavkům. Dopředu děkujeme za jakoukoliv formu zpětné vazby!", "app.homepage.title": "ReCodEx — ReCodEx Code Examiner", "app.homepage.whatIsRecodex": "Co je ReCodEx?", @@ -973,7 +974,7 @@ "app.loginForm.validation.emptyEmail": "E-mailová adresa nemůže být prázdná.", "app.loginForm.validation.emptyPassword": "Heslo nemůže být prázdné.", "app.logout": "Odhlásit", - "app.markdownTextArea.canUseMarkdown": "V tomto poli je povoleno používat syntaxi markdown.", + "app.markdownTextArea.canUseMarkdown": "V tomto poli je povoleno používat syntaxi markdown.", "app.markdownTextArea.empty": "Prázdné", "app.markdownTextArea.preview": "Náhled:", "app.markdownTextArea.showPreview": "Ukaž náhled", @@ -1055,6 +1056,8 @@ "app.pipelinesList.judgeOnlyIconTooltip": "Pipeline pouze se sudím", "app.pipelinesList.stdoutIconTooltip": "Testované řešení by mělo vypsat svoje výsledky na standardní výstup", "app.pipelinesList.universalPipelineIconTooltip": "Univerzální pipeline, která se používá v konfiguracích běžných úloh.", + "app.pipelinesSimpleList.actions": "Akce", + "app.pipelinesSimpleList.empty": "Na seznamu nejsou žádné pipelines.", "app.plantSisTerm.noGroupsSelected": "Musí být vybrána alespoň jedna rodičovská skupina.", "app.plantSisTerm.plantGroups": "Osadit skupiny", "app.plantSisTerm.planted": "Osazeno", diff --git a/src/locales/en.json b/src/locales/en.json index 67f631425..0ef50a857 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -276,12 +276,12 @@ "app.editEnvironmentConfig.variableName": "Source Files Variable", "app.editEnvironmentConfig.variableType": "Type", "app.editEnvironmentConfig.variableValue": "Wildcard Pattern", - "app.editEnvironmentConfig.variablesInfo": "These variables cover the submitted files and how they are associated with pipeline inputs. Each value may hold a file name or a wildcard (e.g., solution.cpp, *.py, my-*.{c,h}). Only file and file[] variables are allowed here.", + "app.editEnvironmentConfig.variablesInfo": "These variables cover the submitted files and how they are associated with pipeline inputs. Each value may hold a file name or a wildcard (e.g., solution.cpp, *.py, my-*.[c,h]). Only file and file[] variables are allowed here.", "app.editEnvironmentConfig.warnings.ambiguousVariable": "This variable is defined in multiple pipelines. The value will be used in all of them.", "app.editEnvironmentConfig.warnings.noPipelinesVariables": "There are no pipelines set. Name of the variables may not be verified.", "app.editEnvironmentConfig.warnings.unknownVariable": "This variable is not defined in any pipeline.", "app.editEnvironmentSimpleForm.exclusiveEnvironment": "Exclusive runtime environment", - "app.editEnvironmentSimpleForm.linkToWiki": "Select all runtime environments the exercise should support. You may find more information about the environments at our wiki page.", + "app.editEnvironmentSimpleForm.linkToWiki": "Select all runtime environments the exercise should support. You may find more information about the environments at our wiki page.", "app.editEnvironmentSimpleForm.submit": "Save Environments", "app.editEnvironmentSimpleForm.submitting": "Saving Environments...", "app.editEnvironmentSimpleForm.success": "Environments Saved.", @@ -792,7 +792,7 @@ "app.externalLogin.button.authenticating": "Authenticating...", "app.externalLogin.description": "Sign-in into ReCodEx using external authentication service '{name}'. If you do not have an account in ReCodEx, it will attempt to create one. If you do have a local account, it will be associated with your external identity if both have the same e-mail address.", "app.externalLogin.failed": "External authentication failed.", - "app.externalLogin.help": "In case of any problems, contact the support.", + "app.externalLogin.help": "In case of any problems, contact the support.", "app.externalLogin.title": "Sign-in by External Authenticator", "app.externalRegistrationForm.gdprConfirm": "I agree that my personal data will be processed by ReCodEx in accordance with GDPR policy.", "app.externalRegistrationForm.instance": "Instance:", @@ -830,14 +830,18 @@ "app.filterExercisesListForm.selectedTags": "Selected Tags:", "app.filterExercisesListForm.showAllFilters": "Show all filters...", "app.filterUsersListForm.searchName": "Search by name", - "app.footer.copyright": "Copyright © 2016-{year} ReCodEx. All rights reserved.", - "app.footer.version": "Version {version} (changelog)", + "app.footer.copyright": "Copyright © 2016-{year} ReCodEx. All rights reserved.", + "app.footer.version": "Version {version} (changelog)", "app.forkExerciseForm.confirmSubmit": "Fork process will create another copy of the exercise. This only make sense if you need to create a different exercise and you do not want to start from scratch. Please, do not fork exercises just to attach them to a different groups of residence. Are you sure you would like to proceed with forking?", "app.forkExerciseForm.showForkedExerciseButton": "Show the Forked Exercise", "app.forkExerciseForm.submit": "Fork Exercise", "app.forkExerciseForm.submitting": "Forking...", "app.forkExerciseForm.success": "Exercise forked", "app.forkExerciseForm.successMessage": "A copy of the exercise was successfully created in the designated group.", + "app.forkPipelineButton.success": "Show the forked pipeline", + "app.forkPipelineForm.submit": "Fork pipeline", + "app.forkPipelineForm.submitting": "Forking...", + "app.forkPipelineForm.success": "Pipeline forked", "app.generateTokenForm.copied": "Copied!", "app.generateTokenForm.copyToClipboard": "Copy to Clipboard", "app.generateTokenForm.day": "1 Day", @@ -918,15 +922,12 @@ "app.hardwareGroupMetadata.wallTimeOverlay": "Wall time limit constraints", "app.header.languageSwitching.translationTitle": "Translation", "app.headerNotification.copiedToClippboard": "Copied to clippboard.", - "app.homepage.aboutContentP1": "ReCodEx was born in 2016 as a project for the Software Project class. It is a replacement for the previous system CodEx used at MFF UK since 2006. The project is open source under the MIT licence hosted on GitHub. More detailed info is on the Wiki page of the project.", - "app.homepage.aboutContentP2": "During development we found a number of topics for subsequent student projects of various kinds. If you are interested in making this project more awesome, please contact one of the authors or teachers.", "app.homepage.aboutTitle": "About", "app.homepage.acknowledgementContent": "This project was supported by the Student Grant Program (SFG) of the Faculty of Mathematics and Physics, Charles University.", "app.homepage.acknowledgementTitle": "Acknowledgement", "app.homepage.description": "ReCodEx - homepage", "app.homepage.githubWebappRepository": "ReCodEx Webapp Repository", "app.homepage.help": "Help", - "app.homepage.helpContent": "If you have any issues with ReCodEx, please consult the user documentation first.", "app.homepage.howToGiveFeedback": "For any kind of feedback, either positive or negative, feel free to create an issue on GitHub. Just please give your feedback the tag 'feedback' so we can distinguish it from bugs. We will try to respond to your feedback and we will see if there is something that can be done about it. We thank you for all your feedback in advance!", "app.homepage.title": "ReCodEx — ReCodEx Code Examiner", "app.homepage.whatIsRecodex": "What is ReCodEx?", @@ -935,7 +936,7 @@ "app.homepage.whereToReportBugsText": "Every software system contains bugs and we are well aware of this fact. From time to time you might find a bug that nobody else has reported and which has not been fixed yet. Please report all bugs to our issue tracker on GitHub - just file a new issue and give it the label 'bug'. We will try to investigate and release a bug fix as soon as possible.", "app.instance.description": "Instance overview", "app.instance.edit": "Edit instance", - "app.instance.groups.noGroups": "There are no groups in this ReCodEx instance currently visible to you", + "app.instance.groups.noGroups": "There are no groups in this ReCodEx instance currently visible to you.", "app.instance.groupsTitle": "Groups Hierarchy", "app.instance.hasValidLicence": "{name} has a valid licence:", "app.instance.licencesTitle": "Licences", @@ -973,7 +974,7 @@ "app.loginForm.validation.emptyEmail": "E-mail address cannot be empty.", "app.loginForm.validation.emptyPassword": "Password cannot be empty.", "app.logout": "Logout", - "app.markdownTextArea.canUseMarkdown": "You can use markdown syntax in this field.", + "app.markdownTextArea.canUseMarkdown": "You can use markdown syntax in this field.", "app.markdownTextArea.empty": "Empty", "app.markdownTextArea.preview": "Preview:", "app.markdownTextArea.showPreview": "Preview", @@ -1055,6 +1056,8 @@ "app.pipelinesList.judgeOnlyIconTooltip": "Judge-only pipeline", "app.pipelinesList.stdoutIconTooltip": "Tested solution is expected to yield results to standard output", "app.pipelinesList.universalPipelineIconTooltip": "Universal pipeline which is used in common (simple) exercise configurations.", + "app.pipelinesSimpleList.actions": "Actions", + "app.pipelinesSimpleList.empty": "There are no pipelines in this list.", "app.plantSisTerm.noGroupsSelected": "At least one parent group needs to be selected.", "app.plantSisTerm.plantGroups": "Plant Groups", "app.plantSisTerm.planted": "Planted", @@ -1444,7 +1447,7 @@ "app.submitSolution.limitsExceeded": "Solution file limits have been exceeded", "app.submitSolution.limitsExceededCount": "You may submit no more than {limit} {limit, plural, one {file} other {files}}.", "app.submitSolution.limitsExceededSize": "Total size of the solution must not exceed {limit} KiB.", - "app.submitSolution.linkToWiki": "Select the right environment, under which you wish to submit your solution. You may find more information about the environments at our wiki page.", + "app.submitSolution.linkToWiki": "Select the right environment, under which you wish to submit your solution. You may find more information about the environments at our wiki page.", "app.submitSolution.noEnvironments": "Uploaded files do not meet criteria of any allowed runtime environment.", "app.submitSolution.noteLabel": "Note for you and your supervisor(s):", "app.submitSolution.runtimeEnvironment": "Select runtime environment (programming language):", diff --git a/src/locales/index.js b/src/locales/index.js index 04a87b001..102f5b152 100644 --- a/src/locales/index.js +++ b/src/locales/index.js @@ -3,12 +3,15 @@ import { canUseDOM } from 'exenv'; import messagesCs from './cs'; // eslint-disable-line import messagesEn from './en'; // eslint-disable-line -import en from 'react-intl/locale-data/en'; -import cs from 'react-intl/locale-data/cs'; +import '@formatjs/intl-pluralrules/polyfill'; +import '@formatjs/intl-pluralrules/locale-data/en'; +import '@formatjs/intl-pluralrules/locale-data/cs'; +import '@formatjs/intl-relativetimeformat/polyfill'; +import '@formatjs/intl-relativetimeformat/locale-data/en'; +import '@formatjs/intl-relativetimeformat/locale-data/cs'; export const messages = { cs: messagesCs, en: messagesEn }; export const isAvailable = lang => Object.keys(messages).indexOf(lang) !== -1; -export const localeData = { cs, en }; export const getDefaultLang = () => { if (canUseDOM) { diff --git a/src/locales/whitelist_cs.json b/src/locales/whitelist_cs.json index 440a7ceb4..89bf97fda 100644 --- a/src/locales/whitelist_cs.json +++ b/src/locales/whitelist_cs.json @@ -1,22 +1,41 @@ [ - "app.evaluationProgressStatus.ok", - "generic.detail", "app.attachmentFilesTable.url", + "app.broker.title", "app.changePasswordForm.email", - "app.passwordStrength.ok", - "app.passwordStrength.unknown", - "app.externalRegistrationForm.instance", + "app.evaluationProgressStatus.ok", + "app.exitCodes.csharp.0", + "app.exitCodes.csharp.1", + "app.exitCodes.csharp.101", + "app.exitCodes.csharp.102", + "app.exitCodes.csharp.103", + "app.exitCodes.csharp.104", + "app.exitCodes.csharp.105", + "app.exitCodes.csharp.106", + "app.exitCodes.csharp.107", + "app.exitCodes.csharp.108", + "app.exitCodes.csharp.109", + "app.exitCodes.csharp.200", + "app.exitCodes.csharp.201", + "app.exitCodes.csharp.202", + "app.exitCodes.java.0", + "app.exitCodes.java.1", + "app.exitCodes.java.100", + "app.exitCodes.java.101", + "app.exitCodes.java.102", + "app.exitCodes.java.103", + "app.exitCodes.java.104", + "app.exitCodes.java.105", + "app.exitCodes.java.106", + "app.exitCodes.java.107", + "app.exitCodes.java.108", + "app.exitCodes.java.109", + "app.exitCodes.java.110", + "app.exitCodes.java.111", + "app.exitCodes.java.112", + "app.exitCodes.java.113", + "app.exitCodes.java.2", "app.exitCodes.pascal.0", "app.exitCodes.pascal.1", - "app.exitCodes.pascal.2", - "app.exitCodes.pascal.3", - "app.exitCodes.pascal.4", - "app.exitCodes.pascal.5", - "app.exitCodes.pascal.6", - "app.exitCodes.pascal.12", - "app.exitCodes.pascal.15", - "app.exitCodes.pascal.16", - "app.exitCodes.pascal.17", "app.exitCodes.pascal.100", "app.exitCodes.pascal.101", "app.exitCodes.pascal.102", @@ -24,6 +43,8 @@ "app.exitCodes.pascal.104", "app.exitCodes.pascal.105", "app.exitCodes.pascal.106", + "app.exitCodes.pascal.12", + "app.exitCodes.pascal.15", "app.exitCodes.pascal.150", "app.exitCodes.pascal.151", "app.exitCodes.pascal.152", @@ -32,9 +53,12 @@ "app.exitCodes.pascal.157", "app.exitCodes.pascal.158", "app.exitCodes.pascal.159", + "app.exitCodes.pascal.16", "app.exitCodes.pascal.160", "app.exitCodes.pascal.161", "app.exitCodes.pascal.162", + "app.exitCodes.pascal.17", + "app.exitCodes.pascal.2", "app.exitCodes.pascal.200", "app.exitCodes.pascal.201", "app.exitCodes.pascal.202", @@ -61,6 +85,10 @@ "app.exitCodes.pascal.229", "app.exitCodes.pascal.231", "app.exitCodes.pascal.232", + "app.exitCodes.pascal.3", + "app.exitCodes.pascal.4", + "app.exitCodes.pascal.5", + "app.exitCodes.pascal.6", "app.exitCodes.python3.0", "app.exitCodes.python3.1", "app.exitCodes.python3.101", @@ -78,55 +106,19 @@ "app.exitCodes.python3.113", "app.exitCodes.python3.114", "app.exitCodes.python3.115", - "app.exitCodes.java.0", - "app.exitCodes.java.1", - "app.exitCodes.java.2", - "app.exitCodes.java.100", - "app.exitCodes.java.101", - "app.exitCodes.java.102", - "app.exitCodes.java.103", - "app.exitCodes.java.104", - "app.exitCodes.java.105", - "app.exitCodes.java.106", - "app.exitCodes.java.107", - "app.exitCodes.java.108", - "app.exitCodes.java.109", - "app.exitCodes.java.110", - "app.exitCodes.java.111", - "app.exitCodes.java.112", - "app.exitCodes.java.113", - "app.exitCodes.csharp.0", - "app.exitCodes.csharp.1", - "app.exitCodes.csharp.101", - "app.exitCodes.csharp.102", - "app.exitCodes.csharp.103", - "app.exitCodes.csharp.104", - "app.exitCodes.csharp.105", - "app.exitCodes.csharp.106", - "app.exitCodes.csharp.107", - "app.exitCodes.csharp.108", - "app.exitCodes.csharp.109", - "app.exitCodes.csharp.200", - "app.exitCodes.csharp.201", - "app.exitCodes.csharp.202", - "app.roles.student", - "app.instancesTable.admin", - "app.sidebar.menu.title", - "app.sidebar.menu.faq", - "app.scoreConfigInfoWeighted.test", - "app.submissions.testResultsTable.statusOK", + "app.externalRegistrationForm.instance", "app.failureList.headLink", - "app.systemMessagesList.text", - "generic.role", + "app.faq.description", + "app.faq.title", + "app.homepage.title", + "app.instance.title", + "app.instancesTable.admin", + "app.passwordStrength.ok", + "app.passwordStrength.unknown", + "app.pipeline.title", + "app.randomMessages.error", + "app.randomMessages.last", "app.randomMessages.m1", - "app.randomMessages.m2", - "app.randomMessages.m3", - "app.randomMessages.m4", - "app.randomMessages.m5", - "app.randomMessages.m6", - "app.randomMessages.m7", - "app.randomMessages.m8", - "app.randomMessages.m9", "app.randomMessages.m10", "app.randomMessages.m11", "app.randomMessages.m12", @@ -137,6 +129,7 @@ "app.randomMessages.m17", "app.randomMessages.m18", "app.randomMessages.m19", + "app.randomMessages.m2", "app.randomMessages.m20", "app.randomMessages.m21", "app.randomMessages.m22", @@ -147,6 +140,7 @@ "app.randomMessages.m27", "app.randomMessages.m28", "app.randomMessages.m29", + "app.randomMessages.m3", "app.randomMessages.m30", "app.randomMessages.m31", "app.randomMessages.m32", @@ -155,12 +149,19 @@ "app.randomMessages.m35", "app.randomMessages.m36", "app.randomMessages.m37", - "app.randomMessages.last", - "app.randomMessages.error", - "app.instance.title", - "app.pipeline.title", - "app.faq.title", - "app.faq.description", - "app.broker.title", - "generic.email" + "app.randomMessages.m4", + "app.randomMessages.m5", + "app.randomMessages.m6", + "app.randomMessages.m7", + "app.randomMessages.m8", + "app.randomMessages.m9", + "app.roles.student", + "app.scoreConfigInfoWeighted.test", + "app.sidebar.menu.faq", + "app.sidebar.menu.title", + "app.submissions.testResultsTable.statusOK", + "app.systemMessagesList.text", + "generic.detail", + "generic.email", + "generic.role" ] \ No newline at end of file diff --git a/src/locales/whitelist_en.json b/src/locales/whitelist_en.json deleted file mode 100644 index c4f3598cf..000000000 --- a/src/locales/whitelist_en.json +++ /dev/null @@ -1,1581 +0,0 @@ -[ - "app.EditLimitsForm.cloneAll.yesNoQuestion", - "app.EditLimitsForm.cloneHorizontal.yesNoQuestion", - "app.EditLimitsForm.validation.NaN", - "app.EditLimitsForm.validation.outOfRange", - "app.ExercisePrefixIcons.isLocked", - "app.ExercisePrefixIcons.isPrivate", - "app.acceptSolution.accepted", - "app.acceptSolution.acceptedShort", - "app.acceptSolution.notAccepted", - "app.acceptSolution.notAcceptedShort", - "app.addExerciseTagForm.submit", - "app.addExerciseTagForm.submitting", - "app.addExerciseTagForm.success", - "app.addExerciseTagForm.validation.alreadyAssigned", - "app.addExerciseTagForm.validation.invalidCharacters", - "app.addExerciseTagForm.validation.tooLong", - "app.addExerciseTagForm.validation.tooShort", - "app.addExerciseTagForm.warnings.newTag", - "app.addExerciseTagForm.warnings.tooLong", - "app.addExerciseTagForm.warnings.tooShort", - "app.addLicence.addLicenceTitle", - "app.addLicence.failed", - "app.addLicence.note", - "app.addLicence.processing", - "app.addLicence.set", - "app.addLicence.success", - "app.addLicence.validUntil", - "app.addLicence.validation.note", - "app.addLicence.validation.validUntilEmpty", - "app.addLicence.validation.validUntilInThePast", - "app.addSisTermForm.failed", - "app.addSisTermForm.processing", - "app.addSisTermForm.submit", - "app.addSisTermForm.success", - "app.addSisTermForm.summer", - "app.addSisTermForm.term", - "app.addSisTermForm.title", - "app.addSisTermForm.winter", - "app.addSisTermForm.year", - "app.addUserContainer.emptyQuery", - "app.allowUserButton.confirmAllow", - "app.allowUserButton.confirmDisallow", - "app.apiErrorCodes.400-001", - "app.apiErrorCodes.400-101", - "app.apiErrorCodes.400-104", - "app.apiErrorCodes.400-105", - "app.apiErrorCodes.400-106", - "app.apiErrorCodes.403-001", - "app.apiErrorCodes.403-002", - "app.apiErrorCodes.409_100", - "app.apiErrorCodes.409_101", - "app.apiErrorCodes.409_102", - "app.apiErrorCodes.500-000", - "app.apiErrorCodes.unknown", - "app.archive.archivedGroups", - "app.archive.description", - "app.archive.title", - "app.archiveGroupButton.set", - "app.archiveGroupButton.setShort", - "app.archiveGroupButton.unset", - "app.archiveGroupButton.unsetShort", - "app.archiveSisTerm.archiveGroups", - "app.archiveSisTerm.archived", - "app.archiveSisTerm.archiving", - "app.archiveSisTerm.failed", - "app.archiveSisTerm.noGroups", - "app.archiveSisTerm.noGroupsSelected", - "app.archiveSisTerm.title", - "app.assignExerciseButton.isBroken", - "app.assignExerciseButton.isLocked", - "app.assignExerciseButton.noRefSolutions", - "app.assignemntStatusIcon.evaluationFailed", - "app.assignemntStatusIcon.failed", - "app.assignemntStatusIcon.inProgress", - "app.assignemntStatusIcon.isBestSolution", - "app.assignemntStatusIcon.none", - "app.assignemntStatusIcon.ok", - "app.assignemntStatusIcon.solutionMissingSubmission", - "app.assignment.alreadySubmitted", - "app.assignment.assignedAtExplanation", - "app.assignment.deadline", - "app.assignment.downloadBestSolutionsArchive", - "app.assignment.error", - "app.assignment.errorExplanation", - "app.assignment.exerciseDeleted", - "app.assignment.exerciseDeletedInfo", - "app.assignment.isBonus", - "app.assignment.loading", - "app.assignment.maxPointsCurrent", - "app.assignment.maxPointsFirst", - "app.assignment.maxPointsSecond", - "app.assignment.pointsPercentualThreshold", - "app.assignment.runtimeEnvironmentsIds", - "app.assignment.secondDeadline", - "app.assignment.solutionFilesLimit", - "app.assignment.solutionSizeLimit", - "app.assignment.submissionsCountLimit", - "app.assignment.syncAttachmentFiles", - "app.assignment.syncButton", - "app.assignment.syncButton.exerciseBroken", - "app.assignment.syncConfigurationType", - "app.assignment.syncDescription", - "app.assignment.syncExerciseConfig", - "app.assignment.syncExerciseEnvironmentConfigs", - "app.assignment.syncExerciseTests", - "app.assignment.syncHardwareGroups", - "app.assignment.syncLimits", - "app.assignment.syncLocalizedTexts", - "app.assignment.syncMergeJudgeLogs", - "app.assignment.syncRequired", - "app.assignment.syncRuntimeEnvironments", - "app.assignment.syncScoreConfig", - "app.assignment.syncSupplementaryFiles", - "app.assignment.title", - "app.assignment.viewResults", - "app.assignment.visible", - "app.assignment.visibleFrom", - "app.assignmentStats.assignmentSolutions", - "app.assignmentStats.groupByUsersCheckbox", - "app.assignmentStats.noSolutions", - "app.assignmentStats.onlyBestSolutionsCheckbox", - "app.assignmentStats.title", - "app.assignments.deadline", - "app.assignments.discussionModalTitle", - "app.assignments.group", - "app.assignments.maxPoints", - "app.assignments.maxPointsShort", - "app.assignments.name", - "app.assignments.points", - "app.assignments.secondDeadline", - "app.assignmentsTable.noAssignments", - "app.assignmentsTableRow.loading", - "app.asyncJobs.abort", - "app.asyncJobs.list.abortConfirm", - "app.asyncJobs.list.args", - "app.asyncJobs.list.associatedAssignment", - "app.asyncJobs.list.command", - "app.asyncJobs.list.noJobs", - "app.asyncJobs.list.processInfo", - "app.asyncJobs.list.retries", - "app.asyncJobs.list.title", - "app.asyncJobs.list.worker", - "app.asyncJobs.ping", - "app.asyncJobs.title", - "app.attachmentFiles.deleteConfirm", - "app.attachmentFilesTable.description", - "app.attachmentFilesTable.title", - "app.attachmentFilesTable.url", - "app.badge.effectiveRoleDialog.title", - "app.badge.failedLoading", - "app.badge.failedLoadingInfo", - "app.badge.sessionExpiration", - "app.box.highlighterExplanation", - "app.broker.confirmFreeze", - "app.broker.confirmUnfreeze", - "app.broker.freeze", - "app.broker.stats", - "app.broker.title", - "app.broker.unfreeze", - "app.changePassword.description", - "app.changePassword.requestAnotherLink", - "app.changePassword.title", - "app.changePassword.tokenExpired", - "app.changePassword.tokenExpiresIn", - "app.changePasswordForm.changePassword", - "app.changePasswordForm.email", - "app.changePasswordForm.failed", - "app.changePasswordForm.oldPassword", - "app.changePasswordForm.password", - "app.changePasswordForm.passwordCheck", - "app.changePasswordForm.passwordStrength", - "app.changePasswordForm.processing", - "app.changePasswordForm.succeeded", - "app.changePasswordForm.success", - "app.changePasswordForm.title", - "app.changePasswordForm.validation.emptyPassword", - "app.changePasswordForm.validation.passwordTooWeak", - "app.changePasswordForm.validation.passwordsDontMatch", - "app.comments.addComment", - "app.comments.commentPlaceholder", - "app.comments.everyoneCanSeeThisComment", - "app.comments.loadingCommentThread", - "app.comments.noCommentsYet", - "app.comments.onlyYouCanSeeThisComment", - "app.comments.publishing", - "app.comments.publishingFailed", - "app.comments.title", - "app.comments.warnings.isPrivate", - "app.comments.warnings.isPublic", - "app.confirm.no", - "app.confirm.yes", - "app.createExerciseForm.selectGroupFirst", - "app.createExerciseForm.title", - "app.createExerciseForm.validation.noGroupSelected", - "app.createGroup.detaining", - "app.createGroup.externalId", - "app.createGroup.hasThreshold", - "app.createGroup.isOrganizational", - "app.createGroup.isPublic", - "app.createGroup.makeMeAdmin", - "app.createGroup.publicStats", - "app.createGroup.threshold", - "app.createUserForm.validation.emailTaken", - "app.createUserForm.validation.emptyPassword", - "app.dashboard.memberOf", - "app.dashboard.sisGroupsStudent", - "app.dashboard.sisGroupsStudentExplain", - "app.dashboard.studentNoGroups", - "app.dashboard.studentNoGroupsTitle", - "app.dashboard.supervisorNoGroups", - "app.dashboard.supervisorNoGroupsTitle", - "app.dashboard.supervisorOf", - "app.dashboard.title", - "app.deadlineValidation.deadlineInFarFuture", - "app.deadlineValidation.emptyDeadline", - "app.deadlineValidation.invalidDateTime", - "app.deadlineValidation.secondDeadlineBeforeFirstDeadline", - "app.deleteButton.confirm", - "app.editAssignment.deleteAssignment", - "app.editAssignment.deleteAssignmentWarning", - "app.editAssignment.description", - "app.editAssignment.title", - "app.editAssignment.validation.versionDiffers", - "app.editAssignmentForm.allowSecondDeadline", - "app.editAssignmentForm.canViewJudgeLogs", - "app.editAssignmentForm.canViewJudgeLogsExplanation", - "app.editAssignmentForm.canViewJudgeStderr", - "app.editAssignmentForm.canViewJudgeStderrExplanation", - "app.editAssignmentForm.canViewJudgeStdout", - "app.editAssignmentForm.canViewJudgeStdoutExplanation", - "app.editAssignmentForm.canViewLimitRatios", - "app.editAssignmentForm.canViewLimitRatiosExplanation", - "app.editAssignmentForm.chooseFirstDeadlineBeforeSecondDeadline", - "app.editAssignmentForm.enabledEnvironments", - "app.editAssignmentForm.firstDeadline", - "app.editAssignmentForm.isBonus", - "app.editAssignmentForm.localized.assignmentSyncInfo", - "app.editAssignmentForm.localized.completeDescription", - "app.editAssignmentForm.localized.description", - "app.editAssignmentForm.localized.link", - "app.editAssignmentForm.localized.studentHint", - "app.editAssignmentForm.localized.urlValidation", - "app.editAssignmentForm.maxPointsBeforeFirstDeadline", - "app.editAssignmentForm.maxPointsBeforeSecondDeadline", - "app.editAssignmentForm.pointsPercentualThreshold", - "app.editAssignmentForm.pointsPercentualThresholdExplanation", - "app.editAssignmentForm.secondDeadline", - "app.editAssignmentForm.sendNotification", - "app.editAssignmentForm.submissionsCountLimit", - "app.editAssignmentForm.title", - "app.editAssignmentForm.validation.allRuntimesDisabled", - "app.editAssignmentForm.validation.emptyGroups", - "app.editAssignmentForm.validation.emptyName", - "app.editAssignmentForm.validation.localizedText.text", - "app.editAssignmentForm.visibility", - "app.editAssignmentForm.visibility.hidden", - "app.editAssignmentForm.visibility.visible", - "app.editAssignmentForm.visibility.visibleFrom", - "app.editAssignmentForm.visibleFrom", - "app.editAssignmentForm.warninigs.alreadyAssigned", - "app.editAssignmentForm.warninigs.alreadyAssignedGlobal", - "app.editAssignmentForm.warninigs.canViewJudgeLogs", - "app.editEnvironmentConfig.duplicateVariable", - "app.editEnvironmentConfig.noRuntimeSelected", - "app.editEnvironmentConfig.noVariables", - "app.editEnvironmentConfig.selectedRuntime", - "app.editEnvironmentConfig.selectedRuntimeInfo", - "app.editEnvironmentConfig.setDefaultVariables", - "app.editEnvironmentConfig.title", - "app.editEnvironmentConfig.tooltip.add", - "app.editEnvironmentConfig.tooltip.remove", - "app.editEnvironmentConfig.validateEnvironment", - "app.editEnvironmentConfig.validateName", - "app.editEnvironmentConfig.validateWildcard", - "app.editEnvironmentConfig.variableName", - "app.editEnvironmentConfig.variableType", - "app.editEnvironmentConfig.variableValue", - "app.editEnvironmentConfig.variablesInfo", - "app.editEnvironmentConfig.warnings.ambiguousVariable", - "app.editEnvironmentConfig.warnings.noPipelinesVariables", - "app.editEnvironmentConfig.warnings.unknownVariable", - "app.editEnvironmentSimpleForm.exclusiveEnvironment", - "app.editEnvironmentSimpleForm.linkToWiki", - "app.editEnvironmentSimpleForm.submit", - "app.editEnvironmentSimpleForm.submitting", - "app.editEnvironmentSimpleForm.success", - "app.editEnvironmentSimpleForm.validation.environments", - "app.editEnvironmentSimpleForm.validation.standaloneEnvironmentsCollisions", - "app.editExercise.deleteExercise", - "app.editExercise.deleteExerciseWarning", - "app.editExercise.description", - "app.editExercise.editConfig", - "app.editExercise.editTags", - "app.editExercise.title", - "app.editExerciseAdvancedConfigForm.validation.emptyFileName", - "app.editExerciseConfig.cannotDisplayConfigForm", - "app.editExerciseConfig.cannotDisplayPipelinesForm", - "app.editExerciseConfig.changeConfigAdvancedExplain", - "app.editExerciseConfig.changeConfigSimpleExplain", - "app.editExerciseConfig.description", - "app.editExerciseConfig.noPipelines", - "app.editExerciseConfig.noRuntimes", - "app.editExerciseConfig.noTests", - "app.editExerciseConfig.runtimeEnvironments", - "app.editExerciseConfig.submit", - "app.editExerciseConfig.submitting", - "app.editExerciseConfig.success", - "app.editExerciseConfig.testsAndScoring", - "app.editExerciseConfig.title", - "app.editExerciseConfigForm.rawFill", - "app.editExerciseConfigForm.rawFillPipeline", - "app.editExerciseConfigForm.rawFillPipeline.yesNoQuestion", - "app.editExerciseConfigForm.rawFillTest", - "app.editExerciseConfigForm.rawFillTest.yesNoQuestion", - "app.editExerciseConfigForm.rawFillVariable.yesNoQuestion", - "app.editExerciseConfigForm.smartFillAll", - "app.editExerciseConfigForm.smartFillAll.yesNoQuestion", - "app.editExerciseConfigForm.smartFillArgs", - "app.editExerciseConfigForm.smartFillArgs.yesNoQuestion", - "app.editExerciseConfigForm.smartFillCompilation", - "app.editExerciseConfigForm.smartFillCompilation.yesNoQuestion", - "app.editExerciseConfigForm.smartFillEntryPoint", - "app.editExerciseConfigForm.smartFillEntryPoint.yesNoQuestion", - "app.editExerciseConfigForm.smartFillExtraFiles", - "app.editExerciseConfigForm.smartFillInput", - "app.editExerciseConfigForm.smartFillInput.yesNoQuestion", - "app.editExerciseConfigForm.smartFillJudge", - "app.editExerciseConfigForm.smartFillJudge.yesNoQuestion", - "app.editExerciseConfigForm.smartFillOutput", - "app.editExerciseConfigForm.smartFillOutput.yesNoQuestion", - "app.editExerciseConfigForm.validation.ambiguousEntryPoint", - "app.editExerciseConfigForm.validation.duplicateFile", - "app.editExerciseConfigForm.validation.duplicateFileName", - "app.editExerciseConfigForm.validation.fileDoesNotExist", - "app.editExerciseConfigForm.validation.noFileSelected", - "app.editExerciseConfigForm.validation.stdinFileEmpty", - "app.editExerciseConfigForm.validation.whitespaceInArg", - "app.editExerciseForm.difficulty", - "app.editExerciseForm.easy", - "app.editExerciseForm.hard", - "app.editExerciseForm.isLocked", - "app.editExerciseForm.isPublic", - "app.editExerciseForm.medium", - "app.editExerciseForm.mergeJudgeLogs", - "app.editExerciseForm.solutionFilesLimit", - "app.editExerciseForm.solutionSizeLimit", - "app.editExerciseForm.title", - "app.editExerciseForm.validation.difficulty", - "app.editExerciseForm.validation.emptyName", - "app.editExerciseForm.validation.versionDiffers", - "app.editExerciseLimits.description", - "app.editExerciseLimits.missingSomething", - "app.editExerciseLimits.missingSomethingTitle", - "app.editExerciseLimits.multiHwGroups", - "app.editExerciseLimits.multiHwGroupsTitle", - "app.editExerciseLimits.title", - "app.editExercisePipelines.addPipeline", - "app.editExercisePipelines.availablePipelines", - "app.editExercisePipelines.title", - "app.editExercisePipelinesForm.validation.duplicatePipelineWarning", - "app.editExercisePipelinesForm.validation.noPipelines", - "app.editExerciseSimpleConfigForm.isDataOnly", - "app.editExerciseSimpleConfigForm.isHaskellOnly", - "app.editExerciseSimpleConfigForm.isPrologOnly", - "app.editExerciseSimpleConfigForm.validation.customJudge", - "app.editExerciseSimpleConfigForm.validation.expectedOutput", - "app.editExerciseSimpleConfigForm.validation.outputFile", - "app.editExerciseSimpleConfigTests.argumentsExplanation", - "app.editExerciseSimpleConfigTests.cmdlineTitle", - "app.editExerciseSimpleConfigTests.compilationInfo", - "app.editExerciseSimpleConfigTests.compilationTitle", - "app.editExerciseSimpleConfigTests.customJudgeBinary", - "app.editExerciseSimpleConfigTests.entryPoint", - "app.editExerciseSimpleConfigTests.entryPointLabel", - "app.editExerciseSimpleConfigTests.executionArguments", - "app.editExerciseSimpleConfigTests.expectedOutput", - "app.editExerciseSimpleConfigTests.extraFilesActual", - "app.editExerciseSimpleConfigTests.extraFilesRename", - "app.editExerciseSimpleConfigTests.extraFilesTitle", - "app.editExerciseSimpleConfigTests.inputFilesActual", - "app.editExerciseSimpleConfigTests.inputFilesRename", - "app.editExerciseSimpleConfigTests.inputStdin", - "app.editExerciseSimpleConfigTests.inputTitle", - "app.editExerciseSimpleConfigTests.jarFiles", - "app.editExerciseSimpleConfigTests.judgeArgs", - "app.editExerciseSimpleConfigTests.judgeTitle", - "app.editExerciseSimpleConfigTests.judgeType", - "app.editExerciseSimpleConfigTests.noExtraFiles", - "app.editExerciseSimpleConfigTests.noJarFiles", - "app.editExerciseSimpleConfigTests.outputFile", - "app.editExerciseSimpleConfigTests.outputTitle", - "app.editExerciseSimpleConfigTests.useCustomJudge", - "app.editExerciseSimpleConfigTests.useOutfile", - "app.editExerciseSimpleConfigTests.validation.sentryPointString", - "app.editExerciseTags.noTags", - "app.editGroup.archivedExplain", - "app.editGroup.cannotDeleteGroupWithSubgroups", - "app.editGroup.cannotDeleteRootGroup", - "app.editGroup.deleteGroup", - "app.editGroup.deleteGroupWarning", - "app.editGroup.description", - "app.editGroup.organizationalExplain", - "app.editGroup.relocateGroup", - "app.editGroup.title", - "app.editGroupForm.createGroup", - "app.editGroupForm.description", - "app.editGroupForm.saveGroup", - "app.editGroupForm.titleEdit", - "app.editGroupForm.titleNew", - "app.editGroupForm.validation.emptyName", - "app.editHardwareGroupForm.about", - "app.editHardwareGroupForm.failed", - "app.editHardwareGroupForm.hwGroupSelect", - "app.editHardwareGroupForm.title", - "app.editHardwareGroupForm.validationFailed", - "app.editHardwareGroupForm.warnLimitsDrop", - "app.editInstance.description", - "app.editInstance.title", - "app.editInstanceForm.failed", - "app.editInstanceForm.isOpen", - "app.editInstanceForm.processing", - "app.editInstanceForm.set", - "app.editInstanceForm.success", - "app.editInstanceForm.title", - "app.editLimitsBox.title", - "app.editLimitsField.tooltip.cloneAll", - "app.editLimitsField.tooltip.cloneHorizontal", - "app.editLimitsField.tooltip.cloneVertical", - "app.editLimitsForm.failed", - "app.editLimitsForm.preciseTime", - "app.editLimitsForm.preciseTimeTooltip", - "app.editLimitsForm.submit", - "app.editLimitsForm.submitting", - "app.editLimitsForm.success", - "app.editLimitsForm.validation.totalTime", - "app.editLocalizedTextForm.localeEnabledCheckbox", - "app.editLocalizedTextForm.localizationTabDisabled", - "app.editLocalizedTextForm.localized.description", - "app.editLocalizedTextForm.localized.noLanguage", - "app.editLocalizedTextForm.localized.reallyRemoveQuestion", - "app.editPipeline.delete", - "app.editPipeline.deleteWarning", - "app.editPipeline.description", - "app.editPipeline.disclaimer", - "app.editPipeline.disclaimerWarning", - "app.editPipeline.title", - "app.editPipelineFields.pipeline", - "app.editPipelineFields.pipelineVariables", - "app.editPipelineForm.description", - "app.editPipelineForm.name", - "app.editPipelineForm.submit", - "app.editPipelineForm.submitting", - "app.editPipelineForm.success", - "app.editPipelineForm.title", - "app.editPipelineForm.validation.description", - "app.editPipelineForm.validation.emptyName", - "app.editPipelineForm.validation.versionDiffers", - "app.editShadowAssignment.deleteAssignment", - "app.editShadowAssignment.deleteAssignmentWarning", - "app.editShadowAssignment.description", - "app.editShadowAssignment.title", - "app.editShadowAssignment.titleName", - "app.editShadowAssignment.validation.versionDiffers", - "app.editShadowAssignmentForm.isBonus", - "app.editShadowAssignmentForm.isPublic", - "app.editShadowAssignmentForm.maxPoints", - "app.editShadowAssignmentForm.sendNotification", - "app.editShadowAssignmentPointsForm.awardedAt", - "app.editShadowAssignmentPointsForm.failed", - "app.editShadowAssignmentPointsForm.note", - "app.editShadowAssignmentPointsForm.points", - "app.editShadowAssignmentPointsForm.removePoints", - "app.editShadowAssignmentPointsForm.setNow", - "app.editShadowAssignmentPointsForm.validation.pointsOutOfRange", - "app.editSisTerm.advertiseUntil", - "app.editSisTerm.beginning", - "app.editSisTerm.end", - "app.editSisTerm.title", - "app.editSisTerm.validation.advertiseInLimits", - "app.editSisTerm.validation.noAdvertiseUntil", - "app.editSisTerm.validation.noBeginning", - "app.editSisTerm.validation.noEnd", - "app.editSolutionNoteForm.failed", - "app.editSolutionNoteForm.note", - "app.editSystemMessageForm.role", - "app.editSystemMessageForm.title", - "app.editSystemMessageForm.type", - "app.editSystemMessageForm.validation.localizedText.text", - "app.editSystemMessageForm.validation.roleEmpty", - "app.editSystemMessageForm.validation.typeEmpty", - "app.editSystemMessageForm.validation.visibleFromBeforeTo", - "app.editSystemMessageForm.validation.visibleFromEmpty", - "app.editSystemMessageForm.validation.visibleToEmpty", - "app.editSystemMessageForm.visibleFrom", - "app.editSystemMessageForm.visibleTo", - "app.editTestsForm.changeCalculator", - "app.editTestsForm.changeCalculator.submit", - "app.editTestsForm.changeCalculator.submitting", - "app.editTestsForm.changeCalculator.success", - "app.editTestsForm.changeCalculatorDisabledTooltip", - "app.editTestsForm.changeCalculatorModal.info", - "app.editTestsForm.changeCalculatorModal.title", - "app.editTestsForm.changeCalculatorModal.warningUniform", - "app.editTestsForm.changeCalculatorModal.warningUniversalToWeighted", - "app.editTestsForm.expandToggleTooltip", - "app.editTestsForm.submit", - "app.editTestsForm.submitting", - "app.editTestsForm.success", - "app.editTestsForm.validation.testName", - "app.editTestsForm.validation.testNameInvalidCharacters", - "app.editTestsForm.validation.testNameTaken", - "app.editTestsTest.add", - "app.editTestsTest.name", - "app.editTestsTest.noTests", - "app.editTestsTest.pointsPercentage", - "app.editTestsTest.testUsedInExpression", - "app.editTestsTest.weight", - "app.editUser.description", - "app.editUser.emailStillNotVerified", - "app.editUser.emailStillNotVerifiedTitle", - "app.editUser.isEmailAlreadyVefiried", - "app.editUser.makeLocal", - "app.editUser.title", - "app.editUserProfile.degreesAfterName", - "app.editUserProfile.degreesBeforeName", - "app.editUserProfile.emptyLocalPassword", - "app.editUserProfile.emptyLocalPasswordExplain", - "app.editUserProfile.firstName", - "app.editUserProfile.gravatarEnabled", - "app.editUserProfile.lastName", - "app.editUserProfile.passwordInstructions", - "app.editUserProfile.passwordTitle", - "app.editUserProfile.validation.emailNotValid", - "app.editUserProfile.validation.emailTaken", - "app.editUserProfile.validation.emptyEmail", - "app.editUserProfile.validation.emptyFirstName", - "app.editUserProfile.validation.emptyLastName", - "app.editUserProfile.validation.emptyNewPassword", - "app.editUserProfile.validation.emptyOldPassword", - "app.editUserProfile.validation.passwordsDontMatch", - "app.editUserProfile.validation.samePasswords", - "app.editUserProfile.validation.shortFirstName", - "app.editUserProfile.validation.shortLastName", - "app.editUserProfileForm.title", - "app.editUserRoleForm.title", - "app.editUserSettings.assignmentCommentsEmails", - "app.editUserSettings.assignmentDeadlineEmails", - "app.editUserSettings.assignmentSubmitAfterAcceptedEmails", - "app.editUserSettings.assignmentSubmitAfterReviewedEmails", - "app.editUserSettings.darkTheme", - "app.editUserSettings.defaultLanguage", - "app.editUserSettings.defaultPage", - "app.editUserSettings.defaultPage.dashboard", - "app.editUserSettings.defaultPage.home", - "app.editUserSettings.defaultPage.instance", - "app.editUserSettings.emailsTitle", - "app.editUserSettings.failed", - "app.editUserSettings.newAssignmentEmails", - "app.editUserSettings.openedSidebar", - "app.editUserSettings.pointsChangedEmails", - "app.editUserSettings.solutionCommentsEmails", - "app.editUserSettings.submissionEvaluatedEmails", - "app.editUserSettings.title", - "app.editUserSettings.useGravatar", - "app.editUserSettings.vimMode", - "app.emailVerification.description", - "app.emailVerification.failed", - "app.emailVerification.progress", - "app.emailVerification.requestAnotherLink", - "app.emailVerification.title", - "app.emailVerification.tokenExpired", - "app.emailVerification.verified", - "app.emailVerification.waiting", - "app.environmentsList.noEnvironments", - "app.evaluationDetail.buildSucceeded", - "app.evaluationDetail.evaluatedAt", - "app.evaluationDetail.explainCorrectness", - "app.evaluationDetail.isCorrect", - "app.evaluationDetail.isDebug", - "app.evaluationDetail.notActualEvaluation", - "app.evaluationDetail.scoredPoints", - "app.evaluationDetail.title.compilationLogs", - "app.evaluationDetail.title.details", - "app.evaluationProgress.continue", - "app.evaluationProgress.noWebSockets", - "app.evaluationProgress.title", - "app.evaluationProgressStatus.completed", - "app.evaluationProgressStatus.failed", - "app.evaluationProgressStatus.ok", - "app.evaluationProgressStatus.skipped", - "app.evaluationTable.empty", - "app.evaluationTable.evaluatedAt", - "app.evaluationTable.evaluationIsDebug", - "app.evaluationTable.notAvailable", - "app.evaluationTable.score", - "app.exercise.addReferenceSolutionDetailed", - "app.exercise.assignButton", - "app.exercise.assignToGroup", - "app.exercise.assignments", - "app.exercise.attach", - "app.exercise.breadcrumbTitle", - "app.exercise.defaultValueForAssignment", - "app.exercise.description", - "app.exercise.description.visibleOnlyToSupervisors", - "app.exercise.detach", - "app.exercise.detailTitle", - "app.exercise.difficulty", - "app.exercise.editConfig", - "app.exercise.editLimits", - "app.exercise.editSettings", - "app.exercise.forked", - "app.exercise.groups", - "app.exercise.isBroken", - "app.exercise.isBrokenShort", - "app.exercise.isLocked", - "app.exercise.isLockedExplanation", - "app.exercise.isPublic", - "app.exercise.isPublicExplanation", - "app.exercise.manageGroupAttachments", - "app.exercise.mergeJudgeLogsExplanation", - "app.exercise.noRefSolutions", - "app.exercise.noReferenceSolutions", - "app.exercise.noReferenceSolutionsDetailed", - "app.exercise.overview", - "app.exercise.referenceSolution.deleteConfirm", - "app.exercise.referenceSolutionDetail", - "app.exercise.referenceSolutionTitle", - "app.exercise.referenceSolutionsBox", - "app.exercise.runtimes", - "app.exercise.solutionFilesLimitExplanation", - "app.exercise.solutionSizeLimitExplanation", - "app.exercise.submitReferenceSoution", - "app.exercise.title", - "app.exercise.validationErrors.config", - "app.exercise.validationErrors.limits", - "app.exercise.validationErrors.noConfigs", - "app.exercise.validationErrors.noHwGroups", - "app.exercise.validationErrors.noRuntimes", - "app.exercise.validationErrors.noTests", - "app.exercise.validationErrors.noTexts", - "app.exercise.validationErrors.rawTitle", - "app.exercise.validationErrors.runtimes", - "app.exercise.validationErrors.score", - "app.exercise.validationLinks.limits", - "app.exercise.validationLinks.noConfigs", - "app.exercise.validationLinks.noHwGroups", - "app.exercise.validationLinks.noTexts", - "app.exercise.validationLinks.runtimes", - "app.exercise.validationLinks.tests", - "app.exerciseAssignments.description", - "app.exerciseAssignments.multiAssignBox", - "app.exerciseConfigTypeButton.advancedConfiguration", - "app.exerciseConfigTypeButton.confirm", - "app.exerciseConfigTypeButton.simpleConfiguration", - "app.exercises.difficultyIcon.easy", - "app.exercises.difficultyIcon.hard", - "app.exercises.difficultyIcon.medium", - "app.exercises.difficultyIcon.unknown", - "app.exercises.failedDetail", - "app.exercises.listEdit", - "app.exercises.listEditConfig", - "app.exercises.listEditLimits", - "app.exercises.listTitle", - "app.exercises.loadingDetail", - "app.exercises.title", - "app.exercisesList.created", - "app.exercisesList.difficulty", - "app.exercisesList.empty", - "app.exercisesList.groups", - "app.exercisesListItem.noGroups", - "app.exitCodes.csharp.0", - "app.exitCodes.csharp.1", - "app.exitCodes.csharp.101", - "app.exitCodes.csharp.102", - "app.exitCodes.csharp.103", - "app.exitCodes.csharp.104", - "app.exitCodes.csharp.105", - "app.exitCodes.csharp.106", - "app.exitCodes.csharp.107", - "app.exitCodes.csharp.108", - "app.exitCodes.csharp.109", - "app.exitCodes.csharp.200", - "app.exitCodes.csharp.201", - "app.exitCodes.csharp.202", - "app.exitCodes.java.0", - "app.exitCodes.java.1", - "app.exitCodes.java.100", - "app.exitCodes.java.101", - "app.exitCodes.java.102", - "app.exitCodes.java.103", - "app.exitCodes.java.104", - "app.exitCodes.java.105", - "app.exitCodes.java.106", - "app.exitCodes.java.107", - "app.exitCodes.java.108", - "app.exitCodes.java.109", - "app.exitCodes.java.110", - "app.exitCodes.java.111", - "app.exitCodes.java.112", - "app.exitCodes.java.113", - "app.exitCodes.java.2", - "app.exitCodes.pascal.0", - "app.exitCodes.pascal.1", - "app.exitCodes.pascal.100", - "app.exitCodes.pascal.101", - "app.exitCodes.pascal.102", - "app.exitCodes.pascal.103", - "app.exitCodes.pascal.104", - "app.exitCodes.pascal.105", - "app.exitCodes.pascal.106", - "app.exitCodes.pascal.12", - "app.exitCodes.pascal.15", - "app.exitCodes.pascal.150", - "app.exitCodes.pascal.151", - "app.exitCodes.pascal.152", - "app.exitCodes.pascal.154", - "app.exitCodes.pascal.156", - "app.exitCodes.pascal.157", - "app.exitCodes.pascal.158", - "app.exitCodes.pascal.159", - "app.exitCodes.pascal.16", - "app.exitCodes.pascal.160", - "app.exitCodes.pascal.161", - "app.exitCodes.pascal.162", - "app.exitCodes.pascal.17", - "app.exitCodes.pascal.2", - "app.exitCodes.pascal.200", - "app.exitCodes.pascal.201", - "app.exitCodes.pascal.202", - "app.exitCodes.pascal.203", - "app.exitCodes.pascal.204", - "app.exitCodes.pascal.205", - "app.exitCodes.pascal.206", - "app.exitCodes.pascal.207", - "app.exitCodes.pascal.210", - "app.exitCodes.pascal.211", - "app.exitCodes.pascal.212", - "app.exitCodes.pascal.213", - "app.exitCodes.pascal.214", - "app.exitCodes.pascal.215", - "app.exitCodes.pascal.216", - "app.exitCodes.pascal.217", - "app.exitCodes.pascal.218", - "app.exitCodes.pascal.219", - "app.exitCodes.pascal.222", - "app.exitCodes.pascal.223", - "app.exitCodes.pascal.224", - "app.exitCodes.pascal.225", - "app.exitCodes.pascal.227", - "app.exitCodes.pascal.229", - "app.exitCodes.pascal.231", - "app.exitCodes.pascal.232", - "app.exitCodes.pascal.3", - "app.exitCodes.pascal.4", - "app.exitCodes.pascal.5", - "app.exitCodes.pascal.6", - "app.exitCodes.python3.0", - "app.exitCodes.python3.1", - "app.exitCodes.python3.101", - "app.exitCodes.python3.102", - "app.exitCodes.python3.103", - "app.exitCodes.python3.104", - "app.exitCodes.python3.105", - "app.exitCodes.python3.106", - "app.exitCodes.python3.107", - "app.exitCodes.python3.108", - "app.exitCodes.python3.109", - "app.exitCodes.python3.110", - "app.exitCodes.python3.111", - "app.exitCodes.python3.112", - "app.exitCodes.python3.113", - "app.exitCodes.python3.114", - "app.exitCodes.python3.115", - "app.exitCodes.unknown", - "app.expandingInputFilesField.noFiles", - "app.expandingInputFilesField.tooltip.add", - "app.expandingInputFilesField.tooltip.remove", - "app.expandingInputFilesField.validateEmpty", - "app.expandingTextField.noItems", - "app.expandingTextField.tooltip.add", - "app.expandingTextField.tooltip.addAbove", - "app.expandingTextField.tooltip.remove", - "app.externalLinkPreview.fetchFailed", - "app.externalLinkPreview.httpFailed", - "app.externalLinkPreview.noTextContent", - "app.externalLinkPreview.readingTextFailed", - "app.externalLinkPreview.showAsMarkdown", - "app.externalLinkPreview.title", - "app.externalLogin.button.authenticate", - "app.externalLogin.button.authenticated", - "app.externalLogin.button.authenticating", - "app.externalLogin.description", - "app.externalLogin.failed", - "app.externalLogin.help", - "app.externalLogin.title", - "app.externalRegistrationForm.gdprConfirm", - "app.externalRegistrationForm.instance", - "app.externalRegistrationForm.validation.gdpr", - "app.externalRegistrationForm.validation.instanceId", - "app.failedGroupDetail.msg", - "app.failedSubmissionDetail.description", - "app.failedSubmissionDetail.title", - "app.failureList.headLink", - "app.failureList.headResolutionNote", - "app.failureList.headResolvedAt", - "app.failureList.headType", - "app.failureList.noFailures", - "app.failureListItem.referenceAssignment", - "app.failureListItem.studentAssignment", - "app.faq.description", - "app.faq.title", - "app.field.isRequired", - "app.fields.limits.memory", - "app.fields.limits.time", - "app.filesTable.addFiles", - "app.filesTable.downloadArchive", - "app.filesTable.empty", - "app.filesTable.fileName", - "app.filesTable.fileSize", - "app.filesTable.originalFileName", - "app.filterArchiveGroupsForm.searchName", - "app.filterArchiveGroupsForm.showAll", - "app.filterExercisesListForm.allButton", - "app.filterExercisesListForm.author", - "app.filterExercisesListForm.hideAdvancedFilters", - "app.filterExercisesListForm.mineButton", - "app.filterExercisesListForm.searchName", - "app.filterExercisesListForm.selectedEnvironments", - "app.filterExercisesListForm.selectedTags", - "app.filterExercisesListForm.showAllFilters", - "app.filterUsersListForm.searchName", - "app.footer.copyright", - "app.footer.version", - "app.forkExerciseForm.confirmSubmit", - "app.forkExerciseForm.showForkedExerciseButton", - "app.forkExerciseForm.submit", - "app.forkExerciseForm.submitting", - "app.forkExerciseForm.success", - "app.forkExerciseForm.successMessage", - "app.generateTokenForm.copied", - "app.generateTokenForm.copyToClipboard", - "app.generateTokenForm.day", - "app.generateTokenForm.expiration", - "app.generateTokenForm.failed", - "app.generateTokenForm.generate", - "app.generateTokenForm.generated", - "app.generateTokenForm.generating", - "app.generateTokenForm.hour", - "app.generateTokenForm.info", - "app.generateTokenForm.lastToken", - "app.generateTokenForm.month", - "app.generateTokenForm.scope.master", - "app.generateTokenForm.scope.readAll", - "app.generateTokenForm.scope.refresh", - "app.generateTokenForm.scopes", - "app.generateTokenForm.title", - "app.generateTokenForm.validate.expirationTooLong", - "app.generateTokenForm.validate.noScopes", - "app.generateTokenForm.warnBothMasterAndReadAll", - "app.generateTokenForm.week", - "app.generateTokenForm.year", - "app.group.adminsView.addSupervisor", - "app.group.archivedExplain", - "app.group.assignments", - "app.group.assignmentsLong", - "app.group.createExercise", - "app.group.info", - "app.group.isPublicWarning", - "app.group.mailtoAll", - "app.group.notDirectlyArchived", - "app.group.organizationalExplain", - "app.group.setRoot", - "app.group.spervisorsView.addStudent", - "app.group.spervisorsView.groupExercises", - "app.group.unbind", - "app.group.unbind.confirmQuestion", - "app.group.unsetRoot", - "app.groupDetail.assignments", - "app.groupDetail.bindings.genericProvider", - "app.groupDetail.bindings.sis", - "app.groupDetail.description", - "app.groupDetail.externalId", - "app.groupDetail.hasPublicStats", - "app.groupDetail.isPublic", - "app.groupDetail.loading", - "app.groupDetail.newShadowAssignment", - "app.groupDetail.noDescription", - "app.groupDetail.pageDescription", - "app.groupDetail.shadowAssignments", - "app.groupDetail.studentsResultsTable", - "app.groupDetail.subgroups", - "app.groupDetail.supervisors", - "app.groupDetail.threshold", - "app.groupInfo.pageDescription", - "app.groupResultsTable.downloadCSV", - "app.groupResultsTable.maxPointsRow", - "app.groupResultsTableRow.noStudents", - "app.groupTree.treeViewLeaf.archivedTooltip", - "app.groupTree.treeViewLeaf.organizationalTooltip", - "app.groupTree.treeViewLeaf.publicTooltip", - "app.groups.joinGroupButton", - "app.groups.leaveGroupButton", - "app.groups.makeGroupAdminButton", - "app.groups.makeSupervisorButton", - "app.groups.removeFromGroup", - "app.groups.removeGroupAdminButton", - "app.groups.removeSupervisorButton", - "app.hardwareGroupMetadata.cpuTimeOverlay", - "app.hardwareGroupMetadata.description", - "app.hardwareGroupMetadata.id", - "app.hardwareGroupMetadata.memoryConstraints", - "app.hardwareGroupMetadata.memoryOverlay", - "app.hardwareGroupMetadata.timeOverlay", - "app.hardwareGroupMetadata.timePerExerciseConstraints", - "app.hardwareGroupMetadata.timePerTestConstraints", - "app.hardwareGroupMetadata.title", - "app.hardwareGroupMetadata.wallTimeOverlay", - "app.header.languageSwitching.translationTitle", - "app.headerNotification.copiedToClippboard", - "app.homepage.aboutContentP1", - "app.homepage.aboutContentP2", - "app.homepage.aboutTitle", - "app.homepage.acknowledgementContent", - "app.homepage.acknowledgementTitle", - "app.homepage.description", - "app.homepage.githubWebappRepository", - "app.homepage.help", - "app.homepage.helpContent", - "app.homepage.howToGiveFeedback", - "app.homepage.title", - "app.homepage.whatIsRecodex", - "app.homepage.whatIsRecodexContent", - "app.homepage.whereToReportBugs", - "app.homepage.whereToReportBugsText", - "app.instance.description", - "app.instance.edit", - "app.instance.groups.noGroups", - "app.instance.groupsTitle", - "app.instance.hasValidLicence", - "app.instance.licencesTitle", - "app.instance.title", - "app.instanceDetail.admin", - "app.instanceDetail.description", - "app.instanceDetail.noDescription", - "app.instances.description", - "app.instances.listTitle", - "app.instances.title", - "app.instancesTable.admin", - "app.instancesTable.validLicence", - "app.leaveGroup.confirm", - "app.licencesTable.isValid", - "app.licencesTable.noLicences", - "app.licencesTable.note", - "app.licencesTable.validUntil", - "app.localizedTexts.externalLink", - "app.localizedTexts.noText", - "app.localizedTexts.studentHintHeading", - "app.localizedTexts.validation.noLocalizedText", - "app.login.alreadyLoggedIn", - "app.login.cannotRememberPassword", - "app.login.description", - "app.login.loginIsRequired", - "app.login.resetPassword", - "app.login.title", - "app.loginForm.email", - "app.loginForm.login", - "app.loginForm.password", - "app.loginForm.processing", - "app.loginForm.success", - "app.loginForm.title", - "app.loginForm.validation.emailIsNotAnEmail", - "app.loginForm.validation.emptyEmail", - "app.loginForm.validation.emptyPassword", - "app.logout", - "app.markdownTextArea.canUseMarkdown", - "app.markdownTextArea.empty", - "app.markdownTextArea.preview", - "app.markdownTextArea.showPreview", - "app.maybeBonusAssignmentIcon.isBonus", - "app.maybePublicIcon.visibleFrom", - "app.maybeVisibleIcon.isHidden", - "app.maybeVisibleIcon.isVisible", - "app.multiAssignForm.showAllGroups", - "app.multiAssignForm.showMyGroups", - "app.multiAssignForm.submit", - "app.multiAssignForm.submitting", - "app.multiAssignForm.success", - "app.multiAssignForm.successDescription", - "app.multiAssignForm.successHeading", - "app.notFound.description", - "app.notFound.text", - "app.notFound.title", - "app.notifications.hideAll", - "app.notifications.showAll", - "app.notifications.title", - "app.numericTextField.validationFailed", - "app.numericTextField.validationFailedMax", - "app.numericTextField.validationFailedMin", - "app.numericTextField.validationFailedMinMax", - "app.organizationalGroupButton.set", - "app.organizationalGroupButton.unset", - "app.page.failed", - "app.page.failedDescription.explain", - "app.page.failedDescription.sorry", - "app.page.loadingDescription", - "app.paginationContainer.showingRange", - "app.passwordStrength.bad", - "app.passwordStrength.good", - "app.passwordStrength.ok", - "app.passwordStrength.somewhatOk", - "app.passwordStrength.unknown", - "app.passwordStrength.worst", - "app.pipeline.description", - "app.pipeline.detailTitle", - "app.pipeline.editSettings", - "app.pipeline.exercises", - "app.pipeline.failedDetail", - "app.pipeline.loadingDetail", - "app.pipeline.parameters", - "app.pipeline.publicExercise", - "app.pipeline.runtimes", - "app.pipeline.title", - "app.pipeline.version", - "app.pipeline.visualization", - "app.pipelineEditor.AddBoxForm.title", - "app.pipelineEditor.BoxForm.conflictingPortType", - "app.pipelineEditor.BoxForm.emptyName", - "app.pipelineEditor.BoxForm.failed", - "app.pipelineEditor.BoxForm.loop", - "app.pipelineEditor.BoxForm.missingType", - "app.pipelineEditor.BoxForm.portsIn", - "app.pipelineEditor.BoxForm.portsOut", - "app.pipelineEditor.BoxForm.type", - "app.pipelineEditor.EditBoxForm.title", - "app.pipelineFilesTable.description", - "app.pipelineFilesTable.title", - "app.pipelineParams.hasEntryPoint", - "app.pipelineParams.hasExtraFiles", - "app.pipelineParams.isCompilationPipeline", - "app.pipelineParams.isExecutionPipeline", - "app.pipelineParams.judgeOnlyPipeline", - "app.pipelineParams.producesFiles", - "app.pipelineParams.producesStdout", - "app.pipelineVisualEditor.addBoxButton", - "app.pipelines.createNew", - "app.pipelines.description", - "app.pipelines.listTitle", - "app.pipelines.title", - "app.pipelinesList.authoredPipelineIconTooltip", - "app.pipelinesList.compilationIconTooltip", - "app.pipelinesList.empty", - "app.pipelinesList.executionIconTooltip", - "app.pipelinesList.fileIconTooltip", - "app.pipelinesList.judgeOnlyIconTooltip", - "app.pipelinesList.stdoutIconTooltip", - "app.pipelinesList.universalPipelineIconTooltip", - "app.plantSisTerm.noGroupsSelected", - "app.plantSisTerm.plantGroups", - "app.plantSisTerm.planted", - "app.plantSisTerm.planting", - "app.plantSisTerm.title", - "app.pointsForm.bonusPoints", - "app.pointsForm.failed", - "app.pointsForm.pointsOverride", - "app.pointsForm.scoredPoints", - "app.pointsForm.title", - "app.pointsForm.validation.overrideOutOfRange", - "app.portsField.empty", - "app.randomMessages.error", - "app.randomMessages.last", - "app.randomMessages.m1", - "app.randomMessages.m10", - "app.randomMessages.m11", - "app.randomMessages.m12", - "app.randomMessages.m13", - "app.randomMessages.m14", - "app.randomMessages.m15", - "app.randomMessages.m16", - "app.randomMessages.m17", - "app.randomMessages.m18", - "app.randomMessages.m19", - "app.randomMessages.m2", - "app.randomMessages.m20", - "app.randomMessages.m21", - "app.randomMessages.m22", - "app.randomMessages.m23", - "app.randomMessages.m24", - "app.randomMessages.m25", - "app.randomMessages.m26", - "app.randomMessages.m27", - "app.randomMessages.m28", - "app.randomMessages.m29", - "app.randomMessages.m3", - "app.randomMessages.m30", - "app.randomMessages.m31", - "app.randomMessages.m32", - "app.randomMessages.m33", - "app.randomMessages.m34", - "app.randomMessages.m35", - "app.randomMessages.m36", - "app.randomMessages.m37", - "app.randomMessages.m4", - "app.randomMessages.m5", - "app.randomMessages.m6", - "app.randomMessages.m7", - "app.randomMessages.m8", - "app.randomMessages.m9", - "app.referenceSolution.exerciseBroken", - "app.referenceSolution.exerciseNoLongerHasEnvironment", - "app.referenceSolutionDetail.exercise", - "app.referenceSolutionDetail.solutionFilesLimitExceeded", - "app.referenceSolutionDetail.solutionSizeLimitExceeded", - "app.referenceSolutionDetail.title.details", - "app.referenceSolutionTable.noDescription", - "app.registration.description", - "app.registration.external.gotoSignin", - "app.registration.external.link", - "app.registration.external.mail", - "app.registration.externalInfo", - "app.registration.externalTitle", - "app.registration.title", - "app.registrationForm.createAccount", - "app.registrationForm.email", - "app.registrationForm.failed", - "app.registrationForm.firstName", - "app.registrationForm.lastName", - "app.registrationForm.password", - "app.registrationForm.passwordConfirm", - "app.registrationForm.passwordStrength", - "app.registrationForm.processing", - "app.registrationForm.success", - "app.registrationForm.title", - "app.registrationForm.validation.emailAlreadyTaken", - "app.registrationForm.validation.emailIsNotAnEmail", - "app.registrationForm.validation.emptyEmail", - "app.registrationForm.validation.emptyFirstName", - "app.registrationForm.validation.emptyLastName", - "app.registrationForm.validation.emptyPassword", - "app.registrationForm.validation.passwordDontMatch", - "app.registrationForm.validation.shortFirstName", - "app.registrationForm.validation.shortLastName", - "app.relocateGroupForm.parentGroup", - "app.relocateGroupForm.submit", - "app.relocateGroupForm.submitting", - "app.relocateGroupForm.success", - "app.removeFromGroup.confirm", - "app.resendEmailVerification.failed", - "app.resendEmailVerification.resend", - "app.resendEmailVerification.resending", - "app.resendEmailVerification.resent", - "app.resetPassword.description", - "app.resetPassword.email", - "app.resetPassword.failed", - "app.resetPassword.processing", - "app.resetPassword.resetPassword", - "app.resetPassword.succeeded", - "app.resetPassword.success", - "app.resetPassword.title", - "app.resetPassword.validation.emailIsNotAnEmail", - "app.resetPassword.validation.emptyEmail", - "app.resourceRenderer.loadingFailed", - "app.resubmitSolution.confirm", - "app.resubmitSolution.resubmitAll", - "app.resubmitSolution.resubmitAll.failedJobTitle", - "app.resubmitSolution.resubmitAll.jobCreatedBy", - "app.resubmitSolution.resubmitAll.pendingJobTitle", - "app.resubmitSolution.resubmitAllConfirm", - "app.resubmitSolution.resubmitDebug", - "app.resubmitSolution.resubmitNondebug", - "app.resultsArchiveInfoBox.description", - "app.resultsArchiveInfoBox.title", - "app.resultsTable.total", - "app.reviewedSolution.revoke", - "app.reviewedSolution.set", - "app.roles.description.empoweredSupervisor", - "app.roles.description.student", - "app.roles.description.superadmin", - "app.roles.description.supervisor", - "app.roles.description.supervisorStudent", - "app.roles.empoweredSupervisor", - "app.roles.student", - "app.roles.students", - "app.roles.superadmin", - "app.roles.superadmins", - "app.roles.supervisor", - "app.roles.supervisorStudent", - "app.roles.supervisorStudents", - "app.roles.supervisors", - "app.roles.supervisorsEmpowered", - "app.scoreCalculators.uniform.caption", - "app.scoreCalculators.uniform.description", - "app.scoreCalculators.universal.caption", - "app.scoreCalculators.universal.description", - "app.scoreCalculators.weighted.caption", - "app.scoreCalculators.weighted.description", - "app.scoreConfigExpression.addFunction", - "app.scoreConfigExpression.addLiteral", - "app.scoreConfigExpression.addNewParent", - "app.scoreConfigExpression.addTestResult", - "app.scoreConfigExpression.avg.description", - "app.scoreConfigExpression.clamp.description", - "app.scoreConfigExpression.copy", - "app.scoreConfigExpression.debug.explain", - "app.scoreConfigExpression.debug.title", - "app.scoreConfigExpression.div.description", - "app.scoreConfigExpression.editFunctionDialog.addDescription", - "app.scoreConfigExpression.editFunctionDialog.editDescription", - "app.scoreConfigExpression.editFunctionNodeDialog.title", - "app.scoreConfigExpression.editLiteralDialog.invalidInput", - "app.scoreConfigExpression.editLiteralNodeDialog.title", - "app.scoreConfigExpression.editTestDialog.description", - "app.scoreConfigExpression.editTestNodeDialog.title", - "app.scoreConfigExpression.help.li1", - "app.scoreConfigExpression.help.li2", - "app.scoreConfigExpression.help.li3", - "app.scoreConfigExpression.help.li4", - "app.scoreConfigExpression.help.p1", - "app.scoreConfigExpression.help.p2", - "app.scoreConfigExpression.help.p3", - "app.scoreConfigExpression.help.p4", - "app.scoreConfigExpression.help.title", - "app.scoreConfigExpression.max.description", - "app.scoreConfigExpression.min.description", - "app.scoreConfigExpression.move", - "app.scoreConfigExpression.mul.description", - "app.scoreConfigExpression.neg.description", - "app.scoreConfigExpression.openDebugDialog", - "app.scoreConfigExpression.openInfoDialog", - "app.scoreConfigExpression.openOptimizeDialog", - "app.scoreConfigExpression.optimize.allButton", - "app.scoreConfigExpression.optimize.allInfo", - "app.scoreConfigExpression.optimize.info", - "app.scoreConfigExpression.optimize.optimizeButton", - "app.scoreConfigExpression.optimize.optimizeInfo", - "app.scoreConfigExpression.optimize.removeConstantsButton", - "app.scoreConfigExpression.optimize.removeConstantsInfo", - "app.scoreConfigExpression.optimize.title", - "app.scoreConfigExpression.redo", - "app.scoreConfigExpression.removeNode", - "app.scoreConfigExpression.removeOnlyNode", - "app.scoreConfigExpression.sub.description", - "app.scoreConfigExpression.sum.description", - "app.scoreConfigExpression.swapNodes", - "app.scoreConfigExpression.test-result.description", - "app.scoreConfigExpression.undo", - "app.scoreConfigExpression.value.description", - "app.scoreConfigInfo.calculator", - "app.scoreConfigInfo.createdAt", - "app.scoreConfigInfo.dialogTitle", - "app.scoreConfigInfo.missing", - "app.scoreConfigInfo.missingButCanResubmit", - "app.scoreConfigInfo.missingTitle", - "app.scoreConfigInfo.rawConfig", - "app.scoreConfigInfoWeighted.noTests", - "app.scoreConfigInfoWeighted.score", - "app.scoreConfigInfoWeighted.test", - "app.scoreConfigInfoWeighted.totals", - "app.scoreConfigInfoWeighted.weight", - "app.serverManagement.description", - "app.serverManagement.title", - "app.shadowAssignment.editSettings", - "app.shadowAssignment.isBonus", - "app.shadowAssignment.isPublic", - "app.shadowAssignment.maxPoints", - "app.shadowAssignment.noName", - "app.shadowAssignment.title", - "app.shadowAssignmentPointsDetail.awardedAt", - "app.shadowAssignmentPointsDetail.awardedBy", - "app.shadowAssignmentPointsDetail.noPoints", - "app.shadowAssignmentPointsDetail.note", - "app.shadowAssignmentPointsDetail.points", - "app.shadowAssignmentPointsDetail.title", - "app.shadowAssignmentPointsTable.awardedAt", - "app.shadowAssignmentPointsTable.createPointsButton", - "app.shadowAssignmentPointsTable.formModalTitle", - "app.shadowAssignmentPointsTable.note", - "app.shadowAssignmentPointsTable.receivedPoints", - "app.shadowAssignmentPointsTable.removePointsButtonConfirmation", - "app.shadowAssignmentPointsTable.title", - "app.shadowAssignmentPointsTable.updatePointsButton", - "app.shadowAssignmentPointsTable.user", - "app.shadowAssignmentsTable.loading", - "app.shadowAssignmentsTable.noAssignments", - "app.sidebar.menu.admin.failures", - "app.sidebar.menu.admin.instances", - "app.sidebar.menu.admin.messages", - "app.sidebar.menu.admin.server", - "app.sidebar.menu.admin.sis", - "app.sidebar.menu.admin.users", - "app.sidebar.menu.archive", - "app.sidebar.menu.createAccount", - "app.sidebar.menu.dashboard", - "app.sidebar.menu.exercises", - "app.sidebar.menu.faq", - "app.sidebar.menu.memberOfGroups", - "app.sidebar.menu.pipelines", - "app.sidebar.menu.signIn", - "app.sidebar.menu.supervisorOfGroups", - "app.sidebar.menu.title", - "app.sisBindGroupForm.emptyGroup", - "app.sisBindGroupForm.failed", - "app.sisBindGroupForm.group", - "app.sisBindGroupForm.info", - "app.sisBindGroupForm.submit", - "app.sisBindGroupForm.submitting", - "app.sisBindGroupForm.success", - "app.sisBindGroupForm.title", - "app.sisCreateGroupForm.emptyParentGroup", - "app.sisCreateGroupForm.failed", - "app.sisCreateGroupForm.info", - "app.sisCreateGroupForm.parentGroup", - "app.sisCreateGroupForm.submit", - "app.sisCreateGroupForm.submitting", - "app.sisCreateGroupForm.success", - "app.sisCreateGroupForm.title", - "app.sisIntegration.deleteConfirm", - "app.sisIntegration.description", - "app.sisIntegration.identityInfo", - "app.sisIntegration.list", - "app.sisIntegration.noAccessible", - "app.sisIntegration.noCasIdentifier", - "app.sisIntegration.noCoursesGroupsAvailable", - "app.sisIntegration.noSisGroups", - "app.sisIntegration.plantButton", - "app.sisIntegration.title", - "app.sisIntegration.yearTerm", - "app.sisSupervisor.bindGroupButton", - "app.sisSupervisor.createGroupButton", - "app.sisSupervisor.groupAdmins", - "app.sisSupervisor.groupsAlreadyExist", - "app.sisSupervisor.lab", - "app.sisSupervisor.lecture", - "app.sisSupervisor.multiGroupPopover.title", - "app.sisSupervisor.noAccessible", - "app.sisSupervisor.noSisGroups", - "app.sisSupervisor.noUsersInNewGroupsWarning", - "app.sisSupervisor.notScheduled", - "app.sisSupervisor.organizationalGroupWarning", - "app.sisSupervisor.sisGroupsCreate", - "app.sisSupervisor.sisGroupsCreateExplain", - "app.sisSupervisor.yearTerm", - "app.solution.accepted", - "app.solution.anotherAcceptedWarning", - "app.solution.anotherBestWarning", - "app.solution.beforeFirstDeadline", - "app.solution.beforeSecondDeadline", - "app.solution.best", - "app.solution.dotnetResubmitTemporaryDisabled", - "app.solution.editNoteModalTitle", - "app.solution.emptyNote", - "app.solution.environment", - "app.solution.environmentNotAllowedCannotResubmit", - "app.solution.lastReviewed", - "app.solution.lastSolution", - "app.solution.note", - "app.solution.reviewed", - "app.solution.scoredPoints", - "app.solution.solutionAttempt", - "app.solution.solutionAttemptValue", - "app.solution.submittedAt", - "app.solution.title", - "app.solutionArchiveInfoBox.description", - "app.solutionArchiveInfoBox.title", - "app.solutionsTable.commentsIcon.count", - "app.solutionsTable.commentsIcon.last", - "app.solutionsTable.environment", - "app.solutionsTable.failedLoading", - "app.solutionsTable.loading", - "app.solutionsTable.noSolutionsFound", - "app.solutionsTable.note", - "app.solutionsTable.receivedPoints", - "app.solutionsTable.reviewedTooltip", - "app.solutionsTable.rowsCount", - "app.solutionsTable.solutionValidity", - "app.solutionsTable.submissionDate", - "app.solutionsTable.submitNewSolution", - "app.solutionsTable.title", - "app.sourceCodeViewer.downloadButton", - "app.sourceCodeViewer.incompleteWarning", - "app.sourceCodeViewer.utf8Warning", - "app.studentsList.gainedPointsOfWithoutBreakingSpaces", - "app.studentsList.noStudents", - "app.submission.evaluation.bonusPoints", - "app.submission.evaluation.status.failed", - "app.submission.evaluation.status.isCorrect", - "app.submission.evaluation.status.solutionMissingSubmission", - "app.submission.evaluation.status.systemFailiure", - "app.submission.evaluation.status.workInProgress", - "app.submission.evaluation.title", - "app.submission.evaluation.title.testResults", - "app.submission.evaluationStatus", - "app.submissionEvaluation.confirmDeleteLastSubmission", - "app.submissionEvaluation.evaluationFailedHeading", - "app.submissionEvaluation.evaluationFailedInternalError", - "app.submissionEvaluation.evaluationFailedMessage", - "app.submissionEvaluation.evaluationFailureResolved", - "app.submissionEvaluation.evaluationFailureResolvedNote", - "app.submissionEvaluation.noEvaluationYet", - "app.submissionEvaluation.noEvaluationsWhatSoEver", - "app.submissionEvaluation.show", - "app.submissionEvaluation.tableInfo", - "app.submissionEvaluation.title", - "app.submissionEvaluation.visible", - "app.submissionFailures.description", - "app.submissionFailures.failed", - "app.submissionFailures.failedDescription", - "app.submissionFailures.listTitle", - "app.submissionFailures.loading", - "app.submissionFailures.loadingDescription", - "app.submissionFailures.resolve", - "app.submissionFailures.resolveMaxLengthExceeded", - "app.submissionFailures.resolveNote", - "app.submissionFailures.resolveTitle", - "app.submissionFailures.sendEmail", - "app.submissionFailures.title", - "app.submissionStatus.accepted", - "app.submissions.testResultsTable.correctness", - "app.submissions.testResultsTable.cpuTimeExplain", - "app.submissions.testResultsTable.exitCode", - "app.submissions.testResultsTable.hideLog", - "app.submissions.testResultsTable.logIsPrivate", - "app.submissions.testResultsTable.memoryExceeded", - "app.submissions.testResultsTable.overallTestResult", - "app.submissions.testResultsTable.primaryLog", - "app.submissions.testResultsTable.secondaryLog", - "app.submissions.testResultsTable.showLog", - "app.submissions.testResultsTable.signalTooltip", - "app.submissions.testResultsTable.statusFailed", - "app.submissions.testResultsTable.statusOK", - "app.submissions.testResultsTable.statusSkipped", - "app.submissions.testResultsTable.timeExceeded", - "app.submissions.testResultsTable.wallTimeExplain", - "app.submistSolution.instructions", - "app.submistSolution.submitFailed", - "app.submitButton.invalid", - "app.submitRefSolution.noteLabel", - "app.submitRefSolution.title", - "app.submitSolution.addFile", - "app.submitSolution.dragAndDrop", - "app.submitSolution.emptyNoteSubmitConfirm", - "app.submitSolution.emptyNoteWarning", - "app.submitSolution.entryPoint", - "app.submitSolution.limitsExceeded", - "app.submitSolution.limitsExceededCount", - "app.submitSolution.limitsExceededSize", - "app.submitSolution.linkToWiki", - "app.submitSolution.noEnvironments", - "app.submitSolution.noteLabel", - "app.submitSolution.runtimeEnvironment", - "app.submitSolution.title", - "app.submitSolution.uploadFilesFirst", - "app.submitSolution.validating", - "app.sudebar.menu.admin.title", - "app.supplementaryFiles.cannotDeleteExplain", - "app.supplementaryFiles.deleteConfirm", - "app.supplementaryFilesTable.description", - "app.supplementaryFilesTable.title", - "app.systemMessages.acceptActiveMessages", - "app.systemMessages.description", - "app.systemMessages.failed", - "app.systemMessages.failedDescription", - "app.systemMessages.listTitle", - "app.systemMessages.loading", - "app.systemMessages.loadingDescription", - "app.systemMessages.newSystemMessage", - "app.systemMessages.title", - "app.systemMessages.titleLong", - "app.systemMessages.unacceptActiveMessages", - "app.systemMessagesList.noMessages", - "app.systemMessagesList.showAll", - "app.systemMessagesList.text", - "app.systemMessagesList.type", - "app.systemMessagesList.visibleFrom", - "app.systemMessagesList.visibleTo", - "app.tabbedArrayField.empty", - "app.tabbedArrayField.reallyRemoveQuestion", - "app.termsList.advertiseUntil", - "app.termsList.end", - "app.termsList.noTerms", - "app.termsList.start", - "app.termsList.summer", - "app.termsList.term", - "app.termsList.winter", - "app.termsList.year", - "app.user.description", - "app.user.examineGroupsInstance", - "app.user.newAccount", - "app.user.noCommonGroups", - "app.user.nothingInCommon.title", - "app.user.title", - "app.user.welcomeTitle", - "app.userList.noSupervisors", - "app.userList.noUsers", - "app.userName.externalIds", - "app.userName.userDeactivated", - "app.userSwitching.loginAs", - "app.users.createUser", - "app.users.description", - "app.users.listTitle", - "app.users.takeOver", - "app.users.title", - "app.users.userCreatedAt", - "app.users.users", - "app.usersName.notVerified.title", - "app.usersStats.description", - "app.usersname.notVerified.description", - "diff", - "generic.accessDenied", - "generic.acknowledge", - "generic.assignedAt", - "generic.author", - "generic.clearAll", - "generic.close", - "generic.create", - "generic.created", - "generic.createdAt", - "generic.creating", - "generic.creationFailed", - "generic.delete", - "generic.deleteFailed", - "generic.deleted", - "generic.deleting", - "generic.description", - "generic.detail", - "generic.details", - "generic.disable", - "generic.discussion", - "generic.edit", - "generic.effectiveRole", - "generic.email", - "generic.enable", - "generic.errorMessage", - "generic.filtersSet", - "generic.finishedAt", - "generic.hideAll", - "generic.inUse", - "generic.invertSelection", - "generic.lastUpdatedAt", - "generic.loading", - "generic.name", - "generic.nameOfPerson", - "generic.noRecordsInTable", - "generic.operationFailed", - "generic.reason", - "generic.reevaluatedBy", - "generic.refresh", - "generic.remove", - "generic.reset", - "generic.results", - "generic.role", - "generic.runtimeShortest", - "generic.runtimesShort", - "generic.save", - "generic.saved", - "generic.saving", - "generic.savingFailed", - "generic.scheduledAt", - "generic.search", - "generic.selectAll", - "generic.setFilters", - "generic.settings", - "generic.showAll", - "generic.startedAt", - "generic.submit", - "generic.submitted", - "generic.submitting", - "generic.tags", - "generic.updated", - "generic.uploadedAt", - "generic.validating", - "generic.version", - "recodex-judge-float", - "recodex-judge-float-newline", - "recodex-judge-normal", - "recodex-judge-normal-newline", - "recodex-judge-shuffle", - "recodex-judge-shuffle-all", - "recodex-judge-shuffle-newline", - "recodex-judge-shuffle-rows" -] \ No newline at end of file diff --git a/src/pages/Archive/Archive.js b/src/pages/Archive/Archive.js index 7bf8114ef..e4f12dbb0 100644 --- a/src/pages/Archive/Archive.js +++ b/src/pages/Archive/Archive.js @@ -2,7 +2,7 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; import { connect } from 'react-redux'; -import { FormattedMessage, injectIntl, intlShape } from 'react-intl'; +import { FormattedMessage, injectIntl } from 'react-intl'; import { Link } from 'react-router-dom'; import Page from '../../components/layout/Page'; @@ -186,7 +186,7 @@ Archive.propTypes = { instanceId: PropTypes.string.isRequired, instance: ImmutablePropTypes.map, groups: ImmutablePropTypes.map, - intl: intlShape, + intl: PropTypes.object, }; export default withLinks( diff --git a/src/pages/Assignment/Assignment.js b/src/pages/Assignment/Assignment.js index 26af67b03..3fa43c391 100644 --- a/src/pages/Assignment/Assignment.js +++ b/src/pages/Assignment/Assignment.js @@ -2,7 +2,7 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; import { connect } from 'react-redux'; -import { FormattedMessage, injectIntl, intlShape } from 'react-intl'; +import { FormattedMessage, injectIntl } from 'react-intl'; import { Col, Row, Alert } from 'react-bootstrap'; import { Link } from 'react-router-dom'; @@ -292,7 +292,7 @@ Assignment.propTypes = { exerciseSync: PropTypes.func.isRequired, solutions: ImmutablePropTypes.list.isRequired, fetchManyStatus: PropTypes.string, - intl: intlShape.isRequired, + intl: PropTypes.object.isRequired, }; export default withLinks( diff --git a/src/pages/AssignmentStats/AssignmentStats.js b/src/pages/AssignmentStats/AssignmentStats.js index 1fe08d9af..f3b7379e4 100644 --- a/src/pages/AssignmentStats/AssignmentStats.js +++ b/src/pages/AssignmentStats/AssignmentStats.js @@ -3,7 +3,7 @@ import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; import { Row, Col, Modal } from 'react-bootstrap'; import { connect } from 'react-redux'; -import { injectIntl, FormattedMessage, FormattedNumber, intlShape } from 'react-intl'; +import { injectIntl, FormattedMessage, FormattedNumber } from 'react-intl'; import { Link } from 'react-router-dom'; import { defaultMemoize } from 'reselect'; @@ -309,7 +309,7 @@ class AssignmentStats extends Component { resource: assignment, iconName: 'hourglass-start', breadcrumb: assignment => ({ - text: , + text: , link: ({ ASSIGNMENT_DETAIL_URI_FACTORY }) => ASSIGNMENT_DETAIL_URI_FACTORY(assignment.id), }), }, @@ -475,7 +475,7 @@ AssignmentStats.propTypes = { loadAsync: PropTypes.func.isRequired, downloadBestSolutionsArchive: PropTypes.func.isRequired, fetchManyStatus: PropTypes.string, - intl: intlShape, + intl: PropTypes.object, links: PropTypes.object.isRequired, }; diff --git a/src/pages/ChangePassword/ChangePassword.js b/src/pages/ChangePassword/ChangePassword.js index f72c98312..f791793f3 100644 --- a/src/pages/ChangePassword/ChangePassword.js +++ b/src/pages/ChangePassword/ChangePassword.js @@ -1,7 +1,7 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import { canUseDOM } from 'exenv'; -import { FormattedMessage, FormattedRelative } from 'react-intl'; +import { FormattedMessage, FormattedRelativeTime } from 'react-intl'; import { connect } from 'react-redux'; import { reset } from 'redux-form'; @@ -108,12 +108,12 @@ class ChangePassword extends Component { } breadcrumbs={[ { - text: , + text: , link: HOME_URI, iconName: 'home', }, { - text: , + text: , iconName: 'shield-alt', }, ]}> @@ -143,7 +143,7 @@ class ChangePassword extends Component { />

{' '} - +

)} diff --git a/src/pages/EditAssignment/EditAssignment.js b/src/pages/EditAssignment/EditAssignment.js index 3e528a24c..a07d8d6c5 100644 --- a/src/pages/EditAssignment/EditAssignment.js +++ b/src/pages/EditAssignment/EditAssignment.js @@ -115,12 +115,12 @@ class EditAssignment extends Component { iconName: 'ghost', }, { - text: , + text: , iconName: 'hourglass-start', link: ASSIGNMENT_DETAIL_URI_FACTORY(assignmentId), }, { - text: , + text: , iconName: ['far', 'edit'], }, ]}> diff --git a/src/pages/EditExerciseConfig/EditExerciseConfig.js b/src/pages/EditExerciseConfig/EditExerciseConfig.js index 107807c5d..f2ce270be 100644 --- a/src/pages/EditExerciseConfig/EditExerciseConfig.js +++ b/src/pages/EditExerciseConfig/EditExerciseConfig.js @@ -1,7 +1,7 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; -import { FormattedMessage, intlShape, injectIntl } from 'react-intl'; +import { FormattedMessage, injectIntl } from 'react-intl'; import { Row, Col } from 'react-bootstrap'; import { withRouter } from 'react-router'; import { connect } from 'react-redux'; @@ -710,7 +710,7 @@ EditExerciseConfig.propTypes = { supplementaryFiles: ImmutablePropTypes.map, supplementaryFilesStatus: PropTypes.string, links: PropTypes.object.isRequired, - intl: intlShape.isRequired, + intl: PropTypes.object.isRequired, loadAsync: PropTypes.func.isRequired, fetchPipelinesVariables: PropTypes.func.isRequired, setExerciseConfigType: PropTypes.func.isRequired, diff --git a/src/pages/EditGroup/EditGroup.js b/src/pages/EditGroup/EditGroup.js index edb81e8e8..b50e613dd 100644 --- a/src/pages/EditGroup/EditGroup.js +++ b/src/pages/EditGroup/EditGroup.js @@ -1,7 +1,7 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; -import { FormattedMessage, injectIntl, intlShape } from 'react-intl'; +import { FormattedMessage, injectIntl } from 'react-intl'; import { Row, Col, Form } from 'react-bootstrap'; import { connect } from 'react-redux'; import { reset, formValueSelector } from 'redux-form'; @@ -267,7 +267,7 @@ EditGroup.propTypes = { relocateGroup: PropTypes.func.isRequired, hasThreshold: PropTypes.bool, isSuperAdmin: PropTypes.bool, - intl: intlShape, + intl: PropTypes.object, }; const editGroupFormSelector = formValueSelector('editGroup'); diff --git a/src/pages/EditShadowAssignment/EditShadowAssignment.js b/src/pages/EditShadowAssignment/EditShadowAssignment.js index 894d4c599..3e25c50ef 100644 --- a/src/pages/EditShadowAssignment/EditShadowAssignment.js +++ b/src/pages/EditShadowAssignment/EditShadowAssignment.js @@ -107,7 +107,7 @@ class EditShadowAssignment extends Component { } breadcrumbs={[ { - text: , + text: , iconName: 'user-secret', link: SHADOW_ASSIGNMENT_DETAIL_URI_FACTORY(assignmentId), }, diff --git a/src/pages/EditUser/EditUser.js b/src/pages/EditUser/EditUser.js index 45d830edc..aa20a96db 100644 --- a/src/pages/EditUser/EditUser.js +++ b/src/pages/EditUser/EditUser.js @@ -2,7 +2,7 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; import { connect } from 'react-redux'; -import { FormattedMessage, injectIntl, intlShape } from 'react-intl'; +import { FormattedMessage, injectIntl } from 'react-intl'; import { Row, Col } from 'react-bootstrap'; import { defaultMemoize } from 'reselect'; @@ -93,7 +93,7 @@ class EditUser extends Component { resource: user, iconName: 'user', breadcrumb: user => ({ - text: , + text: , link: ({ USER_URI_FACTORY }) => USER_URI_FACTORY(user.id), }), }, @@ -238,7 +238,7 @@ EditUser.propTypes = { generateToken: PropTypes.func.isRequired, setRole: PropTypes.func.isRequired, takeOver: PropTypes.func.isRequired, - intl: intlShape, + intl: PropTypes.object, }; export default connect( diff --git a/src/pages/EmailVerification/EmailVerification.js b/src/pages/EmailVerification/EmailVerification.js index 5ca8eb51b..b0695f42c 100644 --- a/src/pages/EmailVerification/EmailVerification.js +++ b/src/pages/EmailVerification/EmailVerification.js @@ -65,12 +65,12 @@ class EmailVerification extends Component { } breadcrumbs={[ { - text: , + text: , link: HOME_URI, iconName: 'home', }, { - text: , + text: , iconName: 'tick', }, ]}> diff --git a/src/pages/Exercise/Exercise.js b/src/pages/Exercise/Exercise.js index f578cf505..b228bbe09 100644 --- a/src/pages/Exercise/Exercise.js +++ b/src/pages/Exercise/Exercise.js @@ -2,7 +2,7 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; import { connect } from 'react-redux'; -import { FormattedMessage, defineMessages, intlShape, injectIntl } from 'react-intl'; +import { FormattedMessage, defineMessages, injectIntl } from 'react-intl'; import { Row, Col } from 'react-bootstrap'; import { Link } from 'react-router-dom'; @@ -291,7 +291,7 @@ Exercise.propTypes = { forkedFrom: ImmutablePropTypes.map, runtimeEnvironments: ImmutablePropTypes.map, referenceSolutions: ImmutablePropTypes.map, - intl: intlShape.isRequired, + intl: PropTypes.object.isRequired, submitting: PropTypes.bool, initCreateReferenceSolution: PropTypes.func.isRequired, links: PropTypes.object, diff --git a/src/pages/ExerciseAssignments/ExerciseAssignments.js b/src/pages/ExerciseAssignments/ExerciseAssignments.js index 1a9c41fb7..5b6127e19 100644 --- a/src/pages/ExerciseAssignments/ExerciseAssignments.js +++ b/src/pages/ExerciseAssignments/ExerciseAssignments.js @@ -2,7 +2,7 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; import { connect } from 'react-redux'; -import { FormattedMessage, defineMessages, intlShape, injectIntl } from 'react-intl'; +import { FormattedMessage, defineMessages, injectIntl } from 'react-intl'; import { Row, Col, Alert } from 'react-bootstrap'; import { formValueSelector } from 'redux-form'; import { defaultMemoize } from 'reselect'; @@ -288,7 +288,7 @@ ExerciseAssignments.propTypes = { allowSecondDeadline: PropTypes.bool, visibility: PropTypes.string, links: PropTypes.object, - intl: intlShape.isRequired, + intl: PropTypes.object.isRequired, loadAsync: PropTypes.func.isRequired, assignExercise: PropTypes.func.isRequired, editAssignment: PropTypes.func.isRequired, diff --git a/src/pages/Exercises/Exercises.js b/src/pages/Exercises/Exercises.js index f7c0137e5..df15631e4 100644 --- a/src/pages/Exercises/Exercises.js +++ b/src/pages/Exercises/Exercises.js @@ -2,7 +2,7 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; import { connect } from 'react-redux'; -import { injectIntl, FormattedMessage, intlShape } from 'react-intl'; +import { injectIntl, FormattedMessage } from 'react-intl'; import { withRouter } from 'react-router'; import { defaultMemoize } from 'reselect'; @@ -55,13 +55,11 @@ class Exercises extends Component { return ( } - description={ - - } + title={} + description={} breadcrumbs={[ { - text: , + text: , iconName: 'puzzle-piece', }, ]}> @@ -93,7 +91,7 @@ Exercises.propTypes = { groups: ImmutablePropTypes.map, groupsAccessor: PropTypes.func.isRequired, query: PropTypes.string, - intl: intlShape, + intl: PropTypes.object, links: PropTypes.object.isRequired, createGroupExercise: PropTypes.func.isRequired, }; diff --git a/src/pages/GroupDetail/GroupDetail.js b/src/pages/GroupDetail/GroupDetail.js index eb34aa305..89863f8f7 100644 --- a/src/pages/GroupDetail/GroupDetail.js +++ b/src/pages/GroupDetail/GroupDetail.js @@ -3,7 +3,7 @@ import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; import { connect } from 'react-redux'; import Button from '../../components/widgets/TheButton'; -import { FormattedMessage, injectIntl, intlShape } from 'react-intl'; +import { FormattedMessage, injectIntl } from 'react-intl'; import { Row, Col } from 'react-bootstrap'; import App from '../../containers/App'; @@ -356,24 +356,29 @@ class GroupDetail extends Component {
)} - {// unfortunatelly, this cannot be covered by permission hints at the moment, since addStudent involes both student and group - (isGroupSupervisor || isGroupAdmin) && - !data.organizational && - !data.archived && - isSupervisorRole(effectiveRole) && - !isStudentRole(effectiveRole) && ( - - - - } - isOpen> - - - - - )} + { + // unfortunatelly, this cannot be covered by permission hints at the moment, since addStudent involes both student and group + (isGroupSupervisor || isGroupAdmin) && + !data.organizational && + !data.archived && + isSupervisorRole(effectiveRole) && + !isStudentRole(effectiveRole) && ( + + + + } + isOpen> + + + + + ) + } )} @@ -445,7 +450,7 @@ GroupDetail.propTypes = { setShadowPoints: PropTypes.func.isRequired, removeShadowPoints: PropTypes.func.isRequired, links: PropTypes.object, - intl: intlShape, + intl: PropTypes.object, }; const mapStateToProps = ( diff --git a/src/pages/Home/Home.js b/src/pages/Home/Home.js index f25ca200a..2c2e70939 100644 --- a/src/pages/Home/Home.js +++ b/src/pages/Home/Home.js @@ -1,6 +1,6 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { FormattedMessage, FormattedHTMLMessage } from 'react-intl'; +import { FormattedMessage } from 'react-intl'; import { Row, Col, Image } from 'react-bootstrap'; import PageContent from '../../components/layout/PageContent'; @@ -11,20 +11,8 @@ import { URL_PATH_PREFIX } from '../../helpers/config'; const Home = ({ links: { GITHUB_BUGS_URL } }) => ( - } - description={ - - }> + title={} + description={}>
@@ -48,16 +36,18 @@ const Home = ({ links: { GITHUB_BUGS_URL } }) => (

-

- + */}

(

- @@ -95,10 +85,12 @@ const Home = ({ links: { GITHUB_BUGS_URL } }) => (

- + */}

diff --git a/src/pages/Instance/Instance.js b/src/pages/Instance/Instance.js index d21a4b6e0..7a0209712 100644 --- a/src/pages/Instance/Instance.js +++ b/src/pages/Instance/Instance.js @@ -76,7 +76,7 @@ class Instance extends Component { description={} breadcrumbs={[ { - text: , + text: , iconName: 'info-circle', }, ]}> @@ -210,17 +210,19 @@ export default withLinks( }, } ) => ({ - createGroup: userId => ({ localizedTexts, hasThreshold, threshold, makeMeAdmin, ...data }) => - dispatch( - createGroup({ - ...data, - hasThreshold, - threshold: hasThreshold ? threshold : undefined, - localizedTexts: transformLocalizedTextsFormData(localizedTexts), - noAdmin: !makeMeAdmin, // inverted logic in API, user is added as admin by default - instanceId, - }) - ).then(() => Promise.all([dispatch(fetchAllGroups()), dispatch(fetchUser(userId))])), + createGroup: + userId => + ({ localizedTexts, hasThreshold, threshold, makeMeAdmin, ...data }) => + dispatch( + createGroup({ + ...data, + hasThreshold, + threshold: hasThreshold ? threshold : undefined, + localizedTexts: transformLocalizedTextsFormData(localizedTexts), + noAdmin: !makeMeAdmin, // inverted logic in API, user is added as admin by default + instanceId, + }) + ).then(() => Promise.all([dispatch(fetchAllGroups()), dispatch(fetchUser(userId))])), loadAsync: fetchGroupsStatus => Instance.loadAsync({ instanceId, fetchGroupsStatus }, dispatch), }) )(injectIntl(Instance)) diff --git a/src/pages/Login/Login.js b/src/pages/Login/Login.js index 7ca348a7c..285a929f7 100644 --- a/src/pages/Login/Login.js +++ b/src/pages/Login/Login.js @@ -1,7 +1,7 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; -import { FormattedMessage, intlShape, injectIntl } from 'react-intl'; +import { FormattedMessage, injectIntl } from 'react-intl'; import { connect } from 'react-redux'; import { Link } from 'react-router-dom'; import { reset, SubmissionError } from 'redux-form'; @@ -104,12 +104,12 @@ class Login extends Component { description={} breadcrumbs={[ { - text: , + text: , link: HOME_URI, iconName: 'home', }, { - text: , + text: , iconName: 'sign-in-alt', }, ]}> @@ -195,7 +195,7 @@ Login.propTypes = { loggedInUser: ImmutablePropTypes.map, reset: PropTypes.func.isRequired, links: PropTypes.object.isRequired, - intl: intlShape, + intl: PropTypes.object, }; export default withLinks( diff --git a/src/pages/Pipeline/Pipeline.js b/src/pages/Pipeline/Pipeline.js index 241c361d6..23b6a2063 100644 --- a/src/pages/Pipeline/Pipeline.js +++ b/src/pages/Pipeline/Pipeline.js @@ -75,7 +75,7 @@ class Pipeline extends Component { description={} breadcrumbs={[ { - text: , + text: , iconName: 'random', link: PIPELINES_URI, }, diff --git a/src/pages/ReferenceSolution/ReferenceSolution.js b/src/pages/ReferenceSolution/ReferenceSolution.js index 38b4f4c9d..02bfc16c6 100644 --- a/src/pages/ReferenceSolution/ReferenceSolution.js +++ b/src/pages/ReferenceSolution/ReferenceSolution.js @@ -1,7 +1,7 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import { connect } from 'react-redux'; -import { FormattedMessage, defineMessages, intlShape, injectIntl } from 'react-intl'; +import { FormattedMessage, defineMessages, injectIntl } from 'react-intl'; import ImmutablePropTypes from 'react-immutable-proptypes'; import { defaultMemoize } from 'reselect'; @@ -183,7 +183,7 @@ ReferenceSolution.propTypes = { fetchStatus: PropTypes.string, scoreConfigSelector: PropTypes.func, evaluations: ImmutablePropTypes.map, - intl: intlShape.isRequired, + intl: PropTypes.object.isRequired, links: PropTypes.object.isRequired, }; diff --git a/src/pages/Registration/Registration.js b/src/pages/Registration/Registration.js index a9035e956..4b5b49206 100644 --- a/src/pages/Registration/Registration.js +++ b/src/pages/Registration/Registration.js @@ -1,7 +1,7 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; -import { FormattedMessage, intlShape, injectIntl } from 'react-intl'; +import { FormattedMessage, injectIntl } from 'react-intl'; import { connect } from 'react-redux'; import { reset, startAsyncValidation } from 'redux-form'; import { defaultMemoize } from 'reselect'; @@ -76,12 +76,12 @@ class Registration extends Component { description={} breadcrumbs={[ { - text: , + text: , link: HOME_URI, iconName: 'home', }, { - text: , + text: , iconName: 'user-plus', }, ]}> @@ -156,7 +156,7 @@ Registration.propTypes = { reset: PropTypes.func.isRequired, triggerAsyncValidation: PropTypes.func.isRequired, links: PropTypes.object.isRequired, - intl: intlShape, + intl: PropTypes.object, }; export default withLinks( @@ -169,8 +169,10 @@ export default withLinks( loadAsync: () => Promise.all([dispatch(fetchInstances())]), createAccount: ({ firstName, lastName, email, password, passwordConfirm, instanceId }) => dispatch(createAccount(firstName, lastName, email, password, passwordConfirm, instanceId)), - createExternalAccount: (authType = 'secondary') => ({ instanceId, serviceId, ...credentials }) => - dispatch(createExternalAccount(instanceId, serviceId, credentials, authType)), + createExternalAccount: + (authType = 'secondary') => + ({ instanceId, serviceId, ...credentials }) => + dispatch(createExternalAccount(instanceId, serviceId, credentials, authType)), triggerAsyncValidation: () => dispatch(startAsyncValidation('registration')), reset: () => { dispatch(reset('registration')); diff --git a/src/pages/ResetPassword/ResetPassword.js b/src/pages/ResetPassword/ResetPassword.js index b972936e4..90be9fa26 100644 --- a/src/pages/ResetPassword/ResetPassword.js +++ b/src/pages/ResetPassword/ResetPassword.js @@ -30,12 +30,12 @@ const ResetPassword = ({ resetPassword, isReseting, hasFailed, hasSucceeded, lin } breadcrumbs={[ { - text: , + text: , link: HOME_URI, iconName: 'home', }, { - text: , + text: , iconName: 'key', }, ]}> diff --git a/src/pages/ShadowAssignment/ShadowAssignment.js b/src/pages/ShadowAssignment/ShadowAssignment.js index ae4d1eb3e..bbe3793b1 100644 --- a/src/pages/ShadowAssignment/ShadowAssignment.js +++ b/src/pages/ShadowAssignment/ShadowAssignment.js @@ -1,7 +1,7 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import { connect } from 'react-redux'; -import { FormattedMessage, injectIntl, intlShape } from 'react-intl'; +import { FormattedMessage, injectIntl } from 'react-intl'; import { Col, Row } from 'react-bootstrap'; import { defaultMemoize } from 'reselect'; import { Link } from 'react-router-dom'; @@ -127,7 +127,7 @@ ShadowAssignment.propTypes = { group: PropTypes.func, loadAsync: PropTypes.func.isRequired, links: PropTypes.object.isRequired, - intl: intlShape.isRequired, + intl: PropTypes.object.isRequired, }; export default withLinks( diff --git a/src/pages/SisIntegration/SisIntegration.js b/src/pages/SisIntegration/SisIntegration.js index 33d5486ad..582be40ae 100644 --- a/src/pages/SisIntegration/SisIntegration.js +++ b/src/pages/SisIntegration/SisIntegration.js @@ -2,7 +2,7 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; import { connect } from 'react-redux'; -import { FormattedMessage, injectIntl, intlShape } from 'react-intl'; +import { FormattedMessage, injectIntl } from 'react-intl'; import { Row, Col } from 'react-bootstrap'; import moment from 'moment'; @@ -372,7 +372,7 @@ SisIntegration.propTypes = { addSubgroup: PropTypes.func, setArchived: PropTypes.func, refreshGroups: PropTypes.func, - intl: intlShape.isRequired, + intl: PropTypes.object.isRequired, }; const mapStateToProps = state => { diff --git a/src/pages/Solution/Solution.js b/src/pages/Solution/Solution.js index 530c26887..f2d8ea185 100644 --- a/src/pages/Solution/Solution.js +++ b/src/pages/Solution/Solution.js @@ -1,7 +1,7 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import { connect } from 'react-redux'; -import { FormattedMessage, injectIntl, intlShape } from 'react-intl'; +import { FormattedMessage, injectIntl } from 'react-intl'; import { defaultMemoize } from 'reselect'; import Page from '../../components/layout/Page'; @@ -218,7 +218,7 @@ Solution.propTypes = { editNote: PropTypes.func.isRequired, deleteEvaluation: PropTypes.func.isRequired, refreshSolutionEvaluations: PropTypes.func.isRequired, - intl: intlShape, + intl: PropTypes.object, }; export default connect( diff --git a/src/pages/SystemMessages/SystemMessages.js b/src/pages/SystemMessages/SystemMessages.js index ec6ef01fe..3bc6d67bf 100644 --- a/src/pages/SystemMessages/SystemMessages.js +++ b/src/pages/SystemMessages/SystemMessages.js @@ -1,7 +1,7 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import { connect } from 'react-redux'; -import { FormattedMessage, injectIntl, intlShape } from 'react-intl'; +import { FormattedMessage, injectIntl } from 'react-intl'; import Button from '../../components/widgets/TheButton'; import PageContent from '../../components/layout/PageContent'; @@ -178,7 +178,7 @@ SystemMessages.propTypes = { createMessage: PropTypes.func, editMessage: PropTypes.func, systemMessages: PropTypes.array.isRequired, - intl: intlShape.isRequired, + intl: PropTypes.object.isRequired, }; export default connect( diff --git a/src/pages/Users/Users.js b/src/pages/Users/Users.js index d5425bb53..09982b73d 100644 --- a/src/pages/Users/Users.js +++ b/src/pages/Users/Users.js @@ -2,7 +2,7 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; import { connect } from 'react-redux'; -import { FormattedMessage, injectIntl, intlShape } from 'react-intl'; +import { FormattedMessage, injectIntl } from 'react-intl'; import { Row, Col, Modal } from 'react-bootstrap'; import { Link } from 'react-router-dom'; import { defaultMemoize } from 'reselect'; @@ -248,7 +248,7 @@ Users.propTypes = { createUser: PropTypes.func.isRequired, reloadPagination: PropTypes.func.isRequired, links: PropTypes.object.isRequired, - intl: intlShape.isRequired, + intl: PropTypes.object.isRequired, }; export default withLinks( diff --git a/src/redux/helpers/api/download.js b/src/redux/helpers/api/download.js index 2658c1289..f680d1472 100644 --- a/src/redux/helpers/api/download.js +++ b/src/redux/helpers/api/download.js @@ -1,59 +1,59 @@ import { createApiAction } from '../../middleware/apiMiddleware'; -import { saveAs } from 'file-saver'; import { addNotification } from '../../modules/notifications'; const trivialFileNameSelector = (id, state) => id; -export const downloadHelper = ({ - fetch, - endpoint, - actionType, - fileNameSelector = trivialFileNameSelector, - contentType, -}) => (id, fileName = null) => (dispatch, getState) => { - let initial; - if (fetch !== null) { - initial = dispatch(fetch(id)); - } else { - initial = Promise.resolve(); - } - return initial - .then(() => - dispatch( - createApiAction({ - type: actionType, - method: 'GET', - endpoint: endpoint(id), - doNotProcess: true, // the response is not (does not have to be) a JSON - }) +export const downloadHelper = + ({ fetch, endpoint, actionType, fileNameSelector = trivialFileNameSelector, contentType }) => + (id, fileName = null) => + (dispatch, getState) => { + let initial; + if (fetch !== null) { + initial = dispatch(fetch(id)); + } else { + initial = Promise.resolve(); + } + return initial + .then(() => + dispatch( + createApiAction({ + type: actionType, + method: 'GET', + endpoint: endpoint(id), + doNotProcess: true, // the response is not (does not have to be) a JSON + }) + ) ) - ) - .then(result => { - const { - value: { ok, status }, - } = result; - if (ok === false) { - const msg = - status === 404 ? 'The file could not be found on the server.' : `This file cannot be downloaded (${status}).`; - throw new Error(msg); - } + .then(result => { + const { + value: { ok, status }, + } = result; + if (ok === false) { + const msg = + status === 404 + ? 'The file could not be found on the server.' + : `This file cannot be downloaded (${status}).`; + throw new Error(msg); + } - return result; - }) - .then(({ value }) => value.blob()) - .then(blob => { - const typedBlob = new Blob([blob], { type: contentType }); - fileName = fileName || fileNameSelector(id, getState()); - saveAs(typedBlob, fileName); - return Promise.resolve(); - }) - .catch(e => dispatch(addNotification(e.message, false))); -}; + return result; + }) + .then(({ value }) => value.blob()) + .then(blob => { + const { saveAs } = require('file-saver'); // dynamic loading, to avoid errors in headles nodejs execution + const typedBlob = new Blob([blob], { type: contentType }); + fileName = fileName || fileNameSelector(id, getState()); + saveAs(typedBlob, fileName, { autoBom: false }); + return Promise.resolve(); + }) + .catch(e => dispatch(addNotification(e.message, false))); + }; export const downloadString = (fileName, data, contentType, addBOM = false) => { + const { saveAs } = require('file-saver'); // dynamic loading, to avoid errors in headles nodejs execution const blobData = addBOM ? [new Uint8Array([0xef, 0xbb, 0xbf])] : []; blobData.push(data); const typedBlob = new Blob(blobData, { type: contentType }); - saveAs(typedBlob, fileName, true); + saveAs(typedBlob, fileName, { autoBom: false }); return Promise.resolve(); }; diff --git a/src/redux/selectors/exercises.js b/src/redux/selectors/exercises.js index 9bf1de561..e321cc333 100644 --- a/src/redux/selectors/exercises.js +++ b/src/redux/selectors/exercises.js @@ -10,31 +10,19 @@ const getResources = exercises => exercises && exercises.get('resources'); const getGroupExercises = state => state.groupExercises; const getRuntimeEnvironments = exercise => exercise && exercise.getIn(['data', 'runtimeEnvironments'], EMPTY_LIST); -export const exercisesSelector = createSelector( - getExercises, - getResources -); +export const exercisesSelector = createSelector(getExercises, getResources); export const exerciseSelector = exerciseId => - createSelector( - exercisesSelector, - exercises => exercises && exercises.get(exerciseId) - ); + createSelector(exercisesSelector, exercises => exercises && exercises.get(exerciseId)); export const exerciseForkedFromSelector = defaultMemoize(exerciseId => - createSelector( - exercisesSelector, - exercises => { - const fokredId = exercises && exercises.getIn([exerciseId, 'data', 'forkedFrom']); - return fokredId && exercises.get(fokredId); - } - ) + createSelector(exercisesSelector, exercises => { + const fokredId = exercises && exercises.getIn([exerciseId, 'data', 'forkedFrom']); + return fokredId && exercises.get(fokredId); + }) ); export const getExercise = id => - createSelector( - getExercises, - exercises => exercises && exercises.getIn(['resources', id]) - ); + createSelector(getExercises, exercises => exercises && exercises.getIn(['resources', id])); export const getExerciseOfAssignmentJS = createSelector( [getExercises, getAssignment], @@ -46,16 +34,10 @@ export const getExerciseOfAssignmentJS = createSelector( } ); -export const getExerciseSelector = createSelector( - getExercises, - exercises => id => exercises.getIn(['resources', id]) -); +export const getExerciseSelector = createSelector(getExercises, exercises => id => exercises.getIn(['resources', id])); export const getExerciseRuntimeEnvironments = defaultMemoize(id => - createSelector( - getExercise(id), - getRuntimeEnvironments - ) + createSelector(getExercise(id), getRuntimeEnvironments) ); export const getExerciseRuntimeEnvironmentsSelector = createSelector( @@ -64,10 +46,7 @@ export const getExerciseRuntimeEnvironmentsSelector = createSelector( ); export const getFork = (id, forkId) => - createSelector( - getExercise(id), - exercise => exercise.getIn(['data', 'forks', forkId]) - ); + createSelector(getExercise(id), exercise => exercise.getIn(['data', 'forks', forkId])); export const getExercisesByIdsSelector = ids => createSelector( @@ -87,20 +66,17 @@ export const getExercisesForGroup = createSelector( ); export const getExerciseAttachingGroupId = defaultMemoize(id => - createSelector( - getExercise(id), - exercise => exercise && exercise.getIn(['data', 'attachingGroupId'], null) - ) + createSelector(getExercise(id), exercise => exercise && exercise.getIn(['data', 'attachingGroupId'], null)) ); export const getExerciseDetachingGroupId = defaultMemoize(id => - createSelector( - getExercise(id), - exercise => exercise && exercise.getIn(['data', 'detachingGroupId'], null) - ) + createSelector(getExercise(id), exercise => exercise && exercise.getIn(['data', 'detachingGroupId'], null)) ); -export const getExerciseTags = state => getExercises(state).get('tags', []); +export const getExerciseTags = state => { + const res = getExercises(state).get('tags'); + return res && Array.isArray(res) ? res : []; +}; export const getExerciseTagsLoading = state => getExercises(state).get('tags') === null; export const getExerciseTagsUpdatePending = state => getExercises(state).get('tagsPending', null); diff --git a/src/server.js b/src/server.js index c252db50a..44a8a55e7 100644 --- a/src/server.js +++ b/src/server.js @@ -14,9 +14,6 @@ import fs from 'fs'; import { StaticRouter } from 'react-router'; -import { addLocaleData } from 'react-intl'; -import cs from 'react-intl/locale-data/cs'; - import { configureStore } from './redux/store'; import { loggedInUserIdSelector } from './redux/selectors/auth'; import { isLoggedAsSuperAdmin } from './redux/selectors/users'; @@ -25,7 +22,12 @@ import { TOKEN_COOKIES_KEY, INSTANCEID_COOKIES_KEY } from './redux/middleware/au import { LANG_COOKIES_KEY } from './redux/middleware/langMiddleware'; import App from './containers/App'; -addLocaleData([...cs]); +import '@formatjs/intl-pluralrules/polyfill'; +import '@formatjs/intl-pluralrules/locale-data/en'; +import '@formatjs/intl-pluralrules/locale-data/cs'; +import '@formatjs/intl-relativetimeformat/polyfill'; +import '@formatjs/intl-relativetimeformat/locale-data/en'; +import '@formatjs/intl-relativetimeformat/locale-data/cs'; // Register global atob a btoa functions global.Buffer = global.Buffer || require('buffer').Buffer; @@ -63,7 +65,7 @@ const style = getFileName('public/style-*.css', `${urlPrefix}/`) || `${urlPrefix const app = new Express(); const ejs = require('ejs').__express; app.set('view engine', 'ejs'); -app.engine('.ejs', ejs); +app.engine('ejs', ejs); app.use( urlPrefix, Express.static('public', { diff --git a/yarn.lock b/yarn.lock index 22912c50d..295c723b7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -44,7 +44,12 @@ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.14.5.tgz#8ef4c18e58e801c5c95d3c1c0f2874a2680fadea" integrity sha512-kixrYn4JwfAVPa0f2yfzc2AWti6WRRyO3XjWW5PJAvtE11qhSayrrcrEnee05KAtNaPC+EwehE8Qt1UedEVB8w== -"@babel/core@^7.0.0", "@babel/core@^7.14.6": +"@babel/compat-data@^7.14.7": + version "7.14.7" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.14.7.tgz#7b047d7a3a89a67d2258dc61f604f098f1bc7e08" + integrity sha512-nS6dZaISCXJ3+518CWiBfEr//gHyMO02uDxBkXTKZDN5POruCnOZ1N4YBRZDCabwF8nZMWBpRxIicmXtBs+fvw== + +"@babel/core@^7.0.0", "@babel/core@^7.14.6", "@babel/core@^7.9.0": version "7.14.6" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.14.6.tgz#e0814ec1a950032ff16c13a2721de39a8416fcab" integrity sha512-gJnOEWSqTk96qG5BoIrl5bVtc23DCycmIePPYnamY9RboYdI4nFy5vAQMSl81O5K/W0sLDWfGysnOECC+KUUCA== @@ -65,28 +70,6 @@ semver "^6.3.0" source-map "^0.5.0" -"@babel/core@^7.6.2": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.9.0.tgz#ac977b538b77e132ff706f3b8a4dbad09c03c56e" - integrity sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w== - dependencies: - "@babel/code-frame" "^7.8.3" - "@babel/generator" "^7.9.0" - "@babel/helper-module-transforms" "^7.9.0" - "@babel/helpers" "^7.9.0" - "@babel/parser" "^7.9.0" - "@babel/template" "^7.8.6" - "@babel/traverse" "^7.9.0" - "@babel/types" "^7.9.0" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.1" - json5 "^2.1.2" - lodash "^4.17.13" - resolve "^1.3.2" - semver "^5.4.1" - source-map "^0.5.0" - "@babel/generator@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.14.5.tgz#848d7b9f031caca9d0cd0af01b063f226f52d785" @@ -128,13 +111,13 @@ "@babel/helper-explode-assignable-expression" "^7.14.5" "@babel/types" "^7.14.5" -"@babel/helper-builder-react-jsx@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.9.0.tgz#16bf391990b57732700a3278d4d9a81231ea8d32" - integrity sha512-weiIo4gaoGgnhff54GQ3P5wsUQmnSwpkvU0r6ZHq6TzoSzKy4JxHEgnxNytaKbov2a9z/CVNyzliuCOUPEX3Jw== +"@babel/helper-builder-react-jsx@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.14.5.tgz#87620c97a8729e91caf9e6f0d324fff23e90bb5d" + integrity sha512-LT/856RUBXAHjmvJuLuI6XYZZAZNMSS+N2Yf5EUoHgSWtiWrAaGh7t5saP7sPCq07uvWVxxK3gwwm3weA9gKLg== dependencies: - "@babel/helper-annotate-as-pure" "^7.8.3" - "@babel/types" "^7.9.0" + "@babel/helper-annotate-as-pure" "^7.14.5" + "@babel/types" "^7.14.5" "@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.14.5": version "7.14.5" @@ -242,13 +225,6 @@ dependencies: "@babel/types" "^7.14.5" -"@babel/helper-member-expression-to-functions@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz#659b710498ea6c1d9907e0c73f206eee7dadc24c" - integrity sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA== - dependencies: - "@babel/types" "^7.8.3" - "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz#6d1a44df6a38c957aa7c312da076429f11b422f3" @@ -256,13 +232,6 @@ dependencies: "@babel/types" "^7.14.5" -"@babel/helper-module-imports@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz#7fe39589b39c016331b6b8c3f441e8f0b1419498" - integrity sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg== - dependencies: - "@babel/types" "^7.8.3" - "@babel/helper-module-transforms@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.14.5.tgz#7de42f10d789b423eb902ebd24031ca77cb1e10e" @@ -277,19 +246,6 @@ "@babel/traverse" "^7.14.5" "@babel/types" "^7.14.5" -"@babel/helper-module-transforms@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz#43b34dfe15961918707d247327431388e9fe96e5" - integrity sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA== - dependencies: - "@babel/helper-module-imports" "^7.8.3" - "@babel/helper-replace-supers" "^7.8.6" - "@babel/helper-simple-access" "^7.8.3" - "@babel/helper-split-export-declaration" "^7.8.3" - "@babel/template" "^7.8.6" - "@babel/types" "^7.9.0" - lodash "^4.17.13" - "@babel/helper-optimise-call-expression@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz#f27395a8619e0665b3f0364cddb41c25d71b499c" @@ -297,13 +253,6 @@ dependencies: "@babel/types" "^7.14.5" -"@babel/helper-optimise-call-expression@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz#7ed071813d09c75298ef4f208956006b6111ecb9" - integrity sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ== - dependencies: - "@babel/types" "^7.8.3" - "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz#9ea293be19babc0f52ff8ca88b34c3611b208670" @@ -340,16 +289,6 @@ "@babel/traverse" "^7.14.5" "@babel/types" "^7.14.5" -"@babel/helper-replace-supers@^7.8.6": - version "7.8.6" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz#5ada744fd5ad73203bf1d67459a27dcba67effc8" - integrity sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.8.3" - "@babel/helper-optimise-call-expression" "^7.8.3" - "@babel/traverse" "^7.8.6" - "@babel/types" "^7.8.6" - "@babel/helper-simple-access@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.14.5.tgz#66ea85cf53ba0b4e588ba77fc813f53abcaa41c4" @@ -357,14 +296,6 @@ dependencies: "@babel/types" "^7.14.5" -"@babel/helper-simple-access@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz#7f8109928b4dab4654076986af575231deb639ae" - integrity sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw== - dependencies: - "@babel/template" "^7.8.3" - "@babel/types" "^7.8.3" - "@babel/helper-skip-transparent-expression-wrappers@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.14.5.tgz#96f486ac050ca9f44b009fbe5b7d394cab3a0ee4" @@ -420,15 +351,6 @@ "@babel/traverse" "^7.14.5" "@babel/types" "^7.14.5" -"@babel/helpers@^7.9.0": - version "7.9.2" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.9.2.tgz#b42a81a811f1e7313b88cba8adc66b3d9ae6c09f" - integrity sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA== - dependencies: - "@babel/template" "^7.8.3" - "@babel/traverse" "^7.9.0" - "@babel/types" "^7.9.0" - "@babel/highlight@^7.10.4", "@babel/highlight@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.5.tgz#6861a52f03966405001f6aa534a01a24d99e8cd9" @@ -447,28 +369,28 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/node@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/node/-/node-7.14.5.tgz#cfbfab24c74f2855243d0548bb74a0b8b37b8fce" - integrity sha512-fwAf0Ba3gjcwP04T0BD0Y3oHOTDQH2tVcyaPOMjb+8xkCJ38FoaVOlLfQ/asBgm6aCkBkn12/l8spCXUEEeAyA== +"@babel/node@^7.14.7": + version "7.14.7" + resolved "https://registry.yarnpkg.com/@babel/node/-/node-7.14.7.tgz#0090e83e726027ea682240718ca39e4b625b15ad" + integrity sha512-QghINtVgOUCrSpE7z4IXPTGJfRYyjoY7ny5Qz0cuUlsThQv6WSn1xJk217WlEDucPLP2o5HwGXPSkxD4LWOZxQ== dependencies: "@babel/register" "^7.14.5" commander "^4.0.1" - core-js "^3.14.0" + core-js "^3.15.0" node-environment-flags "^1.0.5" regenerator-runtime "^0.13.4" v8flags "^3.1.1" -"@babel/parser@^7.1.0", "@babel/parser@^7.7.0", "@babel/parser@^7.8.6", "@babel/parser@^7.9.0": - version "7.9.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.9.4.tgz#68a35e6b0319bbc014465be43828300113f2f2e8" - integrity sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA== - -"@babel/parser@^7.14.5", "@babel/parser@^7.14.6": +"@babel/parser@^7.1.0", "@babel/parser@^7.12.0", "@babel/parser@^7.13.9", "@babel/parser@^7.14.5", "@babel/parser@^7.14.6": version "7.14.6" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.6.tgz#d85cc68ca3cac84eae384c06f032921f5227f4b2" integrity sha512-oG0ej7efjEXxb4UgE+klVx+3j4MVo+A2vCzm7OUN4CLo6WhQ+vSOD2yJ8m7B+DghObxtLxt3EfgMWpq+AsWehQ== +"@babel/parser@^7.7.0", "@babel/parser@^7.8.6", "@babel/parser@^7.9.0": + version "7.9.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.9.4.tgz#68a35e6b0319bbc014465be43828300113f2f2e8" + integrity sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA== + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.14.5.tgz#4b467302e1548ed3b1be43beae2cc9cf45e0bb7e" @@ -478,10 +400,10 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.14.5" "@babel/plugin-proposal-optional-chaining" "^7.14.5" -"@babel/plugin-proposal-async-generator-functions@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.5.tgz#4024990e3dd74181f4f426ea657769ff49a2df39" - integrity sha512-tbD/CG3l43FIXxmu4a7RBe4zH7MLJ+S/lFowPFO7HetS2hyOZ/0nnnznegDuzFzfkyQYTxqdTH/hKmuBngaDAA== +"@babel/plugin-proposal-async-generator-functions@^7.14.7": + version "7.14.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.7.tgz#784a48c3d8ed073f65adcf30b57bcbf6c8119ace" + integrity sha512-RK8Wj7lXLY3bqei69/cc25gwS5puEc3dknoFPFbqfy3XxYQBQFvu4ioWpafMBAB+L9NyptQK4nMOa5Xz16og8Q== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/helper-remap-async-to-generator" "^7.14.5" @@ -552,12 +474,12 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-proposal-object-rest-spread@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.5.tgz#e581d5ccdfa187ea6ed73f56c6a21c1580b90fbf" - integrity sha512-VzMyY6PWNPPT3pxc5hi9LloKNr4SSrVCg7Yr6aZpW4Ym07r7KqSU/QXYwjXLVxqwSv0t/XSXkFoKBPUkZ8vb2A== +"@babel/plugin-proposal-object-rest-spread@^7.14.7": + version "7.14.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.7.tgz#5920a2b3df7f7901df0205974c0641b13fd9d363" + integrity sha512-082hsZz+sVabfmDWo1Oct1u1AgbKbUAyVgmX4otIc7bdsRgHBXwTwb3DpDmD4Eyyx6DNiuz5UAATT655k+kL5g== dependencies: - "@babel/compat-data" "^7.14.5" + "@babel/compat-data" "^7.14.7" "@babel/helper-compilation-targets" "^7.14.5" "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" @@ -656,7 +578,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@^7.14.5": +"@babel/plugin-syntax-jsx@7", "@babel/plugin-syntax-jsx@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.14.5.tgz#000e2e25d8673cce49300517a3eda44c263e4201" integrity sha512-ohuFIsOMXJnbOMRfX7/w7LocdR6R7whhuRD4ax8IipLcLPlZGJKkBxgHp++U4N/vKyU16/YDQr2f5seajD3jIw== @@ -769,10 +691,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-destructuring@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.5.tgz#d32ad19ff1a6da1e861dc62720d80d9776e3bf35" - integrity sha512-wU9tYisEbRMxqDezKUqC9GleLycCRoUsai9ddlsq54r8QRLaeEhc+d+9DqCG+kV9W2GgQjTZESPTpn5bAFMDww== +"@babel/plugin-transform-destructuring@^7.14.7": + version "7.14.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.7.tgz#0ad58ed37e23e22084d109f185260835e5557576" + integrity sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" @@ -874,10 +796,10 @@ "@babel/helper-module-transforms" "^7.14.5" "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-named-capturing-groups-regex@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.5.tgz#d537e8ee083ee6f6aa4f4eef9d2081d555746e4c" - integrity sha512-+Xe5+6MWFo311U8SchgeX5c1+lJM+eZDBZgD+tvXu9VVQPXwwVzeManMMjYX6xw2HczngfOSZjoFYKwdeB/Jvw== +"@babel/plugin-transform-named-capturing-groups-regex@^7.14.7": + version "7.14.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.7.tgz#60c06892acf9df231e256c24464bfecb0908fd4e" + integrity sha512-DTNOTaS7TkW97xsDMrp7nycUVh6sn/eq22VaxWfEdzuEbRsiaOU0pqU7DlyUGHVsbQbSghvjKRpEl+nUCKGQSg== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.14.5" @@ -917,13 +839,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-react-inline-elements@^7.2.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-inline-elements/-/plugin-transform-react-inline-elements-7.9.0.tgz#19a39843431803765c9976132198bd8dee3d8058" - integrity sha512-iqqKXtOfVZpbgJ+9D4TG+JO/vgxa29FlpPUSIATzIcopKMUd3/bdwIjrrEneNp+SeiJs74nqKfUFYAUPDEu/qw== +"@babel/plugin-transform-react-inline-elements@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-inline-elements/-/plugin-transform-react-inline-elements-7.14.5.tgz#5e2c8ad96612f1a86484b291df5216cc6a6cffb6" + integrity sha512-RsdXYEbicGlg9WBvanlndPqCxrG9hV86lPjObbsTzA5hkrfScoECP5NWEJFUrtE/NVFu81OcPu6pQVVQtOX20Q== dependencies: - "@babel/helper-builder-react-jsx" "^7.9.0" - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-builder-react-jsx" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-transform-react-jsx-development@^7.14.5": version "7.14.5" @@ -972,7 +894,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-spread@^7.14.5": +"@babel/plugin-transform-spread@^7.14.6": version "7.14.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.14.6.tgz#6bd40e57fe7de94aa904851963b5616652f73144" integrity sha512-Zr0x0YroFJku7n7+/HH3A2eIrGMjbmAIbJSVv0IZ+t3U2WUQUA64S/oeied2e+MaGSjmt4alzBCsK9E8gh+fag== @@ -1016,17 +938,17 @@ "@babel/helper-create-regexp-features-plugin" "^7.14.5" "@babel/helper-plugin-utils" "^7.14.5" -"@babel/preset-env@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.14.5.tgz#c0c84e763661fd0e74292c3d511cb33b0c668997" - integrity sha512-ci6TsS0bjrdPpWGnQ+m4f+JSSzDKlckqKIJJt9UZ/+g7Zz9k0N8lYU8IeLg/01o2h8LyNZDMLGgRLDTxpudLsA== +"@babel/preset-env@^7.14.7": + version "7.14.7" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.14.7.tgz#5c70b22d4c2d893b03d8c886a5c17422502b932a" + integrity sha512-itOGqCKLsSUl0Y+1nSfhbuuOlTs0MJk2Iv7iSH+XT/mR8U1zRLO7NjWlYXB47yhK4J/7j+HYty/EhFZDYKa/VA== dependencies: - "@babel/compat-data" "^7.14.5" + "@babel/compat-data" "^7.14.7" "@babel/helper-compilation-targets" "^7.14.5" "@babel/helper-plugin-utils" "^7.14.5" "@babel/helper-validator-option" "^7.14.5" "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.14.5" - "@babel/plugin-proposal-async-generator-functions" "^7.14.5" + "@babel/plugin-proposal-async-generator-functions" "^7.14.7" "@babel/plugin-proposal-class-properties" "^7.14.5" "@babel/plugin-proposal-class-static-block" "^7.14.5" "@babel/plugin-proposal-dynamic-import" "^7.14.5" @@ -1035,7 +957,7 @@ "@babel/plugin-proposal-logical-assignment-operators" "^7.14.5" "@babel/plugin-proposal-nullish-coalescing-operator" "^7.14.5" "@babel/plugin-proposal-numeric-separator" "^7.14.5" - "@babel/plugin-proposal-object-rest-spread" "^7.14.5" + "@babel/plugin-proposal-object-rest-spread" "^7.14.7" "@babel/plugin-proposal-optional-catch-binding" "^7.14.5" "@babel/plugin-proposal-optional-chaining" "^7.14.5" "@babel/plugin-proposal-private-methods" "^7.14.5" @@ -1061,7 +983,7 @@ "@babel/plugin-transform-block-scoping" "^7.14.5" "@babel/plugin-transform-classes" "^7.14.5" "@babel/plugin-transform-computed-properties" "^7.14.5" - "@babel/plugin-transform-destructuring" "^7.14.5" + "@babel/plugin-transform-destructuring" "^7.14.7" "@babel/plugin-transform-dotall-regex" "^7.14.5" "@babel/plugin-transform-duplicate-keys" "^7.14.5" "@babel/plugin-transform-exponentiation-operator" "^7.14.5" @@ -1073,7 +995,7 @@ "@babel/plugin-transform-modules-commonjs" "^7.14.5" "@babel/plugin-transform-modules-systemjs" "^7.14.5" "@babel/plugin-transform-modules-umd" "^7.14.5" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.14.5" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.14.7" "@babel/plugin-transform-new-target" "^7.14.5" "@babel/plugin-transform-object-super" "^7.14.5" "@babel/plugin-transform-parameters" "^7.14.5" @@ -1081,7 +1003,7 @@ "@babel/plugin-transform-regenerator" "^7.14.5" "@babel/plugin-transform-reserved-words" "^7.14.5" "@babel/plugin-transform-shorthand-properties" "^7.14.5" - "@babel/plugin-transform-spread" "^7.14.5" + "@babel/plugin-transform-spread" "^7.14.6" "@babel/plugin-transform-sticky-regex" "^7.14.5" "@babel/plugin-transform-template-literals" "^7.14.5" "@babel/plugin-transform-typeof-symbol" "^7.14.5" @@ -1092,7 +1014,7 @@ babel-plugin-polyfill-corejs2 "^0.2.2" babel-plugin-polyfill-corejs3 "^0.2.2" babel-plugin-polyfill-regenerator "^0.2.2" - core-js-compat "^3.14.0" + core-js-compat "^3.15.0" semver "^6.3.0" "@babel/preset-modules@^0.1.4": @@ -1150,7 +1072,7 @@ dependencies: regenerator-runtime "^0.13.4" -"@babel/runtime@^7.4.0", "@babel/runtime@^7.8.4": +"@babel/runtime@^7.8.4": version "7.9.2" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.9.2.tgz#d90df0583a3a252f09aaa619665367bae518db06" integrity sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q== @@ -1166,7 +1088,7 @@ "@babel/parser" "^7.14.5" "@babel/types" "^7.14.5" -"@babel/template@^7.8.3", "@babel/template@^7.8.6": +"@babel/template@^7.8.3": version "7.8.6" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.6.tgz#86b22af15f828dfb086474f964dcc3e39c43ce2b" integrity sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg== @@ -1175,7 +1097,7 @@ "@babel/parser" "^7.8.6" "@babel/types" "^7.8.6" -"@babel/traverse@^7.13.0", "@babel/traverse@^7.14.5": +"@babel/traverse@7", "@babel/traverse@^7.13.0", "@babel/traverse@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.14.5.tgz#c111b0f58afab4fea3d3385a406f692748c59870" integrity sha512-G3BiS15vevepdmFqmUc9X+64y0viZYygubAMO8SvBmKARuF6CPSZtH4Ng9vi/lrWlZFGe3FWdXNy835akH8Glg== @@ -1190,7 +1112,7 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/traverse@^7.7.0", "@babel/traverse@^7.8.6", "@babel/traverse@^7.9.0": +"@babel/traverse@^7.7.0": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.9.0.tgz#d3882c2830e513f4fe4cec9fe76ea1cc78747892" integrity sha512-jAZQj0+kn4WTHO5dUZkZKhbFrqZE7K5LAQ5JysMnmvGij+wOdr+8lWqPeW0BcF4wFwrEXXtdGO7wcV6YPJcf3w== @@ -1205,7 +1127,15 @@ globals "^11.1.0" lodash "^4.17.13" -"@babel/types@^7.0.0", "@babel/types@^7.3.0", "@babel/types@^7.4.4", "@babel/types@^7.7.0", "@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.9.0": +"@babel/types@^7.0.0", "@babel/types@^7.12.0", "@babel/types@^7.13.0", "@babel/types@^7.14.5", "@babel/types@^7.3.0", "@babel/types@^7.9.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.14.5.tgz#3bb997ba829a2104cedb20689c4a5b8121d383ff" + integrity sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg== + dependencies: + "@babel/helper-validator-identifier" "^7.14.5" + to-fast-properties "^2.0.0" + +"@babel/types@^7.4.4", "@babel/types@^7.7.0", "@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.9.0": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.9.0.tgz#00b064c3df83ad32b2dbf5ff07312b15c7f1efb5" integrity sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng== @@ -1214,14 +1144,6 @@ lodash "^4.17.13" to-fast-properties "^2.0.0" -"@babel/types@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.14.5.tgz#3bb997ba829a2104cedb20689c4a5b8121d383ff" - integrity sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg== - dependencies: - "@babel/helper-validator-identifier" "^7.14.5" - to-fast-properties "^2.0.0" - "@discoveryjs/json-ext@^0.5.0": version "0.5.3" resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.3.tgz#90420f9f9c6d3987f176a19a7d8e764271a2f55d" @@ -1242,17 +1164,109 @@ minimatch "^3.0.4" strip-json-comments "^3.1.1" -"@formatjs/intl-unified-numberformat@^3.2.0": - version "3.3.0" - resolved "https://registry.yarnpkg.com/@formatjs/intl-unified-numberformat/-/intl-unified-numberformat-3.3.0.tgz#0692346a9cd432abb2cd9b6879ddd6592585641a" - integrity sha512-wLT3myYq6fUhJYUh53tt5fMok+sUqO3Jy1XeSqYTphP7MmQl38tHqAIL65Dxh7M6/QlDEQTOkMZNpQcnT0AzaQ== +"@formatjs/cli@^4.2.21": + version "4.2.21" + resolved "https://registry.yarnpkg.com/@formatjs/cli/-/cli-4.2.21.tgz#94df0830ebb4afdf7fd243a027dd8f4b4509980e" + integrity sha512-6F5ih85ROyhPkXKTNmgHdQ/LemfRYXgyZtv5AOXQ47OIOOKSn0ZaTMC7cUvVS0cga0Rmg2OByaiyzIj5FV21Rw== + dependencies: + "@formatjs/icu-messageformat-parser" "2.0.6" + "@formatjs/ts-transformer" "3.4.3" + "@types/json-stable-stringify" "^1.0.32" + "@types/lodash" "^4.14.150" + "@types/node" "14" + "@vue/compiler-core" "^3.0.0" + "@vue/compiler-sfc" "^3.0.5" + chalk "^4.0.0" + commander "7" + fast-glob "^3.2.4" + fs-extra "^9.0.0" + json-stable-stringify "^1.0.1" + lodash "^4.17.15" + loud-rejection "^2.2.0" + tslib "^2.1.0" + typescript "^4.0" + +"@formatjs/ecma402-abstract@1.9.3": + version "1.9.3" + resolved "https://registry.yarnpkg.com/@formatjs/ecma402-abstract/-/ecma402-abstract-1.9.3.tgz#00892014c805935b5b1345d238246e9bf3a2de50" + integrity sha512-DBrRUL65m4SVtfq+T4Qltd8+upAzfb9K1MX0UZ0hqQ0wpBY0PSIti9XJe0ZQ/j2v/KxpwQ0Jw5NLumKVezJFQg== dependencies: - "@formatjs/intl-utils" "^2.2.0" + tslib "^2.1.0" -"@formatjs/intl-utils@^2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@formatjs/intl-utils/-/intl-utils-2.2.0.tgz#ba6e12fe64ff7fd160be392007c47d24b7ae5c75" - integrity sha512-+Az7tR1av1DHZu9668D8uh9atT6vp+FFmEF8BrEssv0OqzpVjpVBGVmcgPzQP8k2PQjVlm/h2w8cTt0knn132w== +"@formatjs/fast-memoize@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@formatjs/fast-memoize/-/fast-memoize-1.1.1.tgz#3006b58aca1e39a98aca213356b42da5d173f26b" + integrity sha512-mIqBr5uigIlx13eZTOPSEh2buDiy3BCdMYUtewICREQjbb4xarDiVWoXSnrERM7NanZ+0TAHNXSqDe6HpEFQUg== + +"@formatjs/icu-messageformat-parser@2.0.6": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.0.6.tgz#7471c2116982f07b3d9b80e4572a870f20adbaf6" + integrity sha512-dgOZ2kq3sbjjC4P0IIghXFUiGY+x9yyypBJF9YFACjw8gPq/OSPmOzdMGvjY9hl4EeeIhhsDd4LIAN/3zHG99A== + dependencies: + "@formatjs/ecma402-abstract" "1.9.3" + "@formatjs/icu-skeleton-parser" "1.2.7" + tslib "^2.1.0" + +"@formatjs/icu-skeleton-parser@1.2.7": + version "1.2.7" + resolved "https://registry.yarnpkg.com/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.2.7.tgz#a74954695c37470efdeff828799654088e567c34" + integrity sha512-xm1rJMOz4fwVfWH98VKtbTpZvyQ45plHilkCF16Nm6bAgosYC/IcMmgJisGr6uHqb5TvJRXE07+EvnkIIQjsdA== + dependencies: + "@formatjs/ecma402-abstract" "1.9.3" + tslib "^2.1.0" + +"@formatjs/intl-displaynames@5.1.5": + version "5.1.5" + resolved "https://registry.yarnpkg.com/@formatjs/intl-displaynames/-/intl-displaynames-5.1.5.tgz#fb65c09493c3488e11e72b7d9512f0c1cc18b247" + integrity sha512-338DoPv8C4BqLqE7Sn5GkJbbkpL0RG8VoMP6qMJywx7bXVgOdWXiXUl3owdCPvq0bpVGGxTl+UNnF+UH8wGdLg== + dependencies: + "@formatjs/ecma402-abstract" "1.9.3" + tslib "^2.1.0" + +"@formatjs/intl-listformat@6.2.5": + version "6.2.5" + resolved "https://registry.yarnpkg.com/@formatjs/intl-listformat/-/intl-listformat-6.2.5.tgz#b2534700807e3ca2c2d8180592c15751037c908a" + integrity sha512-LRGroM+uLc8dL5J8zwHhNNxWw45nnHQMphW3zEnD9AySKPbFRsrSxzV8LYA93U5mkvMSBf49RdEODpdeyDak/Q== + dependencies: + "@formatjs/ecma402-abstract" "1.9.3" + tslib "^2.1.0" + +"@formatjs/intl-pluralrules@^4.0.27": + version "4.0.27" + resolved "https://registry.yarnpkg.com/@formatjs/intl-pluralrules/-/intl-pluralrules-4.0.27.tgz#32932b0c838a268a9b87173b13895f53d955a69b" + integrity sha512-Q4RAXZXuhWwMWK3Vsbf9AIRBa9B+BTiWjNkzlCq77pCRQYo555owWrGxnZUVk2203wygOIkoRYSvP7Tu2RXNFA== + dependencies: + "@formatjs/ecma402-abstract" "1.9.3" + tslib "^2.1.0" + +"@formatjs/intl-relativetimeformat@^9.1.6": + version "9.1.6" + resolved "https://registry.yarnpkg.com/@formatjs/intl-relativetimeformat/-/intl-relativetimeformat-9.1.6.tgz#7a0755d61aeb5fc07f7002da9199f8ade06ee339" + integrity sha512-u8hvqtpkiIJEVKzafbpaLQ0tvEFjFvb1WUzXk6rYKXOaKhYEhVaTVjVdCzSKr9bsDHuHMoSiR1SvqsP2ltCUHA== + dependencies: + "@formatjs/ecma402-abstract" "1.9.3" + tslib "^2.1.0" + +"@formatjs/intl@1.13.1": + version "1.13.1" + resolved "https://registry.yarnpkg.com/@formatjs/intl/-/intl-1.13.1.tgz#1d3a05f2db7d7590da855409d8c924822b03e09c" + integrity sha512-7UF0tTjdSsMc+0wA7/ROw0ibOo+l3Can6Z01JTC6alshxYvg6UufeklbvDtenXhoeXkUWmQ/HGFJaJhQuHfGGw== + dependencies: + "@formatjs/ecma402-abstract" "1.9.3" + "@formatjs/fast-memoize" "1.1.1" + "@formatjs/icu-messageformat-parser" "2.0.6" + "@formatjs/intl-displaynames" "5.1.5" + "@formatjs/intl-listformat" "6.2.5" + intl-messageformat "9.7.0" + tslib "^2.1.0" + +"@formatjs/ts-transformer@3.4.3": + version "3.4.3" + resolved "https://registry.yarnpkg.com/@formatjs/ts-transformer/-/ts-transformer-3.4.3.tgz#bc2397bd380fb3abc6be94a709d452e37ed3a9c0" + integrity sha512-CmsE+0rpGucWfK/cdVJ4oUfO7LbFJflGwJ6/U122wZhxRs59xcThUIRBBX7HU7Hx1BhtPa3LSW9QJc41D73tpQ== + dependencies: + "@formatjs/icu-messageformat-parser" "2.0.6" + tslib "^2.1.0" "@fortawesome/fontawesome-common-types@^0.2.35": version "0.2.35" @@ -1299,12 +1313,12 @@ dependencies: prop-types "^15.7.2" -"@iktakahiro/markdown-it-katex@^3.0.3": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@iktakahiro/markdown-it-katex/-/markdown-it-katex-3.1.0.tgz#cd40c1037f038ab00cbfee2464604435848deae9" - integrity sha512-Im2hih9ZkUqnUP7FhK0DTkGEVHgKNQ3BNQlbiBreWjSFPxysdylP1Ns5hLvoO+IdI1drhiiip/54VP8Gs3fLvw== +"@iktakahiro/markdown-it-katex@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@iktakahiro/markdown-it-katex/-/markdown-it-katex-4.0.1.tgz#65ff9d12afd4c0b7684dd247abe7ce42fc1edac3" + integrity sha512-kGFooO7fIOgY34PSG8ZNVsUlKhhNoqhzW2kq94TNGa8COzh73PO4KsEoPOsQVG1mEAe8tg7GqG0FoVao0aMHaw== dependencies: - katex "^0.10.0" + katex "^0.12.0" "@lgaitan/pace-progress@^1.0.7": version "1.0.7" @@ -1387,10 +1401,10 @@ resolved "https://registry.yarnpkg.com/@ttskch/select2-bootstrap4-theme/-/select2-bootstrap4-theme-1.5.2.tgz#3b4519b349f3e7831c28752a1e9617312a192656" integrity sha512-gAj8qNy/VYwQDBkACm0USM66kxFai8flX83ayRXPNhzZckEgSqIBB9sM74SCM3ssgeX+ZVy4BifTnLis+KpIyg== -"@types/babel__core@^7.1.2": - version "7.1.6" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.6.tgz#16ff42a5ae203c9af1c6e190ed1f30f83207b610" - integrity sha512-tTnhWszAqvXnhW7m5jQU9PomXSiKXk2sFxpahXvI20SZKu9ylPi8WtIxueZ6ehDWikPT0jeFujMj3X4ZHuf3Tg== +"@types/babel__core@*", "@types/babel__core@^7.1.7": + version "7.1.14" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.14.tgz#faaeefc4185ec71c389f4501ee5ec84b170cc402" + integrity sha512-zGZJzzBUVDo/eV6KgbE0f0ZI7dInEYvo12Rb70uNQDshC3SkRMb67ja0GgRHZgAX3Za6rhaWlvbDO8rrGyAb1g== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" @@ -1399,24 +1413,31 @@ "@types/babel__traverse" "*" "@types/babel__generator@*": - version "7.6.1" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.1.tgz#4901767b397e8711aeb99df8d396d7ba7b7f0e04" - integrity sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew== + version "7.6.2" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.2.tgz#f3d71178e187858f7c45e30380f8f1b7415a12d8" + integrity sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ== dependencies: "@babel/types" "^7.0.0" +"@types/babel__helper-plugin-utils@7": + version "7.10.0" + resolved "https://registry.yarnpkg.com/@types/babel__helper-plugin-utils/-/babel__helper-plugin-utils-7.10.0.tgz#dcd2416f9c189d5837ab2a276368cf67134efe78" + integrity sha512-60YtHzhQ9HAkToHVV+TB4VLzBn9lrfgrsOjiJMtbv/c1jPdekBxaByd6DMsGBzROXWoIL6U3lEFvvbu69RkUoA== + dependencies: + "@types/babel__core" "*" + "@types/babel__template@*": - version "7.0.2" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.0.2.tgz#4ff63d6b52eddac1de7b975a5223ed32ecea9307" - integrity sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg== + version "7.4.0" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.0.tgz#0c888dd70b3ee9eebb6e4f200e809da0076262be" + integrity sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" "@types/babel__traverse@*": - version "7.0.9" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.9.tgz#be82fab304b141c3eee81a4ce3b034d0eba1590a" - integrity sha512-jEFQ8L1tuvPjOI8lnpaf73oCJe+aoxL6ygqSy6c8LcW98zaC+4mzWuQIRCEvKeCOu+lbqdXcg4Uqmm1S8AP1tw== + version "7.11.1" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.11.1.tgz#654f6c4f67568e24c23b367e947098c6206fa639" + integrity sha512-Vs0hm0vPahPMYi9tDjtP66llufgO3ST16WXaSTtDGEl9cewAl3AibmxWw6TINOqHPT9z0uABKAYjT9jNSg4npw== dependencies: "@babel/types" "^7.3.0" @@ -1465,7 +1486,7 @@ "@types/minimatch" "*" "@types/node" "*" -"@types/hoist-non-react-statics@^3.3.0": +"@types/hoist-non-react-statics@^3.3.0", "@types/hoist-non-react-statics@^3.3.1": version "3.3.1" resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#1124aafe5118cb591977aeb1ceaaed1070eb039f" integrity sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA== @@ -1483,11 +1504,21 @@ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.7.tgz#98a993516c859eb0d5c4c8f098317a9ea68db9ad" integrity sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA== +"@types/json-stable-stringify@^1.0.32": + version "1.0.32" + resolved "https://registry.yarnpkg.com/@types/json-stable-stringify/-/json-stable-stringify-1.0.32.tgz#121f6917c4389db3923640b2e68de5fa64dda88e" + integrity sha512-q9Q6+eUEGwQkv4Sbst3J4PNgDOvpuVuKj79Hl/qnmBMEIPzB5QoFRUtjcgcg2xNUZyYUGXBk5wYIBKHt0A+Mxw== + "@types/json5@^0.0.29": version "0.0.29" resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= +"@types/lodash@^4.14.150": + version "4.14.170" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.170.tgz#0d67711d4bf7f4ca5147e9091b847479b87925d6" + integrity sha512-bpcvu/MKHHeYX+qeEN8GE7DIravODWdACVA1ctevD8CN24RhPZIKMn9ntfAsrvLfSX3cR5RrBKAbYm9bGs0A+Q== + "@types/minimatch@*": version "3.0.3" resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" @@ -1498,6 +1529,11 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-13.9.5.tgz#59738bf30b31aea1faa2df7f4a5f55613750cf00" integrity sha512-hkzMMD3xu6BrJpGVLeQ3htQQNAcOrJjX7WFmtK8zWQpz2UJf13LCFF2ALA7c9OVdvc2vQJeDdjfR35M0sBCxvw== +"@types/node@14": + version "14.17.3" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.17.3.tgz#6d327abaa4be34a74e421ed6409a0ae2f47f4c3d" + integrity sha512-e6ZowgGJmTuXa3GyaPbTGxX17tnThl2aSSizrFthQ7m9uLGZBXiGhgE55cjRZTF5kjZvYn9EOPOMljdjwbflxw== + "@types/parse-json@^4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" @@ -1553,11 +1589,6 @@ resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.1.tgz#18845205e86ff0038517aab7a18a62a6b9f71275" integrity sha512-EaCxbanVeyxDRTQBkdLb3Bvl/HK7PBK6UJjsSixB0iHKoWxE5uu2Q/DgtpOhPIojN0Zl1whvOd7PoHs2P0s5eA== -"@types/schema-utils@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@types/schema-utils/-/schema-utils-1.0.0.tgz#295d36f01e2cb8bc3207ca1d9a68e210db6b40cb" - integrity sha512-YesPanU1+WCigC/Aj1Mga8UCOjHIfMNHZ3zzDsUY7lI8GlKnh/Kv2QwJOQ+jNQ36Ru7IfzSedlG14hppYaN13A== - "@types/warning@^3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@types/warning/-/warning-3.0.0.tgz#0d2501268ad8f9962b740d387c4654f5f8e23e52" @@ -1568,6 +1599,60 @@ resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== +"@vue/compiler-core@3.1.1", "@vue/compiler-core@^3.0.0": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.1.1.tgz#4f2c5d70eabd454675714cc8bd2b97f6a8efb196" + integrity sha512-Z1RO3T6AEtAUFf2EqqovFm3ohAeTvFzRtB0qUENW2nEerJfdlk13/LS1a0EgsqlzxmYfR/S/S/gW9PLbFZZxkA== + dependencies: + "@babel/parser" "^7.12.0" + "@babel/types" "^7.12.0" + "@vue/shared" "3.1.1" + estree-walker "^2.0.1" + source-map "^0.6.1" + +"@vue/compiler-dom@3.1.1": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.1.1.tgz#ef60d856ac2ede5b2ad5c72a7a68122895e3d652" + integrity sha512-nobRIo0t5ibzg+q8nC31m+aJhbq8FbWUoKvk6h3Vs1EqTDJaj6lBTcVTq5or8AYht7FbSpdAJ81isbJ1rWNX7A== + dependencies: + "@vue/compiler-core" "3.1.1" + "@vue/shared" "3.1.1" + +"@vue/compiler-sfc@^3.0.5": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.1.1.tgz#d4e4507c013d0b219f0b106b317ec5bb1cde3398" + integrity sha512-lSgMsZaYHF+bAgryq5aUqpvyfhu52GJI2/4LoiJCE5uaxc6FCZfxfgqgw/d9ltiZghv+HiISFtmQVAVvlsk+/w== + dependencies: + "@babel/parser" "^7.13.9" + "@babel/types" "^7.13.0" + "@vue/compiler-core" "3.1.1" + "@vue/compiler-dom" "3.1.1" + "@vue/compiler-ssr" "3.1.1" + "@vue/shared" "3.1.1" + consolidate "^0.16.0" + estree-walker "^2.0.1" + hash-sum "^2.0.0" + lru-cache "^5.1.1" + magic-string "^0.25.7" + merge-source-map "^1.1.0" + postcss "^8.1.10" + postcss-modules "^4.0.0" + postcss-selector-parser "^6.0.4" + source-map "^0.6.1" + +"@vue/compiler-ssr@3.1.1": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.1.1.tgz#1d08b98601397258ed059b75966e0e94a385d770" + integrity sha512-7H6krZtVt3h/YzfNp7eYK41hMDz8ZskiBy+Wby+EDRINX6BD9JQ5C8zyy2xAa7T6Iz2VrQzsaJ/Bb52lTPSS5A== + dependencies: + "@vue/compiler-dom" "3.1.1" + "@vue/shared" "3.1.1" + +"@vue/shared@3.1.1": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.1.1.tgz#2287cfc3dc20e5b20aeb65c2c3a56533bdca801c" + integrity sha512-g+4pzAw7PYSjARtLBoDq6DmcblX8i9KJHSCnyM5VDDFFifUaUT9iHbFpOF/KOizQ9f7QAqU2JH3Y6aXjzUMhVA== + "@webassemblyjs/ast@1.11.0": version "1.11.0" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.0.tgz#a5aa679efdc9e51707a4207139da57920555961f" @@ -1729,6 +1814,11 @@ accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: mime-types "~2.1.24" negotiator "0.6.2" +ace-builds@^1.4.12: + version "1.4.12" + resolved "https://registry.yarnpkg.com/ace-builds/-/ace-builds-1.4.12.tgz#888efa386e36f4345f40b5233fcc4fe4c588fae7" + integrity sha512-G+chJctFPiiLGvs3+/Mly3apXTcfgE45dT5yp12BcWZ1kUs+gm0qd3/fv4gsz6fVag4mM0moHVpjHDIgph6Psg== + acorn-globals@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" @@ -1850,11 +1940,6 @@ ajv-errors@^1.0.0: resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== -ajv-keywords@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762" - integrity sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I= - ajv-keywords@^3.1.0, ajv-keywords@^3.4.1: version "3.4.1" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da" @@ -1865,16 +1950,6 @@ ajv-keywords@^3.5.2: resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== -ajv@5.5.1: - version "5.5.1" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.1.tgz#b38bb8876d9e86bee994956a04e721e88b248eb2" - integrity sha1-s4u4h22ehr7plJVqBOch6IskjrI= - dependencies: - co "^4.6.0" - fast-deep-equal "^1.0.0" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.3.0" - ajv@^6.1.0, ajv@^6.10.0, ajv@^6.12.0, ajv@^6.5.5: version "6.12.0" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.0.tgz#06d60b96d87b8454a5adaba86e7854da629db4b7" @@ -2164,6 +2239,11 @@ async-limiter@~1.0.0: resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== +async@0.9.x: + version "0.9.2" + resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" + integrity sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0= + async@^2.6.2: version "2.6.3" resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" @@ -2191,12 +2271,15 @@ atob@^2.1.2: resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== -attr-accept@^1.0.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/attr-accept/-/attr-accept-1.1.3.tgz#48230c79f93790ef2775fcec4f0db0f5db41ca52" - integrity sha512-iT40nudw8zmCweivz6j58g+RT33I4KbaIvRUhjNmDwO2WmsQUxFEZZYZ5w3vXe5x5MX9D7mfvA/XaLOZYFR9EQ== - dependencies: - core-js "^2.5.0" +attr-accept@^2.2.1: + version "2.2.2" + resolved "https://registry.yarnpkg.com/attr-accept/-/attr-accept-2.2.2.tgz#646613809660110749e92f2c10833b70968d929b" + integrity sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg== + +available-typed-arrays@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.4.tgz#9e0ae84ecff20caae6a94a1c3bc39b955649b7a9" + integrity sha512-SA5mXJWrId1TaQjfxUYghbqQ/hYioKmLJvPJyDuYRtXXenFNMjj4hSSt1Cf1xsuXSXrtxrVC5Ot4eU6cOtBDdA== aws-sign2@~0.7.0: version "0.7.0" @@ -2393,6 +2476,22 @@ babel-plugin-dynamic-import-node@^2.3.3: dependencies: object.assign "^4.1.0" +babel-plugin-formatjs@^10.3.0: + version "10.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-formatjs/-/babel-plugin-formatjs-10.3.0.tgz#e8e706d17b713cc55ee1f6edfbbc15022a88d452" + integrity sha512-vDvXgAMrNO+3Hi4ZLLeQQdfayshWaXOysGW0Z/DLnFmJx8tpjv/HBJxqYQuoieitNOeYVJKqdk45JPf6rlkxtA== + dependencies: + "@babel/core" "^7.9.0" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-jsx" "7" + "@babel/traverse" "7" + "@babel/types" "^7.9.5" + "@formatjs/icu-messageformat-parser" "2.0.6" + "@formatjs/ts-transformer" "3.4.3" + "@types/babel__core" "^7.1.7" + "@types/babel__helper-plugin-utils" "7" + tslib "^2.1.0" + babel-plugin-polyfill-corejs2@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz#e9124785e6fd94f94b618a7954e5693053bf5327" @@ -2417,19 +2516,6 @@ babel-plugin-polyfill-regenerator@^0.2.2: dependencies: "@babel/helper-define-polyfill-provider" "^0.2.2" -babel-plugin-react-intl@^4.1.2: - version "4.3.0" - resolved "https://registry.yarnpkg.com/babel-plugin-react-intl/-/babel-plugin-react-intl-4.3.0.tgz#bcff1936dbad4a1bb2e7d955032f92aba6fdc063" - integrity sha512-X4R9ZrQ6LR6EaNqk7DCA39GamD8Deo1XOeQGEbsswV741AgQ8HfuXtQ7FKCiDnfWp2nhVVio+BAIrhwS5JxHdQ== - dependencies: - "@babel/core" "^7.6.2" - "@babel/helper-plugin-utils" "^7.0.0" - "@types/babel__core" "^7.1.2" - "@types/schema-utils" "^1.0.0" - fs-extra "^8.0.1" - intl-messageformat-parser "^3.2.2" - schema-utils "^2.2.0" - babel-plugin-syntax-async-functions@^6.8.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" @@ -2958,7 +3044,7 @@ base64-js@^1.0.2: resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== -base64-js@^1.1.2, base64-js@^1.3.0: +base64-js@^1.1.2, base64-js@^1.3.0, base64-js@^1.3.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== @@ -3071,7 +3157,7 @@ bl@^1.0.0: readable-stream "^2.3.5" safe-buffer "^5.1.1" -bluebird@^3.3.5: +bluebird@^3.3.5, bluebird@^3.7.2: version "3.7.2" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== @@ -3151,11 +3237,6 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -brace@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/brace/-/brace-0.11.1.tgz#4896fcc9d544eef45f4bb7660db320d3b379fe58" - integrity sha1-SJb8ydVE7vRfS7dmDbMg07N5/lg= - braces@^2.3.1, braces@^2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" @@ -3286,14 +3367,6 @@ buffer-indexof@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" integrity sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g== -buffer@^5.0.7: - version "5.5.0" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.5.0.tgz#9c3caa3d623c33dd1c7ef584b89b88bf9c9bc1ce" - integrity sha512-9FTEDjLjwoAkEwyMGDjYJQN2gfRgOKBKRfiglhvibGbpeeU/pQn1bJxQqm32OD/AIeEuHxU9roxXxg34Byp/Ww== - dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" - buffer@^5.2.1: version "5.6.0" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.6.0.tgz#a31749dc7d81d84db08abf937b6b8c4033f62786" @@ -3302,6 +3375,14 @@ buffer@^5.2.1: base64-js "^1.0.2" ieee754 "^1.1.4" +buffer@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + bytes@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" @@ -3414,10 +3495,10 @@ center-align@^0.1.1: align-text "^0.1.3" lazy-cache "^1.0.3" -chai-immutable@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/chai-immutable/-/chai-immutable-1.6.0.tgz#9ec00bdd67948b13b20fcbb89cbf4af2ce6f9247" - integrity sha1-nsAL3WeUixOyD8u4nL9K8s5vkkc= +chai-immutable@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/chai-immutable/-/chai-immutable-2.1.0.tgz#c407008c22e1292ef6bb2e4b80fc4968264e430d" + integrity sha512-IQrtwbwQYn2tkw/BOL+xYhJMcwuil1w0dzv9nZqi/w+jdQhdAn9rDyJb3qK+LvZkctJqdvy6opALGFZcdriW7A== chai-spies@^1.0.0: version "1.0.0" @@ -3447,7 +3528,7 @@ chalk@^1.0.0, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.0.0, chalk@^2.3.2, chalk@^2.4.1: +chalk@^2.0.0, chalk@^2.3.2, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -3616,11 +3697,6 @@ clone@^1.0.4: resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= -co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= - coa@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" @@ -3630,16 +3706,16 @@ coa@^2.0.2: chalk "^2.4.1" q "^1.1.2" -codemirror@^5.58.2: - version "5.58.2" - resolved "https://registry.yarnpkg.com/codemirror/-/codemirror-5.58.2.tgz#ed54a1796de1498688bea1cdd4e9eeb187565d1b" - integrity sha512-K/hOh24cCwRutd1Mk3uLtjWzNISOkm4fvXiMO7LucCrqbh6aJDdtqUziim3MZUI6wOY0rvY1SlL1Ork01uMy6w== - codemirror@^5.60.0: version "5.61.1" resolved "https://registry.yarnpkg.com/codemirror/-/codemirror-5.61.1.tgz#ccfc8a43b8fcfb8b12e8e75b5ffde48d541406e0" integrity sha512-+D1NZjAucuzE93vJGbAaXzvoBHwp9nJZWWWF9utjv25+5AZUiah6CIlfb4ikG4MoDsFsCG8niiJH5++OO2LgIQ== +codemirror@^5.62.0: + version "5.62.0" + resolved "https://registry.yarnpkg.com/codemirror/-/codemirror-5.62.0.tgz#e9ecd012e6f9eaf2e05ff4a449ff750f51619e22" + integrity sha512-Xnl3304iCc8nyVZuRkzDVVwc794uc9QNX0UcPGeNic1fbzkSrO4l4GVXho9tRNKBgPYZXgocUqXyfIv3BILhCQ== + collection-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" @@ -3677,7 +3753,7 @@ colorette@^1.2.1, colorette@^1.2.2: resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94" integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w== -colors@^1.1.2: +colors@^1.1.2, colors@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== @@ -3689,6 +3765,11 @@ combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: dependencies: delayed-stream "~1.0.0" +commander@7, commander@^7.0.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + commander@^2.19.0, commander@^2.20.0, commander@^2.8.1: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" @@ -3699,11 +3780,6 @@ commander@^4.0.1: resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== -commander@^7.0.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" - integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== - commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" @@ -3767,6 +3843,13 @@ console-stream@^0.1.1: resolved "https://registry.yarnpkg.com/console-stream/-/console-stream-0.1.1.tgz#a095fe07b20465955f2fafd28b5d72bccd949d44" integrity sha1-oJX+B7IEZZVfL6/Si11yvM2UnUQ= +consolidate@^0.16.0: + version "0.16.0" + resolved "https://registry.yarnpkg.com/consolidate/-/consolidate-0.16.0.tgz#a11864768930f2f19431660a65906668f5fbdc16" + integrity sha512-Nhl1wzCslqXYTJVDyJCu3ODohy9OfBMB5uD2BiBTzd7w+QY0lBzafkR8y8755yMYHAaMD4NuzbAw03/xzfw+eQ== + dependencies: + bluebird "^3.7.2" + content-disposition@0.5.3, content-disposition@^0.5.2: version "0.5.3" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" @@ -3831,21 +3914,34 @@ core-js-compat@^3.14.0: browserslist "^4.16.6" semver "7.0.0" +core-js-compat@^3.15.0: + version "3.15.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.15.1.tgz#1afe233716d37ee021956ef097594071b2b585a7" + integrity sha512-xGhzYMX6y7oEGQGAJmP2TmtBLvR4nZmRGEcFa3ubHOq5YEp51gGN9AovVa0AoujGZIq+Wm6dISiYyGNfdflYww== + dependencies: + browserslist "^4.16.6" + semver "7.0.0" + core-js@^0.8.3: version "0.8.4" resolved "https://registry.yarnpkg.com/core-js/-/core-js-0.8.4.tgz#c22665f1e0d1b9c3c5e1b08dabd1f108695e4fcf" integrity sha1-wiZl8eDRucPF4bCNq9HxCGleT88= -core-js@^2.4.0, core-js@^2.5.0: +core-js@^2.4.0: version "2.6.11" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c" integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg== -core-js@^3.0.0, core-js@^3.14.0: +core-js@^3.0.0: version "3.14.0" resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.14.0.tgz#62322b98c71cc2018b027971a69419e2425c2a6c" integrity sha512-3s+ed8er9ahK+zJpp9ZtuVcDoFzHNiZsPbNAAE4KXgrRHbjSqqNN6xGSXq6bq7TZIbKj4NLrLb6bJ5i+vSVjHA== +core-js@^3.15.0: + version "3.15.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.15.1.tgz#6c08ab88abdf56545045ccf5fd81f47f407e7f1a" + integrity sha512-h8VbZYnc9pDzueiS2610IULDkpFFPunHwIpl8yRwFahAEEdSpHlTy3h3z3rKq5h11CaUdBEeRViu9AYvbxiMeg== + core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" @@ -4444,23 +4540,26 @@ deep-equal@^1.0.0, deep-equal@^1.0.1: object-keys "^1.1.1" regexp.prototype.flags "^1.2.0" -deep-equal@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.0.1.tgz#fc12bbd6850e93212f21344748682ccc5a8813cf" - integrity sha512-7Et6r6XfNW61CPPCIYfm1YPGSmh6+CliYeL4km7GWJcpX5LTAflGF8drLLR+MZX+2P3NZfAfSduutBbSWqER4g== +deep-equal@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.0.5.tgz#55cd2fe326d83f9cbf7261ef0e060b3f724c5cb9" + integrity sha512-nPiRgmbAtm1a3JsnLCf6/SLfXcjyN5v8L1TXzdCmHrXJ4hx+gW/w1YCcn7z8gJtSiDArZCgYtbao3QqLm/N1Sw== dependencies: - es-abstract "^1.16.3" - es-get-iterator "^1.0.1" + call-bind "^1.0.0" + es-get-iterator "^1.1.1" + get-intrinsic "^1.0.1" is-arguments "^1.0.4" - is-date-object "^1.0.1" - is-regex "^1.0.4" + is-date-object "^1.0.2" + is-regex "^1.1.1" isarray "^2.0.5" - object-is "^1.0.1" + object-is "^1.1.4" object-keys "^1.1.1" - regexp.prototype.flags "^1.2.0" - side-channel "^1.0.1" + object.assign "^4.1.2" + regexp.prototype.flags "^1.3.0" + side-channel "^1.0.3" which-boxed-primitive "^1.0.1" - which-collection "^1.0.0" + which-collection "^1.0.1" + which-typed-array "^1.1.2" deep-is@^0.1.3, deep-is@~0.1.3: version "0.1.3" @@ -4542,6 +4641,11 @@ dfa@^1.2.0: resolved "https://registry.yarnpkg.com/dfa/-/dfa-1.2.0.tgz#96ac3204e2d29c49ea5b57af8d92c2ae12790657" integrity sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q== +diff-match-patch@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/diff-match-patch/-/diff-match-patch-1.0.5.tgz#abb584d5f10cd1196dfc55aa03701592ae3f7b37" + integrity sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw== + diff@5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" @@ -4704,10 +4808,12 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -ejs@^2.6.1: - version "2.7.4" - resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba" - integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA== +ejs@^3.1.6: + version "3.1.6" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.6.tgz#5bfd0a0689743bb5268b3550cceeebbc1702822a" + integrity sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw== + dependencies: + jake "^10.6.1" ekko-lightbox@^5.3.0: version "5.3.0" @@ -4771,10 +4877,10 @@ entities@^2.0.0: resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.0.tgz#68d6084cab1b079767540d80e56a39b423e4abf4" integrity sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw== -entities@~1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" - integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== +entities@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.1.0.tgz#992d3129cf7df6870b96c57858c249a120f8b8b5" + integrity sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w== envinfo@^7.7.3: version "7.8.1" @@ -4795,7 +4901,7 @@ error-ex@^1.2.0, error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.16.3, es-abstract@^1.17.0-next.1, es-abstract@^1.17.2, es-abstract@^1.17.4: +es-abstract@^1.17.0-next.1, es-abstract@^1.17.2: version "1.17.5" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.5.tgz#d8c9d1d66c8981fb9200e2251d799eee92774ae9" integrity sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg== @@ -4834,23 +4940,24 @@ es-abstract@^1.18.0-next.1, es-abstract@^1.18.0-next.2, es-abstract@^1.18.2: string.prototype.trimstart "^1.0.4" unbox-primitive "^1.0.1" -es-get-iterator@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.0.tgz#bb98ad9d6d63b31aacdc8f89d5d0ee57bcb5b4c8" - integrity sha512-UfrmHuWQlNMTs35e1ypnvikg6jCz3SK8v8ImvmDsh36fCVUR1MqoFDiyn0/k52C8NqO3YsO8Oe0azeesNuqSsQ== +es-get-iterator@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.2.tgz#9234c54aba713486d7ebde0220864af5e2b283f7" + integrity sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ== dependencies: - es-abstract "^1.17.4" + call-bind "^1.0.2" + get-intrinsic "^1.1.0" has-symbols "^1.0.1" - is-arguments "^1.0.4" - is-map "^2.0.1" - is-set "^2.0.1" + is-arguments "^1.1.0" + is-map "^2.0.2" + is-set "^2.0.2" is-string "^1.0.5" isarray "^2.0.5" -es-module-lexer@^0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.4.1.tgz#dda8c6a14d8f340a24e34331e0fab0cb50438e0e" - integrity sha512-ooYciCUtfw6/d2w56UVeqHPcoCFAiJdz5XOkYpv/Txl1HMUozpXjz/2RIQgqwKdXNDPSF1W7mJCFse3G+HDyAA== +es-module-lexer@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.6.0.tgz#e72ab05b7412e62b9be37c37a09bdb6000d706f0" + integrity sha512-f8kcHX1ArhllUtb/wVSyvygoKCznIjnxhLxy7TCvIiMdT7fL4ZDTIKaadMe6eLvOXg6Wk02UeoFgUoZ2EKZZUA== es-to-primitive@^1.2.1: version "1.2.1" @@ -5120,10 +5227,10 @@ eslint-visitor-keys@^2.0.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== -eslint@^7.28.0: - version "7.28.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.28.0.tgz#435aa17a0b82c13bb2be9d51408b617e49c1e820" - integrity sha512-UMfH0VSjP0G4p3EWirscJEQ/cHqnT/iuH6oNZOB94nBjWbMnhGEPxsZm1eyIW0C/9jLI0Fow4W5DXLjEI7mn1g== +eslint@^7.29.0: + version "7.29.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.29.0.tgz#ee2a7648f2e729485e4d0bd6383ec1deabc8b3c0" + integrity sha512-82G/JToB9qIy/ArBzIWG9xvvwL3R86AlCjtGw+A29OMZDqhTybz/MByORSukGxeI+YPCR4coYyITKk8BFH9nDA== dependencies: "@babel/code-frame" "7.12.11" "@eslint/eslintrc" "^0.4.2" @@ -5218,6 +5325,11 @@ estree-is-function@^1.0.0: resolved "https://registry.yarnpkg.com/estree-is-function/-/estree-is-function-1.0.0.tgz#c0adc29806d7f18a74db7df0f3b2666702e37ad2" integrity sha512-nSCWn1jkSq2QAtkaVLJZY2ezwcFO161HVc174zL1KPW3RJ+O6C3eJb8Nx7OXzvhoEv+nLgSR1g71oWUHUDTrJA== +estree-walker@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" + integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== + esutils@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" @@ -5462,11 +5574,6 @@ extsprintf@^1.2.0: resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= -fast-deep-equal@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" - integrity sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ= - fast-deep-equal@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4" @@ -5489,6 +5596,18 @@ fast-glob@^3.0.3: micromatch "^4.0.2" picomatch "^2.2.1" +fast-glob@^3.2.4: + version "3.2.5" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.5.tgz#7939af2a656de79a4f1901903ee8adcaa7cb9661" + integrity sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.0" + merge2 "^1.3.0" + micromatch "^4.0.2" + picomatch "^2.2.1" + fast-json-stable-stringify@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" @@ -5584,10 +5703,17 @@ file-loader@^6.2.0: loader-utils "^2.0.0" schema-utils "^3.0.0" -file-saver@^1.3.3: - version "1.3.8" - resolved "https://registry.yarnpkg.com/file-saver/-/file-saver-1.3.8.tgz#e68a30c7cb044e2fb362b428469feb291c2e09d8" - integrity sha512-spKHSBQIxxS81N/O21WmuXA2F6wppUCsutpzenOeZzOCCJ5gEfcbqJP983IrpLXzYmXnMUa6J03SubcNPdKrlg== +file-saver@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/file-saver/-/file-saver-2.0.5.tgz#d61cfe2ce059f414d899e9dd6d4107ee25670c38" + integrity sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA== + +file-selector@^0.2.2: + version "0.2.4" + resolved "https://registry.yarnpkg.com/file-selector/-/file-selector-0.2.4.tgz#7b98286f9dbb9925f420130ea5ed0a69238d4d80" + integrity sha512-ZDsQNbrv6qRi1YTDOEWzf5J2KjZ9KMI1Q2SGeTkCJmNNW25Jg4TW4UMcmoqcg4WrAyKRcpBXdbWRxkfrOzVRbA== + dependencies: + tslib "^2.0.3" file-type@5.2.0, file-type@^5.2.0: version "5.2.0" @@ -5629,6 +5755,13 @@ file-uri-to-path@1.0.0: resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== +filelist@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.2.tgz#80202f21462d4d1c2e214119b1807c1bc0380e5b" + integrity sha512-z7O0IS8Plc39rTCq6i6iHxk43duYOn8uFJiWSewIq0Bww1RNybVHSCjahmcC87ZqAm4OTvFzlzeGu3XAzG1ctQ== + dependencies: + minimatch "^3.0.4" + filename-reserved-regex@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz#abf73dfab735d045440abfea2d91f389ebbfa229" @@ -5757,13 +5890,6 @@ flat-cache@^3.0.4: flatted "^3.1.0" rimraf "^3.0.2" -flat@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.0.tgz#090bec8b05e39cba309747f1d588f04dbaf98db2" - integrity sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw== - dependencies: - is-buffer "~2.0.3" - flat@^5.0.2: version "5.0.2" resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" @@ -5779,20 +5905,15 @@ flot@^4.2.2: resolved "https://registry.yarnpkg.com/flot/-/flot-4.2.2.tgz#0661d9e3805c86ccd36560f9602a0d1484d60fe8" integrity sha512-Strct/A27o0TA25X7Z0pxKhwK4djiP1Kjeqj0tkiqrkRu1qYPqfbp5BYuxEL8CWDNtj85Uc0PnG2E2plo1+VMg== -flow-bin@^0.46.0: - version "0.46.0" - resolved "https://registry.yarnpkg.com/flow-bin/-/flow-bin-0.46.0.tgz#06ad7fe19dddb1042264438064a2a32fee12b872" - integrity sha1-Bq1/4Z3dsQQiZEOAZKKjL+4SuHI= - follow-redirects@^1.0.0: version "1.13.0" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.0.tgz#b42e8d93a2a7eea5ed88633676d6597bc8e384db" integrity sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA== -font-awesome-animation@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/font-awesome-animation/-/font-awesome-animation-0.2.1.tgz#38f1c323ce9baf0932a5dc5596ece762e42f58b0" - integrity sha512-kOLT6yuQG06xRrjLoI1cCVrmMyREnKIk7TCkdRd4nQtHnSue4pRxvyTKN3SVV4Zs/pasfMxd296a11u7uSBI3A== +font-awesome-animation@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/font-awesome-animation/-/font-awesome-animation-1.1.1.tgz#fa7e685c163034d59a22b565af1d848d3f7866b6" + integrity sha512-WHl4zhyb0LeqT+v2JClv5yNZ+63e2Mbbu+9ycL3FGVHtZA8zn4iaMBxA6AgcJySLlfdjuTEA0lBZBW2CE1cwpQ== fontkit@^1.8.1: version "1.8.1" @@ -5816,6 +5937,11 @@ for-in@^1.0.2: resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= +foreach@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" + integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k= + forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" @@ -5880,16 +6006,7 @@ fs-extra@^0.30.0: path-is-absolute "^1.0.0" rimraf "^2.2.8" -fs-extra@^8.0.1: - version "8.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" - integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs-extra@^9.1.0: +fs-extra@^9.0.0, fs-extra@^9.1.0: version "9.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== @@ -5949,10 +6066,12 @@ generic-names@^1.0.1: dependencies: loader-utils "^0.2.16" -gensync@^1.0.0-beta.1: - version "1.0.0-beta.1" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" - integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg== +generic-names@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/generic-names/-/generic-names-2.0.1.tgz#f8a378ead2ccaa7a34f0317b05554832ae41b872" + integrity sha512-kPCHWa1m9wGG/OwQpeweTwM/PYiQLrUIxXbt/P4Nic3LbGjCP0YwrALHW1uNLKZ0LIMg+RF+XRlj2ekT9ZlZAQ== + dependencies: + loader-utils "^1.1.0" gensync@^1.0.0-beta.2: version "1.0.0-beta.2" @@ -5974,7 +6093,7 @@ get-func-name@^2.0.0: resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= -get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: +get-intrinsic@^1.0.1, get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== @@ -6086,7 +6205,7 @@ glob-to-regexp@^0.4.0, glob-to-regexp@^0.4.1: resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== -glob@7.1.7: +glob@7.1.7, glob@^7.1.7: version "7.1.7" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== @@ -6218,11 +6337,6 @@ growl@1.10.5: resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== -gud@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/gud/-/gud-1.0.0.tgz#a489581b17e6a70beca9abe3ae57de7a499852c0" - integrity sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw== - handle-thing@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" @@ -6323,15 +6437,20 @@ has@^1.0.1, has@^1.0.3: dependencies: function-bind "^1.1.1" +hash-sum@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/hash-sum/-/hash-sum-2.0.0.tgz#81d01bb5de8ea4a214ad5d6ead1b523460b0b45a" + integrity sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg== + he@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== -highlight.js@^10.4.1: - version "10.4.1" - resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.4.1.tgz#d48fbcf4a9971c4361b3f95f302747afe19dbad0" - integrity sha512-yR5lWvNz7c85OhVAEAeFhVCc/GV4C30Fjzc/rCP0aCWzc1UUOPUk55dK/qdwTZHBvMZo+eZ2jpk62ndX/xMFlg== +highlight.js@^11.0.1: + version "11.0.1" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-11.0.1.tgz#a78bafccd9aa297978799fe5eed9beb7ee1ef887" + integrity sha512-EqYpWyTF2s8nMfttfBA2yLKPNoZCO33pLS4MnbXQ4hECf1TKujCt1Kq7QAdrio7roL4+CqsfjqwYj4tYgq0pJQ== history@^4.9.0: version "4.10.1" @@ -6553,6 +6672,11 @@ ieee754@^1.1.4: resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== +ieee754@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + ignore@^4.0.6: version "4.0.6" resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" @@ -6774,36 +6898,14 @@ interpret@^2.2.0: resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== -intl-format-cache@^2.0.5: - version "2.2.9" - resolved "https://registry.yarnpkg.com/intl-format-cache/-/intl-format-cache-2.2.9.tgz#fb560de20c549cda20b569cf1ffb6dc62b5b93b4" - integrity sha512-Zv/u8wRpekckv0cLkwpVdABYST4hZNTDaX7reFetrYTJwxExR2VyTqQm+l0WmL0Qo8Mjb9Tf33qnfj0T7pjxdQ== - -intl-messageformat-parser@1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/intl-messageformat-parser/-/intl-messageformat-parser-1.4.0.tgz#b43d45a97468cadbe44331d74bb1e8dea44fc075" - integrity sha1-tD1FqXRoytvkQzHXS7Ho3qRPwHU= - -intl-messageformat-parser@^3.2.2: - version "3.6.4" - resolved "https://registry.yarnpkg.com/intl-messageformat-parser/-/intl-messageformat-parser-3.6.4.tgz#5199d106d816c3dda26ee0694362a9cf823978fb" - integrity sha512-RgPGwue0mJtoX2Ax8EmMzJzttxjnva7gx0Q7mKJ4oALrTZvtmCeAw5Msz2PcjW4dtCh/h7vN/8GJCxZO1uv+OA== - dependencies: - "@formatjs/intl-unified-numberformat" "^3.2.0" - -intl-messageformat@^2.0.0, intl-messageformat@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-2.2.0.tgz#345bcd46de630b7683330c2e52177ff5eab484fc" - integrity sha1-NFvNRt5jC3aDMwwuUhd/9eq0hPw= - dependencies: - intl-messageformat-parser "1.4.0" - -intl-relativeformat@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/intl-relativeformat/-/intl-relativeformat-2.2.0.tgz#6aca95d019ec8d30b6c5653b6629f9983ea5b6c5" - integrity sha512-4bV/7kSKaPEmu6ArxXf9xjv1ny74Zkwuey8Pm01NH4zggPP7JHwg2STk8Y3JdspCKRDriwIyLRfEXnj2ZLr4Bw== +intl-messageformat@9.7.0: + version "9.7.0" + resolved "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-9.7.0.tgz#a1903f71a9c828e4e3204b5a5b7f098897714726" + integrity sha512-8oiPpjantFesqixf3Fi/j3i35wPH+iWNciSm1IGb2q74MFwotsz0lYkzyQg/62ni6j+XWlmmImKNYo5tKn6TKw== dependencies: - intl-messageformat "^2.0.0" + "@formatjs/fast-memoize" "1.1.1" + "@formatjs/icu-messageformat-parser" "2.0.6" + tslib "^2.1.0" into-stream@^3.1.0: version "3.1.0" @@ -6813,7 +6915,7 @@ into-stream@^3.1.0: from2 "^2.1.1" p-is-promise "^1.1.0" -invariant@^2.1.1, invariant@^2.2.2, invariant@^2.2.4: +invariant@^2.2.2, invariant@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== @@ -6864,6 +6966,13 @@ is-arguments@^1.0.4: resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.0.4.tgz#3faf966c7cba0ff437fb31f6250082fcf0448cf3" integrity sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA== +is-arguments@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.0.tgz#62353031dfbee07ceb34656a6bde59efecae8dd9" + integrity sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg== + dependencies: + call-bind "^1.0.0" + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" @@ -6910,11 +7019,6 @@ is-buffer@^1.1.5: resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== -is-buffer@~2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.4.tgz#3e572f23c8411a5cfd9557c849e3665e0b290623" - integrity sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A== - is-callable@^1.1.4, is-callable@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab" @@ -6958,6 +7062,11 @@ is-date-object@^1.0.1: resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== +is-date-object@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.4.tgz#550cfcc03afada05eea3dd30981c7b09551f73e5" + integrity sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A== + is-descriptor@^0.1.0: version "0.1.6" resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" @@ -7039,6 +7148,11 @@ is-map@^2.0.1: resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.1.tgz#520dafc4307bb8ebc33b813de5ce7c9400d644a1" integrity sha512-T/S49scO8plUiAOA2DBTBG3JHpn1yiw0kRp6dgiZ0v2/6twi5eiB0rHtHFH9ZIrvlWc6+4O+m4zg5+Z833aXgw== +is-map@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" + integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== + is-natural-number@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/is-natural-number/-/is-natural-number-4.0.1.tgz#ab9d76e1db4ced51e35de0c72ebecf09f734cde8" @@ -7134,7 +7248,7 @@ is-regex@^1.0.4, is-regex@^1.0.5: dependencies: has "^1.0.3" -is-regex@^1.1.3: +is-regex@^1.1.1, is-regex@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.3.tgz#d029f9aff6448b93ebbe3f33dac71511fdcbef9f" integrity sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ== @@ -7152,6 +7266,11 @@ is-set@^2.0.1: resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.1.tgz#d1604afdab1724986d30091575f54945da7e5f43" integrity sha512-eJEzOtVyenDs1TMzSQ3kU3K+E0GUS9sno+F0OBT97xsgcJsF9nXMBtkT9/kut5JEpM7oL7X/0qxR17K3mcwIAA== +is-set@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec" + integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== + is-stream@^1.0.0, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" @@ -7198,6 +7317,17 @@ is-symbol@^1.0.3: dependencies: has-symbols "^1.0.2" +is-typed-array@^1.1.3: + version "1.1.5" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.5.tgz#f32e6e096455e329eb7b423862456aa213f0eb4e" + integrity sha512-S+GRDgJlR3PyEbsX/Fobd9cqpZBuvUS+8asRqYDMLCb2qMzt1oz5m5oxQCxOgUDxiWsOVNi4yaF+/uvdlHlYug== + dependencies: + available-typed-arrays "^1.0.2" + call-bind "^1.0.2" + es-abstract "^1.18.0-next.2" + foreach "^2.0.5" + has-symbols "^1.0.1" + is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" @@ -7292,6 +7422,16 @@ isurl@^1.0.0-alpha5: has-to-string-tag-x "^1.2.0" is-object "^1.0.1" +jake@^10.6.1: + version "10.8.2" + resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.2.tgz#ebc9de8558160a66d82d0eadc6a2e58fbc500a7b" + integrity sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A== + dependencies: + async "0.9.x" + chalk "^2.4.2" + filelist "^1.0.1" + minimatch "^3.0.4" + jest-worker@^27.0.2: version "27.0.2" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.0.2.tgz#4ebeb56cef48b3e7514552f80d0d80c0129f0b05" @@ -7441,11 +7581,6 @@ json-parse-even-better-errors@^2.3.0: resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== -json-schema-traverse@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" - integrity sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A= - json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" @@ -7509,13 +7644,6 @@ jsonfile@^2.1.0: optionalDependencies: graceful-fs "^4.1.6" -jsonfile@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" - integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= - optionalDependencies: - graceful-fs "^4.1.6" - jsonfile@^6.0.1: version "6.1.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" @@ -7568,15 +7696,15 @@ just-curry-it@^3.1.0: resolved "https://registry.yarnpkg.com/just-curry-it/-/just-curry-it-3.1.0.tgz#ab59daed308a58b847ada166edd0a2d40766fbc5" integrity sha512-mjzgSOFzlrurlURaHVjnQodyPNvrHrf1TbQP2XU9NSqBtHQPuHZ+Eb6TAJP7ASeJN9h9K0KXoRTs8u6ouHBKvg== -jwt-decode@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/jwt-decode/-/jwt-decode-2.2.0.tgz#7d86bd56679f58ce6a84704a657dd392bba81a79" - integrity sha1-fYa9VmefWM5qhHBKZX3TkruoGnk= +jwt-decode@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/jwt-decode/-/jwt-decode-3.1.2.tgz#3fb319f3675a2df0c2895c8f5e9fa4b67b04ed59" + integrity sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A== -katex@^0.10.0: - version "0.10.2" - resolved "https://registry.yarnpkg.com/katex/-/katex-0.10.2.tgz#39973edbb65eda5b6f9e7f41648781e557dd4932" - integrity sha512-cQOmyIRoMloCoSIOZ1+gEwsksdJZ1EW4SWm3QzxSza/QsnZr6D4U1V9S4q+B/OLm2OQ8TCBecQ8MaIfnScI7cw== +katex@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/katex/-/katex-0.12.0.tgz#2fb1c665dbd2b043edcf8a1f5c555f46beaa0cb9" + integrity sha512-y+8btoc/CK70XqcHqjxiGWBOeIL8upbS0peTPXTvgrh21n1RiWWcIpSWM+4uXq+IAgNh9YYQWdc7LVDPDAEEAg== dependencies: commander "^2.19.0" @@ -7694,10 +7822,10 @@ lines-and-columns@^1.1.6: resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= -linkify-it@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-2.2.0.tgz#e3b54697e78bf915c70a38acd78fd09e0058b1cf" - integrity sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw== +linkify-it@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-3.0.2.tgz#f55eeb8bc1d3ae754049e124ab3bb56d97797fb8" + integrity sha512-gDBO4aHNZS6coiZCKVhSNh43F9ioIL4JwRjLZPkoLIY4yZFwg264Y5lu2x6rb1Js42Gh6Yqm2f6L2AJcnkzinQ== dependencies: uc.micro "^1.0.1" @@ -7737,7 +7865,7 @@ loader-utils@^0.2.16, loader-utils@^0.2.6: json5 "^0.5.0" object-assign "^4.0.1" -loader-utils@^1.2.3, loader-utils@^1.4.0: +loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== @@ -7785,16 +7913,16 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" -lodash-es@^4.17.15: - version "4.17.15" - resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.15.tgz#21bd96839354412f23d7a10340e5eac6ee455d78" - integrity sha512-rlrc3yU3+JNOpZ9zj5pQtxnx2THmvRykwL4Xlxoa8I9lHBlVbbyPhgyPMioxVZ4NqyxaVVtaJnzsyOidQIhyyQ== - lodash-es@^4.17.20: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== +lodash.camelcase@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= + lodash.clonedeep@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" @@ -7810,7 +7938,7 @@ lodash.get@^4.1.2, lodash.get@^4.4.2: resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= -lodash.isequal@^4.1.1, lodash.isequal@^4.5.0: +lodash.isequal@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA= @@ -7906,6 +8034,14 @@ loud-rejection@^1.0.0: currently-unhandled "^0.4.1" signal-exit "^3.0.0" +loud-rejection@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-2.2.0.tgz#4255eb6e9c74045b0edc021fa7397ab655a8517c" + integrity sha512-S0FayMXku80toa5sZ6Ro4C+s+EtFDCsyJNG/AzFMfX3AxD5Si4dZsgzm/kKnbOxHl5Cv8jBlno8+3XYIh2pNjQ== + dependencies: + currently-unhandled "^0.4.1" + signal-exit "^3.0.2" + lowercase-keys@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" @@ -7934,6 +8070,13 @@ lru-cache@^4.0.1: pseudomap "^1.0.2" yallist "^2.1.2" +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + lru-cache@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" @@ -7948,6 +8091,13 @@ magic-string@0.25.1: dependencies: sourcemap-codec "^1.4.1" +magic-string@^0.25.7: + version "0.25.7" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051" + integrity sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA== + dependencies: + sourcemap-codec "^1.4.4" + make-dir@^1.0.0, make-dir@^1.2.0: version "1.3.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" @@ -8001,21 +8151,21 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" -markdown-it@^8.4.1: - version "8.4.2" - resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-8.4.2.tgz#386f98998dc15a37722aa7722084f4020bdd9b54" - integrity sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ== +markdown-it@^12.0.6: + version "12.0.6" + resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-12.0.6.tgz#adcc8e5fe020af292ccbdf161fe84f1961516138" + integrity sha512-qv3sVLl4lMT96LLtR7xeRJX11OUFjsaD5oVat2/SNBIb21bJXwal2+SklcRbTwGwqWpWH/HRtYavOoJE+seL8w== dependencies: - argparse "^1.0.7" - entities "~1.1.1" - linkify-it "^2.0.0" + argparse "^2.0.1" + entities "~2.1.0" + linkify-it "^3.0.1" mdurl "^1.0.1" uc.micro "^1.0.5" -marked@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/marked/-/marked-2.1.1.tgz#b7c27f520fc4de0ddd049d9b4be3b04e06314923" - integrity sha512-5XFS69o9CzDpQDSpUYC+AN2xvq8yl1EGa5SG/GI1hP78/uTeo3PDfiDNmsUyiahpyhToDDJhQk7fNtJsga+KVw== +marked@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/marked/-/marked-2.1.2.tgz#59579e17b02443312caa1509994d5a0b18ae38e1" + integrity sha512-ueJhIvklJJw04qxQbGIAu63EXwwOCYc7yKMBjgagTM4rjC5QtWyqSNgW7jCosV1/Km/1TUfs5qEpAqcGG0Mo5g== matchmediaquery@^0.3.0: version "0.3.1" @@ -8095,6 +8245,13 @@ merge-source-map@1.0.4: dependencies: source-map "^0.5.6" +merge-source-map@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.1.0.tgz#2fdde7e6020939f70906a68f2d7ae685e4c8c646" + integrity sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw== + dependencies: + source-map "^0.6.1" + merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" @@ -8193,14 +8350,13 @@ min-document@^2.19.0: dependencies: dom-walk "^0.1.0" -mini-create-react-context@^0.3.0: - version "0.3.2" - resolved "https://registry.yarnpkg.com/mini-create-react-context/-/mini-create-react-context-0.3.2.tgz#79fc598f283dd623da8e088b05db8cddab250189" - integrity sha512-2v+OeetEyliMt5VHMXsBhABoJ0/M4RCe7fatd/fBy6SMiKazUSEt3gxxypfnk2SHMkdBYvorHRoQxuGoiwbzAw== +mini-create-react-context@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/mini-create-react-context/-/mini-create-react-context-0.4.1.tgz#072171561bfdc922da08a60c2197a497cc2d1d5e" + integrity sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ== dependencies: - "@babel/runtime" "^7.4.0" - gud "^1.0.0" - tiny-warning "^1.0.2" + "@babel/runtime" "^7.12.1" + tiny-warning "^1.0.3" mini-css-extract-plugin@^1.6.0: version "1.6.0" @@ -8306,11 +8462,6 @@ moment-timezone@^0.5.31: resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.1.tgz#b2be769fa31940be9eeea6469c075e35006fa3d3" integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ== -moment@^2.24.0: - version "2.24.0" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b" - integrity sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg== - mozjpeg@^7.0.0: version "7.1.0" resolved "https://registry.yarnpkg.com/mozjpeg/-/mozjpeg-7.1.0.tgz#23f202f3e48e98f02ed84f415358d4cbfab66c19" @@ -8541,6 +8692,14 @@ object-is@^1.0.1: resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.0.2.tgz#6b80eb84fe451498f65007982f035a5b445edec4" integrity sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ== +object-is@^1.1.4: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" + integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" @@ -9264,6 +9423,20 @@ postcss-modules-values@^4.0.0: dependencies: icss-utils "^5.0.0" +postcss-modules@^4.0.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/postcss-modules/-/postcss-modules-4.1.3.tgz#c4c4c41d98d97d24c70e88dacfc97af5a4b3e21d" + integrity sha512-dBT39hrXe4OAVYJe/2ZuIZ9BzYhOe7t+IhedYeQ2OxKwDpAGlkEN/fR0fGnrbx4BvgbMReRX4hCubYK9cE/pJQ== + dependencies: + generic-names "^2.0.1" + icss-replace-symbols "^1.1.0" + lodash.camelcase "^4.3.0" + postcss-modules-extract-imports "^3.0.0" + postcss-modules-local-by-default "^4.0.0" + postcss-modules-scope "^3.0.0" + postcss-modules-values "^4.0.0" + string-hash "^1.1.1" + postcss-selector-parser@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz#934cf799d016c83411859e09dcecade01286ec5c" @@ -9295,7 +9468,7 @@ postcss@^6.0.1, postcss@^6.0.2: source-map "^0.6.1" supports-color "^5.4.0" -postcss@^8.2.15: +postcss@^8.1.10, postcss@^8.2.15: version "8.3.5" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.3.5.tgz#982216b113412bc20a86289e91eb994952a5b709" integrity sha512-NxTuJocUhYGsMiMFHDUkmjSKT3EdH4/WbGF6GCi1NDGk+vbcUTun4fpbOqaPtD8IIsztA2ilZm2DhYCuyN58gA== @@ -9329,10 +9502,10 @@ prettier@^2.3.1: resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.3.1.tgz#76903c3f8c4449bc9ac597acefa24dc5ad4cbea6" integrity sha512-p+vNbgpLjif/+D+DwAZAbndtRrR0md0MwfmOVN9N+2RgyACMT+7tfaRnT+WDPkqnuVwleyuBIG2XBxKDme3hPA== -pretty-ms@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-6.0.1.tgz#03ec6cfee20329f142645e63efad96bb775d3da4" - integrity sha512-ke4njoVmlotekHlHyCZ3wI/c5AMT8peuHs8rKJqekj/oR5G8lND2dVpicFlUz5cbZgE290vvkMuDwfj/OcW1kw== +pretty-ms@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-7.0.1.tgz#7d903eaab281f7d8e03c66f867e239dc32fb73e8" + integrity sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q== dependencies: parse-ms "^2.1.0" @@ -9371,7 +9544,7 @@ prop-types-extra@^1.1.0: react-is "^16.3.2" warning "^4.0.0" -prop-types@^15.5.4, prop-types@^15.5.7, prop-types@^15.5.8, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2: +prop-types@^15.5.7, prop-types@^15.5.8, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2: version "15.7.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== @@ -9515,15 +9688,16 @@ raw-body@2.4.0: iconv-lite "0.4.24" unpipe "1.0.0" -react-ace@5.9.0: - version "5.9.0" - resolved "https://registry.yarnpkg.com/react-ace/-/react-ace-5.9.0.tgz#427a1cc4869b960a6f9748aa7eb169a9269fc336" - integrity sha512-r6Tuce6seG05g9kT2Tio6DWohy06knG7e5u9OfhvMquZL+Cyu4eqPf60K1Vi2RXlS3+FWrdG8Rinwu4+oQjjgw== +react-ace@^9.4.1: + version "9.4.1" + resolved "https://registry.yarnpkg.com/react-ace/-/react-ace-9.4.1.tgz#5f446c2764a0b615e8d00cd251b9b35d95365e37" + integrity sha512-vhOFrB5Xy++mcPNc6wc1mwMFP/FZOnYxQPqgRl/dLfkZBbrJf4SAgXaa6PU4AXWu1u5bfxOmRwwHaZPrLb6d9Q== dependencies: - brace "^0.11.0" + ace-builds "^1.4.12" + diff-match-patch "^1.0.4" lodash.get "^4.4.2" - lodash.isequal "^4.1.1" - prop-types "^15.5.8" + lodash.isequal "^4.5.0" + prop-types "^15.7.2" react-bootstrap@1.6.1: version "1.6.1" @@ -9548,17 +9722,15 @@ react-bootstrap@1.6.1: uncontrollable "^7.2.1" warning "^4.0.3" -react-collapse@^4.0.2: - version "4.0.3" - resolved "https://registry.yarnpkg.com/react-collapse/-/react-collapse-4.0.3.tgz#b96de959ed0092a43534630b599a4753dd76d543" - integrity sha512-OO4NhtEqFtz+1ma31J1B7+ezdRnzHCZiTGSSd/Pxoks9hxrZYhzFEddeYt05A/1477xTtdrwo7xEa2FLJyWGCQ== - dependencies: - prop-types "^15.5.8" +react-collapse@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/react-collapse/-/react-collapse-5.1.0.tgz#36f69ecb0fe797f976aaf5e4f2b2c248d2760140" + integrity sha512-5v0ywsn9HjiR/odNzbRDs0RZfrnbdSippJebWOBCFFDA12Vx8DddrbI4qWVf1P2wTiVagrpcSy07AU0b6+gM9Q== -react-copy-to-clipboard@^5.0.1: - version "5.0.2" - resolved "https://registry.yarnpkg.com/react-copy-to-clipboard/-/react-copy-to-clipboard-5.0.2.tgz#d82a437e081e68dfca3761fbd57dbf2abdda1316" - integrity sha512-/2t5mLMMPuN5GmdXo6TebFa8IoFxZ+KTDDqYhcDm0PhkgEzSxVvIX26G20s1EB02A4h2UZgwtfymZ3lGJm0OLg== +react-copy-to-clipboard@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/react-copy-to-clipboard/-/react-copy-to-clipboard-5.0.3.tgz#2a0623b1115a1d8c84144e9434d3342b5af41ab4" + integrity sha512-9S3j+m+UxDZOM0Qb8mhnT/rMR0NGSrj9A/073yz2DSxPMYhmYFBMYIdI2X4o8AjOjyFsSNxDRnCX6s/gRxpriw== dependencies: copy-to-clipboard "^3" prop-types "^15.5.8" @@ -9580,18 +9752,19 @@ react-dom@^16.8.6: prop-types "^15.6.2" scheduler "^0.19.1" -react-dropzone@^3.5.3: - version "3.13.4" - resolved "https://registry.yarnpkg.com/react-dropzone/-/react-dropzone-3.13.4.tgz#84da26815c40339691c49b4544c2ef7a16912ccc" - integrity sha1-hNomgVxAM5aRxJtFRMLvehaRLMw= +react-dropzone@^11.3.2: + version "11.3.2" + resolved "https://registry.yarnpkg.com/react-dropzone/-/react-dropzone-11.3.2.tgz#2efb6af800a4779a9daa1e7ba1f8d51d0ab862d7" + integrity sha512-Z0l/YHcrNK1r85o6RT77Z5XgTARmlZZGfEKBl3tqTXL9fZNQDuIdRx/J0QjvR60X+yYu26dnHeaG2pWU+1HHvw== dependencies: - attr-accept "^1.0.3" - prop-types "^15.5.7" + attr-accept "^2.2.1" + file-selector "^0.2.2" + prop-types "^15.7.2" -react-fast-compare@^2.0.2: - version "2.0.4" - resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-2.0.4.tgz#e84b4d455b0fec113e0402c329352715196f81f9" - integrity sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw== +react-fast-compare@^3.1.1: + version "3.2.0" + resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.0.tgz#641a9da81b6a6320f270e89724fb45a0b39e43bb" + integrity sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA== react-height@^3.0.0: version "3.0.1" @@ -9600,15 +9773,15 @@ react-height@^3.0.0: dependencies: prop-types "^15.5.8" -react-helmet@^5.0.3: - version "5.2.1" - resolved "https://registry.yarnpkg.com/react-helmet/-/react-helmet-5.2.1.tgz#16a7192fdd09951f8e0fe22ffccbf9bb3e591ffa" - integrity sha512-CnwD822LU8NDBnjCpZ4ySh8L6HYyngViTZLfBBb3NjtrpN8m49clH8hidHouq20I51Y6TpCTISCBbqiY5GamwA== +react-helmet@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/react-helmet/-/react-helmet-6.1.0.tgz#a750d5165cb13cf213e44747502652e794468726" + integrity sha512-4uMzEY9nlDlgxr61NL3XbKRy1hEkXmKNXhjbAIOVw5vcFrsdYbH2FEwcNyWvWinl103nXgzYNlns9ca+8kFiWw== dependencies: object-assign "^4.1.1" - prop-types "^15.5.4" - react-fast-compare "^2.0.2" - react-side-effect "^1.1.0" + prop-types "^15.7.2" + react-fast-compare "^3.1.1" + react-side-effect "^2.1.0" react-immutable-proptypes@^2.1.0: version "2.2.0" @@ -9627,17 +9800,22 @@ react-intl-translations-manager@^5.0.0: json-stable-stringify "^1.0.1" mkdirp "^0.5.1" -react-intl@2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/react-intl/-/react-intl-2.4.0.tgz#66c14dc9df9a73b2fbbfbd6021726e80a613eb15" - integrity sha1-ZsFNyd+ac7L7v71gIXJugKYT6xU= - dependencies: - intl-format-cache "^2.0.5" - intl-messageformat "^2.1.0" - intl-relativeformat "^2.0.0" - invariant "^2.1.1" +react-intl@5.20.3: + version "5.20.3" + resolved "https://registry.yarnpkg.com/react-intl/-/react-intl-5.20.3.tgz#03a5220cec7f5108ab99b5eae5b19f9c55b5f4d0" + integrity sha512-IFMAWZ5S3abQG7g9+ZVwyxbwDShk6R+JH5RoObfxBHYnvf6XwhrXIgGQ7zGgtJcqEEsVNPWe3CVvGhiVldsqpQ== + dependencies: + "@formatjs/ecma402-abstract" "1.9.3" + "@formatjs/icu-messageformat-parser" "2.0.6" + "@formatjs/intl" "1.13.1" + "@formatjs/intl-displaynames" "5.1.5" + "@formatjs/intl-listformat" "6.2.5" + "@types/hoist-non-react-statics" "^3.3.1" + hoist-non-react-statics "^3.3.2" + intl-messageformat "9.7.0" + tslib "^2.1.0" -react-is@^16.12.0, react-is@^16.13.1, react-is@^16.3.2, react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1: +react-is@^16.13.1, react-is@^16.3.2, react-is@^16.4.2, react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== @@ -9682,56 +9860,54 @@ react-redux@^7.2.0: prop-types "^15.7.2" react-is "^16.13.1" -react-responsive@^8.0.1: - version "8.0.3" - resolved "https://registry.yarnpkg.com/react-responsive/-/react-responsive-8.0.3.tgz#ceb84205359b6032d306650e51490dc1f63d907b" - integrity sha512-F9VXyLao7O8XHXbLjQbIr4+mC6Zr0RDTwNjd7ixTmYEAyKyNanBkLkFchNaMZgszoSK6PgSs/3m/QDWw33/gpg== +react-responsive@^8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/react-responsive/-/react-responsive-8.2.0.tgz#e0ffb306cfd8f38c9c12e26725b9e1245fa9debc" + integrity sha512-iagCqVrw4QSjhxKp3I/YK6+ODkWY6G+YPElvdYKiUUbywwh9Ds0M7r26Fj2/7dWFFbOpcGnJE6uE7aMck8j5Qg== dependencies: hyphenate-style-name "^1.0.0" matchmediaquery "^0.3.0" prop-types "^15.6.1" shallow-equal "^1.1.0" -react-router-dom@^5.0.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.1.2.tgz#06701b834352f44d37fbb6311f870f84c76b9c18" - integrity sha512-7BPHAaIwWpZS074UKaw1FjVdZBSVWEk8IuDXdB+OkLb8vd/WRQIpA4ag9WQk61aEfQs47wHyjWUoUGGZxpQXew== +react-router-dom@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.2.0.tgz#9e65a4d0c45e13289e66c7b17c7e175d0ea15662" + integrity sha512-gxAmfylo2QUjcwxI63RhQ5G85Qqt4voZpUXSEqCwykV0baaOTQDR1f0PmY8AELqIyVc0NEZUj0Gov5lNGcXgsA== dependencies: "@babel/runtime" "^7.1.2" history "^4.9.0" loose-envify "^1.3.1" prop-types "^15.6.2" - react-router "5.1.2" + react-router "5.2.0" tiny-invariant "^1.0.2" tiny-warning "^1.0.0" -react-router@5.1.2, react-router@^5.0.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.1.2.tgz#6ea51d789cb36a6be1ba5f7c0d48dd9e817d3418" - integrity sha512-yjEuMFy1ONK246B+rsa0cUam5OeAQ8pyclRDgpxuSCrAlJ1qN9uZ5IgyKC7gQg0w8OM50NXHEegPh/ks9YuR2A== +react-router@5.2.0, react-router@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.2.0.tgz#424e75641ca8747fbf76e5ecca69781aa37ea293" + integrity sha512-smz1DUuFHRKdcJC0jobGo8cVbhO3x50tCL4icacOlcwDOEQPq4TMqwx3sY1TP+DvtTgz4nm3thuo7A+BK2U0Dw== dependencies: "@babel/runtime" "^7.1.2" history "^4.9.0" hoist-non-react-statics "^3.1.0" loose-envify "^1.3.1" - mini-create-react-context "^0.3.0" + mini-create-react-context "^0.4.0" path-to-regexp "^1.7.0" prop-types "^15.6.2" react-is "^16.6.0" tiny-invariant "^1.0.2" tiny-warning "^1.0.0" -react-side-effect@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/react-side-effect/-/react-side-effect-1.2.0.tgz#0e940c78faba0c73b9b0eba9cd3dda8dfb7e7dae" - integrity sha512-v1ht1aHg5k/thv56DRcjw+WtojuuDHFUgGfc+bFHOWsF4ZK6C2V57DO0Or0GPsg6+LSTE0M6Ry/gfzhzSwbc5w== - dependencies: - shallowequal "^1.0.1" +react-side-effect@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/react-side-effect/-/react-side-effect-2.1.1.tgz#66c5701c3e7560ab4822a4ee2742dee215d72eb3" + integrity sha512-2FoTQzRNTncBVtnzxFOk2mCpcfxQpenBMbk5kSVBg5UcPqV9fRbgY2zhb7GTWWOlpFmAxhClBDlIq8Rsubz1yQ== -react-toggle@4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/react-toggle/-/react-toggle-4.1.1.tgz#2317f67bf918ea3508a96b09dd383efd9da572af" - integrity sha512-+wXlMcSpg8SmnIXauMaZiKpR+r2wp2gMUteroejp2UTSqGTVvZLN+m9EhMzFARBKEw7KpQOwzCyfzeHeAndQGw== +react-toggle@4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/react-toggle/-/react-toggle-4.1.2.tgz#b00500832f925ad524356d909821821ae39f6c52" + integrity sha512-4Ohw31TuYQdhWfA6qlKafeXx3IOH7t4ZHhmRdwsm1fQREwOBGxJT+I22sgHqR/w8JRdk+AeMCJXPImEFSrNXow== dependencies: classnames "^2.2.5" @@ -9876,21 +10052,19 @@ redux-actions@^2.6.5: reduce-reducers "^0.4.3" to-camel-case "^1.0.0" -redux-form@^8.2.4: - version "8.3.1" - resolved "https://registry.yarnpkg.com/redux-form/-/redux-form-8.3.1.tgz#a2958375d85fa064690285848dda3c9b22828fab" - integrity sha512-YEr0w+KftgN0l6cLVlpsLDqnATw/MIG7wpxCJwPdLC2PWbTv/0H9T7Ny6n8r1KZAfvTXUlX61jm4obFP7bggbw== +redux-form@^8.3.7: + version "8.3.7" + resolved "https://registry.yarnpkg.com/redux-form/-/redux-form-8.3.7.tgz#24eb6d8b8b37098b4702fc4c52b6596b01a71c82" + integrity sha512-CUv6z5Gpog3shB3Ptsd+x6dmeQ1AzIlx1Tniri3j7Gf+oBBtLrD7dHMLOcTbJKsaEwG49SB/z1Pik3Hy04mNcQ== dependencies: - "@babel/runtime" "^7.8.4" + "@babel/runtime" "^7.9.2" es6-error "^4.1.1" hoist-non-react-statics "^3.3.2" invariant "^2.2.4" is-promise "^2.1.0" lodash "^4.17.15" - lodash-es "^4.17.15" prop-types "^15.6.1" - react-is "^16.12.0" - react-lifecycles-compat "^3.0.4" + react-is "^16.4.2" redux-promise-middleware@^6.1.1: version "6.1.2" @@ -9938,21 +10112,13 @@ redux-thunk@^2.3.0: resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.3.0.tgz#51c2c19a185ed5187aaa9a2d08b666d0d6467622" integrity sha512-km6dclyFnmcvxhAcrQV2AkZmPQjzPDjgVlQtR0EQjxZPyJ0BnMf3in1ryuR8A2qU0HldVRfxYXbFSKlI3N7Slw== -redux@^4.0.0: +redux@^4.0.0, redux@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/redux/-/redux-4.1.0.tgz#eb049679f2f523c379f1aff345c8612f294c88d4" integrity sha512-uI2dQN43zqLWCt6B/BMGRMY6db7TTY4qeHHfGeKb3EOhmOKjU3KdWvNLJyqaHRksv/ErdNH7cFZWg9jXtewy4g== dependencies: "@babel/runtime" "^7.9.2" -redux@^4.0.4: - version "4.0.5" - resolved "https://registry.yarnpkg.com/redux/-/redux-4.0.5.tgz#4db5de5816e17891de8a80c424232d06f051d93f" - integrity sha512-VSz1uMAH24DM6MF72vcojpYPtrTUu3ByVWfPL1nPfVRb5mZVTve5GnNCUV53QM/BZ66xfWrm0CTWoM+Xlz8V1w== - dependencies: - loose-envify "^1.4.0" - symbol-observable "^1.2.0" - regenerate-unicode-properties@^8.2.0: version "8.2.0" resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec" @@ -10008,7 +10174,7 @@ regexp.prototype.flags@^1.2.0: define-properties "^1.1.3" es-abstract "^1.17.0-next.1" -regexp.prototype.flags@^1.3.1: +regexp.prototype.flags@^1.3.0, regexp.prototype.flags@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz#7ef352ae8d159e758c0eadca6f8fcb4eef07be26" integrity sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA== @@ -10221,7 +10387,7 @@ resolve@^1.1.5, resolve@^1.14.2, resolve@^1.20.0, resolve@^1.9.0: is-core-module "^2.2.0" path-parse "^1.0.6" -resolve@^1.10.0, resolve@^1.10.1, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.3.2: +resolve@^1.10.0, resolve@^1.10.1, resolve@^1.12.0, resolve@^1.13.1: version "1.15.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.1.tgz#27bdcdeffeaf2d6244b95bb0f9f4b4653451f3e8" integrity sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w== @@ -10342,7 +10508,7 @@ schema-utils@^1.0.0: ajv-errors "^1.0.0" ajv-keywords "^3.1.0" -schema-utils@^2.2.0, schema-utils@^2.6.5: +schema-utils@^2.6.5: version "2.6.5" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.6.5.tgz#c758f0a7e624263073d396e29cd40aa101152d8a" integrity sha512-5KXuwKziQrTVHh8j/Uxz+QUbxkaLW9X/86NBlx/gnKgtsZA2GIVMUn17qWhRFwF8jdYb3Dig5hRO/W5mZqy6SQ== @@ -10431,7 +10597,7 @@ semver-truncate@^1.1.2: dependencies: semver "^5.3.0" -"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.6.0, semver@^5.7.0: +"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.5.0, semver@^5.6.0, semver@^5.7.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== @@ -10479,10 +10645,10 @@ serialize-javascript@5.0.1, serialize-javascript@^5.0.1: dependencies: randombytes "^2.1.0" -serialize-javascript@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-3.1.0.tgz#8bf3a9170712664ef2561b44b691eafe399214ea" - integrity sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg== +serialize-javascript@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" + integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== dependencies: randombytes "^2.1.0" @@ -10556,11 +10722,6 @@ shallow-equal@^1.1.0: resolved "https://registry.yarnpkg.com/shallow-equal/-/shallow-equal-1.2.1.tgz#4c16abfa56043aa20d050324efa68940b0da79da" integrity sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA== -shallowequal@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" - integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== - shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" @@ -10585,15 +10746,7 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -side-channel@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.2.tgz#df5d1abadb4e4bf4af1cd8852bf132d2f7876947" - integrity sha512-7rL9YlPHg7Ancea1S96Pa8/QWb4BtXL/TZvS6B8XFetGBeuhAsfmUspK6DokBeZ64+Kj9TCNRD/30pVz1BvQNA== - dependencies: - es-abstract "^1.17.0-next.1" - object-inspect "^1.7.0" - -side-channel@^1.0.4: +side-channel@^1.0.3, side-channel@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== @@ -10762,7 +10915,7 @@ source-map@~0.7.2: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== -sourcemap-codec@^1.4.1: +sourcemap-codec@^1.4.1, sourcemap-codec@^1.4.4: version "1.4.8" resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== @@ -10912,6 +11065,11 @@ strict-uri-encode@^1.0.0: resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= +string-hash@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/string-hash/-/string-hash-1.1.3.tgz#e8aafc0ac1855b4666929ed7dd1275df5d6c811b" + integrity sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs= + "string-width@^1.0.2 || 2": version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" @@ -11167,11 +11325,6 @@ sweetalert2@^10.15.6: resolved "https://registry.yarnpkg.com/sweetalert2/-/sweetalert2-10.16.9.tgz#8ed86f2fa811a136667a48357e204348705be8c9" integrity sha512-oNe+md5tmmS3fGfVHa7gVPlun7Td2oANSacnZCeghnrr3OHBi6UPVPU+GFrymwaDqwQspACilLRmRnM7aTjNPA== -symbol-observable@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" - integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== - symbol-tree@^3.2.4: version "3.2.4" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" @@ -11240,7 +11393,7 @@ tempusdominus-bootstrap-4@^5.39.0: moment-timezone "^0.5.31" popper.js "^1.16.1" -terser-webpack-plugin@^5.1.1, terser-webpack-plugin@^5.1.3: +terser-webpack-plugin@^5.1.3: version "5.1.3" resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.1.3.tgz#30033e955ca28b55664f1e4b30a1347e61aa23af" integrity sha512-cxGbMqr6+A2hrIB5ehFIF+F/iST5ZOxvOmy9zih9ySbP1C2oEWQSOUS+2SNBTjzx5xLKO4xnod9eywdfq1Nb9A== @@ -11311,7 +11464,7 @@ tiny-invariant@^1.0.2: resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.1.0.tgz#634c5f8efdc27714b7f386c35e6760991d230875" integrity sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw== -tiny-warning@^1.0.0, tiny-warning@^1.0.2: +tiny-warning@^1.0.0, tiny-warning@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== @@ -11457,6 +11610,11 @@ tslib@^1.10.0, tslib@^1.9.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.11.1.tgz#eb15d128827fbee2841549e171f45ed338ac7e35" integrity sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA== +tslib@^2.0.3, tslib@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.0.tgz#803b8cdab3e12ba581a4ca41c8839bbb0dacb09e" + integrity sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg== + tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" @@ -11521,6 +11679,11 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= +typescript@^4.0: + version "4.3.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.3.4.tgz#3f85b986945bcf31071decdd96cf8bfa65f9dcbc" + integrity sha512-uauPG7XZn9F/mo+7MrsRjyvbxFpzemRjKEZXS4AK83oP2KKOJPvb+9cO/gmnv8arWZvhnjVOXz7B49m1l0e9Ew== + uc.micro@^1.0.1, uc.micro@^1.0.5: version "1.0.6" resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac" @@ -11639,7 +11802,7 @@ uniq@^1.0.1: resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= -universalify@^0.1.0, universalify@^0.1.2: +universalify@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== @@ -11779,10 +11942,10 @@ validate-npm-package-license@^3.0.1: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" -validator@^7.0.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/validator/-/validator-7.2.0.tgz#a63dcbaba51d4350bf8df20988e0d5a54d711791" - integrity sha512-c8NGTUYeBEcUIGeMppmNVKHE7wwfm3mYbNZxV+c5mlv9fDHI7Ad3p07qfNrn/CvpdkK2k61fOLRO2sTEhgQXmg== +validator@^13.6.0: + version "13.6.0" + resolved "https://registry.yarnpkg.com/validator/-/validator-13.6.0.tgz#1e71899c14cdc7b2068463cb24c1cc16f6ec7059" + integrity sha512-gVgKbdbHgtxpRyR8K0O6oFZPhhB5tT1jeEHZR0Znr9Svg03U0+r9DXWMrnRAB+HtCStDQKlaIZm42tVsVjqtjg== value-equal@^1.0.1: version "1.0.1" @@ -11803,10 +11966,10 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" -viz.js@^1.8.0: - version "1.8.2" - resolved "https://registry.yarnpkg.com/viz.js/-/viz.js-1.8.2.tgz#d9cc04cd99f98ec986bf9054db76a6cbcdc5d97a" - integrity sha512-W+1+N/hdzLpQZEcvz79n2IgUE9pfx6JLdHh3Kh8RGvLL8P1LdJVQmi2OsDcLdY4QVID4OUy+FPelyerX0nJxIQ== +viz.js@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/viz.js/-/viz.js-2.1.2.tgz#6f09cd4e10af28754a6d50b055bd2e4a7693983a" + integrity sha512-UO6CPAuEMJ8oNR0gLLNl+wUiIzQUsyUOp8SyyDKTqVRBtq7kk1VnFmIZW8QufjxGrGEuI+LVR7p/C7uEKy0LQw== w3c-hr-time@^1.0.2: version "1.0.2" @@ -11985,10 +12148,10 @@ webpack-sources@^2.3.0: source-list-map "^2.0.1" source-map "^0.6.1" -webpack@^5.39.1: - version "5.39.1" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.39.1.tgz#d1e014b6d71e1aef385316ad528f21cd5b1f9784" - integrity sha512-ulOvoNCh2PvTUa+zbpRuEb1VPeQnhxpnHleMPVVCq3QqnaFogjsLyps+o42OviQFoaGtTQYrUqDXu1QNkvUPzw== +webpack@^5.40.0: + version "5.40.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.40.0.tgz#3182cfd324759d715252cf541901a226e57b5061" + integrity sha512-c7f5e/WWrxXWUzQqTBg54vBs5RgcAgpvKE4F4VegVgfo4x660ZxYUF2/hpMkZUnLjgytVTitjeXaN4IPlXCGIw== dependencies: "@types/eslint-scope" "^3.7.0" "@types/estree" "^0.0.47" @@ -11999,7 +12162,7 @@ webpack@^5.39.1: browserslist "^4.14.5" chrome-trace-event "^1.0.2" enhanced-resolve "^5.8.0" - es-module-lexer "^0.4.0" + es-module-lexer "^0.6.0" eslint-scope "5.1.1" events "^3.2.0" glob-to-regexp "^0.4.1" @@ -12010,7 +12173,7 @@ webpack@^5.39.1: neo-async "^2.6.2" schema-utils "^3.0.0" tapable "^2.1.1" - terser-webpack-plugin "^5.1.1" + terser-webpack-plugin "^5.1.3" watchpack "^2.2.0" webpack-sources "^2.3.0" @@ -12089,7 +12252,7 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" -which-collection@^1.0.0: +which-collection@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906" integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== @@ -12104,6 +12267,19 @@ which-module@^2.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= +which-typed-array@^1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.4.tgz#8fcb7d3ee5adf2d771066fba7cf37e32fe8711ff" + integrity sha512-49E0SpUe90cjpoc7BOJwyPHRqSAd12c10Qm2amdEZrJPCY2NDxaW01zHITrem+rnETY3dwrbH3UUrUwagfCYDA== + dependencies: + available-typed-arrays "^1.0.2" + call-bind "^1.0.0" + es-abstract "^1.18.0-next.1" + foreach "^2.0.5" + function-bind "^1.1.1" + has-symbols "^1.0.1" + is-typed-array "^1.1.3" + which@2.0.2, which@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" @@ -12222,6 +12398,11 @@ yallist@^2.1.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + yallist@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"