From 42acc542b7b3539d9fcf9bf0d5c282b706acffdf Mon Sep 17 00:00:00 2001 From: "Nicholas Carrigan (he/him)" Date: Fri, 10 Dec 2021 03:23:26 -0800 Subject: [PATCH 01/63] fix: handle uppercase and missing user verification (#44444) * fix: hotfix for isHonest null * fix: early return if no user? * fix: handle invalid input on api Also lowerCases the username it receives since the client could send any case. * fix: report errors to user when verification fails Co-authored-by: Oliver Eyton-Williams --- api-server/src/common/models/user.js | 2 +- api-server/src/server/boot/certificate.js | 28 +++++++++++++++++-- .../components/cert-challenge.tsx | 20 +++++++++---- client/src/utils/ajax.ts | 2 ++ 4 files changed, 43 insertions(+), 9 deletions(-) diff --git a/api-server/src/common/models/user.js b/api-server/src/common/models/user.js index d34f95e9d8..a3c545f087 100644 --- a/api-server/src/common/models/user.js +++ b/api-server/src/common/models/user.js @@ -55,7 +55,7 @@ function destroyAll(id, Model) { return Observable.fromNodeCallback(Model.destroyAll, Model)({ userId: id }); } -function ensureLowerCaseString(maybeString) { +export function ensureLowerCaseString(maybeString) { return (maybeString && maybeString.toLowerCase()) || ''; } diff --git a/api-server/src/server/boot/certificate.js b/api-server/src/server/boot/certificate.js index 1d5637ad43..dd9240dcad 100644 --- a/api-server/src/server/boot/certificate.js +++ b/api-server/src/server/boot/certificate.js @@ -20,6 +20,7 @@ import { reportError } from '../middlewares/sentry-error-handler.js'; import { getChallenges } from '../utils/get-curriculum'; import { ifNoUser401 } from '../utils/middleware'; import { observeQuery } from '../utils/rx'; +import { ensureLowerCaseString } from '../../common/models/user'; const { legacyFrontEndChallengeId, @@ -523,7 +524,7 @@ function createVerifyCanClaim(certTypeIds, app) { let certType = superBlockCertTypeMap[superBlock]; log(certType); - return findUserByUsername$(username, { + return findUserByUsername$(ensureLowerCaseString(username), { isFrontEndCert: true, isBackEndCert: true, isFullStackCert: true, @@ -544,15 +545,36 @@ function createVerifyCanClaim(certTypeIds, app) { isHonest: true, completedChallenges: true }).subscribe(user => { + if (!user) { + return res.status(404).json({ + message: { + type: 'info', + message: 'flash.username-not-found', + variables: { username } + } + }); + } + + if (!certTypeIds[certType]) { + return res.status(404).json({ + message: { + type: 'info', + // TODO: create a specific 'flash.cert-not-found' message + message: 'flash.could-not-find' + } + }); + } + return Observable.of(certTypeIds[certType]) .flatMap(challenge => { const certName = certTypeTitleMap[certType]; const { tests = [] } = challenge; - const { isHonest, completedChallenges } = user; - const isProjectsCompleted = canClaim(tests, completedChallenges); let result = 'incomplete-requirements'; let status = false; + const { isHonest, completedChallenges } = user; + const isProjectsCompleted = canClaim(tests, completedChallenges); + if (isHonest && isProjectsCompleted) { status = true; result = 'requirements-met'; diff --git a/client/src/templates/Introduction/components/cert-challenge.tsx b/client/src/templates/Introduction/components/cert-challenge.tsx index 3cfd947466..1b0b2a989f 100644 --- a/client/src/templates/Introduction/components/cert-challenge.tsx +++ b/client/src/templates/Introduction/components/cert-challenge.tsx @@ -91,12 +91,22 @@ const CertChallenge = ({ void (async () => { try { const data = await getVerifyCanClaimCert(username, superBlock); - const { status, result } = data?.response?.message; - setCanClaimCert(status); - setCertVerificationMessage(result); - setVerificationComplete(true); + if (data?.message) { + setCanClaimCert(false); + createFlashMessage(data.message); + } else { + const { status, result } = data?.response?.message; + setCanClaimCert(status); + setCertVerificationMessage(result); + } } catch (e) { - // TODO: How do we handle errors...? + console.error(e); + createFlashMessage({ + type: 'danger', + message: FlashMessages.ReallyWeird + }); + } finally { + setVerificationComplete(true); } })(); } diff --git a/client/src/utils/ajax.ts b/client/src/utils/ajax.ts index cdfd17f6d4..594b82a08f 100644 --- a/client/src/utils/ajax.ts +++ b/client/src/utils/ajax.ts @@ -1,5 +1,6 @@ import cookies from 'browser-cookies'; import envData from '../../../config/env.json'; +import { FlashMessageArg } from '../components/Flash/redux'; import type { ChallengeFile, @@ -172,6 +173,7 @@ export interface GetVerifyCanClaimCert { }; isCertMap: ClaimedCertifications; completedChallenges: CompletedChallenge[]; + message?: FlashMessageArg; } export function getVerifyCanClaimCert( From 466224fb24ed16c60292aabc922a15104499ec6e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 10 Dec 2021 19:42:45 +0530 Subject: [PATCH 02/63] chore(deps): update dependency jest to v27.4.4 (#44451) Co-authored-by: Renovate Bot --- package-lock.json | 510 +++++++++++++++++++++++----------------------- package.json | 2 +- 2 files changed, 256 insertions(+), 256 deletions(-) diff --git a/package-lock.json b/package-lock.json index afff0606e6..76354593ea 100644 --- a/package-lock.json +++ b/package-lock.json @@ -83,7 +83,7 @@ "execa": "5.1.1", "faker": "5.5.3", "husky": "7.0.4", - "jest": "27.4.3", + "jest": "27.4.4", "js-yaml": "3.14.1", "lint-staged": "12.1.2", "lodash": "4.17.21", @@ -3787,15 +3787,15 @@ } }, "node_modules/@jest/core": { - "version": "27.4.3", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.4.3.tgz", - "integrity": "sha512-V9ms3zSxUHxh1E/ZLAiXF7SLejsdFnjWTFizWotMOWvjho0lW5kSjZymhQSodNW0T0ZMQRiha7f8+NcFVm3hJQ==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.4.4.tgz", + "integrity": "sha512-xBNPVqYAdAiAMXnb4ugx9Cdmr0S52lBsLbQMR/sGBRO0810VSPKiuSDtuup6qdkK1e9vxbv3KK3IAP1QFAp8mw==", "dev": true, "dependencies": { "@jest/console": "^27.4.2", - "@jest/reporters": "^27.4.2", + "@jest/reporters": "^27.4.4", "@jest/test-result": "^27.4.2", - "@jest/transform": "^27.4.2", + "@jest/transform": "^27.4.4", "@jest/types": "^27.4.2", "@types/node": "*", "ansi-escapes": "^4.2.1", @@ -3804,15 +3804,15 @@ "exit": "^0.1.2", "graceful-fs": "^4.2.4", "jest-changed-files": "^27.4.2", - "jest-config": "^27.4.3", - "jest-haste-map": "^27.4.2", + "jest-config": "^27.4.4", + "jest-haste-map": "^27.4.4", "jest-message-util": "^27.4.2", "jest-regex-util": "^27.4.0", - "jest-resolve": "^27.4.2", - "jest-resolve-dependencies": "^27.4.2", - "jest-runner": "^27.4.3", - "jest-runtime": "^27.4.2", - "jest-snapshot": "^27.4.2", + "jest-resolve": "^27.4.4", + "jest-resolve-dependencies": "^27.4.4", + "jest-runner": "^27.4.4", + "jest-runtime": "^27.4.4", + "jest-snapshot": "^27.4.4", "jest-util": "^27.4.2", "jest-validate": "^27.4.2", "jest-watcher": "^27.4.2", @@ -3913,9 +3913,9 @@ } }, "node_modules/@jest/environment": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.4.2.tgz", - "integrity": "sha512-uSljKxh/rGlHlmhyeG4ZoVK9hOec+EPBkwTHkHKQ2EqDu5K+MaG9uJZ8o1CbRsSdZqSuhXvJCYhBWsORPPg6qw==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.4.4.tgz", + "integrity": "sha512-q+niMx7cJgt/t/b6dzLOh4W8Ef/8VyKG7hxASK39jakijJzbFBGpptx3RXz13FFV7OishQ9lTbv+dQ5K3EhfDQ==", "dev": true, "dependencies": { "@jest/fake-timers": "^27.4.2", @@ -3945,12 +3945,12 @@ } }, "node_modules/@jest/globals": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.4.2.tgz", - "integrity": "sha512-KkfaHEttlGpXYAQTZHgrESiEPx2q/DKAFLGLFda1uGVrqc17snd3YVPhOxlXOHIzVPs+lQ/SDB2EIvxyGzb3Ew==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.4.4.tgz", + "integrity": "sha512-bqpqQhW30BOreXM8bA8t8JbOQzsq/WnPTnBl+It3UxAD9J8yxEAaBEylHx1dtBapAr/UBk8GidXbzmqnee8tYQ==", "dev": true, "dependencies": { - "@jest/environment": "^27.4.2", + "@jest/environment": "^27.4.4", "@jest/types": "^27.4.2", "expect": "^27.4.2" }, @@ -3959,15 +3959,15 @@ } }, "node_modules/@jest/reporters": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.4.2.tgz", - "integrity": "sha512-sp4aqmdBJtjKetEakzDPcZggPcVIF6w9QLkYBbaWDV6e/SIsHnF1S4KtIH91eEc2fp7ep6V/e1xvdfEoho1d2w==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.4.4.tgz", + "integrity": "sha512-ssyJSw9B9Awb1QaxDhIPSs4de1b7SE2kv7tqFehQL13xpn5HUkMYZK/ufTOXiCAnXFOZS+XDl1GaQ/LmJAzI1A==", "dev": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", "@jest/console": "^27.4.2", "@jest/test-result": "^27.4.2", - "@jest/transform": "^27.4.2", + "@jest/transform": "^27.4.4", "@jest/types": "^27.4.2", "@types/node": "*", "chalk": "^4.0.0", @@ -3980,10 +3980,10 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.0.2", - "jest-haste-map": "^27.4.2", - "jest-resolve": "^27.4.2", + "jest-haste-map": "^27.4.4", + "jest-resolve": "^27.4.4", "jest-util": "^27.4.2", - "jest-worker": "^27.4.2", + "jest-worker": "^27.4.4", "slash": "^3.0.0", "source-map": "^0.6.0", "string-length": "^4.0.1", @@ -4061,9 +4061,9 @@ } }, "node_modules/@jest/reporters/node_modules/jest-worker": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.2.tgz", - "integrity": "sha512-0QMy/zPovLfUPyHuOuuU4E+kGACXXE84nRnq6lBVI9GJg5DCBiA97SATi+ZP8CpiJwEQy1oCPjRBf8AnLjN+Ag==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.4.tgz", + "integrity": "sha512-jfwxYJvfua1b1XkyuyPh01ATmgg4e5fPM/muLmhy9Qc6dmiwacQB0MLHaU6IjEsv/+nAixHGxTn8WllA27Pn0w==", "dev": true, "dependencies": { "@types/node": "*", @@ -4158,24 +4158,24 @@ } }, "node_modules/@jest/test-sequencer": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.4.2.tgz", - "integrity": "sha512-HmHp5mlh9f9GyNej5yCS1JZIFfUGnP9+jEOH5zoq5EmsuZeYD+dGULqyvGDPtuzzbyAFJ6R4+z4SS0VvnFwwGQ==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.4.4.tgz", + "integrity": "sha512-mCh+d4JTGTtX7vr13d7q2GHJy33nAobEwtEJ8X3u7R8+0ImVO2eAsQzsLfX8lyvdYHBxYABhqbYuaUNo42/pQw==", "dev": true, "dependencies": { "@jest/test-result": "^27.4.2", "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.4.2", - "jest-runtime": "^27.4.2" + "jest-haste-map": "^27.4.4", + "jest-runtime": "^27.4.4" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/@jest/transform": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.4.2.tgz", - "integrity": "sha512-RTKcPZllfcmLfnlxBya7aypofhdz05+E6QITe55Ex0rxyerkgjmmpMlvVn11V0cP719Ps6WcDYCnDzxnnJUwKg==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.4.4.tgz", + "integrity": "sha512-7U/nDSrGsGzL7+X8ScNFV71w8u8knJQWSa9C2xsrrKLMOgb+rWuCG4VAyWke/53BU96GnT+Ka81xCAHA5gk6zA==", "dev": true, "dependencies": { "@babel/core": "^7.1.0", @@ -4185,7 +4185,7 @@ "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.4.2", + "jest-haste-map": "^27.4.4", "jest-regex-util": "^27.4.0", "jest-util": "^27.4.2", "micromatch": "^4.0.4", @@ -17430,12 +17430,12 @@ } }, "node_modules/babel-jest": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.4.2.tgz", - "integrity": "sha512-MADrjb3KBO2eyZCAc6QaJg6RT5u+6oEdDyHO5HEalnpwQ6LrhTsQF2Kj1Wnz2t6UPXIXPk18dSXXOT0wF5yTxA==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.4.4.tgz", + "integrity": "sha512-+6RVutZxOQgJkt4svgTHPFtOQlVe9dUg3wrimIAM38pY6hL/nsL8glfFSUjD9jNVjaVjzkCzj6loFFecrjr9Qw==", "dev": true, "dependencies": { - "@jest/transform": "^27.4.2", + "@jest/transform": "^27.4.4", "@jest/types": "^27.4.2", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.0.0", @@ -33099,14 +33099,14 @@ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, "node_modules/jest": { - "version": "27.4.3", - "resolved": "https://registry.npmjs.org/jest/-/jest-27.4.3.tgz", - "integrity": "sha512-jwsfVABBzuN3Atm+6h6vIEpTs9+VApODLt4dk2qv1WMOpb1weI1IIZfuwpMiWZ62qvWj78MvdvMHIYdUfqrFaA==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/jest/-/jest-27.4.4.tgz", + "integrity": "sha512-AXwEIFa58Uf1Jno3/KSo5HZZ0/2Xwqvfrz0/3bmTwImkFlbOvz5vARAW9nTrxRLkojjkitaZ1KNKAtw3JRFAaA==", "dev": true, "dependencies": { - "@jest/core": "^27.4.3", + "@jest/core": "^27.4.4", "import-local": "^3.0.2", - "jest-cli": "^27.4.3" + "jest-cli": "^27.4.4" }, "bin": { "jest": "bin/jest.js" @@ -33138,12 +33138,12 @@ } }, "node_modules/jest-circus": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.4.2.tgz", - "integrity": "sha512-2ePUSru1BGMyzxsMvRfu+tNb+PW60rUyMLJBfw1Nrh5zC8RoTPfF+zbE0JToU31a6ZVe4nnrNKWYRzlghAbL0A==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.4.4.tgz", + "integrity": "sha512-4DWhvQerDq5X4GaqhEUoZiBhuNdKDGr0geW0iJwarbDljAmGaGOErKQG+z2PBr0vgN05z7tsGSY51mdWr8E4xg==", "dev": true, "dependencies": { - "@jest/environment": "^27.4.2", + "@jest/environment": "^27.4.4", "@jest/test-result": "^27.4.2", "@jest/types": "^27.4.2", "@types/node": "*", @@ -33155,8 +33155,8 @@ "jest-each": "^27.4.2", "jest-matcher-utils": "^27.4.2", "jest-message-util": "^27.4.2", - "jest-runtime": "^27.4.2", - "jest-snapshot": "^27.4.2", + "jest-runtime": "^27.4.4", + "jest-snapshot": "^27.4.4", "jest-util": "^27.4.2", "pretty-format": "^27.4.2", "slash": "^3.0.0", @@ -33247,19 +33247,19 @@ } }, "node_modules/jest-cli": { - "version": "27.4.3", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.4.3.tgz", - "integrity": "sha512-zZSJBXNC/i8UnJPwcKWsqnhGgIF3uoTYP7th32Zej7KNQJdxzOMj+wCfy2Ox3kU7nXErJ36DtYyXDhfiqaiDRw==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.4.4.tgz", + "integrity": "sha512-+MfsHnZPUOBigCBURuQFRpgYoPCgmIFkICkqt4SrramZCUp/UAuWcst4pMZb84O3VU8JyKJmnpGG4qH8ClQloA==", "dev": true, "dependencies": { - "@jest/core": "^27.4.3", + "@jest/core": "^27.4.4", "@jest/test-result": "^27.4.2", "@jest/types": "^27.4.2", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.4", "import-local": "^3.0.2", - "jest-config": "^27.4.3", + "jest-config": "^27.4.4", "jest-util": "^27.4.2", "jest-validate": "^27.4.2", "prompts": "^2.0.1", @@ -33398,28 +33398,28 @@ } }, "node_modules/jest-config": { - "version": "27.4.3", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.4.3.tgz", - "integrity": "sha512-DQ10HTSqYtC2pO7s9j2jw+li4xUnm2wLYWH2o7K1ftB8NyvToHsXoLlXxtsGh3AW9gUQR6KY/4B7G+T/NswJBw==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.4.4.tgz", + "integrity": "sha512-6lxg0ugO6KS2zKEbpdDwBzu1IT0Xg4/VhxXMuBu+z/5FvBjLCEMTaWQm3bCaGCZUR9j9FK4DzUIxyhIgn6kVEg==", "dev": true, "dependencies": { "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^27.4.2", + "@jest/test-sequencer": "^27.4.4", "@jest/types": "^27.4.2", - "babel-jest": "^27.4.2", + "babel-jest": "^27.4.4", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.1", "graceful-fs": "^4.2.4", - "jest-circus": "^27.4.2", - "jest-environment-jsdom": "^27.4.3", - "jest-environment-node": "^27.4.2", + "jest-circus": "^27.4.4", + "jest-environment-jsdom": "^27.4.4", + "jest-environment-node": "^27.4.4", "jest-get-type": "^27.4.0", - "jest-jasmine2": "^27.4.2", + "jest-jasmine2": "^27.4.4", "jest-regex-util": "^27.4.0", - "jest-resolve": "^27.4.2", - "jest-runner": "^27.4.3", + "jest-resolve": "^27.4.4", + "jest-runner": "^27.4.4", "jest-util": "^27.4.2", "jest-validate": "^27.4.2", "micromatch": "^4.0.4", @@ -33707,12 +33707,12 @@ } }, "node_modules/jest-environment-jsdom": { - "version": "27.4.3", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.4.3.tgz", - "integrity": "sha512-x1AUVz3G14LpEJs7KIFUaTINT2n0unOUmvdAby3s/sldUpJJetOJifHo1O/EUQC5fNBowggwJbVulko18y6OWw==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.4.4.tgz", + "integrity": "sha512-cYR3ndNfHBqQgFvS1RL7dNqSvD//K56j/q1s2ygNHcfTCAp12zfIromO1w3COmXrxS8hWAh7+CmZmGCIoqGcGA==", "dev": true, "dependencies": { - "@jest/environment": "^27.4.2", + "@jest/environment": "^27.4.4", "@jest/fake-timers": "^27.4.2", "@jest/types": "^27.4.2", "@types/node": "*", @@ -33725,12 +33725,12 @@ } }, "node_modules/jest-environment-node": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.4.2.tgz", - "integrity": "sha512-nzTZ5nJ+FabuZPH2YVci7SZIHpvtNRHPt8+vipLkCnAgXGjVzHm7XJWdnNqXbAkExIgiKeVEkVMNZOZE/LeiIg==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.4.4.tgz", + "integrity": "sha512-D+v3lbJ2GjQTQR23TK0kY3vFVmSeea05giInI41HHOaJnAwOnmUHTZgUaZL+VxUB43pIzoa7PMwWtCVlIUoVoA==", "dev": true, "dependencies": { - "@jest/environment": "^27.4.2", + "@jest/environment": "^27.4.4", "@jest/fake-timers": "^27.4.2", "@jest/types": "^27.4.2", "@types/node": "*", @@ -33751,9 +33751,9 @@ } }, "node_modules/jest-haste-map": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.4.2.tgz", - "integrity": "sha512-foiyAEePORUN2eeJnOtcM1y8qW0ShEd9kTjWVL4sVaMcuCJM6gtHegvYPBRT0mpI/bs4ueThM90+Eoj2ncoNsA==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.4.4.tgz", + "integrity": "sha512-kvspmHmgPIZoDaqUsvsJFTaspuxhATvdO6wsFNGNSi8kfdiOCEEvECNbht8xG+eE5Ol88JyJmp2D7RF4dYo85Q==", "dev": true, "dependencies": { "@jest/types": "^27.4.2", @@ -33765,7 +33765,7 @@ "jest-regex-util": "^27.4.0", "jest-serializer": "^27.4.0", "jest-util": "^27.4.2", - "jest-worker": "^27.4.2", + "jest-worker": "^27.4.4", "micromatch": "^4.0.4", "walker": "^1.0.7" }, @@ -33786,9 +33786,9 @@ } }, "node_modules/jest-haste-map/node_modules/jest-worker": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.2.tgz", - "integrity": "sha512-0QMy/zPovLfUPyHuOuuU4E+kGACXXE84nRnq6lBVI9GJg5DCBiA97SATi+ZP8CpiJwEQy1oCPjRBf8AnLjN+Ag==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.4.tgz", + "integrity": "sha512-jfwxYJvfua1b1XkyuyPh01ATmgg4e5fPM/muLmhy9Qc6dmiwacQB0MLHaU6IjEsv/+nAixHGxTn8WllA27Pn0w==", "dev": true, "dependencies": { "@types/node": "*", @@ -33815,13 +33815,13 @@ } }, "node_modules/jest-jasmine2": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.4.2.tgz", - "integrity": "sha512-VO/fyAJSH9u0THjbteFiL8qc93ufU+yW+bdieDc8tzTCWwlWzO53UHS5nFK1qmE8izb5Smkn+XHlVt6/l06MKQ==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.4.4.tgz", + "integrity": "sha512-ygk2tUgtLeN3ouj4KEYw9p81GLI1EKrnvourPULN5gdgB482PH5op9gqaRG0IenbJhBbbRwiSvh5NoBoQZSqdA==", "dev": true, "dependencies": { "@babel/traverse": "^7.1.0", - "@jest/environment": "^27.4.2", + "@jest/environment": "^27.4.4", "@jest/source-map": "^27.4.0", "@jest/test-result": "^27.4.2", "@jest/types": "^27.4.2", @@ -33833,8 +33833,8 @@ "jest-each": "^27.4.2", "jest-matcher-utils": "^27.4.2", "jest-message-util": "^27.4.2", - "jest-runtime": "^27.4.2", - "jest-snapshot": "^27.4.2", + "jest-runtime": "^27.4.4", + "jest-snapshot": "^27.4.4", "jest-util": "^27.4.2", "pretty-format": "^27.4.2", "throat": "^6.0.1" @@ -34337,15 +34337,15 @@ } }, "node_modules/jest-resolve": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.4.2.tgz", - "integrity": "sha512-d/zqPjxCzMqHlOdRTg8cTpO9jY+1/T74KazT8Ws/LwmwxV5sRMWOkiLjmzUCDj/5IqA5XHNK4Hkmlq9Kdpb9Sg==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.4.4.tgz", + "integrity": "sha512-Yh5jK3PBmDbm01Rc8pT0XqpBlTPEGwWp7cN61ijJuwony/tR2Taof3TLy6yfNiuRS8ucUOPO7NBYm3ei38kkcg==", "dev": true, "dependencies": { "@jest/types": "^27.4.2", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.4.2", + "jest-haste-map": "^27.4.4", "jest-pnp-resolver": "^1.2.2", "jest-util": "^27.4.2", "jest-validate": "^27.4.2", @@ -34358,14 +34358,14 @@ } }, "node_modules/jest-resolve-dependencies": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.4.2.tgz", - "integrity": "sha512-hb++cTpqvOWfU49MCP/JQkxmnrhKoAVqXWFjgYXswRSVGk8Q6bDTSvhbCeYXDtXaymY0y7WrrSIlKogClcKJuw==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.4.4.tgz", + "integrity": "sha512-iAnpCXh81sd9nbyqySvm5/aV9X6JZKE0dQyFXTC8tptXcdrgS0vjPFy+mEgzPHxXw+tq4TQupuTa0n8OXwRIxw==", "dev": true, "dependencies": { "@jest/types": "^27.4.2", "jest-regex-util": "^27.4.0", - "jest-snapshot": "^27.4.2" + "jest-snapshot": "^27.4.4" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" @@ -34451,15 +34451,15 @@ } }, "node_modules/jest-runner": { - "version": "27.4.3", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.4.3.tgz", - "integrity": "sha512-JgR6Om/j22Fd6ZUUIGTWNcCtuZVYbNrecb4k89W4UyFJoRtHpo2zMKWkmFFFJoqwWGrfrcPLnVBIgkJiTV3cyA==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.4.4.tgz", + "integrity": "sha512-AXv/8Q0Xf1puWnDf52m7oLrK7sXcv6re0V/kItwTSVHJbX7Oebm07oGFQqGmq0R0mhO1zpmB3OpqRuaCN2elPA==", "dev": true, "dependencies": { "@jest/console": "^27.4.2", - "@jest/environment": "^27.4.2", + "@jest/environment": "^27.4.4", "@jest/test-result": "^27.4.2", - "@jest/transform": "^27.4.2", + "@jest/transform": "^27.4.4", "@jest/types": "^27.4.2", "@types/node": "*", "chalk": "^4.0.0", @@ -34467,15 +34467,15 @@ "exit": "^0.1.2", "graceful-fs": "^4.2.4", "jest-docblock": "^27.4.0", - "jest-environment-jsdom": "^27.4.3", - "jest-environment-node": "^27.4.2", - "jest-haste-map": "^27.4.2", + "jest-environment-jsdom": "^27.4.4", + "jest-environment-node": "^27.4.4", + "jest-haste-map": "^27.4.4", "jest-leak-detector": "^27.4.2", "jest-message-util": "^27.4.2", - "jest-resolve": "^27.4.2", - "jest-runtime": "^27.4.2", + "jest-resolve": "^27.4.4", + "jest-runtime": "^27.4.4", "jest-util": "^27.4.2", - "jest-worker": "^27.4.2", + "jest-worker": "^27.4.4", "source-map-support": "^0.5.6", "throat": "^6.0.1" }, @@ -34542,9 +34542,9 @@ } }, "node_modules/jest-runner/node_modules/jest-worker": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.2.tgz", - "integrity": "sha512-0QMy/zPovLfUPyHuOuuU4E+kGACXXE84nRnq6lBVI9GJg5DCBiA97SATi+ZP8CpiJwEQy1oCPjRBf8AnLjN+Ag==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.4.tgz", + "integrity": "sha512-jfwxYJvfua1b1XkyuyPh01ATmgg4e5fPM/muLmhy9Qc6dmiwacQB0MLHaU6IjEsv/+nAixHGxTn8WllA27Pn0w==", "dev": true, "dependencies": { "@types/node": "*", @@ -34583,17 +34583,17 @@ } }, "node_modules/jest-runtime": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.4.2.tgz", - "integrity": "sha512-eqPgcBaUNaw6j8T5M+dnfAEh6MIrh2YmtskCr9sl50QYpD22Sg+QqHw3J3nmaLzVMbBtOMHFFxLF0Qx8MsZVFQ==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.4.4.tgz", + "integrity": "sha512-tZGay6P6vXJq8t4jVFAUzYHx+lzIHXjz+rj1XBk6mAR1Lwtf5kz0Uun7qNuU+oqpZu4+hhuxpUfXb6j30bEPqA==", "dev": true, "dependencies": { "@jest/console": "^27.4.2", - "@jest/environment": "^27.4.2", - "@jest/globals": "^27.4.2", + "@jest/environment": "^27.4.4", + "@jest/globals": "^27.4.4", "@jest/source-map": "^27.4.0", "@jest/test-result": "^27.4.2", - "@jest/transform": "^27.4.2", + "@jest/transform": "^27.4.4", "@jest/types": "^27.4.2", "@types/yargs": "^16.0.0", "chalk": "^4.0.0", @@ -34603,12 +34603,12 @@ "exit": "^0.1.2", "glob": "^7.1.3", "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.4.2", + "jest-haste-map": "^27.4.4", "jest-message-util": "^27.4.2", "jest-mock": "^27.4.2", "jest-regex-util": "^27.4.0", - "jest-resolve": "^27.4.2", - "jest-snapshot": "^27.4.2", + "jest-resolve": "^27.4.4", + "jest-snapshot": "^27.4.4", "jest-util": "^27.4.2", "jest-validate": "^27.4.2", "slash": "^3.0.0", @@ -34759,9 +34759,9 @@ } }, "node_modules/jest-snapshot": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.4.2.tgz", - "integrity": "sha512-DI7lJlNIu6WSQ+esqhnJzEzU70+dV+cNjoF1c+j5FagWEd3KtOyZvVliAH0RWNQ6KSnAAnKSU0qxJ8UXOOhuUQ==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.4.4.tgz", + "integrity": "sha512-yy+rpCvYMOjTl7IMuaMI9OP9WT229zi8BhdNHm6e6mttAOIzvIiCxFoZ6yRxaV3HDPPgMryi+ReX2b8+IQJdPA==", "dev": true, "dependencies": { "@babel/core": "^7.7.2", @@ -34770,7 +34770,7 @@ "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/traverse": "^7.7.2", "@babel/types": "^7.0.0", - "@jest/transform": "^27.4.2", + "@jest/transform": "^27.4.4", "@jest/types": "^27.4.2", "@types/babel__traverse": "^7.0.4", "@types/prettier": "^2.1.5", @@ -34780,10 +34780,10 @@ "graceful-fs": "^4.2.4", "jest-diff": "^27.4.2", "jest-get-type": "^27.4.0", - "jest-haste-map": "^27.4.2", + "jest-haste-map": "^27.4.4", "jest-matcher-utils": "^27.4.2", "jest-message-util": "^27.4.2", - "jest-resolve": "^27.4.2", + "jest-resolve": "^27.4.4", "jest-util": "^27.4.2", "natural-compare": "^1.4.0", "pretty-format": "^27.4.2", @@ -58859,15 +58859,15 @@ } }, "@jest/core": { - "version": "27.4.3", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.4.3.tgz", - "integrity": "sha512-V9ms3zSxUHxh1E/ZLAiXF7SLejsdFnjWTFizWotMOWvjho0lW5kSjZymhQSodNW0T0ZMQRiha7f8+NcFVm3hJQ==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.4.4.tgz", + "integrity": "sha512-xBNPVqYAdAiAMXnb4ugx9Cdmr0S52lBsLbQMR/sGBRO0810VSPKiuSDtuup6qdkK1e9vxbv3KK3IAP1QFAp8mw==", "dev": true, "requires": { "@jest/console": "^27.4.2", - "@jest/reporters": "^27.4.2", + "@jest/reporters": "^27.4.4", "@jest/test-result": "^27.4.2", - "@jest/transform": "^27.4.2", + "@jest/transform": "^27.4.4", "@jest/types": "^27.4.2", "@types/node": "*", "ansi-escapes": "^4.2.1", @@ -58876,15 +58876,15 @@ "exit": "^0.1.2", "graceful-fs": "^4.2.4", "jest-changed-files": "^27.4.2", - "jest-config": "^27.4.3", - "jest-haste-map": "^27.4.2", + "jest-config": "^27.4.4", + "jest-haste-map": "^27.4.4", "jest-message-util": "^27.4.2", "jest-regex-util": "^27.4.0", - "jest-resolve": "^27.4.2", - "jest-resolve-dependencies": "^27.4.2", - "jest-runner": "^27.4.3", - "jest-runtime": "^27.4.2", - "jest-snapshot": "^27.4.2", + "jest-resolve": "^27.4.4", + "jest-resolve-dependencies": "^27.4.4", + "jest-runner": "^27.4.4", + "jest-runtime": "^27.4.4", + "jest-snapshot": "^27.4.4", "jest-util": "^27.4.2", "jest-validate": "^27.4.2", "jest-watcher": "^27.4.2", @@ -58952,9 +58952,9 @@ } }, "@jest/environment": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.4.2.tgz", - "integrity": "sha512-uSljKxh/rGlHlmhyeG4ZoVK9hOec+EPBkwTHkHKQ2EqDu5K+MaG9uJZ8o1CbRsSdZqSuhXvJCYhBWsORPPg6qw==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.4.4.tgz", + "integrity": "sha512-q+niMx7cJgt/t/b6dzLOh4W8Ef/8VyKG7hxASK39jakijJzbFBGpptx3RXz13FFV7OishQ9lTbv+dQ5K3EhfDQ==", "dev": true, "requires": { "@jest/fake-timers": "^27.4.2", @@ -58978,26 +58978,26 @@ } }, "@jest/globals": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.4.2.tgz", - "integrity": "sha512-KkfaHEttlGpXYAQTZHgrESiEPx2q/DKAFLGLFda1uGVrqc17snd3YVPhOxlXOHIzVPs+lQ/SDB2EIvxyGzb3Ew==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.4.4.tgz", + "integrity": "sha512-bqpqQhW30BOreXM8bA8t8JbOQzsq/WnPTnBl+It3UxAD9J8yxEAaBEylHx1dtBapAr/UBk8GidXbzmqnee8tYQ==", "dev": true, "requires": { - "@jest/environment": "^27.4.2", + "@jest/environment": "^27.4.4", "@jest/types": "^27.4.2", "expect": "^27.4.2" } }, "@jest/reporters": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.4.2.tgz", - "integrity": "sha512-sp4aqmdBJtjKetEakzDPcZggPcVIF6w9QLkYBbaWDV6e/SIsHnF1S4KtIH91eEc2fp7ep6V/e1xvdfEoho1d2w==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.4.4.tgz", + "integrity": "sha512-ssyJSw9B9Awb1QaxDhIPSs4de1b7SE2kv7tqFehQL13xpn5HUkMYZK/ufTOXiCAnXFOZS+XDl1GaQ/LmJAzI1A==", "dev": true, "requires": { "@bcoe/v8-coverage": "^0.2.3", "@jest/console": "^27.4.2", "@jest/test-result": "^27.4.2", - "@jest/transform": "^27.4.2", + "@jest/transform": "^27.4.4", "@jest/types": "^27.4.2", "@types/node": "*", "chalk": "^4.0.0", @@ -59010,10 +59010,10 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.0.2", - "jest-haste-map": "^27.4.2", - "jest-resolve": "^27.4.2", + "jest-haste-map": "^27.4.4", + "jest-resolve": "^27.4.4", "jest-util": "^27.4.2", - "jest-worker": "^27.4.2", + "jest-worker": "^27.4.4", "slash": "^3.0.0", "source-map": "^0.6.0", "string-length": "^4.0.1", @@ -59062,9 +59062,9 @@ "dev": true }, "jest-worker": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.2.tgz", - "integrity": "sha512-0QMy/zPovLfUPyHuOuuU4E+kGACXXE84nRnq6lBVI9GJg5DCBiA97SATi+ZP8CpiJwEQy1oCPjRBf8AnLjN+Ag==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.4.tgz", + "integrity": "sha512-jfwxYJvfua1b1XkyuyPh01ATmgg4e5fPM/muLmhy9Qc6dmiwacQB0MLHaU6IjEsv/+nAixHGxTn8WllA27Pn0w==", "dev": true, "requires": { "@types/node": "*", @@ -59138,21 +59138,21 @@ } }, "@jest/test-sequencer": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.4.2.tgz", - "integrity": "sha512-HmHp5mlh9f9GyNej5yCS1JZIFfUGnP9+jEOH5zoq5EmsuZeYD+dGULqyvGDPtuzzbyAFJ6R4+z4SS0VvnFwwGQ==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.4.4.tgz", + "integrity": "sha512-mCh+d4JTGTtX7vr13d7q2GHJy33nAobEwtEJ8X3u7R8+0ImVO2eAsQzsLfX8lyvdYHBxYABhqbYuaUNo42/pQw==", "dev": true, "requires": { "@jest/test-result": "^27.4.2", "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.4.2", - "jest-runtime": "^27.4.2" + "jest-haste-map": "^27.4.4", + "jest-runtime": "^27.4.4" } }, "@jest/transform": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.4.2.tgz", - "integrity": "sha512-RTKcPZllfcmLfnlxBya7aypofhdz05+E6QITe55Ex0rxyerkgjmmpMlvVn11V0cP719Ps6WcDYCnDzxnnJUwKg==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.4.4.tgz", + "integrity": "sha512-7U/nDSrGsGzL7+X8ScNFV71w8u8knJQWSa9C2xsrrKLMOgb+rWuCG4VAyWke/53BU96GnT+Ka81xCAHA5gk6zA==", "dev": true, "requires": { "@babel/core": "^7.1.0", @@ -59162,7 +59162,7 @@ "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.4.2", + "jest-haste-map": "^27.4.4", "jest-regex-util": "^27.4.0", "jest-util": "^27.4.2", "micromatch": "^4.0.4", @@ -69456,12 +69456,12 @@ } }, "babel-jest": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.4.2.tgz", - "integrity": "sha512-MADrjb3KBO2eyZCAc6QaJg6RT5u+6oEdDyHO5HEalnpwQ6LrhTsQF2Kj1Wnz2t6UPXIXPk18dSXXOT0wF5yTxA==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.4.4.tgz", + "integrity": "sha512-+6RVutZxOQgJkt4svgTHPFtOQlVe9dUg3wrimIAM38pY6hL/nsL8glfFSUjD9jNVjaVjzkCzj6loFFecrjr9Qw==", "dev": true, "requires": { - "@jest/transform": "^27.4.2", + "@jest/transform": "^27.4.4", "@jest/types": "^27.4.2", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.0.0", @@ -81717,14 +81717,14 @@ } }, "jest": { - "version": "27.4.3", - "resolved": "https://registry.npmjs.org/jest/-/jest-27.4.3.tgz", - "integrity": "sha512-jwsfVABBzuN3Atm+6h6vIEpTs9+VApODLt4dk2qv1WMOpb1weI1IIZfuwpMiWZ62qvWj78MvdvMHIYdUfqrFaA==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/jest/-/jest-27.4.4.tgz", + "integrity": "sha512-AXwEIFa58Uf1Jno3/KSo5HZZ0/2Xwqvfrz0/3bmTwImkFlbOvz5vARAW9nTrxRLkojjkitaZ1KNKAtw3JRFAaA==", "dev": true, "requires": { - "@jest/core": "^27.4.3", + "@jest/core": "^27.4.4", "import-local": "^3.0.2", - "jest-cli": "^27.4.3" + "jest-cli": "^27.4.4" } }, "jest-changed-files": { @@ -81739,12 +81739,12 @@ } }, "jest-circus": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.4.2.tgz", - "integrity": "sha512-2ePUSru1BGMyzxsMvRfu+tNb+PW60rUyMLJBfw1Nrh5zC8RoTPfF+zbE0JToU31a6ZVe4nnrNKWYRzlghAbL0A==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.4.4.tgz", + "integrity": "sha512-4DWhvQerDq5X4GaqhEUoZiBhuNdKDGr0geW0iJwarbDljAmGaGOErKQG+z2PBr0vgN05z7tsGSY51mdWr8E4xg==", "dev": true, "requires": { - "@jest/environment": "^27.4.2", + "@jest/environment": "^27.4.4", "@jest/test-result": "^27.4.2", "@jest/types": "^27.4.2", "@types/node": "*", @@ -81756,8 +81756,8 @@ "jest-each": "^27.4.2", "jest-matcher-utils": "^27.4.2", "jest-message-util": "^27.4.2", - "jest-runtime": "^27.4.2", - "jest-snapshot": "^27.4.2", + "jest-runtime": "^27.4.4", + "jest-snapshot": "^27.4.4", "jest-util": "^27.4.2", "pretty-format": "^27.4.2", "slash": "^3.0.0", @@ -81823,19 +81823,19 @@ } }, "jest-cli": { - "version": "27.4.3", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.4.3.tgz", - "integrity": "sha512-zZSJBXNC/i8UnJPwcKWsqnhGgIF3uoTYP7th32Zej7KNQJdxzOMj+wCfy2Ox3kU7nXErJ36DtYyXDhfiqaiDRw==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.4.4.tgz", + "integrity": "sha512-+MfsHnZPUOBigCBURuQFRpgYoPCgmIFkICkqt4SrramZCUp/UAuWcst4pMZb84O3VU8JyKJmnpGG4qH8ClQloA==", "dev": true, "requires": { - "@jest/core": "^27.4.3", + "@jest/core": "^27.4.4", "@jest/test-result": "^27.4.2", "@jest/types": "^27.4.2", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.4", "import-local": "^3.0.2", - "jest-config": "^27.4.3", + "jest-config": "^27.4.4", "jest-util": "^27.4.2", "jest-validate": "^27.4.2", "prompts": "^2.0.1", @@ -81932,28 +81932,28 @@ } }, "jest-config": { - "version": "27.4.3", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.4.3.tgz", - "integrity": "sha512-DQ10HTSqYtC2pO7s9j2jw+li4xUnm2wLYWH2o7K1ftB8NyvToHsXoLlXxtsGh3AW9gUQR6KY/4B7G+T/NswJBw==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.4.4.tgz", + "integrity": "sha512-6lxg0ugO6KS2zKEbpdDwBzu1IT0Xg4/VhxXMuBu+z/5FvBjLCEMTaWQm3bCaGCZUR9j9FK4DzUIxyhIgn6kVEg==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^27.4.2", + "@jest/test-sequencer": "^27.4.4", "@jest/types": "^27.4.2", - "babel-jest": "^27.4.2", + "babel-jest": "^27.4.4", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.1", "graceful-fs": "^4.2.4", - "jest-circus": "^27.4.2", - "jest-environment-jsdom": "^27.4.3", - "jest-environment-node": "^27.4.2", + "jest-circus": "^27.4.4", + "jest-environment-jsdom": "^27.4.4", + "jest-environment-node": "^27.4.4", "jest-get-type": "^27.4.0", - "jest-jasmine2": "^27.4.2", + "jest-jasmine2": "^27.4.4", "jest-regex-util": "^27.4.0", - "jest-resolve": "^27.4.2", - "jest-runner": "^27.4.3", + "jest-resolve": "^27.4.4", + "jest-runner": "^27.4.4", "jest-util": "^27.4.2", "jest-validate": "^27.4.2", "micromatch": "^4.0.4", @@ -82161,12 +82161,12 @@ } }, "jest-environment-jsdom": { - "version": "27.4.3", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.4.3.tgz", - "integrity": "sha512-x1AUVz3G14LpEJs7KIFUaTINT2n0unOUmvdAby3s/sldUpJJetOJifHo1O/EUQC5fNBowggwJbVulko18y6OWw==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.4.4.tgz", + "integrity": "sha512-cYR3ndNfHBqQgFvS1RL7dNqSvD//K56j/q1s2ygNHcfTCAp12zfIromO1w3COmXrxS8hWAh7+CmZmGCIoqGcGA==", "dev": true, "requires": { - "@jest/environment": "^27.4.2", + "@jest/environment": "^27.4.4", "@jest/fake-timers": "^27.4.2", "@jest/types": "^27.4.2", "@types/node": "*", @@ -82176,12 +82176,12 @@ } }, "jest-environment-node": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.4.2.tgz", - "integrity": "sha512-nzTZ5nJ+FabuZPH2YVci7SZIHpvtNRHPt8+vipLkCnAgXGjVzHm7XJWdnNqXbAkExIgiKeVEkVMNZOZE/LeiIg==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.4.4.tgz", + "integrity": "sha512-D+v3lbJ2GjQTQR23TK0kY3vFVmSeea05giInI41HHOaJnAwOnmUHTZgUaZL+VxUB43pIzoa7PMwWtCVlIUoVoA==", "dev": true, "requires": { - "@jest/environment": "^27.4.2", + "@jest/environment": "^27.4.4", "@jest/fake-timers": "^27.4.2", "@jest/types": "^27.4.2", "@types/node": "*", @@ -82196,9 +82196,9 @@ "dev": true }, "jest-haste-map": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.4.2.tgz", - "integrity": "sha512-foiyAEePORUN2eeJnOtcM1y8qW0ShEd9kTjWVL4sVaMcuCJM6gtHegvYPBRT0mpI/bs4ueThM90+Eoj2ncoNsA==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.4.4.tgz", + "integrity": "sha512-kvspmHmgPIZoDaqUsvsJFTaspuxhATvdO6wsFNGNSi8kfdiOCEEvECNbht8xG+eE5Ol88JyJmp2D7RF4dYo85Q==", "dev": true, "requires": { "@jest/types": "^27.4.2", @@ -82211,7 +82211,7 @@ "jest-regex-util": "^27.4.0", "jest-serializer": "^27.4.0", "jest-util": "^27.4.2", - "jest-worker": "^27.4.2", + "jest-worker": "^27.4.4", "micromatch": "^4.0.4", "walker": "^1.0.7" }, @@ -82223,9 +82223,9 @@ "dev": true }, "jest-worker": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.2.tgz", - "integrity": "sha512-0QMy/zPovLfUPyHuOuuU4E+kGACXXE84nRnq6lBVI9GJg5DCBiA97SATi+ZP8CpiJwEQy1oCPjRBf8AnLjN+Ag==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.4.tgz", + "integrity": "sha512-jfwxYJvfua1b1XkyuyPh01ATmgg4e5fPM/muLmhy9Qc6dmiwacQB0MLHaU6IjEsv/+nAixHGxTn8WllA27Pn0w==", "dev": true, "requires": { "@types/node": "*", @@ -82245,13 +82245,13 @@ } }, "jest-jasmine2": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.4.2.tgz", - "integrity": "sha512-VO/fyAJSH9u0THjbteFiL8qc93ufU+yW+bdieDc8tzTCWwlWzO53UHS5nFK1qmE8izb5Smkn+XHlVt6/l06MKQ==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.4.4.tgz", + "integrity": "sha512-ygk2tUgtLeN3ouj4KEYw9p81GLI1EKrnvourPULN5gdgB482PH5op9gqaRG0IenbJhBbbRwiSvh5NoBoQZSqdA==", "dev": true, "requires": { "@babel/traverse": "^7.1.0", - "@jest/environment": "^27.4.2", + "@jest/environment": "^27.4.4", "@jest/source-map": "^27.4.0", "@jest/test-result": "^27.4.2", "@jest/types": "^27.4.2", @@ -82263,8 +82263,8 @@ "jest-each": "^27.4.2", "jest-matcher-utils": "^27.4.2", "jest-message-util": "^27.4.2", - "jest-runtime": "^27.4.2", - "jest-snapshot": "^27.4.2", + "jest-runtime": "^27.4.4", + "jest-snapshot": "^27.4.4", "jest-util": "^27.4.2", "pretty-format": "^27.4.2", "throat": "^6.0.1" @@ -82639,15 +82639,15 @@ "dev": true }, "jest-resolve": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.4.2.tgz", - "integrity": "sha512-d/zqPjxCzMqHlOdRTg8cTpO9jY+1/T74KazT8Ws/LwmwxV5sRMWOkiLjmzUCDj/5IqA5XHNK4Hkmlq9Kdpb9Sg==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.4.4.tgz", + "integrity": "sha512-Yh5jK3PBmDbm01Rc8pT0XqpBlTPEGwWp7cN61ijJuwony/tR2Taof3TLy6yfNiuRS8ucUOPO7NBYm3ei38kkcg==", "dev": true, "requires": { "@jest/types": "^27.4.2", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.4.2", + "jest-haste-map": "^27.4.4", "jest-pnp-resolver": "^1.2.2", "jest-util": "^27.4.2", "jest-validate": "^27.4.2", @@ -82714,26 +82714,26 @@ } }, "jest-resolve-dependencies": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.4.2.tgz", - "integrity": "sha512-hb++cTpqvOWfU49MCP/JQkxmnrhKoAVqXWFjgYXswRSVGk8Q6bDTSvhbCeYXDtXaymY0y7WrrSIlKogClcKJuw==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.4.4.tgz", + "integrity": "sha512-iAnpCXh81sd9nbyqySvm5/aV9X6JZKE0dQyFXTC8tptXcdrgS0vjPFy+mEgzPHxXw+tq4TQupuTa0n8OXwRIxw==", "dev": true, "requires": { "@jest/types": "^27.4.2", "jest-regex-util": "^27.4.0", - "jest-snapshot": "^27.4.2" + "jest-snapshot": "^27.4.4" } }, "jest-runner": { - "version": "27.4.3", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.4.3.tgz", - "integrity": "sha512-JgR6Om/j22Fd6ZUUIGTWNcCtuZVYbNrecb4k89W4UyFJoRtHpo2zMKWkmFFFJoqwWGrfrcPLnVBIgkJiTV3cyA==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.4.4.tgz", + "integrity": "sha512-AXv/8Q0Xf1puWnDf52m7oLrK7sXcv6re0V/kItwTSVHJbX7Oebm07oGFQqGmq0R0mhO1zpmB3OpqRuaCN2elPA==", "dev": true, "requires": { "@jest/console": "^27.4.2", - "@jest/environment": "^27.4.2", + "@jest/environment": "^27.4.4", "@jest/test-result": "^27.4.2", - "@jest/transform": "^27.4.2", + "@jest/transform": "^27.4.4", "@jest/types": "^27.4.2", "@types/node": "*", "chalk": "^4.0.0", @@ -82741,15 +82741,15 @@ "exit": "^0.1.2", "graceful-fs": "^4.2.4", "jest-docblock": "^27.4.0", - "jest-environment-jsdom": "^27.4.3", - "jest-environment-node": "^27.4.2", - "jest-haste-map": "^27.4.2", + "jest-environment-jsdom": "^27.4.4", + "jest-environment-node": "^27.4.4", + "jest-haste-map": "^27.4.4", "jest-leak-detector": "^27.4.2", "jest-message-util": "^27.4.2", - "jest-resolve": "^27.4.2", - "jest-runtime": "^27.4.2", + "jest-resolve": "^27.4.4", + "jest-runtime": "^27.4.4", "jest-util": "^27.4.2", - "jest-worker": "^27.4.2", + "jest-worker": "^27.4.4", "source-map-support": "^0.5.6", "throat": "^6.0.1" }, @@ -82795,9 +82795,9 @@ "dev": true }, "jest-worker": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.2.tgz", - "integrity": "sha512-0QMy/zPovLfUPyHuOuuU4E+kGACXXE84nRnq6lBVI9GJg5DCBiA97SATi+ZP8CpiJwEQy1oCPjRBf8AnLjN+Ag==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.4.tgz", + "integrity": "sha512-jfwxYJvfua1b1XkyuyPh01ATmgg4e5fPM/muLmhy9Qc6dmiwacQB0MLHaU6IjEsv/+nAixHGxTn8WllA27Pn0w==", "dev": true, "requires": { "@types/node": "*", @@ -82828,17 +82828,17 @@ } }, "jest-runtime": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.4.2.tgz", - "integrity": "sha512-eqPgcBaUNaw6j8T5M+dnfAEh6MIrh2YmtskCr9sl50QYpD22Sg+QqHw3J3nmaLzVMbBtOMHFFxLF0Qx8MsZVFQ==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.4.4.tgz", + "integrity": "sha512-tZGay6P6vXJq8t4jVFAUzYHx+lzIHXjz+rj1XBk6mAR1Lwtf5kz0Uun7qNuU+oqpZu4+hhuxpUfXb6j30bEPqA==", "dev": true, "requires": { "@jest/console": "^27.4.2", - "@jest/environment": "^27.4.2", - "@jest/globals": "^27.4.2", + "@jest/environment": "^27.4.4", + "@jest/globals": "^27.4.4", "@jest/source-map": "^27.4.0", "@jest/test-result": "^27.4.2", - "@jest/transform": "^27.4.2", + "@jest/transform": "^27.4.4", "@jest/types": "^27.4.2", "@types/yargs": "^16.0.0", "chalk": "^4.0.0", @@ -82848,12 +82848,12 @@ "exit": "^0.1.2", "glob": "^7.1.3", "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.4.2", + "jest-haste-map": "^27.4.4", "jest-message-util": "^27.4.2", "jest-mock": "^27.4.2", "jest-regex-util": "^27.4.0", - "jest-resolve": "^27.4.2", - "jest-snapshot": "^27.4.2", + "jest-resolve": "^27.4.4", + "jest-snapshot": "^27.4.4", "jest-util": "^27.4.2", "jest-validate": "^27.4.2", "slash": "^3.0.0", @@ -82967,9 +82967,9 @@ } }, "jest-snapshot": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.4.2.tgz", - "integrity": "sha512-DI7lJlNIu6WSQ+esqhnJzEzU70+dV+cNjoF1c+j5FagWEd3KtOyZvVliAH0RWNQ6KSnAAnKSU0qxJ8UXOOhuUQ==", + "version": "27.4.4", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.4.4.tgz", + "integrity": "sha512-yy+rpCvYMOjTl7IMuaMI9OP9WT229zi8BhdNHm6e6mttAOIzvIiCxFoZ6yRxaV3HDPPgMryi+ReX2b8+IQJdPA==", "dev": true, "requires": { "@babel/core": "^7.7.2", @@ -82978,7 +82978,7 @@ "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/traverse": "^7.7.2", "@babel/types": "^7.0.0", - "@jest/transform": "^27.4.2", + "@jest/transform": "^27.4.4", "@jest/types": "^27.4.2", "@types/babel__traverse": "^7.0.4", "@types/prettier": "^2.1.5", @@ -82988,10 +82988,10 @@ "graceful-fs": "^4.2.4", "jest-diff": "^27.4.2", "jest-get-type": "^27.4.0", - "jest-haste-map": "^27.4.2", + "jest-haste-map": "^27.4.4", "jest-matcher-utils": "^27.4.2", "jest-message-util": "^27.4.2", - "jest-resolve": "^27.4.2", + "jest-resolve": "^27.4.4", "jest-util": "^27.4.2", "natural-compare": "^1.4.0", "pretty-format": "^27.4.2", diff --git a/package.json b/package.json index 2c017174de..ac39b34e7e 100644 --- a/package.json +++ b/package.json @@ -158,7 +158,7 @@ "execa": "5.1.1", "faker": "5.5.3", "husky": "7.0.4", - "jest": "27.4.3", + "jest": "27.4.4", "js-yaml": "3.14.1", "lint-staged": "12.1.2", "lodash": "4.17.21", From ecc964996bb1930bd7d9fad1c7e07956bc3f255e Mon Sep 17 00:00:00 2001 From: camperbot Date: Fri, 10 Dec 2021 20:15:49 +0530 Subject: [PATCH 03/63] chore(i18n,curriculum): processed translations (#44457) --- ...a-more-complex-shape-using-css-and-html.md | 146 +++++++++++++ .../basic-javascript/counting-cards.md | 201 ++++++++++++++++++ 2 files changed, 347 insertions(+) create mode 100644 curriculum/challenges/ukrainian/01-responsive-web-design/applied-visual-design/create-a-more-complex-shape-using-css-and-html.md create mode 100644 curriculum/challenges/ukrainian/02-javascript-algorithms-and-data-structures/basic-javascript/counting-cards.md diff --git a/curriculum/challenges/ukrainian/01-responsive-web-design/applied-visual-design/create-a-more-complex-shape-using-css-and-html.md b/curriculum/challenges/ukrainian/01-responsive-web-design/applied-visual-design/create-a-more-complex-shape-using-css-and-html.md new file mode 100644 index 0000000000..1ad0052da2 --- /dev/null +++ b/curriculum/challenges/ukrainian/01-responsive-web-design/applied-visual-design/create-a-more-complex-shape-using-css-and-html.md @@ -0,0 +1,146 @@ +--- +id: 587d78a6367417b2b2512ade +title: Створіть складнішу форму за допомогою CSS і HTML +challengeType: 0 +videoUrl: 'https://scrimba.com/c/cPpz4fr' +forumTopicId: 301050 +dashedName: create-a-more-complex-shape-using-css-and-html +--- + +# --description-- + +Однією з найпопулярніших форм у світі є серце, і в цьому завданні ви створите його за допомогою CSS. Проте, спочатку вам потрібно зрозуміти, що собою являють псевдоелементи `::before` і `::after`. `::before` створює псевдоелемент, який є першим обраним дочірнім елементом, `::after` створює псевдоелемент, який є останнім обраним дочірнім елементом. У наступному прикладі псевдоелемент `::before` використовується, щоб додати прямокутник до елемента класу `heart`: + +```css +.heart::before { + content: ""; + background-color: yellow; + border-radius: 25%; + position: absolute; + height: 50px; + width: 70px; + top: -50px; + left: 5px; +} +``` + +Для нормального функціонування псевдоелементів `::before` і `::after` необхідно, щоб вони мали визначену властивість `content`. Ця властивість зазвичай використовується, щоб додавати об'єкти на кшталт світлин або тексту до обраного елемента. Коли псевдоелементи `::before` і `::after` використовуються для створення форм, властивість `content` також необхідна, але вона встановлена як порожній рядок. У попередньому прикладі елемент з класом `heart` має псевдоелемент `::before`, що створює жовтий прямокутник зі значеннями висоти та ширини `50px` і `70px` відповідно. Цей прямокутник має заокруглені кути завдяки значенню `border-radius`, рівним 25%, і розташований на `5px` ліворуч від елемента і на `50px` над вершиною елемента. + +# --instructions-- + +Перетворіть елемент на екрані на серце. У селекторі `heart::after` замініть фоновий колір `background-color` на `pink` і встановіть значення `border-radius` на 50%. + +Потім оберіть елемент з класом `heart` (тільки `heart`) і заповніть властивість `transform`. Використовуйте функцію `rotate()` з -45 градусами. + +Нарешті, у селекторі `heart::before` встановіть його властивість `content` на порожній рядок. + +# --hints-- + +Властивість `background-color` селектора `heart::after` має бути `pink`. + +```js +const heartAfter = code.match(/\.heart::after\s*{[\s\S]+?[^\}]}/g)[0]; +assert( + /({|;)\s*background-color\s*:\s*pink\s*(;|})/g.test(heartAfter) +); +``` + +`border-radius` селектора `heart::after` повинен мати значення 50%. + +```js +assert(code.match(/border-radius\s*?:\s*?50%/gi).length == 2); +``` + +Властивість `transform` класу `heart` повинна використовувати функцію `rotate()`, встановлену на -45 градусів. + +```js +assert(code.match(/transform\s*?:\s*?rotate\(\s*?-45deg\s*?\)/gi)); +``` + +Елемент `content` селектора `heart::before` має бути порожнім рядком. + +```js +assert(code.match(/\.heart::before\s*?{\s*?content\s*?:\s*?("|')\1\s*?;/gi)); +``` + +# --seed-- + +## --seed-contents-- + +```html + +
+``` + +# --solutions-- + +```html + +
+``` diff --git a/curriculum/challenges/ukrainian/02-javascript-algorithms-and-data-structures/basic-javascript/counting-cards.md b/curriculum/challenges/ukrainian/02-javascript-algorithms-and-data-structures/basic-javascript/counting-cards.md new file mode 100644 index 0000000000..eb9043c6e1 --- /dev/null +++ b/curriculum/challenges/ukrainian/02-javascript-algorithms-and-data-structures/basic-javascript/counting-cards.md @@ -0,0 +1,201 @@ +--- +id: 565bbe00e9cc8ac0725390f4 +title: Підрахунок карт +challengeType: 1 +videoUrl: 'https://scrimba.com/c/c6KE7ty' +forumTopicId: 16809 +dashedName: counting-cards +--- + +# --description-- + +У казино грі Blackjack гравець може здобути перевагу над казино, відстежуючи відносне число старших та молодших карт, що залишились в колоді. Це називається [Підрахунок карт](https://en.wikipedia.org/wiki/Card_counting). + +Чим більше старших карт у колоді, тим краще для гравця. Кожній карті присвоєно значення відповідно до нижчеподаної таблиці. Коли рахунок є більшим за нуль, гравець повинен ставити старшу карту. Коли рахунок дорівнює нулю або є меншим, гравець повинен ставити молодшу карту. + +
Зміна рахункуКарти
+12, 3, 4, 5, 6
07, 8, 9
-110, 'J', 'Q', 'К', 'A'
+ +Ви писатимете функцію підрахунку карт. Вона матиме параметр `card`, який може бути числом або рядком, а також збільшить або зменшить загальну змінну `count` відповідно до значення карти (див. таблицю). Тоді функція поверне рядок з поточним рахунком і рядок `Bet`, якщо рахунок більше нуля, або `Hold`, якщо рахунок дорівнює або менше нуля. Між поточним рахунком та рішенням гравця (`Bet` чи `Hold`) повиннен бути один пробіл. + +**Приклад результатів:** `-3 Hold` або `5 Bet` + +**Підказка** +НЕ скидайте `count` до 0, коли значення 7, 8 або 9. Не повертайте масив. +Не вставляйте лапки (одинарні чи подвійні) у результаті. + +# --hints-- + +Послідовність карт 2, 3, 4, 5, 6 має повернути рядок `5 Bet` + +```js +assert( + (function () { + count = 0; + cc(2); + cc(3); + cc(4); + cc(5); + var out = cc(6); + if (out === '5 Bet') { + return true; + } + return false; + })() +); +``` + +Послідовність карт 7, 8, 9 має повернути рядок `0 Hold` + +```js +assert( + (function () { + count = 0; + cc(7); + cc(8); + var out = cc(9); + if (out === '0 Hold') { + return true; + } + return false; + })() +); +``` + +Послідовність карт 10, J, Q, K, A має повернути рядок `-5 Hold` + +```js +assert( + (function () { + count = 0; + cc(10); + cc('J'); + cc('Q'); + cc('K'); + var out = cc('A'); + if (out === '-5 Hold') { + return true; + } + return false; + })() +); +``` + +Послідовність карт 3, 7, Q, 8, A має повернути рядок `-1 Hold` + +```js +assert( + (function () { + count = 0; + cc(3); + cc(7); + cc('Q'); + cc(8); + var out = cc('A'); + if (out === '-1 Hold') { + return true; + } + return false; + })() +); +``` + +Послідовність карт 2, J, 9, 2, 7 має повернути рядок `1 Bet` + +```js +assert( + (function () { + count = 0; + cc(2); + cc('J'); + cc(9); + cc(2); + var out = cc(7); + if (out === '1 Bet') { + return true; + } + return false; + })() +); +``` + +Послідовність карт 2, 2, 10 має повернути рядок `1 Bet` + +```js +assert( + (function () { + count = 0; + cc(2); + cc(2); + var out = cc(10); + if (out === '1 Bet') { + return true; + } + return false; + })() +); +``` + +Послідовність карт 3, 2, A, 10, K має повернути рядок `-1 Hold` + +```js +assert( + (function () { + count = 0; + cc(3); + cc(2); + cc('A'); + cc(10); + var out = cc('K'); + if (out === '-1 Hold') { + return true; + } + return false; + })() +); +``` + +# --seed-- + +## --seed-contents-- + +```js +let count = 0; + +function cc(card) { + // Only change code below this line + + + return "Change Me"; + // Only change code above this line +} + +cc(2); cc(3); cc(7); cc('K'); cc('A'); +``` + +# --solutions-- + +```js +let count = 0; +function cc(card) { + switch(card) { + case 2: + case 3: + case 4: + case 5: + case 6: + count++; + break; + case 10: + case 'J': + case 'Q': + case 'K': + case 'A': + count--; + } + if(count > 0) { + return count + " Bet"; + } else { + return count + " Hold"; + } +} +``` From efe5d419f34031fe5670ef021401d87ff0795ccc Mon Sep 17 00:00:00 2001 From: camperbot Date: Fri, 10 Dec 2021 20:16:21 +0530 Subject: [PATCH 04/63] chore(i18n,client): processed translations (#44456) --- client/i18n/locales/chinese-traditional/translations.json | 5 +++++ client/i18n/locales/chinese/translations.json | 5 +++++ client/i18n/locales/espanol/translations.json | 5 +++++ client/i18n/locales/italian/translations.json | 5 +++++ client/i18n/locales/portuguese/translations.json | 5 +++++ client/i18n/locales/ukrainian/translations.json | 5 +++++ 6 files changed, 30 insertions(+) diff --git a/client/i18n/locales/chinese-traditional/translations.json b/client/i18n/locales/chinese-traditional/translations.json index 4f129bcf41..2e550db5b7 100644 --- a/client/i18n/locales/chinese-traditional/translations.json +++ b/client/i18n/locales/chinese-traditional/translations.json @@ -287,11 +287,16 @@ "info": "信息", "code": "編程", "tests": "測試", + "restart": "Restart", + "restart-step": "Restart Step", + "console": "Console", + "notes": "Notes", "preview": "預覽" }, "help-translate": "我們仍然在翻譯以下證書。", "help-translate-link": "幫助我們翻譯。", "season-greetings": "Season's Greetings to you and your family.", + "season-greetings-fcc": "Season's Greetings from the freeCodeCamp community 🎉", "if-getting-value": "If you're getting a lot out of freeCodeCamp, now is a great time to donate to support our nonprofit's mission.", "project-preview-title": "下面是你將構建的項目的預覽" }, diff --git a/client/i18n/locales/chinese/translations.json b/client/i18n/locales/chinese/translations.json index cca9d43ad6..1e991f3ea4 100644 --- a/client/i18n/locales/chinese/translations.json +++ b/client/i18n/locales/chinese/translations.json @@ -287,11 +287,16 @@ "info": "信息", "code": "编程", "tests": "测试", + "restart": "Restart", + "restart-step": "Restart Step", + "console": "Console", + "notes": "Notes", "preview": "预览" }, "help-translate": "我们仍然在翻译以下证书。", "help-translate-link": "帮助我们翻译。", "season-greetings": "Season's Greetings to you and your family.", + "season-greetings-fcc": "Season's Greetings from the freeCodeCamp community 🎉", "if-getting-value": "If you're getting a lot out of freeCodeCamp, now is a great time to donate to support our nonprofit's mission.", "project-preview-title": "下面是你将构建的项目的预览" }, diff --git a/client/i18n/locales/espanol/translations.json b/client/i18n/locales/espanol/translations.json index b7129dac53..c3ae663afc 100644 --- a/client/i18n/locales/espanol/translations.json +++ b/client/i18n/locales/espanol/translations.json @@ -287,11 +287,16 @@ "info": "Info", "code": "Código", "tests": "Pruebas", + "restart": "Restart", + "restart-step": "Restart Step", + "console": "Console", + "notes": "Notes", "preview": "Vista" }, "help-translate": "Todavía estamos traduciendo las siguientes certificaciones.", "help-translate-link": "Ayúdanos a traducir.", "season-greetings": "Deseamos felices festividades a ti y a tu familia.", + "season-greetings-fcc": "Season's Greetings from the freeCodeCamp community 🎉", "if-getting-value": "Si estás obteniendo mucho de freeCodeCamp, ahora es un buen momento para donar para apoyar nuestra misión sin fines de lucro.", "project-preview-title": "Aquí hay una vista previa de lo que construirás" }, diff --git a/client/i18n/locales/italian/translations.json b/client/i18n/locales/italian/translations.json index e31524f5a1..810a99a62a 100644 --- a/client/i18n/locales/italian/translations.json +++ b/client/i18n/locales/italian/translations.json @@ -287,11 +287,16 @@ "info": "Informazioni", "code": "Codice", "tests": "Test", + "restart": "Restart", + "restart-step": "Restart Step", + "console": "Console", + "notes": "Notes", "preview": "Anteprima" }, "help-translate": "Stiamo ancora traducendo le seguenti certificazioni.", "help-translate-link": "Aiutaci con le traduzioni...", "season-greetings": "Season's Greetings to you and your family.", + "season-greetings-fcc": "Season's Greetings from the freeCodeCamp community 🎉", "if-getting-value": "If you're getting a lot out of freeCodeCamp, now is a great time to donate to support our nonprofit's mission.", "project-preview-title": "Here's a preview of what you will build" }, diff --git a/client/i18n/locales/portuguese/translations.json b/client/i18n/locales/portuguese/translations.json index 3f4f1802b0..f904713164 100644 --- a/client/i18n/locales/portuguese/translations.json +++ b/client/i18n/locales/portuguese/translations.json @@ -287,11 +287,16 @@ "info": "Informações", "code": "Código", "tests": "Testes", + "restart": "Restart", + "restart-step": "Restart Step", + "console": "Console", + "notes": "Notes", "preview": "Pré-visualizar" }, "help-translate": "Ainda estamos traduzindo as certificações a seguir.", "help-translate-link": "Ajude-nos a traduzir.", "season-greetings": "Boas festas de fim de ano para você e sua família.", + "season-greetings-fcc": "Season's Greetings from the freeCodeCamp community 🎉", "if-getting-value": "Se você está conseguindo tirar proveito do conteúdo do freeCodeCamp, agora é um ótimo momento para fazer sua doação e apoiar nossa missão sem fins lucrativos.", "project-preview-title": "Aqui está uma prévia do que você vai criar" }, diff --git a/client/i18n/locales/ukrainian/translations.json b/client/i18n/locales/ukrainian/translations.json index 4e1886c368..611391edd8 100644 --- a/client/i18n/locales/ukrainian/translations.json +++ b/client/i18n/locales/ukrainian/translations.json @@ -287,11 +287,16 @@ "info": "Інформація", "code": "Код", "tests": "Тести", + "restart": "Restart", + "restart-step": "Restart Step", + "console": "Console", + "notes": "Notes", "preview": "Попередній перегляд" }, "help-translate": "Ми все ще перекладаємо такі сертифікати.", "help-translate-link": "Допоможіть нам з перекладом.", "season-greetings": "Season's Greetings to you and your family.", + "season-greetings-fcc": "Season's Greetings from the freeCodeCamp community 🎉", "if-getting-value": "If you're getting a lot out of freeCodeCamp, now is a great time to donate to support our nonprofit's mission.", "project-preview-title": "Here's a preview of what you will build" }, From f8eec5d3fb4d84fe2548053f51ce646def6a9505 Mon Sep 17 00:00:00 2001 From: "Nicholas Carrigan (he/him)" Date: Fri, 10 Dec 2021 07:22:45 -0800 Subject: [PATCH 05/63] chore: migrate required files (#44461) --- client/i18n/locales/ukrainian/links.json | 28 + client/i18n/locales/ukrainian/meta-tags.json | 32 + client/i18n/locales/ukrainian/motivation.json | 819 ++++++++++++++++++ client/i18n/locales/ukrainian/trending.json | 65 ++ 4 files changed, 944 insertions(+) create mode 100644 client/i18n/locales/ukrainian/links.json create mode 100644 client/i18n/locales/ukrainian/meta-tags.json create mode 100644 client/i18n/locales/ukrainian/motivation.json create mode 100644 client/i18n/locales/ukrainian/trending.json diff --git a/client/i18n/locales/ukrainian/links.json b/client/i18n/locales/ukrainian/links.json new file mode 100644 index 0000000000..65f62b29c1 --- /dev/null +++ b/client/i18n/locales/ukrainian/links.json @@ -0,0 +1,28 @@ +{ + "help-translate-link-url": "https://contribute.freecodecamp.org/#/how-to-translate-files", + "top-contributors": "https://www.freecodecamp.org/news/freecodecamp-top-contributors/", + "footer": { + "about-url": "https://www.freecodecamp.org/news/about/", + "shop-url": "https://www.freecodecamp.org/shop/", + "support-url": "https://www.freecodecamp.org/news/support/", + "sponsors-url": "https://www.freecodecamp.org/news/sponsors/", + "honesty-url": "https://www.freecodecamp.org/news/academic-honesty-policy/", + "coc-url": "https://www.freecodecamp.org/news/code-of-conduct/", + "privacy-url": "https://www.freecodecamp.org/news/privacy-policy/", + "tos-url": "https://www.freecodecamp.org/news/terms-of-service/", + "copyright-url": "https://www.freecodecamp.org/news/copyright-policy/" + }, + "donate": { + "other-ways-url": "https://www.freecodecamp.org/news/how-to-donate-to-free-code-camp" + }, + "nav": { + "forum": "https://forum.freecodecamp.org/", + "news": "https://freecodecamp.org/news/" + }, + "help": { + "HTML-CSS": "HTML-CSS", + "JavaScript": "JavaScript", + "Python": "Python", + "Relational Databases": "Relational Databases" + } +} diff --git a/client/i18n/locales/ukrainian/meta-tags.json b/client/i18n/locales/ukrainian/meta-tags.json new file mode 100644 index 0000000000..cf2020dbfb --- /dev/null +++ b/client/i18n/locales/ukrainian/meta-tags.json @@ -0,0 +1,32 @@ +{ + "title": "Learn to Code — For Free — Coding Courses for Busy People", + "description": "Learn to Code — For Free", + "social-description": "Learn to Code — For Free", + "keywords": [ + "python", + "javascript", + "js", + "git", + "github", + "website", + "web", + "development", + "free", + "code", + "camp", + "course", + "courses", + "html", + "css", + "react", + "redux", + "api", + "front", + "back", + "end", + "learn", + "tutorial", + "programming" + ], + "youre-unsubscribed": "You have been unsubscribed" +} diff --git a/client/i18n/locales/ukrainian/motivation.json b/client/i18n/locales/ukrainian/motivation.json new file mode 100644 index 0000000000..d0cf5c66ae --- /dev/null +++ b/client/i18n/locales/ukrainian/motivation.json @@ -0,0 +1,819 @@ +{ + "compliments": [ + "Over the top!", + "Down the rabbit hole we go!", + "Bring that rain!", + "Target acquired.", + "Feel that need for speed!", + "You've got guts!", + "We have liftoff!", + "To infinity and beyond!", + "Encore!", + "Onward!", + "Challenge destroyed!", + "It's on like Donkey Kong!", + "Power level? It's over 9000!", + "Coding spree!", + "Code long and prosper.", + "The crowd goes wild!", + "One for the guinness book!", + "Flawless victory!", + "Most efficient!", + "You've got the touch!", + "You're on fire!", + "The town is now red!", + "To the nines!", + "To the Batmobile!", + "Pull out all the stops!", + "You're a wizard, Harry!", + "You're an all star!", + "Way to go!", + "Outta sight!", + "You're crushing it!", + "What sorcery is this?", + "The world rejoices!", + "That's the way it's done!", + "You rock!", + "Woo-hoo!", + "We knew you could do it!", + "Hyper Combo Finish!", + "Nothing but net!", + "Boom-shakalaka!", + "You're a shooting star!", + "You're unstoppable!", + "Way cool!", + "Walk on that sunshine!", + "Keep on trucking!", + "Off the charts!", + "There is no spoon!", + "Cranked it up to 11!", + "Escape velocity reached!", + "You make this look easy!", + "Passed with flying colors!", + "You've got this!", + "Happy, happy, joy, joy!", + "Tomorrow, the world!", + "Your powers combined!", + "It's alive. It's alive!", + "Sonic Boom!", + "Here's looking at you, Code!", + "Ride like the wind!", + "Legen - wait for it - dary!", + "Ludicrous Speed! Go!", + "Most triumphant!", + "One loop to rule them all!", + "By the power of Grayskull!", + "You did it!", + "Storm that castle!", + "Face-melting guitar solo!", + "Checkmate!", + "Bodacious!", + "Tubular!", + "You're outta sight!", + "Keep calm and code on!", + "Even sad panda smiles!", + "Even grumpy cat approves!", + "Kool Aid Man says oh yeah!", + "Bullseye!", + "Far out!", + "You're heating up!", + "Standing ovation!", + "Nice one!", + "All right!", + "Hasta la vista, challenge!", + "Terminated.", + "Off the hook!", + "Thundercats, Hooo!", + "Shiver me timbers!", + "Raise the roof!", + "Bingo!", + "Even honeybadger cares!", + "Helm, Warp Nine. Engage!", + "Gotta code 'em all!", + "Spool up the FTL drive!", + "Cool beans!", + "They're in another castle.", + "Power UP!", + "Pikachu chooses you!", + "I gotta have more cow bell.", + "Gotta go fast!", + "Yipee!", + "Cowabunga!", + "Moon Prism Power!", + "Plus Ultra!" + ], + "motivationalQuotes": [ + { + "quote": "Whatever you are, be a good one.", + "author": "Abraham Lincoln" + }, + { + "quote": "A change in perspective is worth 80 IQ points.", + "author": "Alan Kay" + }, + { + "quote": "The best way to predict the future is to invent it.", + "author": "Alan Kay" + }, + { + "quote": "The future is not laid out on a track. It is something that we can decide, and to the extent that we do not violate any known laws of the universe, we can probably make it work the way that we want to.", + "author": "Alan Kay" + }, + { + "quote": "We can only see a short distance ahead, but we can see plenty there that needs to be done.", + "author": "Alan Turing" + }, + { + "quote": "In the depth of winter, I finally learned that within me there lay an invincible summer.", + "author": "Albert Camus" + }, + { + "quote": "A person who never made a mistake never tried anything new.", + "author": "Albert Einstein" + }, + { + "quote": "Creativity is intelligence having fun.", + "author": "Albert Einstein" + }, + { + "quote": "I have no special talents. I am only passionately curious.", + "author": "Albert Einstein" + }, + { + "quote": "Life is like riding a bicycle. To keep your balance, you must keep moving.", + "author": "Albert Einstein" + }, + { + "quote": "Make everything as simple as possible, but not simpler.", + "author": "Albert Einstein" + }, + { + "quote": "Never memorize something that you can look up.", + "author": "Albert Einstein" + }, + { + "quote": "Once we accept our limits, we go beyond them.", + "author": "Albert Einstein" + }, + { + "quote": "Play is the highest form of research.", + "author": "Albert Einstein" + }, + { + "quote": "We cannot solve our problems with the same thinking we used when we created them.", + "author": "Albert Einstein" + }, + { + "quote": "Wisdom is not a product of schooling but of the lifelong attempt to acquire it.", + "author": "Albert Einstein" + }, + { + "quote": "Your imagination is your preview of life's coming attractions.", + "author": "Albert Einstein" + }, + { + "quote": "There is only one corner of the universe you can be certain of improving, and that's your own self.", + "author": "Aldous Huxley" + }, + { + "quote": "The most common way people give up their power is by thinking they don't have any.", + "author": "Alice Walker" + }, + { + "quote": "Follow your inner moonlight. Don't hide the madness.", + "author": "Allen Ginsberg" + }, + { + "quote": "The most difficult thing is the decision to act. The rest is merely tenacity.", + "author": "Amelia Earhart" + }, + { + "quote": "Life shrinks or expands in proportion with one's courage.", + "author": "Anaïs Nin" + }, + { + "quote": "Weeks of programming can save you hours of planning.", + "author": "Unknown" + }, + { + "quote": "Quality is not an act, it is a habit.", + "author": "Aristotle" + }, + { + "quote": "Start where you are. Use what you have. Do what you can.", + "author": "Arthur Ashe" + }, + { + "quote": "Nothing is impossible, the word itself says \"I'm possible\"!", + "author": "Audrey Hepburn" + }, + { + "quote": "Every strike brings me closer to the next home run.", + "author": "Babe Ruth" + }, + { + "quote": "By failing to prepare, you are preparing to fail.", + "author": "Benjamin Franklin" + }, + { + "quote": "Tell me and I forget. Teach me and I remember. Involve me and I learn.", + "author": "Benjamin Franklin" + }, + { + "quote": "Well done is better than well said.", + "author": "Benjamin Franklin" + }, + { + "quote": "There are no short cuts to any place worth going.", + "author": "Beverly Sills" + }, + { + "quote": "Controlling complexity is the essence of computer programming.", + "author": "Brian Kernighan" + }, + { + "quote": "I fear not the man who has practiced 10,000 kicks once, but I fear the man who has practiced one kick 10,000 times.", + "author": "Bruce Lee" + }, + { + "quote": "There are far, far better things ahead than any we leave behind.", + "author": "C.S. Lewis" + }, + { + "quote": "We are what we believe we are.", + "author": "C.S. Lewis" + }, + { + "quote": "With the possible exception of the equator, everything begins somewhere.", + "author": "C.S. Lewis" + }, + { + "quote": "You are never too old to set another goal, or to dream a new dream.", + "author": "C.S. Lewis" + }, + { + "quote": "Somewhere, something incredible is waiting to be known.", + "author": "Carl Sagan" + }, + { + "quote": "If you're not making mistakes, then you're not making decisions.", + "author": "Catherine Cook" + }, + { + "quote": "Find what you love and let it kill you.", + "author": "Charles Bukowski" + }, + { + "quote": "What matters most is how well you walk through the fire.", + "author": "Charles Bukowski" + }, + { + "quote": "It is not the strongest of the species that survive, nor the most intelligent, but the one most responsive to change.", + "author": "Charles Darwin" + }, + { + "quote": "Life is 10% what happens to you and 90% how you react to it.", + "author": "Charles R. Swindoll" + }, + { + "quote": "You will do foolish things, but do them with enthusiasm.", + "author": "Colette" + }, + { + "quote": "It does not matter how slowly you go as long as you do not stop.", + "author": "Confucius" + }, + { + "quote": "Real knowledge is to know the extent of one's ignorance.", + "author": "Confucius" + }, + { + "quote": "The past cannot be changed. The future is yet in your power.", + "author": "Confucius" + }, + { + "quote": "Looking at code you wrote more than two weeks ago is like looking at code you are seeing for the first time.", + "author": "Dan Hurvitz" + }, + { + "quote": "Someday is not a day of the week.", + "author": "Denise Brennan-Nelson" + }, + { + "quote": "UNIX is simple. It just takes a genius to understand its simplicity.", + "author": "Dennis Ritchie" + }, + { + "quote": "Computers are good at following instructions, but not at reading your mind.", + "author": "Donald Knuth" + }, + { + "quote": "A good programmer is someone who always looks both ways before crossing a one-way street.", + "author": "Doug Linder" + }, + { + "quote": "Tough times never last, but tough people do.", + "author": "Dr. Robert Schuller" + }, + { + "quote": "If things start happening, don't worry, don't stew, just go right along and you'll start happening too.", + "author": "Dr. Seuss" + }, + { + "quote": "Do not go gentle into that good night. Rage, rage against the dying of the light.", + "author": "Dylan Thomas" + }, + { + "quote": "The question of whether computers can think is like the question of whether submarines can swim.", + "author": "E.W. Dijkstra" + }, + { + "quote": "Any code of your own that you haven't looked at for six or more months might as well have been written by someone else.", + "author": "Eagleson's Law" + }, + { + "quote": "Do one thing every day that scares you.", + "author": "Eleanor Roosevelt" + }, + { + "quote": "With the new day comes new strength and new thoughts.", + "author": "Eleanor Roosevelt" + }, + { + "quote": "You must do the things you think you cannot do.", + "author": "Eleanor Roosevelt" + }, + { + "quote": "Light tomorrow with today.", + "author": "Elizabeth Barrett Browning" + }, + { + "quote": "Forever is composed of nows.", + "author": "Emily Dickinson" + }, + { + "quote": "Computer science education cannot make anybody an expert programmer any more than studying brushes and pigment can make somebody an expert painter.", + "author": "Eric Raymond" + }, + { + "quote": "If you don't risk anything, you risk even more.", + "author": "Erica Jong" + }, + { + "quote": "The world breaks everyone, and afterward, many are strong at the broken places.", + "author": "Ernest Hemingway" + }, + { + "quote": "There is nothing noble in being superior to your fellow man; true nobility is being superior to your former self.", + "author": "Ernest Hemingway" + }, + { + "quote": "Never confuse a single defeat with a final defeat.", + "author": "F. Scott Fitzgerald" + }, + { + "quote": "I attribute my success to this - I never gave or took any excuse.", + "author": "Florence Nightingale" + }, + { + "quote": "The best revenge is massive success.", + "author": "Frank Sinatra" + }, + { + "quote": "The only limit to our realization of tomorrow, will be our doubts of today.", + "author": "Franklin D. Roosevelt" + }, + { + "quote": "Right or wrong, it's very pleasant to break something from time to time.", + "author": "Fyodor Dostoevsky" + }, + { + "quote": "The harder I work, the luckier I get.", + "author": "Gary Player" + }, + { + "quote": "Giving up is the only sure way to fail.", + "author": "Gena Showalter" + }, + { + "quote": "The only truly secure system is one that is powered off, cast in a block of concrete and sealed in a lead-lined room with armed guards.", + "author": "Gene Spafford" + }, + { + "quote": "A life spent making mistakes is not only more honorable, but more useful than a life spent doing nothing.", + "author": "George Bernard Shaw" + }, + { + "quote": "First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack.", + "author": "George Carrette" + }, + { + "quote": "Discovering the unexpected is more important than confirming the known.", + "author": "George Box" + }, + { + "quote": "We only see what we know.", + "author": "Goethe" + }, + { + "quote": "Without hard work, nothing grows but weeds.", + "author": "Gordon B. Hinckley" + }, + { + "quote": "The function of good software is to make the complex appear to be simple.", + "author": "Grady Booch" + }, + { + "quote": "When you know that you're capable of dealing with whatever comes, you have the only security the world has to offer.", + "author": "Harry Browne" + }, + { + "quote": "Pain is inevitable. Suffering is optional.", + "author": "Haruki Murakami" + }, + { + "quote": "Optimism is the faith that leads to achievement. Nothing can be done without hope and confidence.", + "author": "Helen Keller" + }, + { + "quote": "The price of anything is the amount of life you exchange for it.", + "author": "Henry David Thoreau" + }, + { + "quote": "Whether you think you can or think you can't, you're right.", + "author": "Henry Ford" + }, + { + "quote": "The most exciting phrase to hear in science, the one that heralds discoveries, is not 'Eureka!' but 'Now that's funny…'", + "author": "Isaac Asimov" + }, + { + "quote": "We are all failures. At least the best of us are.", + "author": "J.M. Barrie" + }, + { + "quote": "You can't wait for inspiration. You have to go after it with a club.", + "author": "Jack London" + }, + { + "quote": "Don't wish it were easier, wish you were better.", + "author": "Jim Rohn" + }, + { + "quote": "By seeking and blundering we learn.", + "author": "Johann Wolfgang von Goethe" + }, + { + "quote": "Knowing is not enough; we must apply. Wishing is not enough; we must do.", + "author": "Johann Wolfgang von Goethe" + }, + { + "quote": "We first make our habits, then our habits make us.", + "author": "John Dryden" + }, + { + "quote": "The power of imagination makes us infinite.", + "author": "John Muir" + }, + { + "quote": "May you live every day of your life.", + "author": "Jonathan Swift" + }, + { + "quote": "Perseverance is failing 19 times and succeeding the 20th.", + "author": "Julie Andrews" + }, + { + "quote": "The work of today is the history of tomorrow, and we are its makers.", + "author": "Juliette Gordon Low" + }, + { + "quote": "If you reveal your secrets to the wind, you should not blame the wind for revealing them to the trees.", + "author": "Kahlil Gibran" + }, + { + "quote": "Optimism is an occupational hazard of programming; feedback is the treatment.", + "author": "Kent Beck" + }, + { + "quote": "Opportunity does not knock, it presents itself when you beat down the door.", + "author": "Kyle Chandler" + }, + { + "quote": "To iterate is human, to recurse divine.", + "author": "Peter Deutsch" + }, + { + "quote": "A good traveler has no fixed plans and is not intent on arriving.", + "author": "Lao Tzu" + }, + { + "quote": "An ant on the move does more than a dozing ox.", + "author": "Lao Tzu" + }, + { + "quote": "Do the difficult things while they are easy and do the great things while they are small. A journey of a thousand miles must begin with a single step.", + "author": "Lao Tzu" + }, + { + "quote": "That's the thing about people who think they hate computers. What they really hate is lousy programmers.", + "author": "Larry Niven" + }, + { + "quote": "It had long since come to my attention that people of accomplishment rarely sat back and let things happen to them. They went out and happened to things.", + "author": "Leonardo da Vinci" + }, + { + "quote": "If you're any good at all, you know you can be better.", + "author": "Lindsay Buckingham" + }, + { + "quote": "If people never did silly things, nothing intelligent would ever get done.", + "author": "Ludwig Wittgenstein" + }, + { + "quote": "You only live once, but if you do it right, once is enough.", + "author": "Mae West" + }, + { + "quote": "Live as if you were to die tomorrow. Learn as if you were to live forever.", + "author": "Mahatma Gandhi" + }, + { + "quote": "Strength does not come from physical capacity. It comes from an indomitable will.", + "author": "Mahatma Gandhi" + }, + { + "quote": "One person's 'paranoia' is another person's 'engineering redundancy'.", + "author": "Marcus J. Ranum" + }, + { + "quote": "Nothing in life is to be feared, it is only to be understood. Now is the time to understand more, so that we may fear less.", + "author": "Marie Curie" + }, + { + "quote": "If you have everything under control, you're not moving fast enough.", + "author": "Mario Andretti" + }, + { + "quote": "Education: the path from cocky ignorance to miserable uncertainty.", + "author": "Mark Twain" + }, + { + "quote": "It ain't what you don't know that gets you into trouble. It's what you know for sure that just ain't so.", + "author": "Mark Twain" + }, + { + "quote": "The secret of getting ahead is getting started.", + "author": "Mark Twain" + }, + { + "quote": "The two most important days in your life are the day you are born and the day you find out why.", + "author": "Mark Twain" + }, + { + "quote": "Twenty years from now you will be more disappointed by the things that you didn't do than by the ones you did do. So throw off the bowlines. Sail away from the safe harbor. Catch the trade winds in your sails.", + "author": "Mark Twain" + }, + { + "quote": "Any fool can write code that a computer can understand. Good programmers write code that humans can understand.", + "author": "Martin Fowler" + }, + { + "quote": "I know, somehow, that only when it is dark enough can you see the stars.", + "author": "Martin Luther King Jr." + }, + { + "quote": "It is never too late to be what you might have been.", + "author": "Mary Anne Evans" + }, + { + "quote": "Nothing will work unless you do.", + "author": "Maya Angelou" + }, + { + "quote": "We delight in the beauty of the butterfly, but rarely admit the changes it has gone through to achieve that beauty.", + "author": "Maya Angelou" + }, + { + "quote": "We may encounter many defeats, but we must not be defeated.", + "author": "Maya Angelou" + }, + { + "quote": "Everybody has talent, but ability takes hard work.", + "author": "Michael Jordan" + }, + { + "quote": "I've missed more than 9,000 shots during my career. I've lost almost 300 games. 26 times, I've been trusted to take the game winning shot and missed. I've failed over and over and over again in my life. And that is why I succeed.", + "author": "Michael Jordan" + }, + { + "quote": "Impossible is just a big word thrown around by small men who find it easier to live in the world they've been given than to explore the power they have to change it. Impossible is not a fact. It's an opinion. Impossible is not a declaration. It's a dare. Impossible is potential. Impossible is temporary. Impossible is nothing.", + "author": "Muhammad Ali" + }, + { + "quote": "A winner is a dreamer who never gives up.", + "author": "Nelson Mandela" + }, + { + "quote": "It always seems impossible until it's done.", + "author": "Nelson Mandela" + }, + { + "quote": "Failure will never overtake me if my determination to succeed is strong enough.", + "author": "Og Mandino" + }, + { + "quote": "I am not young enough to know everything.", + "author": "Oscar Wilde" + }, + { + "quote": "There is only one thing that makes a dream impossible to achieve: the fear of failure.", + "author": "Paulo Coelho" + }, + { + "quote": "Never go to bed mad. Stay up and fight.", + "author": "Phyllis Diller" + }, + { + "quote": "You can't cross the sea merely by standing and staring at the water.", + "author": "Rabindranath Tagore" + }, + { + "quote": "The only person you are destined to become is the person you decide to be.", + "author": "Ralph Waldo Emerson" + }, + { + "quote": "What you do speaks so loudly that I cannot hear what you say.", + "author": "Ralph Waldo Emerson" + }, + { + "quote": "People who are crazy enough to think they can change the world, are the ones who do.", + "author": "Rob Siltanen" + }, + { + "quote": "The best way out is always through.", + "author": "Robert Frost" + }, + { + "quote": "Today's accomplishments were yesterday's impossibilities.", + "author": "Robert H. Schuller" + }, + { + "quote": "Don't be satisfied with stories, how things have gone with others. Unfold your own myth.", + "author": "Rumi" + }, + { + "quote": "Forget safety. Live where you fear to live. Destroy your reputation. Be notorious.", + "author": "Rumi" + }, + { + "quote": "Sell your cleverness and buy bewilderment.", + "author": "Rumi" + }, + { + "quote": "The cure for pain is in the pain.", + "author": "Rumi" + }, + { + "quote": "Have no fear of perfection - you'll never reach it.", + "author": "Salvador Dalí" + }, + { + "quote": "Don't watch the clock. Do what it does. Keep going.", + "author": "Sam Levenson" + }, + { + "quote": "Ever Tried. Ever failed. No matter. Try again. Fail again. Fail better.", + "author": "Samuel Beckett" + }, + { + "quote": "The more you know, the more you realize you know nothing.", + "author": "Socrates" + }, + { + "quote": "The greatest enemy of knowledge is not ignorance, it is the illusion of knowledge.", + "author": "Stephen Hawking" + }, + { + "quote": "The universe doesn't allow perfection.", + "author": "Stephen Hawking" + }, + { + "quote": "Whether you want to uncover the secrets of the universe, or you want to pursue a career in the 21st century, basic computer programming is an essential skill to learn.", + "author": "Stephen Hawking" + }, + { + "quote": "The scariest moment is always just before you start.", + "author": "Stephen King" + }, + { + "quote": "You can, you should, and if you're brave enough to start, you will.", + "author": "Stephen King" + }, + { + "quote": "Arise, Awake and Stop not until the goal is reached.", + "author": "Swami Vivekananda" + }, + { + "quote": "It is said that your life flashes before your eyes just before you die. That is true, it's called Life.", + "author": "Terry Pratchett" + }, + { + "quote": "Believe you can and you're halfway there.", + "author": "Theodore Roosevelt" + }, + { + "quote": "I have not failed. I've just found 10,000 ways that won't work.", + "author": "Thomas A. Edison" + }, + { + "quote": "Our greatest weakness lies in giving up. The most certain way to succeed is always to try just one more time.", + "author": "Thomas A. Edison" + }, + { + "quote": "The harder the conflict, the more glorious the triumph.", + "author": "Thomas Paine" + }, + { + "quote": "The Web as I envisaged it, we have not seen it yet. The future is still so much bigger than the past.", + "author": "Tim Berners-Lee" + }, + { + "quote": "Failure is the condiment that gives success its flavor.", + "author": "Truman Capote" + }, + { + "quote": "Those who says it cannot be done should not interrupt the person doing it.", + "author": "Unknown" + }, + { + "quote": "Even if you fall on your face, you're still moving forward.", + "author": "Victor Kiam" + }, + { + "quote": "It's not whether you get knocked down, it's whether you get up.", + "author": "Vince Lombardi" + }, + { + "quote": "I dream my painting and I paint my dream.", + "author": "Vincent van Gogh" + }, + { + "quote": "Let us cultivate our garden.", + "author": "Voltaire" + }, + { + "quote": "Aim for the moon. If you miss, you may hit a star.", + "author": "W. Clement Stone" + }, + { + "quote": "The way to get started is to quit talking and begin doing.", + "author": "Walt Disney" + }, + { + "quote": "You miss 100% of the shots you don't take.", + "author": "Wayne Gretzky" + }, + { + "quote": "Don't let yesterday take up too much of today.", + "author": "Will Rogers" + }, + { + "quote": "Even if you're on the right track, you'll get run over if you just sit there.", + "author": "Will Rogers" + }, + { + "quote": "Do not wait to strike till the iron is hot; but make it hot by striking.", + "author": "William Butler Yeats" + }, + { + "quote": "You cannot swim for new horizons until you have courage to lose sight of the shore.", + "author": "William Faulkner" + }, + { + "quote": "Be not afraid of greatness. Some are born great, some achieve greatness, and others have greatness thrust upon them.", + "author": "William Shakespeare" + }, + { + "quote": "We know what we are, but not what we may be.", + "author": "William Shakespeare" + }, + { + "quote": "In theory there is no difference between theory and practice. In practice there is.", + "author": "Yogi Berra" + }, + { + "quote": "You can see a lot by just looking.", + "author": "Yogi Berra" + }, + { + "quote": "There is no elevator to success, you have to take the stairs.", + "author": "Zig Ziglar" + }, + { + "quote": "You don't have to be great to start, but you have to start to be great.", + "author": "Zig Ziglar" + } + ] +} diff --git a/client/i18n/locales/ukrainian/trending.json b/client/i18n/locales/ukrainian/trending.json new file mode 100644 index 0000000000..750086aece --- /dev/null +++ b/client/i18n/locales/ukrainian/trending.json @@ -0,0 +1,65 @@ +{ + "article0link": "https://www.freecodecamp.org/news/what-is-javascript-javascript-code-explained-in-plain-english/", + "article0title": "What is JavaScript?", + "article1link": "https://www.freecodecamp.org/news/linux-list-processes-how-to-check-running-processes/", + "article1title": "Linux List Processes", + "article2link": "https://www.freecodecamp.org/news/web-page-text-editor-how-to-open-html-code-in-mac-textedit/", + "article2title": "Web Page Text Editor", + "article3link": "https://www.freecodecamp.org/news/what-is-open-source-software-explained-in-plain-english/", + "article3title": "What is Open Source?", + "article4link": "https://www.freecodecamp.org/news/protect-yourself-against-sim-swapping-attacks/", + "article4title": "Sim Swapping Attacks", + "article5link": "https://www.freecodecamp.org/news/rng-meaning-what-does-rng-stand-for-in-gaming/", + "article5title": "RNG Meaning in Gaming", + "article6link": "https://www.freecodecamp.org/news/the-model-view-controller-pattern-mvc-architecture-and-frameworks-explained/", + "article6title": "Model View Controller", + "article7link": "https://www.freecodecamp.org/news/front-end-developer-what-is-front-end-development-explained-in-plain-english/", + "article7title": "Front End Development", + "article8link": "https://www.freecodecamp.org/news/what-is-a-full-stack-developer-back-end-front-end-full-stack-engineer/", + "article8title": "Full Stack Developer?", + "article9link": "https://www.freecodecamp.org/news/javascript-switch-case-js-switch-statement-example/", + "article9title": "JavaScript Switch Case", + "article10link": "https://www.freecodecamp.org/news/bash-sleep-how-to-make-a-shell-script-wait-n-seconds-example-command/", + "article10title": "Bash Sleep", + "article11link": "https://www.freecodecamp.org/news/bash-array-how-to-declare-an-array-of-strings-in-a-bash-script/", + "article11title": "Bash Array", + "article12link": "https://www.freecodecamp.org/news/what-is-a-cv-and-how-is-it-different-from-a-resume/", + "article12title": "What is a CV?", + "article13link": "https://www.freecodecamp.org/news/coding-programs-101-ways-to-learn-to-code-for-free/", + "article13title": "Coding Programs", + "article14link": "https://www.freecodecamp.org/news/how-to-exit-vim/", + "article14title": "How to Exit Vim", + "article15link": "https://www.freecodecamp.org/news/html-line-break-how-to-break-a-line-with-the-html-br-tag/", + "article15title": "HTML Line Break", + "article16link": "https://www.freecodecamp.org/news/how-to-convert-a-string-to-an-int-in-c-tutorial-with-example-code/", + "article16title": "C# String to Int", + "article17link": "https://www.freecodecamp.org/news/logical-fallacies-definition-fallacy-examples/", + "article17title": "Logical fallacies", + "article18link": "https://www.freecodecamp.org/news/javascript-online-html-css-js-code-editor-list-browser-ide-tools/", + "article18title": "JavaScript Online", + "article19link": "https://www.freecodecamp.org/news/sql-case-statement-tutorial-with-when-then-clause-example-queries/", + "article19title": "SQL Case Statement", + "article20link": "https://www.freecodecamp.org/news/javascript-tolowercase-how-to-convert-a-string-to-lowercase-and-uppercase-in-js/", + "article20title": "JavaScript toLowerCase", + "article21link": "https://www.freecodecamp.org/news/angular-ngclass-example/", + "article21title": "Angular NgClass Example", + "article22link": "https://www.freecodecamp.org/news/sql-aggregate-functions-with-example-data-queries-for-beginners/", + "article22title": "SQL Aggregate Functions", + "article23link": "https://www.freecodecamp.org/news/what-is-web-development-how-to-become-a-web-developer-career-path/", + "article23title": "What is Web Development?", + "article24link": "https://www.freecodecamp.org/news/the-best-way-to-learn-python-python-programming-tutorial-for-beginners/", + "article24title": "Best Way to Learn Python", + "article25link": "https://www.freecodecamp.org/news/word-count-in-google-docs-tutorial-counting-words-and-characters-in-a-google-doc-or-word-file/", + "article25title": "Word Count in Google Docs", + "article26link": "https://www.freecodecamp.org/news/how-to-use-node-environment-variables-with-a-dotenv-file-for-node-js-and-npm/", + "article26title": "Node Environment Variables", + "article27link": "https://www.freecodecamp.org/news/event-viewer-how-to-access-the-windows-10-activity-log/", + "article27title": "Event Viewer in Windows 10", + "article28link": "https://www.freecodecamp.org/news/combine-first-last-names-excel/", + "article28title": "Combine 1st/Last Name Excel", + "article29link": "https://www.freecodecamp.org/news/javascript-if-else-and-if-then-js-conditional-statements/", + "article29title": "JavaScript if-else & if-then" +} + + + From 010e09ffb7ebe466cfc726994b4b966f7e20927b Mon Sep 17 00:00:00 2001 From: "Nicholas Carrigan (he/him)" Date: Fri, 10 Dec 2021 07:58:00 -0800 Subject: [PATCH 06/63] chore: migrate untranslated files (#44462) --- .../file-metadata-microservice.md | 88 +++++++++ .../timestamp-microservice.md | 156 ++++++++++++++++ .../url-shortener-microservice.md | 119 ++++++++++++ .../demographic-data-analyzer.md | 78 ++++++++ ...-variance-standard-deviation-calculator.md | 80 ++++++++ .../medical-data-visualizer.md | 90 +++++++++ .../page-view-time-series-visualizer.md | 60 ++++++ .../sea-level-predictor.md | 64 +++++++ .../anonymous-message-board.md | 172 ++++++++++++++++++ .../port-scanner.md | 95 ++++++++++ .../sha-1-password-cracker.md | 72 ++++++++ .../stock-price-checker.md | 136 ++++++++++++++ ...sh-and-compare-passwords-asynchronously.md | 81 +++++++++ .../problem-124-ordered-radicals.md | 142 +++++++++++++++ .../problem-199-iterative-circle-packing.md | 75 ++++++++ ...h-the-area--perimeter-ratio-is-integral.md | 48 +++++ .../problem-29-distinct-powers.md | 86 +++++++++ .../project-euler/problem-331-cross-flips.md | 52 ++++++ 18 files changed, 1694 insertions(+) create mode 100644 curriculum/challenges/ukrainian/05-back-end-development-and-apis/back-end-development-and-apis-projects/file-metadata-microservice.md create mode 100644 curriculum/challenges/ukrainian/05-back-end-development-and-apis/back-end-development-and-apis-projects/timestamp-microservice.md create mode 100644 curriculum/challenges/ukrainian/05-back-end-development-and-apis/back-end-development-and-apis-projects/url-shortener-microservice.md create mode 100644 curriculum/challenges/ukrainian/08-data-analysis-with-python/data-analysis-with-python-projects/demographic-data-analyzer.md create mode 100644 curriculum/challenges/ukrainian/08-data-analysis-with-python/data-analysis-with-python-projects/mean-variance-standard-deviation-calculator.md create mode 100644 curriculum/challenges/ukrainian/08-data-analysis-with-python/data-analysis-with-python-projects/medical-data-visualizer.md create mode 100644 curriculum/challenges/ukrainian/08-data-analysis-with-python/data-analysis-with-python-projects/page-view-time-series-visualizer.md create mode 100644 curriculum/challenges/ukrainian/08-data-analysis-with-python/data-analysis-with-python-projects/sea-level-predictor.md create mode 100644 curriculum/challenges/ukrainian/09-information-security/information-security-projects/anonymous-message-board.md create mode 100644 curriculum/challenges/ukrainian/09-information-security/information-security-projects/port-scanner.md create mode 100644 curriculum/challenges/ukrainian/09-information-security/information-security-projects/sha-1-password-cracker.md create mode 100644 curriculum/challenges/ukrainian/09-information-security/information-security-projects/stock-price-checker.md create mode 100644 curriculum/challenges/ukrainian/09-information-security/information-security-with-helmetjs/hash-and-compare-passwords-asynchronously.md create mode 100644 curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-124-ordered-radicals.md create mode 100644 curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-199-iterative-circle-packing.md create mode 100644 curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-283-integer-sided-triangles-for-which-the-area--perimeter-ratio-is-integral.md create mode 100644 curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-29-distinct-powers.md create mode 100644 curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-331-cross-flips.md diff --git a/curriculum/challenges/ukrainian/05-back-end-development-and-apis/back-end-development-and-apis-projects/file-metadata-microservice.md b/curriculum/challenges/ukrainian/05-back-end-development-and-apis/back-end-development-and-apis-projects/file-metadata-microservice.md new file mode 100644 index 0000000000..73a21855f9 --- /dev/null +++ b/curriculum/challenges/ukrainian/05-back-end-development-and-apis/back-end-development-and-apis-projects/file-metadata-microservice.md @@ -0,0 +1,88 @@ +--- +id: bd7158d8c443edefaeb5bd0f +title: File Metadata Microservice +challengeType: 4 +forumTopicId: 301506 +dashedName: file-metadata-microservice +--- + +# --description-- + +Build a full stack JavaScript app that is functionally similar to this: . Working on this project will involve you writing your code using one of the following methods: + +- Clone [this GitHub repo](https://github.com/freeCodeCamp/boilerplate-project-filemetadata/) and complete your project locally. +- Use [our Replit starter project](https://replit.com/github/freeCodeCamp/boilerplate-project-filemetadata) to complete your project. +- Use a site builder of your choice to complete the project. Be sure to incorporate all the files from our GitHub repo. + +When you are done, make sure a working demo of your project is hosted somewhere public. Then submit the URL to it in the `Solution Link` field. Optionally, also submit a link to your project's source code in the `GitHub Link` field. + +# --instructions-- + +**HINT:** You can use the `multer` npm package to handle file uploading. + +# --hints-- + +You should provide your own project, not the example URL. + +```js +(getUserInput) => { + assert( + !/.*\/file-metadata-microservice\.freecodecamp\.rocks/.test( + getUserInput('url') + ) + ); +}; +``` + +You can submit a form that includes a file upload. + +```js +async (getUserInput) => { + const site = await fetch(getUserInput('url')); + const data = await site.text(); + const doc = new DOMParser().parseFromString(data, 'text/html'); + assert(doc.querySelector('input[type="file"]')); +}; +``` + +The form file input field has the `name` attribute set to `upfile`. + +```js +async (getUserInput) => { + const site = await fetch(getUserInput('url')); + const data = await site.text(); + const doc = new DOMParser().parseFromString(data, 'text/html'); + assert(doc.querySelector('input[name="upfile"]')); +}; +``` + +When you submit a file, you receive the file `name`, `type`, and `size` in bytes within the JSON response. + +```js +async (getUserInput) => { + const formData = new FormData(); + const fileData = await fetch( + 'https://cdn.freecodecamp.org/weather-icons/01d.png' + ); + const file = await fileData.blob(); + formData.append('upfile', file, 'icon'); + const data = await fetch(getUserInput('url') + '/api/fileanalyse', { + method: 'POST', + body: formData + }); + const parsed = await data.json(); + assert.property(parsed, 'size'); + assert.equal(parsed.name, 'icon'); + assert.equal(parsed.type, 'image/png'); +}; +``` + +# --solutions-- + +```js +/** + Backend challenges don't need solutions, + because they would need to be tested against a full working project. + Please check our contributing guidelines to learn more. +*/ +``` diff --git a/curriculum/challenges/ukrainian/05-back-end-development-and-apis/back-end-development-and-apis-projects/timestamp-microservice.md b/curriculum/challenges/ukrainian/05-back-end-development-and-apis/back-end-development-and-apis-projects/timestamp-microservice.md new file mode 100644 index 0000000000..3e27c39463 --- /dev/null +++ b/curriculum/challenges/ukrainian/05-back-end-development-and-apis/back-end-development-and-apis-projects/timestamp-microservice.md @@ -0,0 +1,156 @@ +--- +id: bd7158d8c443edefaeb5bdef +title: Timestamp Microservice +challengeType: 4 +forumTopicId: 301508 +dashedName: timestamp-microservice +--- + +# --description-- + +Build a full stack JavaScript app that is functionally similar to this: . Working on this project will involve you writing your code using one of the following methods: + +- Clone [this GitHub repo](https://github.com/freeCodeCamp/boilerplate-project-timestamp/) and complete your project locally. +- Use [our Replit starter project](https://replit.com/github/freeCodeCamp/boilerplate-project-timestamp) to complete your project. +- Use a site builder of your choice to complete the project. Be sure to incorporate all the files from our GitHub repo. + +When you are done, make sure a working demo of your project is hosted somewhere public. Then submit the URL to it in the `Solution Link` field. Optionally, also submit a link to your project's source code in the `GitHub Link` field. + +**Note:** Time zones conversion is not a purpose of this project, so assume all sent valid dates will be parsed with `new Date()` as GMT dates. + +# --hints-- + +You should provide your own project, not the example URL. + +```js +(getUserInput) => { + assert( + !/.*\/timestamp-microservice\.freecodecamp\.rocks/.test(getUserInput('url')) + ); +}; +``` + +A request to `/api/:date?` with a valid date should return a JSON object with a `unix` key that is a Unix timestamp of the input date in milliseconds + +```js +(getUserInput) => + $.get(getUserInput('url') + '/api/2016-12-25').then( + (data) => { + assert.equal( + data.unix, + 1482624000000, + 'Should be a valid unix timestamp' + ); + }, + (xhr) => { + throw new Error(xhr.responseText); + } + ); +``` + +A request to `/api/:date?` with a valid date should return a JSON object with a `utc` key that is a string of the input date in the format: `Thu, 01 Jan 1970 00:00:00 GMT` + +```js +(getUserInput) => + $.get(getUserInput('url') + '/api/2016-12-25').then( + (data) => { + assert.equal( + data.utc, + 'Sun, 25 Dec 2016 00:00:00 GMT', + 'Should be a valid UTC date string' + ); + }, + (xhr) => { + throw new Error(xhr.responseText); + } + ); +``` + +A request to `/api/1451001600000` should return `{ unix: 1451001600000, utc: "Fri, 25 Dec 2015 00:00:00 GMT" }` + +```js +(getUserInput) => + $.get(getUserInput('url') + '/api/1451001600000').then( + (data) => { + assert( + data.unix === 1451001600000 && + data.utc === 'Fri, 25 Dec 2015 00:00:00 GMT' + ); + }, + (xhr) => { + throw new Error(xhr.responseText); + } + ); +``` + +Your project can handle dates that can be successfully parsed by `new Date(date_string)` + +```js +(getUserInput) => + $.get(getUserInput('url') + '/api/05 October 2011, GMT').then( + (data) => { + assert( + data.unix === 1317772800000 && + data.utc === 'Wed, 05 Oct 2011 00:00:00 GMT' + ); + }, + (xhr) => { + throw new Error(xhr.responseText); + } + ); +``` + +If the input date string is invalid, the api returns an object having the structure `{ error : "Invalid Date" }` + +```js +(getUserInput) => + $.get(getUserInput('url') + '/api/this-is-not-a-date').then( + (data) => { + assert.equal(data.error.toLowerCase(), 'invalid date'); + }, + (xhr) => { + assert(xhr.responseJSON.error.toLowerCase() === 'invalid date'); + } + ); +``` + +An empty date parameter should return the current time in a JSON object with a `unix` key + +```js +(getUserInput) => + $.get(getUserInput('url') + '/api').then( + (data) => { + var now = Date.now(); + assert.approximately(data.unix, now, 20000); + }, + (xhr) => { + throw new Error(xhr.responseText); + } + ); +``` + +An empty date parameter should return the current time in a JSON object with a `utc` key + +```js +(getUserInput) => + $.get(getUserInput('url') + '/api').then( + (data) => { + var now = Date.now(); + var serverTime = new Date(data.utc).getTime(); + assert.approximately(serverTime, now, 20000); + }, + (xhr) => { + throw new Error(xhr.responseText); + } + ); +``` + +# --solutions-- + +```js +/** + Backend challenges don't need solutions, + because they would need to be tested against a full working project. + Please check our contributing guidelines to learn more. +*/ +``` diff --git a/curriculum/challenges/ukrainian/05-back-end-development-and-apis/back-end-development-and-apis-projects/url-shortener-microservice.md b/curriculum/challenges/ukrainian/05-back-end-development-and-apis/back-end-development-and-apis-projects/url-shortener-microservice.md new file mode 100644 index 0000000000..b10b50c3a9 --- /dev/null +++ b/curriculum/challenges/ukrainian/05-back-end-development-and-apis/back-end-development-and-apis-projects/url-shortener-microservice.md @@ -0,0 +1,119 @@ +--- +id: bd7158d8c443edefaeb5bd0e +title: URL Shortener Microservice +challengeType: 4 +forumTopicId: 301509 +dashedName: url-shortener-microservice +--- + +# --description-- + +Build a full stack JavaScript app that is functionally similar to this: . Working on this project will involve you writing your code using one of the following methods: + +- Clone [this GitHub repo](https://github.com/freeCodeCamp/boilerplate-project-urlshortener/) and complete your project locally. +- Use [our Replit starter project](https://replit.com/github/freeCodeCamp/boilerplate-project-urlshortener) to complete your project. +- Use a site builder of your choice to complete the project. Be sure to incorporate all the files from our GitHub repo. + +When you are done, make sure a working demo of your project is hosted somewhere public. Then submit the URL to it in the `Solution Link` field. Optionally, also submit a link to your project's source code in the `GitHub Link` field. + +# --instructions-- + +**HINT:** Do not forget to use a body parsing middleware to handle the POST requests. Also, you can use the function `dns.lookup(host, cb)` from the `dns` core module to verify a submitted URL. + +# --hints-- + +You should provide your own project, not the example URL. + +```js +(getUserInput) => { + assert( + !/.*\/url-shortener-microservice\.freecodecamp\.rocks/.test( + getUserInput('url') + ) + ); +}; +``` + +You can POST a URL to `/api/shorturl` and get a JSON response with `original_url` and `short_url` properties. Here's an example: `{ original_url : 'https://freeCodeCamp.org', short_url : 1}` + +```js +async (getUserInput) => { + const url = getUserInput('url'); + const urlVariable = Date.now(); + const fullUrl = `${url}/?v=${urlVariable}` + const res = await fetch(url + '/api/shorturl', { + method: 'POST', + headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, + body: `url=${fullUrl}` + }); + if (res.ok) { + const { short_url, original_url } = await res.json(); + assert.isNotNull(short_url); + assert.strictEqual(original_url, `${url}/?v=${urlVariable}`); + } else { + throw new Error(`${res.status} ${res.statusText}`); + } +}; +``` + +When you visit `/api/shorturl/`, you will be redirected to the original URL. + +```js +async (getUserInput) => { + const url = getUserInput('url'); + const urlVariable = Date.now(); + const fullUrl = `${url}/?v=${urlVariable}` + let shortenedUrlVariable; + const postResponse = await fetch(url + '/api/shorturl', { + method: 'POST', + headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, + body: `url=${fullUrl}` + }); + if (postResponse.ok) { + const { short_url } = await postResponse.json(); + shortenedUrlVariable = short_url; + } else { + throw new Error(`${postResponse.status} ${postResponse.statusText}`); + } + const getResponse = await fetch( + url + '/api/shorturl/' + shortenedUrlVariable + ); + if (getResponse) { + const { redirected, url } = getResponse; + assert.isTrue(redirected); + assert.strictEqual(url,fullUrl); + } else { + throw new Error(`${getResponse.status} ${getResponse.statusText}`); + } +}; +``` + +If you pass an invalid URL that doesn't follow the valid `http://www.example.com` format, the JSON response will contain `{ error: 'invalid url' }` + +```js +async (getUserInput) => { + const url = getUserInput('url'); + const res = await fetch(url + '/api/shorturl', { + method: 'POST', + headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, + body: `url=ftp:/john-doe.org` + }); + if (res.ok) { + const { error } = await res.json(); + assert.isNotNull(error); + assert.strictEqual(error.toLowerCase(), 'invalid url'); + } else { + throw new Error(`${res.status} ${res.statusText}`); + } +}; +``` + +# --solutions-- + +```js +/** + Backend challenges don't need solutions, + because they would need to be tested against a full working project. + Please check our contributing guidelines to learn more. +*/ +``` diff --git a/curriculum/challenges/ukrainian/08-data-analysis-with-python/data-analysis-with-python-projects/demographic-data-analyzer.md b/curriculum/challenges/ukrainian/08-data-analysis-with-python/data-analysis-with-python-projects/demographic-data-analyzer.md new file mode 100644 index 0000000000..9b67fad630 --- /dev/null +++ b/curriculum/challenges/ukrainian/08-data-analysis-with-python/data-analysis-with-python-projects/demographic-data-analyzer.md @@ -0,0 +1,78 @@ +--- +id: 5e46f7e5ac417301a38fb929 +title: Demographic Data Analyzer +challengeType: 10 +forumTopicId: 462367 +dashedName: demographic-data-analyzer +--- + +# --description-- + +You will be [working on this project with our Replit starter code](https://replit.com/github/freeCodeCamp/boilerplate-demographic-data-analyzer). + +We are still developing the interactive instructional part of the Python curriculum. For now, here are some videos on the freeCodeCamp.org YouTube channel that will teach you everything you need to know to complete this project: + +- [Python for Everybody Video Course](https://www.freecodecamp.org/news/python-for-everybody/) (14 hours) +- [Learn Python Video Course](https://www.freecodecamp.org/news/learn-python-video-course/) (10 hours) + +# --instructions-- + +In this challenge you must analyze demographic data using Pandas. You are given a dataset of demographic data that was extracted from the 1994 Census database. Here is a sample of what the data looks like: + +```markdown +| | age | workclass | fnlwgt | education | education-num | marital-status | occupation | relationship | race | sex | capital-gain | capital-loss | hours-per-week | native-country | salary | +|---:|------:|:-----------------|---------:|:------------|----------------:|:-------------------|:------------------|:---------------|:-------|:-------|---------------:|---------------:|-----------------:|:-----------------|:---------| +| 0 | 39 | State-gov | 77516 | Bachelors | 13 | Never-married | Adm-clerical | Not-in-family | White | Male | 2174 | 0 | 40 | United-States | <=50K | +| 1 | 50 | Self-emp-not-inc | 83311 | Bachelors | 13 | Married-civ-spouse | Exec-managerial | Husband | White | Male | 0 | 0 | 13 | United-States | <=50K | +| 2 | 38 | Private | 215646 | HS-grad | 9 | Divorced | Handlers-cleaners | Not-in-family | White | Male | 0 | 0 | 40 | United-States | <=50K | +| 3 | 53 | Private | 234721 | 11th | 7 | Married-civ-spouse | Handlers-cleaners | Husband | Black | Male | 0 | 0 | 40 | United-States | <=50K | +| 4 | 28 | Private | 338409 | Bachelors | 13 | Married-civ-spouse | Prof-specialty | Wife | Black | Female | 0 | 0 | 40 | Cuba | <=50K | +``` + +You must use Pandas to answer the following questions: + +- How many people of each race are represented in this dataset? This should be a Pandas series with race names as the index labels. (`race` column) +- What is the average age of men? +- What is the percentage of people who have a Bachelor's degree? +- What percentage of people with advanced education (`Bachelors`, `Masters`, or `Doctorate`) make more than 50K? +- What percentage of people without advanced education make more than 50K? +- What is the minimum number of hours a person works per week? +- What percentage of the people who work the minimum number of hours per week have a salary of more than 50K? +- What country has the highest percentage of people that earn >50K and what is that percentage? +- Identify the most popular occupation for those who earn >50K in India. + +Use the starter code in the file `demographic_data_analyzer`. Update the code so all variables set to "None" are set to the appropriate calculation or code. Round all decimals to the nearest tenth. + +Unit tests are written for you under `test_module.py`. + +## Development + +For development, you can use `main.py` to test your functions. Click the "run" button and `main.py` will run. + +## Testing + +We imported the tests from `test_module.py` to `main.py` for your convenience. The tests will run automatically whenever you hit the "run" button. + +## Submitting + +Copy your project's URL and submit it to freeCodeCamp. + +## Dataset Source + +Dua, D. and Graff, C. (2019). [UCI Machine Learning Repository](http://archive.ics.uci.edu/ml). Irvine, CA: University of California, School of Information and Computer Science. + +# --hints-- + +It should pass all Python tests. + +```js + +``` + +# --solutions-- + +```py + # Python challenges don't need solutions, + # because they would need to be tested against a full working project. + # Please check our contributing guidelines to learn more. +``` diff --git a/curriculum/challenges/ukrainian/08-data-analysis-with-python/data-analysis-with-python-projects/mean-variance-standard-deviation-calculator.md b/curriculum/challenges/ukrainian/08-data-analysis-with-python/data-analysis-with-python-projects/mean-variance-standard-deviation-calculator.md new file mode 100644 index 0000000000..447e9ece0b --- /dev/null +++ b/curriculum/challenges/ukrainian/08-data-analysis-with-python/data-analysis-with-python-projects/mean-variance-standard-deviation-calculator.md @@ -0,0 +1,80 @@ +--- +id: 5e46f7e5ac417301a38fb928 +title: Mean-Variance-Standard Deviation Calculator +challengeType: 10 +forumTopicId: 462366 +dashedName: mean-variance-standard-deviation-calculator +--- + +# --description-- + +You will be [working on this project with our Replit starter code](https://replit.com/github/freeCodeCamp/boilerplate-mean-variance-standard-deviation-calculator). + +We are still developing the interactive instructional part of the Python curriculum. For now, here are some videos on the freeCodeCamp.org YouTube channel that will teach you everything you need to know to complete this project: + +- [Python for Everybody Video Course](https://www.freecodecamp.org/news/python-for-everybody/) (14 hours) +- [Learn Python Video Course](https://www.freecodecamp.org/news/learn-python-video-course/) (10 hours) + +# --instructions-- + +Create a function named `calculate()` in `mean_var_std.py` that uses Numpy to output the mean, variance, standard deviation, max, min, and sum of the rows, columns, and elements in a 3 x 3 matrix. + +The input of the function should be a list containing 9 digits. The function should convert the list into a 3 x 3 Numpy array, and then return a dictionary containing the mean, variance, standard deviation, max, min, and sum along both axes and for the flattened matrix. + +The returned dictionary should follow this format: + +```py +{ + 'mean': [axis1, axis2, flattened], + 'variance': [axis1, axis2, flattened], + 'standard deviation': [axis1, axis2, flattened], + 'max': [axis1, axis2, flattened], + 'min': [axis1, axis2, flattened], + 'sum': [axis1, axis2, flattened] +} +``` + +If a list containing less than 9 elements is passed into the function, it should raise a `ValueError` exception with the message: "List must contain nine numbers." The values in the returned dictionary should be lists and not Numpy arrays. + +For example, `calculate([0,1,2,3,4,5,6,7,8])` should return: + +```py +{ + 'mean': [[3.0, 4.0, 5.0], [1.0, 4.0, 7.0], 4.0], + 'variance': [[6.0, 6.0, 6.0], [0.6666666666666666, 0.6666666666666666, 0.6666666666666666], 6.666666666666667], + 'standard deviation': [[2.449489742783178, 2.449489742783178, 2.449489742783178], [0.816496580927726, 0.816496580927726, 0.816496580927726], 2.581988897471611], + 'max': [[6, 7, 8], [2, 5, 8], 8], + 'min': [[0, 1, 2], [0, 3, 6], 0], + 'sum': [[9, 12, 15], [3, 12, 21], 36] +} +``` + +The unit tests for this project are in `test_module.py`. + +## Development + +For development, you can use `main.py` to test your `calculate()` function. Click the "run" button and `main.py` will run. + +## Testing + +We imported the tests from `test_module.py` to `main.py` for your convenience. The tests will run automatically whenever you hit the "run" button. + +## Submitting + +Copy your project's URL and submit it to freeCodeCamp. + +# --hints-- + +It should pass all Python tests. + +```js + +``` + +# --solutions-- + +```py + # Python challenges don't need solutions, + # because they would need to be tested against a full working project. + # Please check our contributing guidelines to learn more. +``` diff --git a/curriculum/challenges/ukrainian/08-data-analysis-with-python/data-analysis-with-python-projects/medical-data-visualizer.md b/curriculum/challenges/ukrainian/08-data-analysis-with-python/data-analysis-with-python-projects/medical-data-visualizer.md new file mode 100644 index 0000000000..540499ebf5 --- /dev/null +++ b/curriculum/challenges/ukrainian/08-data-analysis-with-python/data-analysis-with-python-projects/medical-data-visualizer.md @@ -0,0 +1,90 @@ +--- +id: 5e46f7f8ac417301a38fb92a +title: Medical Data Visualizer +challengeType: 10 +forumTopicId: 462368 +dashedName: medical-data-visualizer +--- + +# --description-- + +You will be [working on this project with our Replit starter code](https://replit.com/github/freeCodeCamp/boilerplate-medical-data-visualizer). + +We are still developing the interactive instructional part of the Python curriculum. For now, here are some videos on the freeCodeCamp.org YouTube channel that will teach you everything you need to know to complete this project: + +- [Python for Everybody Video Course](https://www.freecodecamp.org/news/python-for-everybody/) (14 hours) +- [Learn Python Video Course](https://www.freecodecamp.org/news/learn-python-video-course/) (10 hours) + +# --instructions-- + +In this project, you will visualize and make calculations from medical examination data using matplotlib, seaborn, and pandas. The dataset values were collected during medical examinations. + +## Data description + +The rows in the dataset represent patients and the columns represent information like body measurements, results from various blood tests, and lifestyle choices. You will use the dataset to explore the relationship between cardiac disease, body measurements, blood markers, and lifestyle choices. + +File name: medical_examination.csv + +| Feature | Variable Type | Variable | Value Type | +|:-------:|:------------:|:-------------:|:----------:| +| Age | Objective Feature | age | int (days) | +| Height | Objective Feature | height | int (cm) | +| Weight | Objective Feature | weight | float (kg) | +| Gender | Objective Feature | gender | categorical code | +| Systolic blood pressure | Examination Feature | ap_hi | int | +| Diastolic blood pressure | Examination Feature | ap_lo | int | +| Cholesterol | Examination Feature | cholesterol | 1: normal, 2: above normal, 3: well above normal | +| Glucose | Examination Feature | gluc | 1: normal, 2: above normal, 3: well above normal | +| Smoking | Subjective Feature | smoke | binary | +| Alcohol intake | Subjective Feature | alco | binary | +| Physical activity | Subjective Feature | active | binary | +| Presence or absence of cardiovascular disease | Target Variable | cardio | binary | + +## Tasks + +Create a chart similar to `examples/Figure_1.png`, where we show the counts of good and bad outcomes for the `cholesterol`, `gluc`, `alco`, `active`, and `smoke` variables for patients with cardio=1 and cardio=0 in different panels. + +Use the data to complete the following tasks in `medical_data_visualizer.py`: + +- Add an `overweight` column to the data. To determine if a person is overweight, first calculate their BMI by dividing their weight in kilograms by the square of their height in meters. If that value is > 25 then the person is overweight. Use the value 0 for NOT overweight and the value 1 for overweight. +- Normalize the data by making 0 always good and 1 always bad. If the value of `cholesterol` or `gluc` is 1, make the value 0. If the value is more than 1, make the value 1. +- Convert the data into long format and create a chart that shows the value counts of the categorical features using seaborn's `catplot()`. The dataset should be split by 'Cardio' so there is one chart for each `cardio` value. The chart should look like `examples/Figure_1.png`. +- Clean the data. Filter out the following patient segments that represent incorrect data: + - diastolic pressure is higher than systolic (Keep the correct data with `(df['ap_lo'] <= df['ap_hi'])`) + - height is less than the 2.5th percentile (Keep the correct data with `(df['height'] >= df['height'].quantile(0.025))`) + - height is more than the 97.5th percentile + - weight is less than the 2.5th percentile + - weight is more than the 97.5th percentile +- Create a correlation matrix using the dataset. Plot the correlation matrix using seaborn's `heatmap()`. Mask the upper triangle. The chart should look like `examples/Figure_2.png`. + +Any time a variable is set to `None`, make sure to set it to the correct code. + +Unit tests are written for you under `test_module.py`. + +## Development + +For development, you can use `main.py` to test your functions. Click the "run" button and `main.py` will run. + +## Testing + +We imported the tests from `test_module.py` to `main.py` for your convenience. The tests will run automatically whenever you hit the "run" button. + +## Submitting + +Copy your project's URL and submit it to freeCodeCamp. + +# --hints-- + +It should pass all Python tests. + +```js + +``` + +# --solutions-- + +```py + # Python challenges don't need solutions, + # because they would need to be tested against a full working project. + # Please check our contributing guidelines to learn more. +``` diff --git a/curriculum/challenges/ukrainian/08-data-analysis-with-python/data-analysis-with-python-projects/page-view-time-series-visualizer.md b/curriculum/challenges/ukrainian/08-data-analysis-with-python/data-analysis-with-python-projects/page-view-time-series-visualizer.md new file mode 100644 index 0000000000..2ca374ca72 --- /dev/null +++ b/curriculum/challenges/ukrainian/08-data-analysis-with-python/data-analysis-with-python-projects/page-view-time-series-visualizer.md @@ -0,0 +1,60 @@ +--- +id: 5e46f802ac417301a38fb92b +title: Page View Time Series Visualizer +challengeType: 10 +forumTopicId: 462369 +dashedName: page-view-time-series-visualizer +--- + +# --description-- + +You will be [working on this project with our Replit starter code](https://replit.com/github/freeCodeCamp/boilerplate-page-view-time-series-visualizer). + +We are still developing the interactive instructional part of the Python curriculum. For now, here are some videos on the freeCodeCamp.org YouTube channel that will teach you everything you need to know to complete this project: + +- [Python for Everybody Video Course](https://www.freecodecamp.org/news/python-for-everybody/) (14 hours) +- [Learn Python Video Course](https://www.freecodecamp.org/news/learn-python-video-course/) (10 hours) + +# --instructions-- + +For this project you will visualize time series data using a line chart, bar chart, and box plots. You will use Pandas, Matplotlib, and Seaborn to visualize a dataset containing the number of page views each day on the freeCodeCamp.org forum from 2016-05-09 to 2019-12-03. The data visualizations will help you understand the patterns in visits and identify yearly and monthly growth. + +Use the data to complete the following tasks: + +- Use Pandas to import the data from "fcc-forum-pageviews.csv". Set the index to the "date" column. +- Clean the data by filtering out days when the page views were in the top 2.5% of the dataset or bottom 2.5% of the dataset. +- Create a `draw_line_plot` function that uses Matplotlib to draw a line chart similar to "examples/Figure_1.png". The title should be "Daily freeCodeCamp Forum Page Views 5/2016-12/2019". The label on the x axis should be "Date" and the label on the y axis should be "Page Views". +- Create a `draw_bar_plot` function that draws a bar chart similar to "examples/Figure_2.png". It should show average daily page views for each month grouped by year. The legend should show month labels and have a title of "Months". On the chart, the label on the x axis should be "Years" and the label on the y axis should be "Average Page Views". +- Create a `draw_box_plot` function that uses Searborn to draw two adjacent box plots similar to "examples/Figure_3.png". These box plots should show how the values are distributed within a given year or month and how it compares over time. The title of the first chart should be "Year-wise Box Plot (Trend)" and the title of the second chart should be "Month-wise Box Plot (Seasonality)". Make sure the month labels on bottom start at "Jan" and the x and x axis are labeled correctly. The boilerplate includes commands to prepare the data. + +For each chart, make sure to use a copy of the data frame. Unit tests are written for you under `test_module.py`. + +The boilerplate also includes commands to save and return the image. + +## Development + +For development, you can use `main.py` to test your functions. Click the "run" button and `main.py` will run. + +## Testing + +We imported the tests from `test_module.py` to `main.py` for your convenience. The tests will run automatically whenever you hit the "run" button. + +## Submitting + +Copy your project's URL and submit it to freeCodeCamp. + +# --hints-- + +It should pass all Python tests. + +```js + +``` + +# --solutions-- + +```py + # Python challenges don't need solutions, + # because they would need to be tested against a full working project. + # Please check our contributing guidelines to learn more. +``` diff --git a/curriculum/challenges/ukrainian/08-data-analysis-with-python/data-analysis-with-python-projects/sea-level-predictor.md b/curriculum/challenges/ukrainian/08-data-analysis-with-python/data-analysis-with-python-projects/sea-level-predictor.md new file mode 100644 index 0000000000..04742507b6 --- /dev/null +++ b/curriculum/challenges/ukrainian/08-data-analysis-with-python/data-analysis-with-python-projects/sea-level-predictor.md @@ -0,0 +1,64 @@ +--- +id: 5e4f5c4b570f7e3a4949899f +title: Sea Level Predictor +challengeType: 10 +forumTopicId: 462370 +dashedName: sea-level-predictor +--- + +# --description-- + +You will be [working on this project with our Replit starter code](https://replit.com/github/freeCodeCamp/boilerplate-sea-level-predictor). + +We are still developing the interactive instructional part of the Python curriculum. For now, here are some videos on the freeCodeCamp.org YouTube channel that will teach you everything you need to know to complete this project: + +- [Python for Everybody Video Course](https://www.freecodecamp.org/news/python-for-everybody/) (14 hours) +- [Learn Python Video Course](https://www.freecodecamp.org/news/learn-python-video-course/) (10 hours) + +# --instructions-- + +You will analyze a dataset of the global average sea level change since 1880. You will use the data to predict the sea level change through year 2050. + +Use the data to complete the following tasks: + +- Use Pandas to import the data from `epa-sea-level.csv`. +- Use matplotlib to create a scatter plot using the "Year" column as the x-axis and the "CSIRO Adjusted Sea Level" column as the y-axix. +- Use the `linregress` function from `scipy.stats` to get the slope and y-intercept of the line of best fit. Plot the line of best fit over the top of the scatter plot. Make the line go through the year 2050 to predict the sea level rise in 2050. +- Plot a new line of best fit just using the data from year 2000 through the most recent year in the dataset. Make the line also go through the year 2050 to predict the sea level rise in 2050 if the rate of rise continues as it has since the year 2000. +- The x label should be "Year", the y label should be "Sea Level (inches)", and the title should be "Rise in Sea Level". + +Unit tests are written for you under `test_module.py`. + +The boilerplate also includes commands to save and return the image. + +## Development + +For development, you can use `main.py` to test your functions. Click the "run" button and `main.py` will run. + +## Testing + +We imported the tests from `test_module.py` to `main.py` for your convenience. The tests will run automatically whenever you hit the "run" button. + +## Submitting + +Copy your project's URL and submit it to freeCodeCamp. + +## Data Source +[Global Average Absolute Sea Level Change](https://datahub.io/core/sea-level-rise), 1880-2014 from the US Environmental Protection Agency using data from CSIRO, 2015; NOAA, 2015. + + +# --hints-- + +It should pass all Python tests. + +```js + +``` + +# --solutions-- + +```py + # Python challenges don't need solutions, + # because they would need to be tested against a full working project. + # Please check our contributing guidelines to learn more. +``` diff --git a/curriculum/challenges/ukrainian/09-information-security/information-security-projects/anonymous-message-board.md b/curriculum/challenges/ukrainian/09-information-security/information-security-projects/anonymous-message-board.md new file mode 100644 index 0000000000..b7be38cf5f --- /dev/null +++ b/curriculum/challenges/ukrainian/09-information-security/information-security-projects/anonymous-message-board.md @@ -0,0 +1,172 @@ +--- +id: 587d824a367417b2b2512c45 +title: Anonymous Message Board +challengeType: 4 +forumTopicId: 301568 +dashedName: anonymous-message-board +--- + +# --description-- + +Build a full stack JavaScript app that is functionally similar to this: . + +Working on this project will involve you writing your code using one of the following methods: + +- Clone [this GitHub repo](https://github.com/freeCodeCamp/boilerplate-project-messageboard/) and complete your project locally. +- Use [our Replit starter project](https://replit.com/github/freeCodeCamp/boilerplate-project-messageboard) to complete your project. +- Use a site builder of your choice to complete the project. Be sure to incorporate all the files from our GitHub repo. + +When you are done, make sure a working demo of your project is hosted somewhere public. Then submit the URL to it in the `Solution Link` field. Optionally, also submit a link to your project's source code in the `GitHub Link` field. + +# --instructions-- + +1. Set `NODE_ENV` to test without quotes when ready to write tests and DB to your databases connection string (in `.env`) +2. Recommended to create controllers/handlers and handle routing in `routes/api.js` +3. You will add any security features to `server.js` + +Write the following tests in `tests/2_functional-tests.js`: + +- Creating a new thread: POST request to `/api/threads/{board}` +- Viewing the 10 most recent threads with 3 replies each: GET request to `/api/threads/{board}` +- Deleting a thread with the incorrect password: DELETE request to `/api/threads/{board}` with an invalid `delete_password` +- Deleting a thread with the correct password: DELETE request to `/api/threads/{board}` with a valid `delete_password` +- Reporting a thread: PUT request to `/api/threads/{board}` +- Creating a new reply: POST request to `/api/replies/{board}` +- Viewing a single thread with all replies: GET request to `/api/replies/{board}` +- Deleting a reply with the incorrect password: DELETE request to `/api/replies/{board}` with an invalid `delete_password` +- Deleting a reply with the correct password: DELETE request to `/api/replies/{board}` with a valid `delete_password` +- Reporting a reply: PUT request to `/api/replies/{board}` + +# --hints-- + +You can provide your own project, not the example URL. + +```js +(getUserInput) => { + assert( + !/.*\/anonymous-message-board\.freecodecamp\.rocks/.test( + getUserInput('url') + ) + ); +}; +``` + +Only allow your site to be loaded in an iFrame on your own pages. + +```js +async (getUserInput) => { + const data = await fetch(getUserInput('url') + '/_api/app-info'); + const parsed = await data.json(); + assert.isTrue(parsed.headers['x-frame-options']?.includes('SAMEORIGIN')); +}; +``` + +Do not allow DNS prefetching. + +```js +async (getUserInput) => { + const data = await fetch(getUserInput('url') + '/_api/app-info'); + const parsed = await data.json(); + assert.isTrue(parsed.headers['x-dns-prefetch-control']?.includes('off')); +}; +``` + +Only allow your site to send the referrer for your own pages. + +```js +async (getUserInput) => { + const data = await fetch(getUserInput('url') + '/_api/app-info'); + const parsed = await data.json(); + assert.isTrue(parsed.headers['referrer-policy']?.includes('same-origin')); +}; +``` + +You can send a POST request to `/api/threads/{board}` with form data including `text` and `delete_password`. The saved database record will have at least the fields `_id`, `text`, `created_on`(date & time), `bumped_on`(date & time, starts same as `created_on`), `reported` (boolean), `delete_password`, & `replies` (array). + +```js +async (getUserInput) => { + const date = new Date(); + const text = `fcc_test_${date}`; + const deletePassword = 'delete_me'; + const data = { text, delete_password: deletePassword }; + const url = getUserInput('url'); + const res = await fetch(url + '/api/threads/fcc_test', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(data) + }); + if (res.ok) { + const checkData = await fetch(url + '/api/threads/fcc_test'); + const parsed = await checkData.json(); + try { + assert.equal(parsed[0].text, text); + assert.isNotNull(parsed[0]._id); + assert.equal(new Date(parsed[0].created_on).toDateString(), date.toDateString()); + assert.equal(parsed[0].bumped_on, parsed[0].created_on); + assert.isArray(parsed[0].replies); + } catch (err) { + throw new Error(err.responseText || err.message); + } + } else { + throw new Error(`${res.status} ${res.statusText}`); + } +}; +``` + +You can send a POST request to `/api/replies/{board}` with form data including `text`, `delete_password`, & `thread_id`. This will update the `bumped_on` date to the comment's date. In the thread's `replies` array, an object will be saved with at least the properties `_id`, `text`, `created_on`, `delete_password`, & `reported`. + +```js + +``` + +You can send a GET request to `/api/threads/{board}`. Returned will be an array of the most recent 10 bumped threads on the board with only the most recent 3 replies for each. The `reported` and `delete_password` fields will not be sent to the client. + +```js + +``` + +You can send a GET request to `/api/replies/{board}?thread_id={thread_id}`. Returned will be the entire thread with all its replies, also excluding the same fields from the client as the previous test. + +```js + +``` + +You can send a DELETE request to `/api/threads/{board}` and pass along the `thread_id` & `delete_password` to delete the thread. Returned will be the string `incorrect password` or `success`. + +```js + +``` + +You can send a DELETE request to `/api/replies/{board}` and pass along the `thread_id`, `reply_id`, & `delete_password`. Returned will be the string `incorrect password` or `success`. On success, the text of the `reply_id` will be changed to `[deleted]`. + +```js + +``` + +You can send a PUT request to `/api/threads/{board}` and pass along the `thread_id`. Returned will be the string `success`. The `reported` value of the `thread_id` will be changed to `true`. + +```js + +``` + +You can send a PUT request to `/api/replies/{board}` and pass along the `thread_id` & `reply_id`. Returned will be the string `success`. The `reported` value of the `reply_id` will be changed to `true`. + +```js + +``` + +All 10 functional tests are complete and passing. + +```js + +``` + +# --solutions-- + +```js +/** + Backend challenges don't need solutions, + because they would need to be tested against a full working project. + Please check our contributing guidelines to learn more. +*/ +``` diff --git a/curriculum/challenges/ukrainian/09-information-security/information-security-projects/port-scanner.md b/curriculum/challenges/ukrainian/09-information-security/information-security-projects/port-scanner.md new file mode 100644 index 0000000000..10c950657d --- /dev/null +++ b/curriculum/challenges/ukrainian/09-information-security/information-security-projects/port-scanner.md @@ -0,0 +1,95 @@ +--- +id: 5e46f979ac417301a38fb932 +title: Port Scanner +challengeType: 10 +forumTopicId: 462372 +helpCategory: Python +dashedName: port-scanner +--- + +# --description-- + +You will be [working on this project with our Replit starter code](https://replit.com/github/freeCodeCamp/boilerplate-port-scanner). + +We are still developing the interactive instructional part of the Python curriculum. For now, here are some videos on the freeCodeCamp.org YouTube channel that will teach you everything you need to know to complete this project: + +- [Python for Everybody Video Course](https://www.freecodecamp.org/news/python-for-everybody/) (14 hours) + +- [Learn Python Video Course](https://www.freecodecamp.org/news/learn-python-video-course/) (10 hours) + +# --instructions-- + +Create a port scanner using Python. + +In the `port_scanner.py` file, create a function called `get_open_ports` that takes a `target` argument and a `port_range` argument. `target` can be a URL or IP address. `port_range` is a list of two numbers indicating the first and last numbers of the range of ports to check. + +Here are examples of how the function may be called: + +```py +get_open_ports("209.216.230.240", [440, 445]) +get_open_ports("www.stackoverflow.com", [79, 82]) +``` + +The function should return a list of open ports in the given range. + +The `get_open_ports` function should also take an optional third argument of `True` to indicate "Verbose" mode. If this is set to true, the function should return a descriptive string instead of a list of ports. + +Here is the format of the string that should be returned in verbose mode (text inside `{}` indicates the information that should appear): + +```bash +Open ports for {URL} ({IP address}) +PORT SERVICE +{port} {service name} +{port} {service name} +``` + +You can use the dictionary in `common_ports.py` to get the correct service name for each port. + +For example, if the function is called like this: + +```py +port_scanner.get_open_ports("scanme.nmap.org", [20, 80], True) +``` + +It should return the following: + +```bash +Open ports for scanme.nmap.org (45.33.32.156) +PORT SERVICE +22 ssh +80 http +``` + +Make sure to include proper spacing and new line characters. + +If the URL passed into the `get_open_ports` function is invalid, the function should return the string: "Error: Invalid hostname". + +If the IP address passed into the `get_open_ports` function is invalid, the function should return the string: "Error: Invalid IP address". + +## Development + +Write your code in `port_scanner.py`. For development, you can use `main.py` to test your code. Click the "run" button and `main.py` will run. + +## Testing + +The unit tests for this project are in `test_module.py`. We imported the tests from `test_module.py` to `main.py` for your convenience. The tests will run automatically whenever you hit the "run" button. + +## Submitting + +Copy your project's URL and submit it to freeCodeCamp. + +# --hints-- + +It should pass all Python tests. + +```js + +``` + +# --solutions-- + +```py + # Python challenges don't need solutions, + # because they would need to be tested against a full working project. + # Please check our contributing guidelines to learn more. +``` diff --git a/curriculum/challenges/ukrainian/09-information-security/information-security-projects/sha-1-password-cracker.md b/curriculum/challenges/ukrainian/09-information-security/information-security-projects/sha-1-password-cracker.md new file mode 100644 index 0000000000..5d297ce139 --- /dev/null +++ b/curriculum/challenges/ukrainian/09-information-security/information-security-projects/sha-1-password-cracker.md @@ -0,0 +1,72 @@ +--- +id: 5e46f983ac417301a38fb933 +title: SHA-1 Password Cracker +challengeType: 10 +forumTopicId: 462374 +helpCategory: Python +dashedName: sha-1-password-cracker +--- + +# --description-- + +You will be [working on this project with our Replit starter code](https://replit.com/github/freeCodeCamp/boilerplate-SHA-1-password-cracker). + +We are still developing the interactive instructional part of the Python curriculum. For now, here are some videos on the freeCodeCamp.org YouTube channel that will teach you everything you need to know to complete this project: + +- [Python for Everybody Video Course](https://www.freecodecamp.org/news/python-for-everybody/) (14 hours) + +- [Learn Python Video Course](https://www.freecodecamp.org/news/learn-python-video-course/) (10 hours) + +# --instructions-- + +Passwords should never be stored in plain text. They should be stored as hashes, just in case the password list is discovered. However, not all hashes are created equal. + +For this project you will learn about the importance of good security by creating a password cracker to figure out passwords that were hashed using SHA-1. + +Create a function that takes in a SHA-1 hash of a password and returns the password if it is one of the top 10,000 passwords used. If the SHA-1 hash is NOT of a password in the database, return "PASSWORD NOT IN DATABASE". + +The function should hash each password from `top-10000-passwords.txt` and compare it to the hash passed into the function. + +The function should take an optional second argument named `use_salts`. If set to true, each salt string from the file `known-salts.txt` should be appended AND prepended to each password from `top-10000-passwords.txt` before hashing and before comparing it to the hash passed into the function. + +Here are some hashed passwords to test the function with: + +- `b305921a3723cd5d70a375cd21a61e60aabb84ec` should return "sammy123" +- `c7ab388a5ebefbf4d550652f1eb4d833e5316e3e` should return "abacab" +- `5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8` should return "password" + +Here are some hashed passwords to test the function with when `use_salts` is set to `True`: + +- `53d8b3dc9d39f0184144674e310185e41a87ffd5` should return "superman" +- `da5a4e8cf89539e66097acd2f8af128acae2f8ae` should return "q1w2e3r4t5" +- `ea3f62d498e3b98557f9f9cd0d905028b3b019e1` should return "bubbles1" + +The `hashlib` library has been imported for you. You should condider using it in your code. [Learn more about "hashlib" here.](https://docs.python.org/3/library/hashlib.html) + +## Development + +Write your code in `password_cracker.py`. For development, you can use `main.py` to test your code. Click the "run" button and `main.py` will run. + +## Testing + +The unit tests for this project are in `test_module.py`. We imported the tests from `test_module.py` to `main.py` for your convenience. The tests will run automatically whenever you hit the "run" button. + +## Submitting + +Copy your project's URL and submit it to freeCodeCamp. + +# --hints-- + +It should pass all Python tests. + +```js + +``` + +# --solutions-- + +```py + # Python challenges don't need solutions, + # because they would need to be tested against a full working project. + # Please check our contributing guidelines to learn more. +``` diff --git a/curriculum/challenges/ukrainian/09-information-security/information-security-projects/stock-price-checker.md b/curriculum/challenges/ukrainian/09-information-security/information-security-projects/stock-price-checker.md new file mode 100644 index 0000000000..c982308617 --- /dev/null +++ b/curriculum/challenges/ukrainian/09-information-security/information-security-projects/stock-price-checker.md @@ -0,0 +1,136 @@ +--- +id: 587d824a367417b2b2512c44 +title: Stock Price Checker +challengeType: 4 +forumTopicId: 301572 +dashedName: stock-price-checker +--- + +# --description-- + +Build a full stack JavaScript app that is functionally similar to this: . + +Since all reliable stock price APIs require an API key, we've built a workaround. Use to get up-to-date stock price information without needing to sign up for your own key. + +Working on this project will involve you writing your code using one of the following methods: + +- Clone [this GitHub repo](https://github.com/freeCodeCamp/boilerplate-project-stockchecker/) and complete your project locally. +- Use [our Replit starter project](https://replit.com/github/freeCodeCamp/boilerplate-project-stockchecker) to complete your project. +- Use a site builder of your choice to complete the project. Be sure to incorporate all the files from our GitHub repo. + +When you are done, make sure a working demo of your project is hosted somewhere public. Then submit the URL to it in the `Solution Link` field. Optionally, also submit a link to your project's source code in the `GitHub Link` field. + +# --instructions-- + +1. SET `NODE_ENV` to `test` without quotes and set `DB` to your MongoDB connection string +2. Complete the project in `routes/api.js` or by creating a handler/controller +3. You will add any security features to `server.js` +4. You will create all of the functional tests in `tests/2_functional-tests.js` + +**Note** Privacy Considerations: Due to the requirement that only 1 like per IP should be accepted, you will have to save IP addresses. It is important to remain compliant with data privacy laws such as the General Data Protection Regulation. One option is to get permission to save the user's data, but it is much simpler to anonymize it. For this challenge, remember to anonymize IP addresses before saving them to the database. If you need ideas on how to do this, you may choose to hash the data, truncate it, or set part of the IP address to 0. + +Write the following tests in `tests/2_functional-tests.js`: + +- Viewing one stock: GET request to `/api/stock-prices/` +- Viewing one stock and liking it: GET request to `/api/stock-prices/` +- Viewing the same stock and liking it again: GET request to `/api/stock-prices/` +- Viewing two stocks: GET request to `/api/stock-prices/` +- Viewing two stocks and liking them: GET request to `/api/stock-prices/` + +# --hints-- + +You can provide your own project, not the example URL. + +```js +(getUserInput) => { + assert( + !/.*\/stock-price-checker\.freecodecamp\.rocks/.test(getUserInput('url')) + ); +}; +``` + +You should set the content security policies to only allow loading of scripts and CSS from your server. + +```js +async (getUserInput) => { + const data = await fetch(getUserInput('url') + '/_api/app-info'); + const parsed = await data.json(); + assert.isTrue( + parsed.headers['content-security-policy'].includes("script-src 'self'") + ); + assert.isTrue( + parsed.headers['content-security-policy'].includes("style-src 'self'") + ); +}; +``` + +You can send a `GET` request to `/api/stock-prices`, passing a NASDAQ stock symbol to a `stock` query parameter. The returned object will contain a property named `stockData`. + +```js +async (getUserInput) => { + const data = await fetch( + getUserInput('url') + '/api/stock-prices?stock=GOOG' + ); + const parsed = await data.json(); + assert.property(parsed, 'stockData'); +}; +``` + +The `stockData` property includes the `stock` symbol as a string, the `price` as a number, and `likes` as a number. + +```js +async (getUserInput) => { + const data = await fetch( + getUserInput('url') + '/api/stock-prices?stock=GOOG' + ); + const parsed = await data.json(); + const ticker = parsed.stockData; + assert.typeOf(ticker.price, 'number'); + assert.typeOf(ticker.likes, 'number'); + assert.typeOf(ticker.stock, 'string'); +}; +``` + +You can also pass along a `like` field as `true` (boolean) to have your like added to the stock(s). Only 1 like per IP should be accepted. + +```js + +``` + +If you pass along 2 stocks, the returned value will be an array with information about both stocks. Instead of `likes`, it will display `rel_likes` (the difference between the likes on both stocks) for both `stockData` objects. + +```js +async (getUserInput) => { + const data = await fetch( + getUserInput('url') + '/api/stock-prices?stock=GOOG&stock=MSFT' + ); + const parsed = await data.json(); + const ticker = parsed.stockData; + assert.typeOf(ticker, 'array'); + assert.property(ticker[0], 'rel_likes'); + assert.property(ticker[1], 'rel_likes'); +}; +``` + +All 5 functional tests are complete and passing. + +```js +async (getUserInput) => { + const tests = await fetch(getUserInput('url') + '/_api/get-tests'); + const parsed = await tests.json(); + assert.isTrue(parsed.length >= 5); + parsed.forEach((test) => { + assert.equal(test.state, 'passed'); + }); +}; +``` + +# --solutions-- + +```js +/** + Backend challenges don't need solutions, + because they would need to be tested against a full working project. + Please check our contributing guidelines to learn more. +*/ +``` diff --git a/curriculum/challenges/ukrainian/09-information-security/information-security-with-helmetjs/hash-and-compare-passwords-asynchronously.md b/curriculum/challenges/ukrainian/09-information-security/information-security-with-helmetjs/hash-and-compare-passwords-asynchronously.md new file mode 100644 index 0000000000..1d72070146 --- /dev/null +++ b/curriculum/challenges/ukrainian/09-information-security/information-security-with-helmetjs/hash-and-compare-passwords-asynchronously.md @@ -0,0 +1,81 @@ +--- +id: 58a25bcff9fc0f352b528e7d +title: Hash and Compare Passwords Asynchronously +challengeType: 2 +forumTopicId: 301578 +dashedName: hash-and-compare-passwords-asynchronously +--- + +# --description-- + +As a reminder, this project is being built upon the following starter project on [Replit](https://replit.com/github/freeCodeCamp/boilerplate-bcrypt), or cloned from [GitHub](https://github.com/freeCodeCamp/boilerplate-bcrypt/). + +As hashing is designed to be computationally intensive, it is recommended to do so asynchronously on your server as to avoid blocking incoming connections while you hash. All you have to do to hash a password asynchronous is call + +```js +bcrypt.hash(myPlaintextPassword, saltRounds, (err, hash) => { + /*Store hash in your db*/ +}); +``` + +# --instructions-- + +Add this hashing function to your server (we've already defined the variables used in the function for you to use) and log it to the console for you to see! At this point you would normally save the hash to your database. + +Now when you need to figure out if a new input is the same data as the hash you would just use the compare function. + +```js +bcrypt.compare(myPlaintextPassword, hash, (err, res) => { + /*res == true or false*/ +}); +``` + +Add this into your existing hash function (since you need to wait for the hash to complete before calling the compare function) after you log the completed hash and log 'res' to the console within the compare. You should see in the console a hash then 'true' is printed! If you change 'myPlaintextPassword' in the compare function to 'someOtherPlaintextPassword' then it should say false. + +```js +bcrypt.hash('passw0rd!', 13, (err, hash) => { + console.log(hash); + //$2a$12$Y.PHPE15wR25qrrtgGkiYe2sXo98cjuMCG1YwSI5rJW1DSJp0gEYS + bcrypt.compare('passw0rd!', hash, (err, res) => { + console.log(res); //true + }); +}); + +``` + +Submit your page when you think you've got it right. + +# --hints-- + +Async hash should be generated and correctly compared. + +```js +(getUserInput) => + $.get(getUserInput('url') + '/_api/server.js').then( + (data) => { + assert.match( + data, + /START_ASYNC[^]*bcrypt.hash.*myPlaintextPassword( |),( |)saltRounds( |),( |).*err( |),( |)hash[^]*END_ASYNC/gi, + 'You should call bcrypt.hash on myPlaintextPassword and saltRounds and handle err and hash as a result in the callback' + ); + assert.match( + data, + /START_ASYNC[^]*bcrypt.hash[^]*bcrypt.compare.*myPlaintextPassword( |),( |)hash( |),( |).*err( |),( |)res[^]*}[^]*}[^]*END_ASYNC/gi, + 'Nested within the hash function should be the compare function comparing myPlaintextPassword to hash' + ); + }, + (xhr) => { + throw new Error(xhr.statusText); + } + ); +``` + +# --solutions-- + +```js +/** + Backend challenges don't need solutions, + because they would need to be tested against a full working project. + Please check our contributing guidelines to learn more. +*/ +``` diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-124-ordered-radicals.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-124-ordered-radicals.md new file mode 100644 index 0000000000..08779282a3 --- /dev/null +++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-124-ordered-radicals.md @@ -0,0 +1,142 @@ +--- +id: 5900f3e81000cf542c50fefb +title: 'Problem 124: Ordered radicals' +challengeType: 5 +forumTopicId: 301751 +dashedName: problem-124-ordered-radicals +--- + +# --description-- + +The radical of $n$, $rad(n)$, is the product of the distinct prime factors of $n$. For example, $504 = 2^3 × 3^2 × 7$, so $rad(504) = 2 × 3 × 7 = 42$. + +If we calculate $rad(n)$ for $1 ≤ n ≤ 10$, then sort them on $rad(n)$, and sorting on $n$ if the radical values are equal, we get: + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
$Unsorted$$Sorted$
$n$$rad(n)$$n$$rad(n)$$k$
11111
22222
33423
42824
55335
66936
77557
82668
93779
1010101010
+

+ +Let $E(k)$ be the $k$th element in the sorted $n$ column; for example, $E(4) = 8$ and $E(6) = 9$. If $rad(n)$ is sorted for $1 ≤ n ≤ 100000$, find $E(10000)$. + +# --hints-- + +`orderedRadicals()` should return `21417`. + +```js +assert.strictEqual(orderedRadicals(), 21417); +``` + +# --seed-- + +## --seed-contents-- + +```js +function orderedRadicals() { + + return true; +} + +orderedRadicals(); +``` + +# --solutions-- + +```js +// solution required +``` diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-199-iterative-circle-packing.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-199-iterative-circle-packing.md new file mode 100644 index 0000000000..d2fc26383f --- /dev/null +++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-199-iterative-circle-packing.md @@ -0,0 +1,75 @@ +--- +id: 5900f4341000cf542c50ff46 +title: 'Problem 199: Iterative Circle Packing' +challengeType: 5 +forumTopicId: 301837 +dashedName: problem-199-iterative-circle-packing +--- + +# --description-- + +Three circles of equal radius are placed inside a larger circle such that each pair of circles is tangent to one another and the inner circles do not overlap. There are four uncovered "gaps" which are to be filled iteratively with more tangent circles. + +a diagram of non-overlapping circles + +At each iteration, a maximally sized circle is placed in each gap, which creates more gaps for the next iteration. After 3 iterations (pictured), there are 108 gaps and the fraction of the area which is not covered by circles is 0.06790342, rounded to eight decimal places. + +What fraction of the area is not covered by circles after `n` iterations? Give your answer rounded to eight decimal places using the format x.xxxxxxxx . + +# --hints-- + +`iterativeCirclePacking(10)` should return a number. + +```js +assert(typeof iterativeCirclePacking(10) === 'number'); +``` + +`iterativeCirclePacking(10)` should return `0.00396087`. + +```js +assert.strictEqual(iterativeCirclePacking(10), 0.00396087); +``` + +`iterativeCirclePacking(3)` should return `0.06790342`. + +```js +assert.strictEqual(iterativeCirclePacking(3), 0.06790342); +``` + +# --seed-- + +## --seed-contents-- + +```js +function iterativeCirclePacking(n) { + + return true; +} + +iterativeCirclePacking(10); +``` + +# --solutions-- + +```js +function iterativeCirclePacking(n) { + let k1 = 1; + let k0 = k1 * (3 - 2 * Math.sqrt(3)); + let a0 = 1 / (k0 * k0); + let a1 = 3 / (k1 * k1); + a1 += 3 * getArea(k0, k1, k1, n); + a1 += getArea(k1, k1, k1, n); + let final = ((a0 - a1) / a0).toFixed(8); + + return parseFloat(final); + function getArea(k1, k2, k3, depth) { + if (depth == 0) return 0.0; + let k4 = k1 + k2 + k3 + 2 * Math.sqrt(k1 * k2 + k2 * k3 + k3 * k1); + let a = 1 / (k4 * k4); + a += getArea(k1, k2, k4, depth - 1); + a += getArea(k2, k3, k4, depth - 1); + a += getArea(k3, k1, k4, depth - 1); + return a; + } +} +``` diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-283-integer-sided-triangles-for-which-the-area--perimeter-ratio-is-integral.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-283-integer-sided-triangles-for-which-the-area--perimeter-ratio-is-integral.md new file mode 100644 index 0000000000..d88415d481 --- /dev/null +++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-283-integer-sided-triangles-for-which-the-area--perimeter-ratio-is-integral.md @@ -0,0 +1,48 @@ +--- +id: 5900f4881000cf542c50ff9a +title: >- + Problem 283: Integer sided triangles for which the area / perimeter ratio is integral +challengeType: 5 +forumTopicId: 301934 +dashedName: >- + problem-283-integer-sided-triangles-for-which-the-area--perimeter-ratio-is-integral +--- + +# --description-- + +Consider the triangle with sides 6, 8 and 10. It can be seen that the perimeter and the area are both equal to 24. + +So the $\frac{\text{area}}{\text{perimeter}}$ ratio is equal to 1. + +Consider also the triangle with sides 13, 14 and 15. The perimeter equals 42 while the area is equal to 84. + +So for this triangle the $\frac{\text{area}}{\text{perimeter}}$ ratio is equal to 2. + +Find the sum of the perimeters of all integer sided triangles for which the area/perimeter ratios are equal to positive integers not exceeding 1000. + +# --hints-- + +`integralAreaPerimeterRatio()` should return `28038042525570324`. + +```js +assert.strictEqual(integralAreaPerimeterRatio(), 28038042525570324); +``` + +# --seed-- + +## --seed-contents-- + +```js +function integralAreaPerimeterRatio() { + + return true; +} + +integralAreaPerimeterRatio(); +``` + +# --solutions-- + +```js +// solution required +``` diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-29-distinct-powers.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-29-distinct-powers.md new file mode 100644 index 0000000000..0fc363ab98 --- /dev/null +++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-29-distinct-powers.md @@ -0,0 +1,86 @@ +--- +id: 5900f3891000cf542c50fe9c +title: 'Problem 29: Distinct powers' +challengeType: 5 +forumTopicId: 301941 +dashedName: problem-29-distinct-powers +--- + +# --description-- + +Consider all integer combinations of $a^b$ for 2 ≤ a ≤ 5 and 2 ≤ b ≤ 5: + +
+ 22=4, 23=8, 24=16, 25=32
+ 32=9, 33=27, 34=81, 35=243
+ 42=16, 43=64, 44=256, 45=1024
+ 52=25, 53=125, 54=625, 55=3125
+
+ +If they are then placed in numerical order, with any repeats removed, we get the following sequence of 15 distinct terms: + +
+ 4, 8, 9, 16, 25, 27, 32, 64, 81, 125, 243, 256, 625, 1024, 3125 +
+ +How many distinct terms are in the sequence generated by $a^b$ for 2 ≤ `a` ≤ `n` and 2 ≤ `b` ≤ `n`? + +# --hints-- + +`distinctPowers(15)` should return a number. + +```js +assert(typeof distinctPowers(15) === 'number'); +``` + +`distinctPowers(15)` should return 177. + +```js +assert.strictEqual(distinctPowers(15), 177); +``` + +`distinctPowers(20)` should return 324. + +```js +assert.strictEqual(distinctPowers(20), 324); +``` + +`distinctPowers(25)` should return 519. + +```js +assert.strictEqual(distinctPowers(25), 519); +``` + +`distinctPowers(30)` should return 755. + +```js +assert.strictEqual(distinctPowers(30), 755); +``` + +# --seed-- + +## --seed-contents-- + +```js +function distinctPowers(n) { + + return n; +} + +distinctPowers(30); +``` + +# --solutions-- + +```js +const distinctPowers = (n) => { + let list = []; + for (let a=2; a<=n; a++) { + for (let b=2; b<=n; b++) { + let term = Math.pow(a, b); + if (list.indexOf(term)===-1) list.push(term); + } + } + return list.length; +}; +``` diff --git a/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-331-cross-flips.md b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-331-cross-flips.md new file mode 100644 index 0000000000..024faedcfd --- /dev/null +++ b/curriculum/challenges/ukrainian/10-coding-interview-prep/project-euler/problem-331-cross-flips.md @@ -0,0 +1,52 @@ +--- +id: 5900f4b71000cf542c50ffca +title: 'Problem 331: Cross flips' +challengeType: 5 +forumTopicId: 301989 +dashedName: problem-331-cross-flips +--- + +# --description-- + +N×N disks are placed on a square game board. Each disk has a black side and white side. + +At each turn, you may choose a disk and flip all the disks in the same row and the same column as this disk: thus $2 × N - 1$ disks are flipped. The game ends when all disks show their white side. The following example shows a game on a 5×5 board. + +animation showing game on 5x5 board + +It can be proven that 3 is the minimal number of turns to finish this game. + +The bottom left disk on the $N×N$ board has coordinates (0, 0); the bottom right disk has coordinates ($N - 1$,$0$) and the top left disk has coordinates ($0$,$N - 1$). + +Let $C_N$ be the following configuration of a board with $N × N$ disks: A disk at ($x$, $y$) satisfying $N - 1 \le \sqrt{x^2 + y^2} \lt N$, shows its black side; otherwise, it shows its white side. $C_5$ is shown above. + +Let $T(N)$ be the minimal number of turns to finish a game starting from configuration $C_N$ or 0 if configuration $C_N$ is unsolvable. We have shown that $T(5) = 3$. You are also given that $T(10) = 29$ and $T(1\\,000) = 395\\,253$. + +Find $\displaystyle \sum_{i = 3}^{31} T(2^i - i)$. + +# --hints-- + +`crossFlips()` should return `467178235146843500`. + +```js +assert.strictEqual(crossFlips(), 467178235146843500); +``` + +# --seed-- + +## --seed-contents-- + +```js +function crossFlips() { + + return true; +} + +crossFlips(); +``` + +# --solutions-- + +```js +// solution required +``` From 3f62615f8db73303479f5f4f9f3e2dbaf0fdfe4e Mon Sep 17 00:00:00 2001 From: Mrugesh Mohapatra <1884376+raisedadead@users.noreply.github.com> Date: Fri, 10 Dec 2021 22:56:21 +0530 Subject: [PATCH 07/63] docs(devops): update npm version to v8 (#44455) --- docs/devops.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/devops.md b/docs/devops.md index 68dca48f68..bbe9507773 100644 --- a/docs/devops.md +++ b/docs/devops.md @@ -563,7 +563,7 @@ Provisioning VMs with the Code 2. Update `npm` and install PM2 and setup `logrotate` and startup on boot ```console - npm i -g npm@6 + npm i -g npm@8 npm i -g pm2 npm install -g serve pm2 install pm2-logrotate From 40def2d291fcfcf3cf1c1d16204d83d3a35401a0 Mon Sep 17 00:00:00 2001 From: camperbot Date: Fri, 10 Dec 2021 23:02:33 +0530 Subject: [PATCH 08/63] chore(i18n,docs): update translations (#44453) --- .../how-to-work-on-coding-challenges.md | 4 + .../how-to-work-on-coding-challenges.md | 4 + .../how-to-work-on-coding-challenges.md | 90 ++++++++++--------- .../how-to-work-on-coding-challenges.md | 4 + .../how-to-work-on-coding-challenges.md | 90 ++++++++++--------- .../how-to-work-on-coding-challenges.md | 4 + 6 files changed, 110 insertions(+), 86 deletions(-) diff --git a/docs/i18n/chinese/how-to-work-on-coding-challenges.md b/docs/i18n/chinese/how-to-work-on-coding-challenges.md index af03d7fd4b..36ade2941a 100644 --- a/docs/i18n/chinese/how-to-work-on-coding-challenges.md +++ b/docs/i18n/chinese/how-to-work-on-coding-challenges.md @@ -73,6 +73,10 @@ assert.equal( ); ``` +# --notes-- + +Extra information for a challenge, in markdown + # --seed-- ## --before-user-code-- diff --git a/docs/i18n/espanol/how-to-work-on-coding-challenges.md b/docs/i18n/espanol/how-to-work-on-coding-challenges.md index 6e3cf6c840..4338884d99 100644 --- a/docs/i18n/espanol/how-to-work-on-coding-challenges.md +++ b/docs/i18n/espanol/how-to-work-on-coding-challenges.md @@ -77,6 +77,10 @@ assert.equal( ); ``` +# --notes-- + +Extra information for a challenge, in markdown + # --seed-- ## --before-user-code-- diff --git a/docs/i18n/italian/how-to-work-on-coding-challenges.md b/docs/i18n/italian/how-to-work-on-coding-challenges.md index c90988f549..7993fd7442 100644 --- a/docs/i18n/italian/how-to-work-on-coding-challenges.md +++ b/docs/i18n/italian/how-to-work-on-coding-challenges.md @@ -73,6 +73,10 @@ assert.equal( ); ``` +# --notes-- + +Extra information for a challenge, in markdown + # --seed-- ## --before-user-code-- @@ -89,7 +93,7 @@ Codice eseguito dopo il codice dell'utente, ma prima dei test ## --seed-contents-- -Codice di partenza da far apparire nell'editor. Questa sezione deve contenere solo codice in backtick, come il seguente: +Boilerplate code to render to the editor. This section should only contain code inside backticks, like the following: ```html @@ -114,7 +118,7 @@ console.log('freeCodeCamp is awesome!'); # --solutions-- -Le soluzioni sono usate dai test CI per assicurarsi che i cambiamenti alla sezione hints facciano eseguire i test correttamente +Solutions are used for the CI tests to ensure that changes to the hints will still pass as intended ```js // prima soluzione - il linguaggio deve combaciare con il seed. @@ -134,27 +138,27 @@ Le soluzioni sono usate dai test CI per assicurarsi che i cambiamenti alla sezio # --question-- -Questi campi sono usati per le domande a scelta multipla delle sfide di Python. +These fields are currently used for the multiple-choice Python challenges. ## --text-- -Il testo della domanda va qui. +The question text goes here. ## --answers-- -Risposa 1 +Answer 1 --- -Risposta 2 +Answer 2 --- -Altre risposte +More answers ## --video-solution-- -Il numero della risposta corretta va qui. +The number for the correct answer goes here. ```` > [!NOTE] @@ -186,9 +190,9 @@ $ ObjectId() ObjectId("5a474d78df58bafeb3535d34") ```` -Il risultato è un nuovo id, per esempio sopra `5a474d78df58bafeb3535d34`. +The result is a new id, for example `5a474d78df58bafeb3535d34` above. -Una volta che hai il tuo id, mettilo nel file markdown nel campo `id` in cima, per esempio +Once you have your id, put it into the markdown file as the `id` field at the top, e.g. ```yml --- @@ -198,13 +202,13 @@ title: Challenge Title ## Dare un nome alle sfide -Dare un nome alle cose è difficile. Lo abbiamo reso più semplice dando dei limiti. +Naming things is hard. We've made it easier by imposing some constraints. -Tutti i titoli delle sfide devono essere espliciti e seguire questo schema: +All challenge titles should be explicit and should follow this pattern: -\[verbo\]\[complemento oggetto\] +\[verb\]\[object clause\] -Ecco alcuni esempi di nomi di sfide: +Here are some example challenge names: - Usare la notazione in senso orario per specificare il padding di un elemento - Condensare array usando .reduce @@ -212,19 +216,19 @@ Ecco alcuni esempi di nomi di sfide: ## Istruzioni e descrizione di una sfida -Le frasi dovrebbero essere chiare e concise con minimo utilizzo di linguaggio tecnico. Se il linguaggio tecnico è usato, deve essere subito seguito da una definizione in linguaggio comune. +Sentences should be clear and concise with minimal jargon. If used, jargon should be immediately defined in plain English. -I paragrafi devono essere corti (1-4 frasi circa). È più probabile che vengano lette alcune frasi corte invece di un muro di testo. +Keep paragraphs short (around 1-4 sentences). People are more likely to read several short paragraphs than a wall of text. -Il testo della sfida dovrebbe usare la seconda persona ("tu") per aiutare ad avere un tono colloquiale. In questo modo il testo e le istruzioni sembrano parlare direttamente al camper che lavora sulle sfide. Cerca di evitare la prima persona ("io", "noi", "facciamo"). +Challenge text should use the second person ("you") to help to give it a conversational tone. This way the text and instructions seem to speak directly to the camper working through the challenge. Try to avoid using the first person ("I", "we", "let's", and "us"). -Non usare link a siti esterni. Questi interrompono il flusso. I camper non dovrebbero mai cercare qualcosa su Google durante queste sfide. Se ci sono risorse di cui pensi che il camper possa beneficiare, aggiungile all'articolo della sfida nella guida. +Don't use outbound links. These interrupt the flow. Campers should never have to google anything during these challenges. If there are resources you think campers would benefit from, add them to the challenge's Guide-related article. -Puoi aggiugere diagrammi se necessario. +You can add diagrams if necessary. -Non usare emoji o emoticon nelle sfide. freeCodeCamp ha una comunità globale, e il significato culturare di una emoji o emoticon può essere differente nelle varie parti del mondo. In più, le emoji possono avere un aspetto diverso su diversi sistemi. +Don't use emojis or emoticons in challenges. freeCodeCamp has a global community, and the cultural meaning of an emoji or emoticon may be different around the world. Also, emojis can render differently on different systems. -I nomi propri dovrebbero usare le maiuscole correttamente quando possibile. Qui sotto trovi una lista di parole come dovrebbero apparire nelle sfide. +Proper nouns should use correct capitalization when possible. Below is a list of words as they should appear in the challenges. - JavaScript (lettere maiuscole in "J" e "S" e senza abbreviazioni) - Node.js @@ -232,28 +236,28 @@ I nomi propri dovrebbero usare le maiuscole correttamente quando possibile. Qui ### La regola dei due minuti -Ogni sfida dovrebbe essere risolvibile entro 120 secondi da un nativo inglese che ha completato tutte le sfide precedenti. Questo include l'ammontare di tempo necessario a leggere le istruzioni, comprendere il codice di partenza, scrivere il loro codice e avere tutti i test superati. +Each challenge should be solvable within 120 seconds by a native English speaker who has completed the challenges leading up to it. This includes the amount of time it takes to read the directions/instructions understand the seeded code, write their code and get all the tests to pass. -Se servono più di due minuti a completare la sfida hai due possibilità: +If it takes longer than two minutes to complete the challenge, you have two options: - Semplificare la sfida, o - Dividere la sfida in due sfide. -La regola dei due minuti obbliga te, designer della sfida, a rendere le tue istruzioni concise, il tuo codice seed chiaro, e i tuoi test diretti. +The 2-minute rule forces you, the challenge designer, to make your directions concise, your seed code clear, and your tests straight-forward. -Teniamo traccia di quanto tempo serve ai camper per risolvere le sfide e usiamo questa informazione per identificare sfide che devono essere semplificate o divise. +We track how long it takes for campers to solve changes and use this information to identify challenges that need to be simplified or split. ### Modularità -Ogni sfida dovrebbe insegnare esattamente un concetto, e quel concetto dovrebbe apparire nel titolo della sfida. +Each challenge should teach exactly one concept, and that concept should be apparent from the challenge's name. -Possiamo rinforzare concetti introdotti in precedenza tramite ripetizione e variazioni, per esempio introducendo gli elementi h1 in una sfida e gli elementi h3 alcune sfide più tardi. +We can reinforce previously covered concepts through repetition and variations - for example, introducing h1 elements in one challenge, then h3 elements a few challenges later. -Il nostro obbiettivo è di avere migliaia di sfide da due minuti. Queste possono scorrere insieme e rinforzare concetti già introdotti in precedenza. +Our goal is to have thousands of 2-minute challenges. These can flow together and reiterate previously-covered concepts. ### Formattare il testo delle sfide -Ecco le linee guidee di formattazione specifiche per il testo delle sfide e degli esempi: +Here are specific formatting guidelines for challenge text and examples: - Le parole chiave del linguaggio vanno in `` \` `` backtick. Per esempio i nomi dei tag HTML o i nomi delle proprietà CSS. - Riferimenti a parti di codice (come nomi di funzioni, metodi o variabili) dovrebbero essere in `` \` `` backtick. Vedi gli esempi seguenti: @@ -266,9 +270,9 @@ Usa `parseInt` per convertire la variabile `realNumber` a un numero intero. - I blocchi di codice multi-riga **devono essere preceduti da una riga vuota**. La riga successiva deve iniziare con tre backticks seguiti immediatamente da uno dei [linguaggi supportati](https://prismjs.com/#supported-languages). Per completare il blocco di codice devi iniziare una nuova riga, scrivere tre backtick e poi **un'altra riga vuota**. Vedi l'esempio seguente: - Gli spazi bianchi hanno significato in Markdown, raccomandiamo di renderli visibili nel tuo editor. -**Nota:** Se devi usare un esempio di codice in YAML, usa `yaml` invece di `yml` per il linguaggio a fianco dei tre backtick. +**Note:** If you are going to use an example code in YAML, use `yaml` instead of `yml` for the language to the right of the backticks. -Il seguente è un esempio di codice: +The following is an example of code: ````md ```{language} @@ -312,13 +316,13 @@ Esempio di un commento a linea singola in JavaScript: // Only change code below this line ```` -Esempio di un commento CSS valido: +Example of a valid CSS comment: ```css /* Only change code above this line */ ``` -Se la sfida ha un unico punto dove il codice ha bisogno di cambiamenti, per favore usa i commenti nel seguente esempio per istruire l'utente su dove dovrebbe fare i cambiamenti. +If a challenge only has a single place where code changes are needed, please use the comments in the following example to instruct the user where changes should be made. ```js var a = 3; @@ -331,7 +335,7 @@ b = 9 + b; c = c + 7; ``` -Se la sfida ha diversi punti dove l'utente deve fare cambiamenti al codice (come in una sfida React) +If a challenge has multiple places where the user is expected to change code (i.e. the React challenges) ```jsx class MyComponent extends React.Component { @@ -364,9 +368,9 @@ class MyComponent extends React.Component { ### Traduzione dei commenti nel codice seed -Ci sono directory separate per ogni lingua. La [versione inglese della directory dei commenti](/curriculum/dictionaries/english/comments.js) è la base per le traduzioni trovate nelle corrispondenti versioni non-inglesi del file. La versione non-inglese della directory dei commenti cinese si trova in `/curriculum/dictionaries/chinese/comments.js`. Ogni directory consiste di un array di oggetti con una proprietà `id` unica e una proprietà `text` che contiene il testo del commento. Solo `text` dovrebbe essere modificato per includere la traduzione del corrispondente commento inglese. +There are separate comment dictionaries for each language. The [English version of the comment dictionary](/curriculum/dictionaries/english/comments.js) is the basis for the translations found in the corresponding non-English versions of the files. The non-English version of the Chinese comment dictionary would be located at `/curriculum/dictionaries/chinese/comments.js`. Each dictionary consists of an array of objects with a unique `id` property and a `text` property. Only the `text` should be modified to encompass the translation of the corresponding English comment. -Alcuni commenti potrebbero contenere delle parole o frasi che non devono essere tradotte. Per esempio, nomi di variabili o nomi propri di librerie come "React" non dovrebbero essere tradotti. Vedi il commento seguente come esempio. La parola `myGlobal` non deve essere tradotta. +Some comments may contain a word/phrase that should not be translated. For example, variable names or proper library names like "React" should not be translated. See the comment below as an example. The word `myGlobal` should not be translated. ```text Declare the myGlobal variable below this line @@ -378,13 +382,13 @@ Declare the myGlobal variable below this line ## Suggerimenti e soluzioni -Ogni sfida ha un pulsante `Get a Hint` (Ottieni un suggerimento), cosicché un utente possa avere accesso a suggerimenti e soluzioni che sono stati creati per la sfida. I suggerimenti e le soluzioni del curriculum si trovano nei topic [del nostro forum](https://forum.freecodecamp.org/c/guide) nella categoria `Guide`. +Each challenge has a `Get a Hint` button, so a user can access any hints/solutions which have been created for the challenge. Curriculum hints/solutions topics are located on [our forum](https://forum.freecodecamp.org/c/guide) under the `Guide` category. -Se trovi un problema con i suggerimenti e le soluzioni delle sfide puoi inviare i tuoi suggerimenti aprendo un topic nella [categoria contributors](https://forum.freecodecamp.org/c/contributors) sul forum. Moderatori e utenti con un livello di fiducia 3 rivedranno i tuoi commenti e decideranno se includere o meno i cambiamenti nel topic corrispondente. +If you find a problem with an existing challenge's hints/solutions topic, you can make suggestions in the [contributors category](https://forum.freecodecamp.org/c/contributors) on the forum. Moderators and users with trust level 3 will review the comments and decide whether or not to include the changes in the corresponding hint/solutions topic. ### Aggiungere nuovi topic per i suggerimenti e le soluzioni delle sfide -Segui i seguenti step quando crei un nuovo topic per le soluzioni e i suggerimenti di una sfida. +Take the following steps when adding a new challenge hints/solutions related topic. 1. Inizia seguendo gli stessi passaggi per creare un nuovo argomento, ma rivedi il successivo per creare il titolo. 2. Il titolo dell'argomento dovrebbe iniziare con `freeCodeCamp Challenge Guide:` concatenato con il titolo effettivo della sfida del curriculum. Ad esempio, se la sfida è chiamata "`Chunky Monkey`", il titolo dell'argomento sarebbe "`freeCodeCamp Challenge Guide: Chunky Monkey`". @@ -393,7 +397,7 @@ Segui i seguenti step quando crei un nuovo topic per le soluzioni e i suggerimen ### Linee guida per il contenuto dei topic dei suggerimenti e delle soluzioni -Quando proponi una soluzione da aggiungere al topic relativo a una sfida, devi includere tutto il codice. Questo include sia il codice seed originale sia i cambiamenti necessari per superare i test. Dovresti usare il seguente template per creare nuovi topic per suggerimenti e soluzioni: +When proposing a solution for a curriculum challenge related Guide topic, the full code must be added. This includes all the original seed code plus any changes needed to pass all the challenge tests. The following template should be used when creating new hints/solutions topics: ````md # [Qui il nome della sfida] @@ -474,12 +478,12 @@ Puoi anche testare una sfida singola con i seguenti step: cd curriculum ``` -2. Esegui i seguenti comandi per ogni singolo file in cui hai fatto cambiamenti (rimpiazziando `challenge-title-goes-here` con il titolo intero della sfida): +2. Run the following for each challenge file for which you have changed (replacing `challenge-title-goes-here` with the full title of the challenge): ``` npm run test -- -g challenge-title-goes-here ``` -Una volta che avrai verificato che ogni sfida su cui hai lavorato passi i test, [per favore crea una pull request](how-to-open-a-pull-request.md). +Once you have verified that each challenge you've worked on passes the tests, [please create a pull request](how-to-open-a-pull-request.md). > [!TIP] Puoi impostare la variabile d'ambiente `LOCALE` nel file `.env` alla lingua usata nelle sfide che devi testare. > @@ -487,7 +491,7 @@ Una volta che avrai verificato che ogni sfida su cui hai lavorato passi i test, ### Link utili -Creare e modificare sfide: +Creating and Editing Challenges: 1. [Tipo della sfida (challenge type)](https://github.com/freeCodeCamp/freeCodeCamp/blob/main/client/utils/challenge-types.js#L1-L13) - cosa significa il tipo di sfida numerico (enum). diff --git a/docs/i18n/japanese/how-to-work-on-coding-challenges.md b/docs/i18n/japanese/how-to-work-on-coding-challenges.md index af03d7fd4b..36ade2941a 100644 --- a/docs/i18n/japanese/how-to-work-on-coding-challenges.md +++ b/docs/i18n/japanese/how-to-work-on-coding-challenges.md @@ -73,6 +73,10 @@ assert.equal( ); ``` +# --notes-- + +Extra information for a challenge, in markdown + # --seed-- ## --before-user-code-- diff --git a/docs/i18n/portuguese/how-to-work-on-coding-challenges.md b/docs/i18n/portuguese/how-to-work-on-coding-challenges.md index ff764ba282..2fe19fdbbe 100644 --- a/docs/i18n/portuguese/how-to-work-on-coding-challenges.md +++ b/docs/i18n/portuguese/how-to-work-on-coding-challenges.md @@ -73,6 +73,10 @@ assert.equal( ); ``` +# --notes-- + +Extra information for a challenge, in markdown + # --seed-- ## --before-user-code-- @@ -89,7 +93,7 @@ Código avaliado após o código do usuário, e pouco antes dos testes ## --seed-contents-- -Código Boilerplate para renderizar para o editor. Esta seção deve somente conter código dentro de crases, como o seguinte exemplo: +Boilerplate code to render to the editor. This section should only contain code inside backticks, like the following: ```html @@ -114,7 +118,7 @@ console.log('freeCodeCamp is awesome!'); # --solutions-- -Soluções são usadas para os testes CI a fim de garantir que mudanças nas dicas ainda passem conforme o esperado +Solutions are used for the CI tests to ensure that changes to the hints will still pass as intended ```js // primeira solução - a(s) linguagem(ns) deve(m) ser a mesma do código fornecido. @@ -134,27 +138,27 @@ Soluções são usadas para os testes CI a fim de garantir que mudanças nas dic # --question-- -Esses espaços são utilizados geralmente para questões de múltipla escolha dos desafios de Python. +These fields are currently used for the multiple-choice Python challenges. ## --text-- -O texto da pergunta vêm aqui. +The question text goes here. ## --answers-- -Resposta 1 +Answer 1 --- -Resposta 2 +Answer 2 --- -Mais respostas +More answers ## --video-solution-- -O número da resposta correta fica aqui. +The number for the correct answer goes here. ```` > [!NOTE] @@ -186,9 +190,9 @@ $ ObjectId() ObjectId("5a474d78df58bafeb3535d34") ```` -O resultado é um novo id, por exemplo `5a474d78df58bafeb3535d34` acima. +The result is a new id, for example `5a474d78df58bafeb3535d34` above. -Quando tiver seu id, coloque-o no arquivo markdown como campo `id` no topo, ex. +Once you have your id, put it into the markdown file as the `id` field at the top, e.g. ```yml --- @@ -198,13 +202,13 @@ title: Título do desafio ## Nomeando desafios -Nomear coisas é difícil. Nós facilitamos com algumas restrições. +Naming things is hard. We've made it easier by imposing some constraints. -Todos os títulos dos desafios devem estar explícitos e devem seguir este padrão: +All challenge titles should be explicit and should follow this pattern: -\[verb\]\[frase objetiva\] +\[verb\]\[object clause\] -Aqui estão alguns exemplos de nomes para desafios: +Here are some example challenge names: - Usar a notação de sentido horário para especificar o preenchimento (padding) de um elemento - Condensar arrays com .reduce @@ -212,19 +216,19 @@ Aqui estão alguns exemplos de nomes para desafios: ## Descrições/instruções do desafio -As frases devem ser claras e resumidas com o mínimo de termos técnicos. Se usado, o termo técnico deve ser imediatamente definido em inglês simples. +Sentences should be clear and concise with minimal jargon. If used, jargon should be immediately defined in plain English. -Mantenha os parágrafos curtos (em torno de 1-4 frases). É mais provável que as pessoas leiam vários parágrafos curtos do que um parágrafo enorme. +Keep paragraphs short (around 1-4 sentences). People are more likely to read several short paragraphs than a wall of text. -O texto do desafio deve usar a segunda pessoa ("você") para ajudar a dar um tom de conversa. Dessa forma, o texto e as instruções parecem falar diretamente ao usuário freeCodeCamp que está resolvendo o desafio. Tente evitar usar a primeira pessoa ("eu", "nós", "vamos"). +Challenge text should use the second person ("you") to help to give it a conversational tone. This way the text and instructions seem to speak directly to the camper working through the challenge. Try to avoid using the first person ("I", "we", "let's", and "us"). -Não use links externos. Eles interrompem o fluxo. Os usuários freeCodeCamp nunca devem precisar pesquisar nada no Google durante esses desafios. Se há recursos que você acha que os usuários irão se beneficiar, adicione-os no artigo relacionado ao guia do desafio. +Don't use outbound links. These interrupt the flow. Campers should never have to google anything during these challenges. If there are resources you think campers would benefit from, add them to the challenge's Guide-related article. -Você pode adicionar diagramas se necessário. +You can add diagrams if necessary. -Não use emojis ou emoticons em desafios. O freeCodeCamp possui uma comunidade global, e o significado cultural de um emoji ou emoticon pode ser diferente ao redor do mundo. Além disso, emojis podem ser mostrados de maneiras diferentes em diferentes sistemas. +Don't use emojis or emoticons in challenges. freeCodeCamp has a global community, and the cultural meaning of an emoji or emoticon may be different around the world. Also, emojis can render differently on different systems. -Substantivos próprios devem começar com letra maiúscula quando possível. Abaixo está uma lista de palavras e como devem aparecem nos desafios. +Proper nouns should use correct capitalization when possible. Below is a list of words as they should appear in the challenges. - JavaScript (letras maiúsculas em "J" e "S" e sem abreviações) - Node.js @@ -232,28 +236,28 @@ Substantivos próprios devem começar com letra maiúscula quando possível. Aba ### A regra dos 2 minutos -Cada desafio deve ser resolvido em 120 segundos por um nativo da língua inglesa que tenha concluído os desafios anteriores. Isso inclui a quantidade de tempo que leva para ler as instruções, entender o código fornecido, escrever o código e passar nos testes. +Each challenge should be solvable within 120 seconds by a native English speaker who has completed the challenges leading up to it. This includes the amount of time it takes to read the directions/instructions understand the seeded code, write their code and get all the tests to pass. -Se levar mais do que dois minutos para completar um desafio, você tem duas opções: +If it takes longer than two minutes to complete the challenge, you have two options: - Simplifique o desafio, ou - Divida o desafio em dois desafios. -A regra dos 2 minutos força quem criou o desafio a deixar as instruções resumidas, o código fornecido limpo e seus testes diretos. +The 2-minute rule forces you, the challenge designer, to make your directions concise, your seed code clear, and your tests straight-forward. -Acompanhamos quanto dura para os usuários resolverem mudanças e usamos essa informação para identificar desafios que precisam ser simplificados ou divididos. +We track how long it takes for campers to solve changes and use this information to identify challenges that need to be simplified or split. ### Modularidade -Cada desafio deve ensinar exatamente um conceito, e esse conceito deve estar aparente a partir do nome do desafio. +Each challenge should teach exactly one concept, and that concept should be apparent from the challenge's name. -Podemos reforçar conceitos citados anteriormente através de repetição e variações - por exemplo, introduzir elementos h1 em um desafio, então elementos h3 depois. +We can reinforce previously covered concepts through repetition and variations - for example, introducing h1 elements in one challenge, then h3 elements a few challenges later. -Nossa meta é ter vários desafios de 2 minutos. Eles podem se completar e relembrar conceitos anteriormente citados. +Our goal is to have thousands of 2-minute challenges. These can flow together and reiterate previously-covered concepts. ### Formatando o texto do desafio -Aqui estão diretrizes de formatação específicas para o texto do desafio e exemplos: +Here are specific formatting guidelines for challenge text and examples: - Palavras chaves da linguagem ficam entre `` \` `` crases. Por exemplo, nomes de tags HTML ou nomes de propriedade CSS. - Referências a códigos (ex. função, método ou nomes de variáveis) devem estar entre `` \` ``. Veja o exemplo abaixo: @@ -266,9 +270,9 @@ Use `parseInt` para converter a variável `realNumber` em um número inteiro. - Blocos de código com várias linhas **devem ser precedidos por uma linha vazia**. A próxima linha deve começar com três crases seguidas imediatamente por uma das [linguagens suportadas](https://prismjs.com/#supported-languages). Para completar o bloco de código, você deve começar uma nova linha que apenas possui três crases e **outra linha vazia**. Veja o exemplo abaixo: - Os espaços importam no Markdown. Então, recomendamos que os mantenham visíveis no seu editor. -**Observação:** se você for usar um exemplo de códigoem YAML, use `yaml` ao invés de `yml` para a linguagem na direita das crases. +**Note:** If you are going to use an example code in YAML, use `yaml` instead of `yml` for the language to the right of the backticks. -A seguir um exemplo do código: +The following is an example of code: ````md ```{language} @@ -315,13 +319,13 @@ Exemplo de um comentário de uma linha em JavaScript: // Mude somente abaixo dessa linha ```` -Exemplo de um comentário válido em CSS: +Example of a valid CSS comment: ```css /* Only change code above this line */ ``` -Se um desafio tem apenas um lugar onde as mudanças de código são necessárias, use os comentários seguindo o exemplo a seguir para instruir o usuário sobre o local onde as mudanças devem ser feitas. +If a challenge only has a single place where code changes are needed, please use the comments in the following example to instruct the user where changes should be made. ```js var a = 3; @@ -334,7 +338,7 @@ b = 9 + b; c = c + 7; ``` -Se um desafio tem múltiplos lugares onde se espera que o usuário faça mudanças no código (ex. os desafios de React) +If a challenge has multiple places where the user is expected to change code (i.e. the React challenges) ```jsx class MyComponent extends React.Component { @@ -367,9 +371,9 @@ class MyComponent extends React.Component { ### Tradução de comentários de código seed -Existem dicionários de comentários separados para cada linguagem. A [versão em inglês do dicionário de comentários](/curriculum/dictionaries/english/comments.js) é a base para as traduções encontradas nas versões correspondentes dos arquivos em outros idiomas. A versão não inglesa do dicionário de comentário chinesa pode ser encontrada em `/curriculum/dictionaries/chinese/comments.js`. Cada dicionário consiste em um array de objetos com uma propriedade de `id` única e uma propriedade de `text`. Somente a propriedade `text` deve ser modificada para englobar a tradução do comentário correspondente em inglês. +There are separate comment dictionaries for each language. The [English version of the comment dictionary](/curriculum/dictionaries/english/comments.js) is the basis for the translations found in the corresponding non-English versions of the files. The non-English version of the Chinese comment dictionary would be located at `/curriculum/dictionaries/chinese/comments.js`. Each dictionary consists of an array of objects with a unique `id` property and a `text` property. Only the `text` should be modified to encompass the translation of the corresponding English comment. -Alguns comentários podem conter uma palavra/frase que não deve ser traduzida. Por exemplo, nomes de variáveis, ou nomes próprios de bibliotecas como "React" não devem ser traduzidas. Veja o comentário abaixo como um exemplo. a palavra `myGlobal` não deve ser traduzida. +Some comments may contain a word/phrase that should not be translated. For example, variable names or proper library names like "React" should not be translated. See the comment below as an example. The word `myGlobal` should not be translated. ```text Declare a variável myGlobal abaixo desta linha @@ -381,13 +385,13 @@ Declare a variável myGlobal abaixo desta linha ## Dicas e soluções -Cada desafio tem um botão `Get a Hint`, assim, o usuário pode acessar qualquer dica/solução que foi criada para aquele desafio. Os tópicos de dicas/soluções são encontrados no [nosso fórum](https://forum.freecodecamp.org/c/guide), abaixo da categoria `Guide`. +Each challenge has a `Get a Hint` button, so a user can access any hints/solutions which have been created for the challenge. Curriculum hints/solutions topics are located on [our forum](https://forum.freecodecamp.org/c/guide) under the `Guide` category. -Se você encontrar um problema nas dicas/tópicos de solução de um desafio existente, você pode fazer sugestões na [categoria de contribuidores](https://forum.freecodecamp.org/c/contributors) no fórum. Os moderadores e usuários com o nível de confiança 3 vão revisar os comentários e decidir quais incluir as mudanças nos tópicos correspondentes de dicas/soluções. +If you find a problem with an existing challenge's hints/solutions topic, you can make suggestions in the [contributors category](https://forum.freecodecamp.org/c/contributors) on the forum. Moderators and users with trust level 3 will review the comments and decide whether or not to include the changes in the corresponding hint/solutions topic. ### Adicionando um novo tópico de dicas/soluções em um desafio -Faça o passo-a-passo a seguir quando for adicionar novos tópicos de dicas/soluções relacionadas a um desafio. +Take the following steps when adding a new challenge hints/solutions related topic. 1. Comece seguindo os mesmos passos para criar um novo tópico, mas revise o seguinte para criar o título. 2. O título do tópico deve começar com `freeCodeCamp Challenge Guide:` concatenado com o título atual do desafio de currículo. Por exemplo, se o desafio é chamado "`Chunky Monkey`", o título do tópico seria "`freeCodeCamp Challenge Guide: Chunky Monkey`". @@ -396,7 +400,7 @@ Faça o passo-a-passo a seguir quando for adicionar novos tópicos de dicas/solu ### Diretrizes para o conteúdo dos tópicos de dicas e soluções -Ao propor uma solução para um tópico do guia relacionado a um desafio de currículo, o código completo deve ser adicionado. Isso inclui todo o código seed original, assim como as alterações necessárias para passar em todos os testes do desafio. O modelo a seguir deve ser usado ao criar um novo tópico de dicas/soluções: +When proposing a solution for a curriculum challenge related Guide topic, the full code must be added. This includes all the original seed code plus any changes needed to pass all the challenge tests. The following template should be used when creating new hints/solutions topics: ````md # O nome do desafio fica aqui @@ -477,12 +481,12 @@ Você também é capaz de testar um desafio individualmente seguindo as seguinte cd curriculum ``` -2. Execute o comando a seguir para cada arquivo de desafio que você fez mudanças (substituindo `challenge-title-goes-here` com o título completo do desafio): +2. Run the following for each challenge file for which you have changed (replacing `challenge-title-goes-here` with the full title of the challenge): ``` npm run test -- -g challenge-title-goes-here ``` -Quando você verificou que cada desafio modificado passou nos testes, [crie um pull request](how-to-open-a-pull-request.md). +Once you have verified that each challenge you've worked on passes the tests, [please create a pull request](how-to-open-a-pull-request.md). > [!TIP] Você pode definir a variável de ambiente `LOCALE` no `.env` no idioma do(s) desafio(s) que precisa testar. > @@ -490,7 +494,7 @@ Quando você verificou que cada desafio modificado passou nos testes, [crie um p ### Links úteis -Criando e editando desafios: +Creating and Editing Challenges: 1. [Tipos de desafio](https://github.com/freeCodeCamp/freeCodeCamp/blob/main/client/utils/challenge-types.js#L1-L13) - o que significam os valores do tipo de desafio numérico (enum). diff --git a/docs/i18n/ukrainian/how-to-work-on-coding-challenges.md b/docs/i18n/ukrainian/how-to-work-on-coding-challenges.md index af03d7fd4b..36ade2941a 100644 --- a/docs/i18n/ukrainian/how-to-work-on-coding-challenges.md +++ b/docs/i18n/ukrainian/how-to-work-on-coding-challenges.md @@ -73,6 +73,10 @@ assert.equal( ); ``` +# --notes-- + +Extra information for a challenge, in markdown + # --seed-- ## --before-user-code-- From 9f0e26fddb637f3793b9dd6e22fe6529d44f134b Mon Sep 17 00:00:00 2001 From: "Nicholas Carrigan (he/him)" Date: Fri, 10 Dec 2021 09:39:02 -0800 Subject: [PATCH 09/63] docs: update steps to enable translation (#44464) --- docs/how-to-test-translations-locally.md | 83 +++++++++++++----------- 1 file changed, 46 insertions(+), 37 deletions(-) diff --git a/docs/how-to-test-translations-locally.md b/docs/how-to-test-translations-locally.md index 0602f4b214..2c95e2956c 100644 --- a/docs/how-to-test-translations-locally.md +++ b/docs/how-to-test-translations-locally.md @@ -9,9 +9,10 @@ If you would like to test your translations on a local instance of the freeCodeC There are a few steps to take in order to allow the codebase to build in your desired language. -First, visit the `config/i18n/all-langs.js` file to add the language to the available languages list and configure the values. There are four objects here. +First, visit the `config/i18n/all-langs.ts` file to add the language to the available languages list and configure the values. There are four objects here. - `availableLangs`: For both the `client` and `curriculum` arrays, add the text name of the language. This is the value that will be used in the `.env` file later. +- `auditedCerts`: Add the text name of the language as the _key_, and add an array of `SuperBlocks.{cert}` variables as the _value_. This tells the client which certifications are fully translated. - `i18nextCodes`: These are the ISO language codes for each language. You will need to add the appropriate ISO code for the language you are enabling. These do need to be unique for each language. - `langDisplayNames`: These are the display names for the language selector in the navigation menu. - `langCodes`: These are the language codes used for formatting dates and numbers. These should be Unicode CLDR codes instead of ISO codes. @@ -30,6 +31,45 @@ const availableLangs = { ] }; +export const auditedCerts = { + espanol: [ + SuperBlocks.RespWebDesign, + SuperBlocks.JsAlgoDataStruct, + SuperBlocks.FrontEndDevLibs, + SuperBlocks.DataVis, + SuperBlocks.BackEndDevApis + ], + chinese: [ + SuperBlocks.RespWebDesign, + SuperBlocks.JsAlgoDataStruct, + SuperBlocks.FrontEndDevLibs, + SuperBlocks.DataVis, + SuperBlocks.BackEndDevApis, + SuperBlocks.QualityAssurance, + SuperBlocks.SciCompPy, + SuperBlocks.DataAnalysisPy, + SuperBlocks.InfoSec, + SuperBlocks.MachineLearningPy + ], + 'chinese-traditional': [ + SuperBlocks.RespWebDesign, + SuperBlocks.JsAlgoDataStruct, + SuperBlocks.FrontEndDevLibs, + SuperBlocks.DataVis, + SuperBlocks.BackEndDevApis, + SuperBlocks.QualityAssurance, + SuperBlocks.SciCompPy, + SuperBlocks.DataAnalysisPy, + SuperBlocks.InfoSec, + SuperBlocks.MachineLearningPy + ], + dothraki: [ + SuperBlocks.RespWebDesign, + SuperBlocks.JsAlgoDataStruct, + SuperBlocks.FrontEndDevLibs + ] +}; + const i18nextCodes = { english: 'en', espanol: 'es', @@ -55,10 +95,13 @@ const langCodes = { }; ``` -Next, open the `client/src/utils/algolia-locale-setup.js` file. This data is used for the search bar that loads `/news` articles. While it is unlikely that you are going to test this functionality, missing the data for your language can lead to errors when attempting to build the codebase locally. +Next, open the `client/src/utils/algolia-locale-setup.ts` file. This data is used for the search bar that loads `/news` articles. While it is unlikely that you are going to test this functionality, missing the data for your language can lead to errors when attempting to build the codebase locally. Add an object for your language to the `algoliaIndices` object. You should use the values for the `english` object for local testing, replacing the `english` key with your language's `availableLangs` value. +> [!NOTE] +> If we have already deployed an instance of news in your target language, you can update the values to reflect the live instance. Otherwise, use the English values. + If you were to add Dothraki: ```js @@ -86,40 +129,6 @@ const algoliaIndices = { }; ``` -Next, you will need to tell the client which certifications are translated, and which are still in English. Open the `utils/is-audited.js` file. Within the `auditedCerts`, add a new key with your language's `availableLangs` value. Assign the value of that key to an array containing the _dashed names_ for the certifications that have been translated. Refer to the existing data for those dashed names. - -Continuing the work to enable Dothraki - we have translated the first three certifications: - -```js -const auditedCerts = { - espanol: [ - 'responsive-web-design', - 'javascript-algorithms-and-data-structures' - ], - chinese: [ - 'responsive-web-design', - 'javascript-algorithms-and-data-structures', - 'front-end-development-libraries', - 'data-visualization', - 'back-end-development-and-apis', - 'quality-assurance' - ], - 'chinese-traditional': [ - 'responsive-web-design', - 'javascript-algorithms-and-data-structures', - 'front-end-development-libraries', - 'data-visualization', - 'back-end-development-and-apis', - 'quality-assurance' - ], - dothraki: [ - 'responsive-web-design', - 'javascript-algorithms-and-data-structures', - 'front-end-development-libraries' - ] -}; -``` - Finally, in your `.env` file, set `CLIENT_LOCALE` and `CURRICULUM_LOCALE` to your new language (use the `availableLangs` value.) ```txt @@ -144,7 +153,7 @@ For the video challenges, you need to change a few things. First add the new loc ... ``` -Then add an id for the new language to any video challenge in an audited block. For example, if `auditedCerts` in `all-langs.js` includes `scientific-computing-with-python` for `dothraki`, then you must add a `dothraki` entry in `videoLocaleIds`. The frontmatter should then look like this: +Then add an id for the new language to any video challenge in an audited block. For example, if `auditedCerts` in `all-langs.ts` includes `scientific-computing-with-python` for `dothraki`, then you must add a `dothraki` entry in `videoLocaleIds`. The frontmatter should then look like this: ```yml videoLocaleIds: From 32e59efb234b7ab2c7e1cb918a78f44cb4c0adcf Mon Sep 17 00:00:00 2001 From: Mrugesh Mohapatra <1884376+raisedadead@users.noreply.github.com> Date: Fri, 10 Dec 2021 23:16:05 +0530 Subject: [PATCH 10/63] docs: enable ukrainian docs (#44450) --- docs/_translations.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/_translations.md b/docs/_translations.md index 8aac1485d7..e3439aa2c5 100644 --- a/docs/_translations.md +++ b/docs/_translations.md @@ -14,6 +14,7 @@ - [Japanese](/i18n/japanese/index.md) - [Portuguese](/i18n/portuguese/index.md) - [Italian](/i18n/italian/index.md) +- [Ukrainian](/i18n/ukrainian/index.md) From 6fe6bab4a5ef5bd3e5db3f0bf027ed12265da050 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 10 Dec 2021 18:48:09 +0000 Subject: [PATCH 11/63] fix(deps): update dependency @stripe/stripe-js to v1.22.0 --- client/package.json | 2 +- package-lock.json | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/client/package.json b/client/package.json index 86ad1481e0..df926acc3a 100644 --- a/client/package.json +++ b/client/package.json @@ -51,7 +51,7 @@ "@loadable/component": "5.15.0", "@reach/router": "1.3.4", "@stripe/react-stripe-js": "1.6.0", - "@stripe/stripe-js": "1.21.2", + "@stripe/stripe-js": "1.22.0", "@types/react-scrollable-anchor": "0.6.1", "algoliasearch": "4.11.0", "assert": "2.0.0", diff --git a/package-lock.json b/package-lock.json index 76354593ea..91b23bc535 100644 --- a/package-lock.json +++ b/package-lock.json @@ -219,7 +219,7 @@ "@loadable/component": "5.15.0", "@reach/router": "1.3.4", "@stripe/react-stripe-js": "1.6.0", - "@stripe/stripe-js": "1.21.2", + "@stripe/stripe-js": "1.22.0", "@types/react-scrollable-anchor": "0.6.1", "algoliasearch": "4.11.0", "assert": "2.0.0", @@ -14001,9 +14001,9 @@ } }, "node_modules/@stripe/stripe-js": { - "version": "1.21.2", - "resolved": "https://registry.npmjs.org/@stripe/stripe-js/-/stripe-js-1.21.2.tgz", - "integrity": "sha512-iIXe+XF9XdyO4/1i+TPRdsjy4rFOkYLeCsmB/uuSrCVs+Y0nxCdaRK3oD6n7c7lEi1sxDbAQX615wlt9E4EqWQ==" + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/@stripe/stripe-js/-/stripe-js-1.22.0.tgz", + "integrity": "sha512-fm8TR8r4LwbXgBIYdPmeMjJJkxxFC66tvoliNnmXOpUgZSgQKoNPW3ON0ZphZIiif1oqWNhAaSrr7tOvGu+AFg==" }, "node_modules/@szmarczak/http-timer": { "version": "4.0.6", @@ -57686,7 +57686,7 @@ "@loadable/component": "5.15.0", "@reach/router": "1.3.4", "@stripe/react-stripe-js": "1.6.0", - "@stripe/stripe-js": "1.21.2", + "@stripe/stripe-js": "1.22.0", "@testing-library/jest-dom": "5.16.1", "@testing-library/react": "12.1.2", "@types/react-scrollable-anchor": "0.6.1", @@ -66552,9 +66552,9 @@ } }, "@stripe/stripe-js": { - "version": "1.21.2", - "resolved": "https://registry.npmjs.org/@stripe/stripe-js/-/stripe-js-1.21.2.tgz", - "integrity": "sha512-iIXe+XF9XdyO4/1i+TPRdsjy4rFOkYLeCsmB/uuSrCVs+Y0nxCdaRK3oD6n7c7lEi1sxDbAQX615wlt9E4EqWQ==" + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/@stripe/stripe-js/-/stripe-js-1.22.0.tgz", + "integrity": "sha512-fm8TR8r4LwbXgBIYdPmeMjJJkxxFC66tvoliNnmXOpUgZSgQKoNPW3ON0ZphZIiif1oqWNhAaSrr7tOvGu+AFg==" }, "@szmarczak/http-timer": { "version": "4.0.6", From a2f799866f7aba24c95f667d5491c5aea6355588 Mon Sep 17 00:00:00 2001 From: Mrugesh Mohapatra <1884376+raisedadead@users.noreply.github.com> Date: Sat, 11 Dec 2021 02:41:52 +0530 Subject: [PATCH 12/63] feat(learn): enable ukrainian certifications (#44454) * feat(learn): enable ukrainian certifications * fix: add algolia config * chore: apply suggestions from code review Co-authored-by: Nicholas Carrigan --- client/src/utils/algolia-locale-setup.ts | 4 ++++ config/i18n/all-langs.ts | 29 ++++++++++++++++++++---- 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/client/src/utils/algolia-locale-setup.ts b/client/src/utils/algolia-locale-setup.ts index 5cbec735b1..a5cd08e4a3 100644 --- a/client/src/utils/algolia-locale-setup.ts +++ b/client/src/utils/algolia-locale-setup.ts @@ -29,6 +29,10 @@ const algoliaIndices = { portuguese: { name: 'news', searchPage: 'https://www.freecodecamp.org/news/search/' + }, + ukrainian: { + name: 'news', + searchPage: 'https://www.freecodecamp.org/news/search/' } }; diff --git a/config/i18n/all-langs.ts b/config/i18n/all-langs.ts index b2eba86d7b..667e03a8c3 100644 --- a/config/i18n/all-langs.ts +++ b/config/i18n/all-langs.ts @@ -15,7 +15,8 @@ export const availableLangs = { 'chinese', 'chinese-traditional', 'italian', - 'portuguese' + 'portuguese', + 'ukrainian' ], curriculum: [ 'english', @@ -23,7 +24,8 @@ export const availableLangs = { 'chinese', 'chinese-traditional', 'italian', - 'portuguese' + 'portuguese', + 'ukrainian' ] }; @@ -92,6 +94,20 @@ export const auditedCerts = { SuperBlocks.MachineLearningPy, SuperBlocks.CodingInterviewPrep, SuperBlocks.RelationalDb + ], + ukrainian: [ + SuperBlocks.RespWebDesign, + SuperBlocks.JsAlgoDataStruct, + SuperBlocks.FrontEndDevLibs, + SuperBlocks.DataVis, + SuperBlocks.BackEndDevApis, + SuperBlocks.QualityAssurance, + SuperBlocks.SciCompPy, + SuperBlocks.DataAnalysisPy, + SuperBlocks.InfoSec, + SuperBlocks.MachineLearningPy, + SuperBlocks.CodingInterviewPrep, + SuperBlocks.RelationalDb ] }; @@ -109,7 +125,8 @@ export const i18nextCodes = { chinese: 'zh', 'chinese-traditional': 'zh-Hant', italian: 'it', - portuguese: 'pt-BR' + portuguese: 'pt-BR', + ukrainian: 'uk' }; // These are for the language selector dropdown menu in the footer @@ -119,7 +136,8 @@ export const langDisplayNames = { chinese: '中文(简体字)', 'chinese-traditional': '中文(繁體字)', italian: 'Italiano', - portuguese: 'Português' + portuguese: 'Português', + ukrainian: 'Українська' }; /* These are for formatting dates and numbers. Used with JS .toLocaleString(). @@ -132,5 +150,6 @@ export const langCodes = { chinese: 'zh', 'chinese-traditional': 'zh-Hant', italian: 'it', - portuguese: 'pt-BR' + portuguese: 'pt-BR', + ukrainian: 'uk' }; From 6ce8738fc013bb830bd467d223f7bea8fab42c3f Mon Sep 17 00:00:00 2001 From: Oliver Eyton-Williams Date: Fri, 10 Dec 2021 23:35:46 +0100 Subject: [PATCH 13/63] refactor: remove useless warning (#44465) --- client/package.json | 2 +- tools/challenge-parser/translation-parser/index.js | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/client/package.json b/client/package.json index df926acc3a..505718776c 100644 --- a/client/package.json +++ b/client/package.json @@ -24,7 +24,7 @@ "build:workers": "cross-env NODE_OPTIONS=\"--max-old-space-size=7168\" webpack --config ./webpack-workers.js", "clean": "gatsby clean", "predevelop": "tsc -p ../tools/ && node ../tools/scripts/build/ensure-env.js && npm run build:workers -- --env development", - "develop": "cross-env NODE_OPTIONS=\"--max-old-space-size=4000\" gatsby develop --inspect=9230", + "develop": "cross-env NODE_OPTIONS=\"--max-old-space-size=5000\" gatsby develop --inspect=9230", "lint": "node ./i18n/schema-validation.js", "serve": "gatsby serve -p 8000", "serve-ci": "serve -l 8000 -c ../serve.json public", diff --git a/tools/challenge-parser/translation-parser/index.js b/tools/challenge-parser/translation-parser/index.js index 4283cfd205..841272650d 100644 --- a/tools/challenge-parser/translation-parser/index.js +++ b/tools/challenge-parser/translation-parser/index.js @@ -17,9 +17,7 @@ exports.translateComments = (text, lang, dict, codeLang) => { exports.translateCommentsInChallenge = (challenge, lang, dict) => { const challClone = cloneDeep(challenge); - if (!challClone.challengeFiles) { - console.warn(`Challenge ${challClone.title} has no seed to translate`); - } else { + if (challClone?.challengeFiles) { challClone.challengeFiles.forEach(challengeFile => { if (challengeFile.contents) { let { text, commentCounts } = this.translateComments( From 8fb945c5a89039b5544571fda62e443725135f96 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 10 Dec 2021 22:39:39 +0000 Subject: [PATCH 14/63] fix(deps): update dependency react-i18next to v11.15.0 --- client/package.json | 2 +- package-lock.json | 24 ++++++++++++------------ 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/client/package.json b/client/package.json index 505718776c..bf8ca18bbc 100644 --- a/client/package.json +++ b/client/package.json @@ -98,7 +98,7 @@ "react-ga": "3.3.0", "react-helmet": "6.1.0", "react-hotkeys": "2.0.0", - "react-i18next": "11.14.3", + "react-i18next": "11.15.0", "react-instantsearch-dom": "6.17.0", "react-lazy-load": "3.1.13", "react-monaco-editor": "0.40.0", diff --git a/package-lock.json b/package-lock.json index 91b23bc535..699321f40a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -266,7 +266,7 @@ "react-ga": "3.3.0", "react-helmet": "6.1.0", "react-hotkeys": "2.0.0", - "react-i18next": "11.14.3", + "react-i18next": "11.15.0", "react-instantsearch-dom": "6.17.0", "react-lazy-load": "3.1.13", "react-monaco-editor": "0.40.0", @@ -31258,8 +31258,7 @@ "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" }, "node_modules/html-minifier-terser": { "version": "6.1.0", @@ -45153,11 +45152,12 @@ } }, "node_modules/react-i18next": { - "version": "11.14.3", - "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-11.14.3.tgz", - "integrity": "sha512-Hf2aanbKgYxPjG8ZdKr+PBz9sY6sxXuZWizxCYyJD2YzvJ0W9JTQcddVEjDaKyBoCyd3+5HTerdhc9ehFugc6g==", + "version": "11.15.0", + "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-11.15.0.tgz", + "integrity": "sha512-7JOIO7KkKSxB7Ycof6ilx9aQ/tviInTqN2sqHyKrjd5MKHyFyKyXVkYrb7KmG/ISFPA4ugWwor5Qsq8IVyQ/Cg==", "dependencies": { "@babel/runtime": "^7.14.5", + "html-escaper": "^2.0.2", "html-parse-stringify": "^3.0.1" }, "peerDependencies": { @@ -57743,7 +57743,7 @@ "react-ga": "3.3.0", "react-helmet": "6.1.0", "react-hotkeys": "2.0.0", - "react-i18next": "11.14.3", + "react-i18next": "11.15.0", "react-instantsearch-dom": "6.17.0", "react-lazy-load": "3.1.13", "react-monaco-editor": "0.40.0", @@ -80369,8 +80369,7 @@ "html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" }, "html-minifier-terser": { "version": "6.1.0", @@ -90868,11 +90867,12 @@ } }, "react-i18next": { - "version": "11.14.3", - "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-11.14.3.tgz", - "integrity": "sha512-Hf2aanbKgYxPjG8ZdKr+PBz9sY6sxXuZWizxCYyJD2YzvJ0W9JTQcddVEjDaKyBoCyd3+5HTerdhc9ehFugc6g==", + "version": "11.15.0", + "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-11.15.0.tgz", + "integrity": "sha512-7JOIO7KkKSxB7Ycof6ilx9aQ/tviInTqN2sqHyKrjd5MKHyFyKyXVkYrb7KmG/ISFPA4ugWwor5Qsq8IVyQ/Cg==", "requires": { "@babel/runtime": "^7.14.5", + "html-escaper": "^2.0.2", "html-parse-stringify": "^3.0.1" } }, From 48f88428e84583337cb5ff58ec0c6574a0876569 Mon Sep 17 00:00:00 2001 From: Oliver Eyton-Williams Date: Sat, 11 Dec 2021 10:04:16 +0100 Subject: [PATCH 15/63] test: login more directly (#44467) * test: login more directly * test: separate login from other visits In a single test, Cypress can only visit within a single domain, hence the separation. * chore: fail slowly for all strategies * test: user certified user for showing cert * test: fix and cleanup certifications --- .github/workflows/cypress.yml | 1 + .github/workflows/node.js-tests-upcoming.yml | 2 + .github/workflows/node.js-tests.yml | 4 + cypress/integration/ShowCertification.js | 90 +++---------------- .../integration/learn/challenges/projects.js | 4 +- .../learn/common-components/navbar.js | 46 ++++++---- .../integration/settings/certifications.js | 73 ++++++--------- cypress/integration/settings/settings.js | 4 +- .../integration/settings/username-change.js | 21 ++++- cypress/support/commands.js | 10 +-- tools/scripts/seed/certifiedUserData.js | 2 +- 11 files changed, 100 insertions(+), 157 deletions(-) diff --git a/.github/workflows/cypress.yml b/.github/workflows/cypress.yml index f6cecb798a..52e277b419 100644 --- a/.github/workflows/cypress.yml +++ b/.github/workflows/cypress.yml @@ -62,6 +62,7 @@ jobs: runs-on: ubuntu-20.04 needs: build-client strategy: + fail-fast: false matrix: browsers: [chrome, firefox, electron] node-version: [16.x] diff --git a/.github/workflows/node.js-tests-upcoming.yml b/.github/workflows/node.js-tests-upcoming.yml index 8d45e5ef7d..ca3254ae99 100644 --- a/.github/workflows/node.js-tests-upcoming.yml +++ b/.github/workflows/node.js-tests-upcoming.yml @@ -15,6 +15,7 @@ jobs: runs-on: ubuntu-20.04 strategy: + fail-fast: false matrix: node-version: [16.x] @@ -47,6 +48,7 @@ jobs: runs-on: ubuntu-20.04 strategy: + fail-fast: false matrix: node-version: [16.x] diff --git a/.github/workflows/node.js-tests.yml b/.github/workflows/node.js-tests.yml index 0e6aae4e76..9d6f8a81b4 100644 --- a/.github/workflows/node.js-tests.yml +++ b/.github/workflows/node.js-tests.yml @@ -10,6 +10,7 @@ jobs: runs-on: ubuntu-20.04 strategy: + fail-fast: false matrix: node-version: [16.x] @@ -39,6 +40,7 @@ jobs: runs-on: ubuntu-20.04 strategy: + fail-fast: false matrix: node-version: [16.x] @@ -70,6 +72,7 @@ jobs: runs-on: ubuntu-20.04 strategy: + fail-fast: false matrix: node-version: [16.x] @@ -103,6 +106,7 @@ jobs: runs-on: ubuntu-20.04 strategy: + fail-fast: false matrix: node-version: [16.x] locale: [chinese, espanol] diff --git a/cypress/integration/ShowCertification.js b/cypress/integration/ShowCertification.js index eaad82c898..c740d17325 100644 --- a/cypress/integration/ShowCertification.js +++ b/cypress/integration/ShowCertification.js @@ -1,112 +1,44 @@ -import { SuperBlocks } from '../../config/certification-settings'; - -const certificationUrl = '/certification/developmentuser/responsive-web-design'; -const projects = { - superBlock: SuperBlocks.RespWebDesign, - block: 'responsive-web-design-projects', - challenges: [ - { - slug: 'build-a-tribute-page', - solution: 'https://codepen.io/moT01/pen/ZpJpKp' - }, - { - slug: 'build-a-survey-form', - solution: 'https://codepen.io/moT01/pen/LrrjGz?editors=1010' - }, - { - slug: 'build-a-product-landing-page', - solution: 'https://codepen.io/moT01/full/qKyKYL/' - }, - { - slug: 'build-a-technical-documentation-page', - solution: 'https://codepen.io/moT01/full/JBvzNL/' - }, - { - slug: 'build-a-personal-portfolio-webpage', - solution: 'https://codepen.io/moT01/pen/vgOaoJ' - } - ] -}; +const certifiedUser = '/certification/certifieduser/responsive-web-design'; describe('A certification,', function () { before(() => { - cy.exec('npm run seed'); - cy.login(); - - // submit projects for certificate - const { superBlock, block, challenges } = projects; - challenges.forEach(({ slug, solution }) => { - const url = `/learn/${superBlock}/${block}/${slug}`; - cy.visit(url); - cy.get('#dynamic-front-end-form') - .get('#solution') - .type(solution, { force: true, delay: 0 }); - cy.contains("I've completed this challenge") - .should('not.be.disabled') - .click(); - cy.contains('Submit and go to next challenge').click().wait(1000); - }); - cy.get('.donation-modal').should('be.visible'); - cy.visit('/settings'); - - // set user settings to public to claim a cert - cy.get('label:contains(Public)>input').each(el => { - if (!/toggle-active/.test(el[0].parentElement.className)) { - cy.wrap(el).click({ force: true }); - cy.wait(1000); - } - }); - - // if honest policy not accepted - cy.get('.honesty-policy button').then(btn => { - if (btn[0].innerText === 'Agree') { - btn[0].click({ force: true }); - cy.wait(1000); - } - }); - - // claim certificate - cy.get('a[href*="developmentuser/responsive-web-design"]').click({ - force: true - }); + cy.exec('npm run seed:certified-user'); }); describe('while viewing your own,', function () { - before(() => { + beforeEach(() => { cy.login(); - cy.visit(certificationUrl); }); - it('should render a LinkedIn button', function () { + cy.visit(certifiedUser); cy.contains('Add this certification to my LinkedIn profile') .should('have.attr', 'href') .and( 'match', // eslint-disable-next-line max-len - /https:\/\/www\.linkedin\.com\/profile\/add\?startTask=CERTIFICATION_NAME&name=Responsive Web Design&organizationId=4831032&issueYear=\d\d\d\d&issueMonth=\d\d?&certUrl=https:\/\/freecodecamp\.org\/certification\/developmentuser\/responsive-web-design/ + /https:\/\/www\.linkedin\.com\/profile\/add\?startTask=CERTIFICATION_NAME&name=Responsive Web Design&organizationId=4831032&issueYear=\d\d\d\d&issueMonth=\d\d?&certUrl=https:\/\/freecodecamp\.org\/certification\/certifieduser\/responsive-web-design/ ); }); it('should render a Twitter button', function () { + cy.visit(certifiedUser); cy.contains('Share this certification on Twitter').should( 'have.attr', 'href', - 'https://twitter.com/intent/tweet?text=I just earned the Responsive Web Design certification @freeCodeCamp! Check it out here: https://freecodecamp.org/certification/developmentuser/responsive-web-design' + 'https://twitter.com/intent/tweet?text=I just earned the Responsive Web Design certification @freeCodeCamp! Check it out here: https://freecodecamp.org/certification/certifieduser/responsive-web-design' ); }); - it("should be issued with today's date", () => { - const date = new Date(); - const issued = `Issued\xa0${new Intl.DateTimeFormat('en-US', { - month: 'long' - }).format(date)} ${date.getDate()}, ${date.getFullYear()}`; + it('should be issued with the submission date', () => { + cy.visit(certifiedUser); + const issued = `Issued\xa0August 3, 2018`; cy.get('[data-cy=issue-date]').should('have.text', issued); }); }); describe("while viewing someone else's,", function () { before(() => { - cy.visit(certificationUrl); + cy.visit(certifiedUser); }); it('should display certificate', function () { diff --git a/cypress/integration/learn/challenges/projects.js b/cypress/integration/learn/challenges/projects.js index f2a41d6148..08d736c8e6 100644 --- a/cypress/integration/learn/challenges/projects.js +++ b/cypress/integration/learn/challenges/projects.js @@ -34,6 +34,7 @@ const pythonProjects = { describe('project submission', () => { beforeEach(() => { cy.exec('npm run seed'); + cy.login(); }); // NOTE: this will fail once challenge tests are added. it('Should be possible to submit Python projects', () => { @@ -46,7 +47,7 @@ describe('project submission', () => { .type('https://replit.com/@camperbot/python-project#main.py'); cy.contains("I've completed this challenge").click(); - cy.contains('Go to next challenge'); + cy.contains('go to next challenge'); // clicking on 'Go to next challenge' seems to have caused flakiness, so // it's commented out until we figure out why. // cy.contains('Go to next challenge').click(); @@ -61,7 +62,6 @@ describe('project submission', () => { 'JavaScript projects can be submitted and then viewed in /settings and on the certifications', { browser: 'electron' }, () => { - cy.login(); cy.fixture('../../config/curriculum.json').then(curriculum => { const { challenges, meta } = curriculum[SuperBlocks.JsAlgoDataStruct].blocks[ diff --git a/cypress/integration/learn/common-components/navbar.js b/cypress/integration/learn/common-components/navbar.js index 6f0a6701ca..928cc7ee71 100644 --- a/cypress/integration/learn/common-components/navbar.js +++ b/cypress/integration/learn/common-components/navbar.js @@ -32,7 +32,7 @@ function waitForAppStart() { }); } -describe('Navbar', () => { +describe('Navbar when logged out', () => { beforeEach(() => { appHasStarted = false; cy.visit('/', { @@ -41,6 +41,32 @@ describe('Navbar', () => { cy.viewport(1300, 660); }); + it('Should have a "Sign in" button', () => { + cy.contains("[data-test-label='landing-small-cta']", 'Sign in'); + }); + + it( + 'Should have `Sign in` link on landing and learn pages' + + ' when not signed in', + () => { + cy.contains(selectors.smallCallToAction, 'Sign in'); + cy.get(selectors.menuButton).click(); + cy.get(selectors.navigationLinks).contains('Curriculum').click(); + cy.contains(selectors.smallCallToAction, 'Sign in'); + } + ); +}); + +describe('Navbar Logged in', () => { + beforeEach(() => { + cy.login(); + appHasStarted = false; + cy.visit('/', { + onBeforeLoad: spyOnListener + }).then(waitForAppStart); + cy.viewport(1300, 660); + }); + it('Should render properly', () => { cy.get('#universal-nav').should('be.visible'); cy.get('#universal-nav').should('have.class', 'universal-nav'); @@ -56,10 +82,6 @@ describe('Navbar', () => { } ); - it('Should have a "Sign in" button', () => { - cy.contains("[data-test-label='landing-small-cta']", 'Sign in'); - }); - // have the curriculum and CTA on landing and /learn pages. it( 'Should have `Radio`, `Forum`, and `Curriculum` links on landing and learn pages' + @@ -75,32 +97,18 @@ describe('Navbar', () => { } ); - it( - 'Should have `Sign in` link on landing and learn pages' + - ' when not signed in', - () => { - cy.contains(selectors.smallCallToAction, 'Sign in'); - cy.get(selectors.menuButton).click(); - cy.get(selectors.navigationLinks).contains('Curriculum').click(); - cy.contains(selectors.smallCallToAction, 'Sign in'); - } - ); - it('Should have `Profile` link when user is signed in', () => { - cy.login(); cy.get(selectors.menuButton).click(); cy.get(selectors.navigationLinks).contains('Profile').click(); cy.url().should('include', '/developmentuser'); }); it('Should have a profile image with class `default-border`', () => { - cy.login(); cy.get(selectors.avatarContainer).should('have.class', 'default-border'); cy.get(selectors.defaultAvatar).should('exist'); }); it('Should have a profile image with dimensions that are <= 31px', () => { - cy.login(); cy.get(selectors.avatarImage).invoke('width').should('lte', 31); cy.get(selectors.avatarImage).invoke('height').should('lte', 31); }); diff --git a/cypress/integration/settings/certifications.js b/cypress/integration/settings/certifications.js index f566d0efc8..8d6daa5b90 100644 --- a/cypress/integration/settings/certifications.js +++ b/cypress/integration/settings/certifications.js @@ -1,57 +1,40 @@ import '@testing-library/cypress/add-commands'; describe('Settings certifications area', () => { - before(() => { - cy.exec('npm run seed'); - cy.login(); - cy.visit('/settings'); - }); - describe('initially', () => { - it('Should render 15 "Claim Certification" buttons', () => { + before(() => { + cy.exec('npm run seed'); + cy.login(); + }); + + it('Should render the default settings page', () => { + cy.visit('/settings/'); cy.findAllByText('Claim Certification').should($btns => { expect($btns).to.have.length(15); }); + cy.findByText('Show Certification').should('not.exist'); + cy.contains('Agree'); + cy.contains('Claim Certification').click(); + cy.contains( + 'To claim a certification, you must first accept our academic honesty policy' + ); + }); + }); + + describe('after isHonest', () => { + before(() => { + cy.exec('npm run seed'); + cy.login(); }); - it('Should render zero "Show Certification" buttons', () => { - cy.contains('Show Certification').should('not.exist'); - }); - - it('Should render one "Agree" button', () => { - cy.contains('Agree').should('exist'); - }); - - describe('before isHonest', () => { - it('Should show "must agree" message when trying to claim a cert', () => { - cy.contains('Claim Certification').click(); - cy.contains( - 'To claim a certification, you must first accept our academic honesty policy' - ).should('exist'); - }); - }); - - describe('after isHonest', () => { - beforeEach(() => { - cy.visit('/'); - cy.login(); - cy.visit('/settings'); - }); - - it('Should render "You have accepted our Academic Honesty Policy." button after clicking "Agree"', () => { - cy.contains('Agree').click({ force: true }); - cy.contains('You have accepted our Academic Honesty Policy.').should( - 'exist' - ); - }); - - it('Should show "incompleted projects" message when clicking "Claim Certification"', () => { - cy.contains('Claim Certification').click({ force: true }); - - cy.contains( - 'It looks like you have not completed the necessary steps. Please complete the required projects to claim the Responsive Web Design Certification' - ).should('exist'); - }); + it('Should update the user as they try to claim their certifications', () => { + cy.visit('/settings'); + cy.contains('Agree').click(); + cy.contains('You have accepted our Academic Honesty Policy.'); + cy.contains('Claim Certification').click(); + cy.contains( + 'It looks like you have not completed the necessary steps. Please complete the required projects to claim the Responsive Web Design Certification' + ); }); }); }); diff --git a/cypress/integration/settings/settings.js b/cypress/integration/settings/settings.js index 5a40f885f8..c88efcf73f 100644 --- a/cypress/integration/settings/settings.js +++ b/cypress/integration/settings/settings.js @@ -1,6 +1,8 @@ describe('Settings', () => { - it('should be possible to reset your progress', () => { + before(() => { cy.login(); + }); + it('should be possible to reset your progress', () => { cy.visit('/settings'); cy.contains('Reset all of my progress').click(); cy.contains('Reset everything. I want to start from the beginning').click(); diff --git a/cypress/integration/settings/username-change.js b/cypress/integration/settings/username-change.js index ca13b3a1f9..d1bb2d75ab 100644 --- a/cypress/integration/settings/username-change.js +++ b/cypress/integration/settings/username-change.js @@ -1,14 +1,18 @@ describe('Username input field', () => { beforeEach(() => { cy.login(); + }); + + function goToSettings() { cy.visit('/settings'); // Setting aliases here cy.get('input[name=username-settings]').as('usernameInput'); cy.get('form#usernameSettings').as('usernameForm'); - }); + } it('Should be possible to type', () => { + goToSettings(); cy.get('@usernameInput') .clear({ force: true }) .type('twaha', { force: true }) @@ -16,6 +20,7 @@ describe('Username input field', () => { }); it('Should show message when validating name', () => { + goToSettings(); cy.get('@usernameInput') .clear({ force: true }) .type('twaha', { force: true }); @@ -28,6 +33,7 @@ describe('Username input field', () => { }); it('Should show username is available if it is', () => { + goToSettings(); cy.get('@usernameInput') .clear({ force: true }) .type('brad', { force: true }); @@ -41,6 +47,7 @@ describe('Username input field', () => { }); it('Should info message if username is available', () => { + goToSettings(); cy.get('@usernameInput') .clear({ force: true }) .type('mrugesh', { force: true }); @@ -58,6 +65,7 @@ describe('Username input field', () => { // eslint-disable-next-line it('Should be able to click the `Save` button if username is avalable', () => { + goToSettings(); cy.get('@usernameInput') .clear({ force: true }) .type('oliver', { force: true }); @@ -68,6 +76,7 @@ describe('Username input field', () => { }); it('Should show username is unavailable if it is', () => { + goToSettings(); cy.get('@usernameInput') .clear({ force: true }) .type('twaha', { force: true }); @@ -82,6 +91,7 @@ describe('Username input field', () => { // eslint-disable-next-line it('Should not be possible to click the `Save` button if username is unavailable', () => { + goToSettings(); cy.get('@usernameInput') .clear({ force: true }) .type('twaha', { force: true }); @@ -97,6 +107,7 @@ describe('Username input field', () => { }); it('Should not show anything if user types their current name', () => { + goToSettings(); cy.get('@usernameInput') .clear({ force: true }) .type('developmentuser', { force: true }); @@ -106,6 +117,7 @@ describe('Username input field', () => { // eslint-disable-next-line max-len it('Should not be possible to click the `Save` button if user types their current name', () => { + goToSettings(); cy.get('@usernameInput') .clear({ force: true }) .type('developmentuser', { force: true }); @@ -114,6 +126,7 @@ describe('Username input field', () => { }); it('Should show warning if username includes invalid character', () => { + goToSettings(); cy.get('@usernameInput') .clear({ force: true }) .type('Quincy Larson', { force: true }); @@ -128,6 +141,7 @@ describe('Username input field', () => { // eslint-disable-next-line max-len it('Should not be able to click the `Save` button if username includes invalid character', () => { + goToSettings(); cy.get('@usernameInput') .clear({ force: true }) .type('Quincy Larson', { force: true }); @@ -136,6 +150,7 @@ describe('Username input field', () => { }); it('Should change username if `Save` button is clicked', () => { + goToSettings(); cy.get('@usernameInput') .clear({ force: true }) .type('quincy', { force: true }); @@ -149,6 +164,7 @@ describe('Username input field', () => { }); it('Should change username with uppercase characters if `Save` button is clicked', () => { + goToSettings(); cy.get('@usernameInput') .clear({ force: true }) .type('Quincy', { force: true }); @@ -162,6 +178,7 @@ describe('Username input field', () => { }); it('Should show flash message showing username has been updated', () => { + goToSettings(); cy.get('@usernameInput') .clear({ force: true }) .type('nhcarrigan', { force: true }); @@ -181,6 +198,7 @@ describe('Username input field', () => { }); it('Should be able to close the shown flash message', () => { + goToSettings(); cy.get('@usernameInput') .clear({ force: true }) .type('bjorno', { force: true }); @@ -197,6 +215,7 @@ describe('Username input field', () => { }); it('Should change username if enter is pressed', () => { + goToSettings(); cy.get('@usernameInput') .clear({ force: true }) .type('symbol', { force: true }); diff --git a/cypress/support/commands.js b/cypress/support/commands.js index af020d1e21..c85d078178 100644 --- a/cypress/support/commands.js +++ b/cypress/support/commands.js @@ -33,14 +33,7 @@ // Cypress.Commands.overwrite('visit', (originalFn, url, options) => {}); Cypress.Commands.add('login', () => { - cy.visit('/'); - cy.contains("Get started (it's free)").click(); - cy.location({ timeout: 10000 }).should(loc => { - // I'm not 100% sure why logins get redirected to /learn/ via 301 in - // development, but not in production, but they do. Hence to make it easier - // work on tests, we'll just allow for both. - expect(loc.pathname).to.match(/^\/learn\/?$/); - }); + cy.visit('http://localhost:3000/signin'); cy.contains('Welcome back'); }); @@ -60,7 +53,6 @@ Cypress.Commands.add('toggleAll', () => { }); Cypress.Commands.add('resetUsername', () => { - cy.login(); cy.visit('/settings'); cy.get('@usernameInput') diff --git a/tools/scripts/seed/certifiedUserData.js b/tools/scripts/seed/certifiedUserData.js index 7962f1040d..9b3e21ccc9 100644 --- a/tools/scripts/seed/certifiedUserData.js +++ b/tools/scripts/seed/certifiedUserData.js @@ -4635,7 +4635,7 @@ module.exports = { rand: 0.6126749173148205, theme: 'default', profileUI: { - isLocked: true, + isLocked: false, showAbout: true, showCerts: true, showDonation: true, From 76f39a748dfe8b0bb499593e1f069d0fedbb53f2 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sat, 11 Dec 2021 09:54:15 +0000 Subject: [PATCH 16/63] chore(deps): update dependency rollup to v2.61.1 --- package-lock.json | 16 ++++++++-------- tools/ui-components/package.json | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index 699321f40a..d946e22e33 100644 --- a/package-lock.json +++ b/package-lock.json @@ -47140,9 +47140,9 @@ "integrity": "sha1-8z/pz7Urv9UgqhgyO8ZdsRCht2w=" }, "node_modules/rollup": { - "version": "2.61.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.61.0.tgz", - "integrity": "sha512-teQ+T1mUYbyvGyUavCodiyA9hD4DxwYZJwr/qehZGhs1Z49vsmzelMVYMxGU4ZhGRKxYPupHuz5yzm/wj7VpWA==", + "version": "2.61.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.61.1.tgz", + "integrity": "sha512-BbTXlEvB8d+XFbK/7E5doIcRtxWPRiqr0eb5vQ0+2paMM04Ye4PZY5nHOQef2ix24l/L0SpLd5hwcH15QHPdvA==", "dev": true, "bin": { "rollup": "dist/bin/rollup" @@ -55220,7 +55220,7 @@ "postcss": "8.4.4", "postcss-import": "14.0.2", "rimraf": "3.0.2", - "rollup": "2.61.0", + "rollup": "2.61.1", "rollup-plugin-postcss": "4.0.2", "rollup-plugin-terser": "7.0.2", "tailwindcss": "2.2.19" @@ -58097,7 +58097,7 @@ "react": "16.14.0", "react-dom": "16.14.0", "rimraf": "3.0.2", - "rollup": "2.61.0", + "rollup": "2.61.1", "rollup-plugin-postcss": "4.0.2", "rollup-plugin-terser": "7.0.2", "tailwindcss": "2.2.19", @@ -92414,9 +92414,9 @@ "integrity": "sha1-8z/pz7Urv9UgqhgyO8ZdsRCht2w=" }, "rollup": { - "version": "2.61.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.61.0.tgz", - "integrity": "sha512-teQ+T1mUYbyvGyUavCodiyA9hD4DxwYZJwr/qehZGhs1Z49vsmzelMVYMxGU4ZhGRKxYPupHuz5yzm/wj7VpWA==", + "version": "2.61.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.61.1.tgz", + "integrity": "sha512-BbTXlEvB8d+XFbK/7E5doIcRtxWPRiqr0eb5vQ0+2paMM04Ye4PZY5nHOQef2ix24l/L0SpLd5hwcH15QHPdvA==", "dev": true, "requires": { "fsevents": "~2.3.2" diff --git a/tools/ui-components/package.json b/tools/ui-components/package.json index 93596d4629..d1402cddc7 100644 --- a/tools/ui-components/package.json +++ b/tools/ui-components/package.json @@ -48,7 +48,7 @@ "postcss": "8.4.4", "postcss-import": "14.0.2", "rimraf": "3.0.2", - "rollup": "2.61.0", + "rollup": "2.61.1", "rollup-plugin-postcss": "4.0.2", "rollup-plugin-terser": "7.0.2", "tailwindcss": "2.2.19" From d896de60d990107a90024be9928e408739018f8c Mon Sep 17 00:00:00 2001 From: camperbot Date: Sat, 11 Dec 2021 18:48:37 +0530 Subject: [PATCH 17/63] chore(i18n,learn): update translations (#44473) --- client/i18n/locales/portuguese/translations.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/client/i18n/locales/portuguese/translations.json b/client/i18n/locales/portuguese/translations.json index f904713164..6706fa5825 100644 --- a/client/i18n/locales/portuguese/translations.json +++ b/client/i18n/locales/portuguese/translations.json @@ -287,16 +287,16 @@ "info": "Informações", "code": "Código", "tests": "Testes", - "restart": "Restart", - "restart-step": "Restart Step", + "restart": "Reiniciar", + "restart-step": "Reiniciar etapa", "console": "Console", - "notes": "Notes", + "notes": "Observações", "preview": "Pré-visualizar" }, "help-translate": "Ainda estamos traduzindo as certificações a seguir.", "help-translate-link": "Ajude-nos a traduzir.", "season-greetings": "Boas festas de fim de ano para você e sua família.", - "season-greetings-fcc": "Season's Greetings from the freeCodeCamp community 🎉", + "season-greetings-fcc": "Boas festas de fim de ano, da comunidade do freeCodeCamp 🎉", "if-getting-value": "Se você está conseguindo tirar proveito do conteúdo do freeCodeCamp, agora é um ótimo momento para fazer sua doação e apoiar nossa missão sem fins lucrativos.", "project-preview-title": "Aqui está uma prévia do que você vai criar" }, From a4dc1603991dae8ec31add4bf7e4a406d47e0582 Mon Sep 17 00:00:00 2001 From: camperbot Date: Sat, 11 Dec 2021 19:15:35 +0530 Subject: [PATCH 18/63] chore(i18n,docs): update translations (#44472) --- docs/i18n/chinese/devops.md | 2 +- .../how-to-test-translations-locally.md | 82 ++++++++------ docs/i18n/espanol/devops.md | 2 +- .../how-to-test-translations-locally.md | 88 ++++++++------- docs/i18n/italian/devops.md | 2 +- .../how-to-test-translations-locally.md | 106 ++++++++++-------- docs/i18n/japanese/devops.md | 2 +- .../how-to-test-translations-locally.md | 82 ++++++++------ docs/i18n/portuguese/devops.md | 2 +- .../how-to-test-translations-locally.md | 106 ++++++++++-------- .../how-to-work-on-coding-challenges.md | 88 +++++++-------- docs/i18n/ukrainian/devops.md | 2 +- .../how-to-test-translations-locally.md | 82 ++++++++------ 13 files changed, 347 insertions(+), 299 deletions(-) diff --git a/docs/i18n/chinese/devops.md b/docs/i18n/chinese/devops.md index e7241c9de4..a9cf732df2 100644 --- a/docs/i18n/chinese/devops.md +++ b/docs/i18n/chinese/devops.md @@ -536,7 +536,7 @@ Provisioning VMs with the Code 2. Update `npm` and install PM2 and setup `logrotate` and startup on boot ```console - npm i -g npm@6 + npm i -g npm@8 npm i -g pm2 npm install -g serve pm2 install pm2-logrotate diff --git a/docs/i18n/chinese/how-to-test-translations-locally.md b/docs/i18n/chinese/how-to-test-translations-locally.md index c0ff23e4c1..8ef754c12c 100644 --- a/docs/i18n/chinese/how-to-test-translations-locally.md +++ b/docs/i18n/chinese/how-to-test-translations-locally.md @@ -8,9 +8,10 @@ If you would like to test your translations on a local instance of the freeCodeC There are a few steps to take in order to allow the codebase to build in your desired language. -First, visit the `config/i18n/all-langs.js` file to add the language to the available languages list and configure the values. There are four objects here. +First, visit the `config/i18n/all-langs.ts` file to add the language to the available languages list and configure the values. There are four objects here. - `availableLangs`: For both the `client` and `curriculum` arrays, add the text name of the language. This is the value that will be used in the `.env` file later. +- `auditedCerts`: Add the text name of the language as the _key_, and add an array of `SuperBlocks.{cert}` variables as the _value_. This tells the client which certifications are fully translated. - `i18nextCodes`: These are the ISO language codes for each language. You will need to add the appropriate ISO code for the language you are enabling. These do need to be unique for each language. - `langDisplayNames`: These are the display names for the language selector in the navigation menu. - `langCodes`: These are the language codes used for formatting dates and numbers. These should be Unicode CLDR codes instead of ISO codes. @@ -29,6 +30,45 @@ const availableLangs = { ] }; +export const auditedCerts = { + espanol: [ + SuperBlocks.RespWebDesign, + SuperBlocks.JsAlgoDataStruct, + SuperBlocks.FrontEndDevLibs, + SuperBlocks.DataVis, + SuperBlocks.BackEndDevApis + ], + chinese: [ + SuperBlocks.RespWebDesign, + SuperBlocks.JsAlgoDataStruct, + SuperBlocks.FrontEndDevLibs, + SuperBlocks.DataVis, + SuperBlocks.BackEndDevApis, + SuperBlocks.QualityAssurance, + SuperBlocks.SciCompPy, + SuperBlocks.DataAnalysisPy, + SuperBlocks.InfoSec, + SuperBlocks.MachineLearningPy + ], + 'chinese-traditional': [ + SuperBlocks.RespWebDesign, + SuperBlocks.JsAlgoDataStruct, + SuperBlocks.FrontEndDevLibs, + SuperBlocks.DataVis, + SuperBlocks.BackEndDevApis, + SuperBlocks.QualityAssurance, + SuperBlocks.SciCompPy, + SuperBlocks.DataAnalysisPy, + SuperBlocks.InfoSec, + SuperBlocks.MachineLearningPy + ], + dothraki: [ + SuperBlocks.RespWebDesign, + SuperBlocks.JsAlgoDataStruct, + SuperBlocks.FrontEndDevLibs + ] +}; + const i18nextCodes = { english: 'en', espanol: 'es', @@ -54,10 +94,12 @@ const langCodes = { }; ``` -Next, open the `client/src/utils/algolia-locale-setup.js` file. This data is used for the search bar that loads `/news` articles. While it is unlikely that you are going to test this functionality, missing the data for your language can lead to errors when attempting to build the codebase locally. +Next, open the `client/src/utils/algolia-locale-setup.ts` file. This data is used for the search bar that loads `/news` articles. While it is unlikely that you are going to test this functionality, missing the data for your language can lead to errors when attempting to build the codebase locally. Add an object for your language to the `algoliaIndices` object. You should use the values for the `english` object for local testing, replacing the `english` key with your language's `availableLangs` value. +> [!NOTE] If we have already deployed an instance of news in your target language, you can update the values to reflect the live instance. Otherwise, use the English values. + If you were to add Dothraki: ```js @@ -85,40 +127,6 @@ const algoliaIndices = { }; ``` -Next, you will need to tell the client which certifications are translated, and which are still in English. Open the `utils/is-audited.js` file. Within the `auditedCerts`, add a new key with your language's `availableLangs` value. Assign the value of that key to an array containing the _dashed names_ for the certifications that have been translated. Refer to the existing data for those dashed names. - -Continuing the work to enable Dothraki - we have translated the first three certifications: - -```js -const auditedCerts = { - espanol: [ - 'responsive-web-design', - 'javascript-algorithms-and-data-structures' - ], - chinese: [ - 'responsive-web-design', - 'javascript-algorithms-and-data-structures', - 'front-end-development-libraries', - 'data-visualization', - 'back-end-development-and-apis', - 'quality-assurance' - ], - 'chinese-traditional': [ - 'responsive-web-design', - 'javascript-algorithms-and-data-structures', - 'front-end-development-libraries', - 'data-visualization', - 'back-end-development-and-apis', - 'quality-assurance' - ], - dothraki: [ - 'responsive-web-design', - 'javascript-algorithms-and-data-structures', - 'front-end-development-libraries' - ] -}; -``` - Finally, in your `.env` file, set `CLIENT_LOCALE` and `CURRICULUM_LOCALE` to your new language (use the `availableLangs` value.) ```txt @@ -143,7 +151,7 @@ For the video challenges, you need to change a few things. First add the new loc ... ``` -Then add an id for the new language to any video challenge in an audited block. For example, if `auditedCerts` in `all-langs.js` includes `scientific-computing-with-python` for `dothraki`, then you must add a `dothraki` entry in `videoLocaleIds`. The frontmatter should then look like this: +Then add an id for the new language to any video challenge in an audited block. For example, if `auditedCerts` in `all-langs.ts` includes `scientific-computing-with-python` for `dothraki`, then you must add a `dothraki` entry in `videoLocaleIds`. The frontmatter should then look like this: ```yml videoLocaleIds: diff --git a/docs/i18n/espanol/devops.md b/docs/i18n/espanol/devops.md index 91cd539fce..e5ca8386dd 100644 --- a/docs/i18n/espanol/devops.md +++ b/docs/i18n/espanol/devops.md @@ -536,7 +536,7 @@ Aprovisionamiento de MVs con el código 2. Actualiza `npm` e instala PM2 y configura `logrotate` e inicia en el arranque ```console - npm i -g npm@6 + npm i -g npm@8 npm i -g pm2 npm install -g serve pm2 install pm2-logrotate diff --git a/docs/i18n/espanol/how-to-test-translations-locally.md b/docs/i18n/espanol/how-to-test-translations-locally.md index 17be9cbdf6..63720a14e9 100644 --- a/docs/i18n/espanol/how-to-test-translations-locally.md +++ b/docs/i18n/espanol/how-to-test-translations-locally.md @@ -8,12 +8,13 @@ En caso de que quieras probar tus traducciones en una instancia local del sitio Hay algunos pasos a seguir para permitirle a la base de código compilar en tu lenguaje deseado. -Primero, visita el archivo `config/i18n/all-langs.js` para añadir el lenguaje a la lista de lenguajes disponibles y configura los valores. Hay cuatro objetos aquí. +First, visit the `config/i18n/all-langs.ts` file to add the language to the available languages list and configure the values. Hay cuatro objetos aquí. - `avaliableLangs`: Tanto para el arreglo `client` como para el arreglo `curriculum`, añade el nombre en texto del lenguaje. Este es el valor que se utilizará en el archivo `.env` más tarde. -- `i18nextCodes`: Estos son los codigos de idioma ISO para cada lenguaje. Necesitarás añadir el codigo ISO apropiado para el lenguaje que estas habilitando. Estos deben ser únicos para cada lenguaje. -- `langDisplayNames`: Estos son los nombres exhibidos para el selector de lenguajes en el menú de navegación. -- `langCodes`: Estos son los códigos de idioma utilizados para el formateo de fechas y números. Estos deberían ser códigos Unicode CLDR en lugar de códigos ISO. +- `auditedCerts`: Add the text name of the language as the _key_, and add an array of `SuperBlocks.{cert}` variables as the _value_. This tells the client which certifications are fully translated. +- `i18nextCodes`: These are the ISO language codes for each language. You will need to add the appropriate ISO code for the language you are enabling. These do need to be unique for each language. +- `langDisplayNames`: These are the display names for the language selector in the navigation menu. +- `langCodes`: These are the language codes used for formatting dates and numbers. These should be Unicode CLDR codes instead of ISO codes. Por ejemplo, si quisieras habilitar Dothraki como un lenguaje, tus objetos `all-langs.js` deberían verse así: @@ -29,6 +30,45 @@ const availableLangs = { ] }; +export const auditedCerts = { + espanol: [ + SuperBlocks.RespWebDesign, + SuperBlocks.JsAlgoDataStruct, + SuperBlocks.FrontEndDevLibs, + SuperBlocks.DataVis, + SuperBlocks.BackEndDevApis + ], + chinese: [ + SuperBlocks.RespWebDesign, + SuperBlocks.JsAlgoDataStruct, + SuperBlocks.FrontEndDevLibs, + SuperBlocks.DataVis, + SuperBlocks.BackEndDevApis, + SuperBlocks.QualityAssurance, + SuperBlocks.SciCompPy, + SuperBlocks.DataAnalysisPy, + SuperBlocks.InfoSec, + SuperBlocks.MachineLearningPy + ], + 'chinese-traditional': [ + SuperBlocks.RespWebDesign, + SuperBlocks.JsAlgoDataStruct, + SuperBlocks.FrontEndDevLibs, + SuperBlocks.DataVis, + SuperBlocks.BackEndDevApis, + SuperBlocks.QualityAssurance, + SuperBlocks.SciCompPy, + SuperBlocks.DataAnalysisPy, + SuperBlocks.InfoSec, + SuperBlocks.MachineLearningPy + ], + dothraki: [ + SuperBlocks.RespWebDesign, + SuperBlocks.JsAlgoDataStruct, + SuperBlocks.FrontEndDevLibs + ] +}; + const i18nextCodes = { english: 'en', espanol: 'es', @@ -54,10 +94,12 @@ const langCodes = { }; ``` -Ahora, abre el archivo `client/src/utils/algolia-locale-setup.js`. Estos datos son utilizados por la barra de búsqueda que carga artículos de `/news` (noticias). While it is unlikely that you are going to test this functionality, missing the data for your language can lead to errors when attempting to build the codebase locally. +Next, open the `client/src/utils/algolia-locale-setup.ts` file. Estos datos son utilizados por la barra de búsqueda que carga artículos de `/news` (noticias). While it is unlikely that you are going to test this functionality, missing the data for your language can lead to errors when attempting to build the codebase locally. Add an object for your language to the `algoliaIndices` object. You should use the values for the `english` object for local testing, replacing the `english` key with your language's `availableLangs` value. +> [!NOTE] If we have already deployed an instance of news in your target language, you can update the values to reflect the live instance. Otherwise, use the English values. + If you were to add Dothraki: ```js @@ -85,40 +127,6 @@ const algoliaIndices = { }; ``` -Next, you will need to tell the client which certifications are translated, and which are still in English. Open the `utils/is-audited.js` file. Within the `auditedCerts`, add a new key with your language's `availableLangs` value. Assign the value of that key to an array containing the _dashed names_ for the certifications that have been translated. Refer to the existing data for those dashed names. - -Continuing the work to enable Dothraki - we have translated the first three certifications: - -```js -const auditedCerts = { - espanol: [ - 'responsive-web-design', - 'javascript-algorithms-and-data-structures' - ], - chinese: [ - 'responsive-web-design', - 'javascript-algorithms-and-data-structures', - 'front-end-development-libraries', - 'data-visualization', - 'back-end-development-and-apis', - 'quality-assurance' - ], - 'chinese-traditional': [ - 'responsive-web-design', - 'javascript-algorithms-and-data-structures', - 'front-end-development-libraries', - 'data-visualization', - 'back-end-development-and-apis', - 'quality-assurance' - ], - dothraki: [ - 'responsive-web-design', - 'javascript-algorithms-and-data-structures', - 'front-end-development-libraries' - ] -}; -``` - Finally, in your `.env` file, set `CLIENT_LOCALE` and `CURRICULUM_LOCALE` to your new language (use the `availableLangs` value.) ```txt @@ -143,7 +151,7 @@ For the video challenges, you need to change a few things. First add the new loc ... ``` -Then add an id for the new language to any video challenge in an audited block. For example, if `auditedCerts` in `all-langs.js` includes `scientific-computing-with-python` for `dothraki`, then you must add a `dothraki` entry in `videoLocaleIds`. The frontmatter should then look like this: +Then add an id for the new language to any video challenge in an audited block. For example, if `auditedCerts` in `all-langs.ts` includes `scientific-computing-with-python` for `dothraki`, then you must add a `dothraki` entry in `videoLocaleIds`. The frontmatter should then look like this: ```yml videoLocaleIds: diff --git a/docs/i18n/italian/devops.md b/docs/i18n/italian/devops.md index 91c2fa9295..6042c6ef79 100644 --- a/docs/i18n/italian/devops.md +++ b/docs/i18n/italian/devops.md @@ -536,7 +536,7 @@ Fare provisioning delle VM con il codice 2. Aggiorna `npm` e installa PM2 e fai il setup di `logrotate` e avvio all'accensione ```console - npm i -g npm@6 + npm i -g npm@8 npm i -g pm2 npm install -g serve pm2 install pm2-logrotate diff --git a/docs/i18n/italian/how-to-test-translations-locally.md b/docs/i18n/italian/how-to-test-translations-locally.md index ad903a38f5..9553a5b999 100644 --- a/docs/i18n/italian/how-to-test-translations-locally.md +++ b/docs/i18n/italian/how-to-test-translations-locally.md @@ -8,12 +8,13 @@ Se vuoi testare le tue traduzioni in una istanza locale della piattaforma `/lear Ci sono alcuni step da fare per avere una build del codebase nella lingua di tua scelta. -Prima, visita il file `config/i18n/all-langs.js` per aggiungere la lingua alle lingue disponibili nella lista e configurare i valori. Ci sono quattro oggetti qui. +First, visit the `config/i18n/all-langs.ts` file to add the language to the available languages list and configure the values. Ci sono quattro oggetti qui. - `availableLangs`: Aggiungi il nome testuale della lingua agli array `client` e `curriculum`. Questo è il valore che sarà usato nel file `.env` più tardi. -- `i18nextCodes`: questi sono i codici ISO per le varie lingue. Dovrai aggiungere il codice ISO appropriato per la lingua che stai attivando. Questi devono essere unici per ogni lingua. -- `langDisplayNames`: Questi sono i nomi delle lingue visualizzati nel menù di navigazione. -- `langCodes`: Questi sono i codici delle lingue usati per formattare date e numeri. Questi devono essere codici Unicode CLDR invece di codici ISO. +- `auditedCerts`: Add the text name of the language as the _key_, and add an array of `SuperBlocks.{cert}` variables as the _value_. This tells the client which certifications are fully translated. +- `i18nextCodes`: These are the ISO language codes for each language. You will need to add the appropriate ISO code for the language you are enabling. These do need to be unique for each language. +- `langDisplayNames`: These are the display names for the language selector in the navigation menu. +- `langCodes`: These are the language codes used for formatting dates and numbers. These should be Unicode CLDR codes instead of ISO codes. Per esempio, se vuoi attivare la lingua Dothraki, il tuo oggetto `all-langs.js` dovrebbe essere come segue: @@ -29,6 +30,45 @@ const availableLangs = { ] }; +export const auditedCerts = { + espanol: [ + SuperBlocks.RespWebDesign, + SuperBlocks.JsAlgoDataStruct, + SuperBlocks.FrontEndDevLibs, + SuperBlocks.DataVis, + SuperBlocks.BackEndDevApis + ], + chinese: [ + SuperBlocks.RespWebDesign, + SuperBlocks.JsAlgoDataStruct, + SuperBlocks.FrontEndDevLibs, + SuperBlocks.DataVis, + SuperBlocks.BackEndDevApis, + SuperBlocks.QualityAssurance, + SuperBlocks.SciCompPy, + SuperBlocks.DataAnalysisPy, + SuperBlocks.InfoSec, + SuperBlocks.MachineLearningPy + ], + 'chinese-traditional': [ + SuperBlocks.RespWebDesign, + SuperBlocks.JsAlgoDataStruct, + SuperBlocks.FrontEndDevLibs, + SuperBlocks.DataVis, + SuperBlocks.BackEndDevApis, + SuperBlocks.QualityAssurance, + SuperBlocks.SciCompPy, + SuperBlocks.DataAnalysisPy, + SuperBlocks.InfoSec, + SuperBlocks.MachineLearningPy + ], + dothraki: [ + SuperBlocks.RespWebDesign, + SuperBlocks.JsAlgoDataStruct, + SuperBlocks.FrontEndDevLibs + ] +}; + const i18nextCodes = { english: 'en', espanol: 'es', @@ -54,10 +94,12 @@ const langCodes = { }; ``` -Successivamente, apri il file `client/src/utils/algolia-locale-setup.js`. Questi dati sono usati dalla barra di ricerca che carica gli articoli in `/news`. Anche se è poco probabile che tu stia testando questa funzione, se questi dati mancano per la tua lingua possono esserci degli errori nel costruire il codebase localmente. +Next, open the `client/src/utils/algolia-locale-setup.ts` file. Questi dati sono usati dalla barra di ricerca che carica gli articoli in `/news`. Anche se è poco probabile che tu stia testando questa funzione, se questi dati mancano per la tua lingua possono esserci degli errori nel costruire il codebase localmente. Aggiungi un oggetto per la tua lingua all'oggetto `algoliaIndices`. Dovresti usare i valori dell'oggetto `english` per testare in locale, sostituiendo la chiave `english` con il valore della tua lingua in `availableLangs`. +> [!NOTE] If we have already deployed an instance of news in your target language, you can update the values to reflect the live instance. Otherwise, use the English values. + Se volessi aggiungere Dothraki: ```js @@ -85,41 +127,7 @@ const algoliaIndices = { }; ``` -Quindi, devi dire al client quali certificazioni sono tradotte e quali sono ancora in inglese. Apri il file `utils/is-audited.js`. Aggiungi a `auditedCerts` una nuova chiave con il valore della tua lingua in `availableLangs`. Assegna il valore di quella chiave a un array contenente i _nomi con trattino_ (dashed name) per le certificazioni che sono state tradotte. Riferisciti ai dati esistenti per i nomi con trattino. - -Continuando il lavoro per attivare Dothraki, abbiamo tradotto le prime tre certificazioni: - -```js -const auditedCerts = { - espanol: [ - 'responsive-web-design', - 'javascript-algorithms-and-data-structures' - ], - chinese: [ - 'responsive-web-design', - 'javascript-algorithms-and-data-structures', - 'front-end-development-libraries', - 'data-visualization', - 'back-end-development-and-apis', - 'quality-assurance' - ], - 'chinese-traditional': [ - 'responsive-web-design', - 'javascript-algorithms-and-data-structures', - 'front-end-development-libraries', - 'data-visualization', - 'back-end-development-and-apis', - 'quality-assurance' - ], - dothraki: [ - 'responsive-web-design', - 'javascript-algorithms-and-data-structures', - 'front-end-development-libraries' - ] -}; -``` - -Infinine, nel file `.env`, dai a `CLIENT_LOCALE` e `CURRICULUM_LOCALE` il valore della tua nuova lingua (usando il valore in `availableLangs`.) +Finally, in your `.env` file, set `CLIENT_LOCALE` and `CURRICULUM_LOCALE` to your new language (use the `availableLangs` value.) ```txt CLIENT_LOCALE="dothraki" @@ -128,7 +136,7 @@ CURRICULUM_LOCALE="dothraki" ## Attivare video localizzati -Per le sfide video, devi cambiare alcune cose. Come prima cosa aggiungi la nuova lingua alla query per GraphQL nel file `client/src/templates/Challenges/video/Show.tsx`. Per esempio, in questo modo aggiungeresti Dothraki alla query: +For the video challenges, you need to change a few things. First add the new locale to the GraphQL query in the `client/src/templates/Challenges/video/Show.tsx` file. For example, adding Dothraki to the query: ```tsx query VideoChallenge($slug: String!) { @@ -143,19 +151,19 @@ Per le sfide video, devi cambiare alcune cose. Come prima cosa aggiungi la nuova ... ``` -Quindi aggiungi un id per la nuova lingua ogni sfida video in un blocco verificato (`auditedCerts`). Per esempio, se `auditedCerts` in `all-langs.js` include `scientific-computing-with-python` per `dothraki`, allora devi aggiungere `dothraki` in `videoLocaleIds`. Il frontespizio dovrebbe essere simile a questo: +Then add an id for the new language to any video challenge in an audited block. For example, if `auditedCerts` in `all-langs.ts` includes `scientific-computing-with-python` for `dothraki`, then you must add a `dothraki` entry in `videoLocaleIds`. The frontmatter should then look like this: ```yml videoLocaleIds: espanol: 3muQV-Im3Z0 italian: hiRTRAqNlpE portuguese: AelGAcoMXbI - dothraki: nuovo-id-qui + dothraki: new-id-here dashedName: introduction-why-program --- ``` -Aggiorna l'interfaccia `VideoLocaleIds` in `client/src/redux/prop-types` così che includa la nuova lingua. +Update the `VideoLocaleIds` interface in `client/src/redux/prop-types` to include the new language. ```ts export interface VideoLocaleIds { @@ -166,7 +174,7 @@ export interface VideoLocaleIds { } ``` -Infine aggiorna lo schema delle sfide in `curriculum/schema/challengeSchema.js`. +And finally update the challenge schema in `curriculum/schema/challengeSchema.js`. ```js videoLocaleIds: Joi.when('challengeType', { @@ -182,10 +190,10 @@ videoLocaleIds: Joi.when('challengeType', { ## Caricare le traduzioni -Poiché la lingua non è ancora stata approvata per la produzione, i nostri script ancora non scaricheranno automaticamente le traduzioni. Solo lo staff ha accesso al download diretto delle traduzioni - sei il benvenuto a rivolgerti a noi attraverso la [chat room per i contributori](https://chat.freecodecamp.org/channel/contributors), o puoi tradurre i file markdown inglesi per le esigenze di test. +Because the language has not been approved for production, our scripts are not automatically downloading the translations yet. Only staff have the access to directly download the translations - you are welcome to reach out to us in our [contributors chat room](https://chat.freecodecamp.org/channel/contributors), or you can translate the English markdown files locally for testing purposes. -Una volta che avrai i file, li dovrai mettere nelle cartelle giuste. Per le sfide del curriculum, dovresti mettere le cartelle dei certificati (ad esempio `01-responsive-web-design`) nella cartella `curriculum/challenges/{lang}`. Per la nostra traduzione in Dothraki, questo sarebbe `curriculum/challenges/dothraki`. I file `.json` con le traduzioni del client vanno nella cartella `client/i18n/locales/{lang}`. +Once you have the files, you will need to place them in the correct directory. For the curriculum challenges, you should place the certification folders (i.e. `01-responsive-web-design`) within the `curriculum/challenges/{lang}` directory. For our Dothraki translations, this would be `curriculum/challenges/dothraki`. The client translation `.json` files will go in the `client/i18n/locales/{lang}` directory. -Una volta che questi saranno in posizione, dovresti essere in grado di eseguire `npm run develop` per vedere la versione tradotta di freeCodeCamp. +Once these are in place, you should be able to run `npm run develop` to view your translated version of freeCodeCamp. -> [!ATTENTION] Anche se puoi farei delle traduzioni localmente per i test, ricordiamo che le traduzioni _non_ devono essere inviate attraverso GitHub ma solo tramite Crowdin. Assicurati di resettare il tuo codebase locale dopo che avrai finito con i test. +> [!ATTENTION] While you may perform translations locally for the purpose of testing, we remind everyone that translations should _not_ be submitted through GitHub and should only be done through Crowdin. Be sure to reset your local codebase after you are done testing. diff --git a/docs/i18n/japanese/devops.md b/docs/i18n/japanese/devops.md index e7241c9de4..a9cf732df2 100644 --- a/docs/i18n/japanese/devops.md +++ b/docs/i18n/japanese/devops.md @@ -536,7 +536,7 @@ Provisioning VMs with the Code 2. Update `npm` and install PM2 and setup `logrotate` and startup on boot ```console - npm i -g npm@6 + npm i -g npm@8 npm i -g pm2 npm install -g serve pm2 install pm2-logrotate diff --git a/docs/i18n/japanese/how-to-test-translations-locally.md b/docs/i18n/japanese/how-to-test-translations-locally.md index c0ff23e4c1..8ef754c12c 100644 --- a/docs/i18n/japanese/how-to-test-translations-locally.md +++ b/docs/i18n/japanese/how-to-test-translations-locally.md @@ -8,9 +8,10 @@ If you would like to test your translations on a local instance of the freeCodeC There are a few steps to take in order to allow the codebase to build in your desired language. -First, visit the `config/i18n/all-langs.js` file to add the language to the available languages list and configure the values. There are four objects here. +First, visit the `config/i18n/all-langs.ts` file to add the language to the available languages list and configure the values. There are four objects here. - `availableLangs`: For both the `client` and `curriculum` arrays, add the text name of the language. This is the value that will be used in the `.env` file later. +- `auditedCerts`: Add the text name of the language as the _key_, and add an array of `SuperBlocks.{cert}` variables as the _value_. This tells the client which certifications are fully translated. - `i18nextCodes`: These are the ISO language codes for each language. You will need to add the appropriate ISO code for the language you are enabling. These do need to be unique for each language. - `langDisplayNames`: These are the display names for the language selector in the navigation menu. - `langCodes`: These are the language codes used for formatting dates and numbers. These should be Unicode CLDR codes instead of ISO codes. @@ -29,6 +30,45 @@ const availableLangs = { ] }; +export const auditedCerts = { + espanol: [ + SuperBlocks.RespWebDesign, + SuperBlocks.JsAlgoDataStruct, + SuperBlocks.FrontEndDevLibs, + SuperBlocks.DataVis, + SuperBlocks.BackEndDevApis + ], + chinese: [ + SuperBlocks.RespWebDesign, + SuperBlocks.JsAlgoDataStruct, + SuperBlocks.FrontEndDevLibs, + SuperBlocks.DataVis, + SuperBlocks.BackEndDevApis, + SuperBlocks.QualityAssurance, + SuperBlocks.SciCompPy, + SuperBlocks.DataAnalysisPy, + SuperBlocks.InfoSec, + SuperBlocks.MachineLearningPy + ], + 'chinese-traditional': [ + SuperBlocks.RespWebDesign, + SuperBlocks.JsAlgoDataStruct, + SuperBlocks.FrontEndDevLibs, + SuperBlocks.DataVis, + SuperBlocks.BackEndDevApis, + SuperBlocks.QualityAssurance, + SuperBlocks.SciCompPy, + SuperBlocks.DataAnalysisPy, + SuperBlocks.InfoSec, + SuperBlocks.MachineLearningPy + ], + dothraki: [ + SuperBlocks.RespWebDesign, + SuperBlocks.JsAlgoDataStruct, + SuperBlocks.FrontEndDevLibs + ] +}; + const i18nextCodes = { english: 'en', espanol: 'es', @@ -54,10 +94,12 @@ const langCodes = { }; ``` -Next, open the `client/src/utils/algolia-locale-setup.js` file. This data is used for the search bar that loads `/news` articles. While it is unlikely that you are going to test this functionality, missing the data for your language can lead to errors when attempting to build the codebase locally. +Next, open the `client/src/utils/algolia-locale-setup.ts` file. This data is used for the search bar that loads `/news` articles. While it is unlikely that you are going to test this functionality, missing the data for your language can lead to errors when attempting to build the codebase locally. Add an object for your language to the `algoliaIndices` object. You should use the values for the `english` object for local testing, replacing the `english` key with your language's `availableLangs` value. +> [!NOTE] If we have already deployed an instance of news in your target language, you can update the values to reflect the live instance. Otherwise, use the English values. + If you were to add Dothraki: ```js @@ -85,40 +127,6 @@ const algoliaIndices = { }; ``` -Next, you will need to tell the client which certifications are translated, and which are still in English. Open the `utils/is-audited.js` file. Within the `auditedCerts`, add a new key with your language's `availableLangs` value. Assign the value of that key to an array containing the _dashed names_ for the certifications that have been translated. Refer to the existing data for those dashed names. - -Continuing the work to enable Dothraki - we have translated the first three certifications: - -```js -const auditedCerts = { - espanol: [ - 'responsive-web-design', - 'javascript-algorithms-and-data-structures' - ], - chinese: [ - 'responsive-web-design', - 'javascript-algorithms-and-data-structures', - 'front-end-development-libraries', - 'data-visualization', - 'back-end-development-and-apis', - 'quality-assurance' - ], - 'chinese-traditional': [ - 'responsive-web-design', - 'javascript-algorithms-and-data-structures', - 'front-end-development-libraries', - 'data-visualization', - 'back-end-development-and-apis', - 'quality-assurance' - ], - dothraki: [ - 'responsive-web-design', - 'javascript-algorithms-and-data-structures', - 'front-end-development-libraries' - ] -}; -``` - Finally, in your `.env` file, set `CLIENT_LOCALE` and `CURRICULUM_LOCALE` to your new language (use the `availableLangs` value.) ```txt @@ -143,7 +151,7 @@ For the video challenges, you need to change a few things. First add the new loc ... ``` -Then add an id for the new language to any video challenge in an audited block. For example, if `auditedCerts` in `all-langs.js` includes `scientific-computing-with-python` for `dothraki`, then you must add a `dothraki` entry in `videoLocaleIds`. The frontmatter should then look like this: +Then add an id for the new language to any video challenge in an audited block. For example, if `auditedCerts` in `all-langs.ts` includes `scientific-computing-with-python` for `dothraki`, then you must add a `dothraki` entry in `videoLocaleIds`. The frontmatter should then look like this: ```yml videoLocaleIds: diff --git a/docs/i18n/portuguese/devops.md b/docs/i18n/portuguese/devops.md index 23013785e3..cccc90c490 100644 --- a/docs/i18n/portuguese/devops.md +++ b/docs/i18n/portuguese/devops.md @@ -536,7 +536,7 @@ Provisionando MVs com o código 2. Atualize o `npm` e instale o PM2 e configure `logrotate` e inicie quando reiniciar ```console - npm i -g npm@6 + npm i -g npm@8 npm i -g pm2 npm install -g serve pm2 install pm2-logrotate diff --git a/docs/i18n/portuguese/how-to-test-translations-locally.md b/docs/i18n/portuguese/how-to-test-translations-locally.md index ea3350e796..c6f4884cd4 100644 --- a/docs/i18n/portuguese/how-to-test-translations-locally.md +++ b/docs/i18n/portuguese/how-to-test-translations-locally.md @@ -8,12 +8,13 @@ Se você gostaria de testar suas traduções em uma instância local do site Fre Existem algumas etapas a serem seguidas para permitir que a base de código seja compilada no idioma desejado. -Primeiro, visite o arquivo `config/i18n/all-langs.js` para adicionar o idioma à lista de idiomas disponíveis e configurar os valores. Existem quatro objetos aqui. +First, visit the `config/i18n/all-langs.ts` file to add the language to the available languages list and configure the values. Existem quatro objetos aqui. - `availableLangs`: tanto para o array `client` quanto para o array `curriculum`, adicione o nome do idioma. Esse valor é o que será usado no arquivo `.env` depois. -- `i18nextCodes`: esses são os códigos ISO de cada linguagem. Você vai precisar do código ISO apropriado para o idioma que você está habilitando. Eles precisam ser únicos para cada idioma. -- `langDisplayNames`: esses são os nomes dos idiomas que aparecerão para a seleção no menu de navegação. -- `langCodes`: esses são os códigos de idiomas usados para formatar datas e números. Esses deverão ser códigos Unicode CLDR ao invés de códigos ISO. +- `auditedCerts`: Add the text name of the language as the _key_, and add an array of `SuperBlocks.{cert}` variables as the _value_. This tells the client which certifications are fully translated. +- `i18nextCodes`: These are the ISO language codes for each language. You will need to add the appropriate ISO code for the language you are enabling. These do need to be unique for each language. +- `langDisplayNames`: These are the display names for the language selector in the navigation menu. +- `langCodes`: These are the language codes used for formatting dates and numbers. These should be Unicode CLDR codes instead of ISO codes. Como um exemplo, se você tivesse que habilitar o idioma Dothraki como seu idioma, os objetos `all-langs.js` devem ficar assim: @@ -29,6 +30,45 @@ const availableLangs = { ] }; +export const auditedCerts = { + espanol: [ + SuperBlocks.RespWebDesign, + SuperBlocks.JsAlgoDataStruct, + SuperBlocks.FrontEndDevLibs, + SuperBlocks.DataVis, + SuperBlocks.BackEndDevApis + ], + chinese: [ + SuperBlocks.RespWebDesign, + SuperBlocks.JsAlgoDataStruct, + SuperBlocks.FrontEndDevLibs, + SuperBlocks.DataVis, + SuperBlocks.BackEndDevApis, + SuperBlocks.QualityAssurance, + SuperBlocks.SciCompPy, + SuperBlocks.DataAnalysisPy, + SuperBlocks.InfoSec, + SuperBlocks.MachineLearningPy + ], + 'chinese-traditional': [ + SuperBlocks.RespWebDesign, + SuperBlocks.JsAlgoDataStruct, + SuperBlocks.FrontEndDevLibs, + SuperBlocks.DataVis, + SuperBlocks.BackEndDevApis, + SuperBlocks.QualityAssurance, + SuperBlocks.SciCompPy, + SuperBlocks.DataAnalysisPy, + SuperBlocks.InfoSec, + SuperBlocks.MachineLearningPy + ], + dothraki: [ + SuperBlocks.RespWebDesign, + SuperBlocks.JsAlgoDataStruct, + SuperBlocks.FrontEndDevLibs + ] +}; + const i18nextCodes = { english: 'en', espanol: 'es', @@ -54,10 +94,12 @@ const langCodes = { }; ``` -Agora, abra o arquivo `client/src/utils/algolia-locale-setup.js`. Esse dado é usado para a barra de busca que carrega os artigos `/news`. Embora seja improvável que você venha a testar essa funcionalidade, não ter os dados para o seu idioma pode levar a erros quando tentar criar a base de código localmente. +Next, open the `client/src/utils/algolia-locale-setup.ts` file. Esse dado é usado para a barra de busca que carrega os artigos `/news`. Embora seja improvável que você venha a testar essa funcionalidade, não ter os dados para o seu idioma pode levar a erros quando tentar criar a base de código localmente. Adicione um objeto para seu idioma no objeto `algoliaIndices`. Você deve usar os valores do objeto `english` para o teste local, substituindo a chave `english` pelo valor de `availableLangs` do seu idioma. +> [!NOTE] If we have already deployed an instance of news in your target language, you can update the values to reflect the live instance. Otherwise, use the English values. + Se você fosse adicionar Dothraki: ```js @@ -85,41 +127,7 @@ const algoliaIndices = { }; ``` -Depois, você precisará informar ao client quais certificações estão traduzidas e quais ainda estão em inglês. Abra o arquivo `utils/is-audited.js`. Dentro de `auditedCerts`, adicione uma nova chave com o valor de `availableLangs` de seu idioma. Atribua o valor daquela chave a um array que contém os _nomes hifenizados_ para as certificações foram traduzidas. Consulte os dados existentes para aqueles nomes hifenizados. - -Dando continuidade ao trabalho para habilitar o idioma Dothraki – traduzimos as três primeiras certificações: - -```js -const auditedCerts = { - espanol: [ - 'responsive-web-design', - 'javascript-algorithms-and-data-structures' - ], - chinese: [ - 'responsive-web-design', - 'javascript-algorithms-and-data-structures', - 'front-end-development-libraries', - 'data-visualization', - 'back-end-development-and-apis', - 'quality-assurance' - ], - 'chinese-traditional': [ - 'responsive-web-design', - 'javascript-algorithms-and-data-structures', - 'front-end-development-libraries', - 'data-visualization', - 'back-end-development-and-apis', - 'quality-assurance' - ], - dothraki: [ - 'responsive-web-design', - 'javascript-algorithms-and-data-structures', - 'front-end-development-libraries' - ] -}; -``` - -Por fim, em seu arquivo `.env`, definimos `CLIENT_LOCALE` e `CURRICULUM_LOCALE` com o valor de seu novo idioma (use o valor de `availableLangs`.) +Finally, in your `.env` file, set `CLIENT_LOCALE` and `CURRICULUM_LOCALE` to your new language (use the `availableLangs` value.) ```txt CLIENT_LOCALE="dothraki" @@ -128,7 +136,7 @@ CURRICULUM_LOCALE="dothraki" ## Ativando vídeos localizados -Para os desafios em vídeo, você precisa fazer algumas alterações. Primeiro, adicione o novo idioma (locale) à consilta do GraphQL no arquivo `client/src/templates/Challenges/video/Show.tsx`. Por exemplo, para adicionar Dothraki à consulta: +For the video challenges, you need to change a few things. First add the new locale to the GraphQL query in the `client/src/templates/Challenges/video/Show.tsx` file. For example, adding Dothraki to the query: ```tsx query VideoChallenge($slug: String!) { @@ -143,7 +151,7 @@ Para os desafios em vídeo, você precisa fazer algumas alterações. Primeiro, ... ``` -Em seguida, adicione um id para o novo idioma para qualquer desafio em vídeo em um bloco auditado. Por exemplo, se `auditedCerts` em `all-langs.js` inclui `scientific-computing-with-python` para `dothraki`, você deve adicionar uma entrada em `dothraki` em `videoLocaleIds`. O frontmatter dever ter essa aparência: +Then add an id for the new language to any video challenge in an audited block. For example, if `auditedCerts` in `all-langs.ts` includes `scientific-computing-with-python` for `dothraki`, then you must add a `dothraki` entry in `videoLocaleIds`. The frontmatter should then look like this: ```yml videoLocaleIds: @@ -151,11 +159,11 @@ videoLocaleIds: italian: hiRTRAqNlpE portuguese: AelGAcoMXbI dothraki: new-id-here -nomeComTracos: introducao-por-que-programa +dashedName: introduction-why-program --- ``` -Atualize a interface de `VideoLocaleIds` em `client/src/redux/prop-types` para que ela inclua o novo idioma. +Update the `VideoLocaleIds` interface in `client/src/redux/prop-types` to include the new language. ```ts export interface VideoLocaleIds { @@ -166,7 +174,7 @@ export interface VideoLocaleIds { } ``` -Por fim, atualize o schema de desafios em `curriculum/schema/challengeSchema.js`. +And finally update the challenge schema in `curriculum/schema/challengeSchema.js`. ```js videoLocaleIds: Joi.when('challengeType', { @@ -182,10 +190,10 @@ videoLocaleIds: Joi.when('challengeType', { ## Carregando traduções -Como o idioma ainda não foi aprovado para produção, nossos scripts ainda não estão baixando automaticamente as traduções. Somente membros da equipe têm acesso para baixar as traduções diretamente – entre em contato conosco quando quiser em nossa [sala de chat dos contribuidores](https://chat.freecodecamp.org/channel/contributors) ou traduza os arquivos de markdown em inglês localmente para fins de teste. +Because the language has not been approved for production, our scripts are not automatically downloading the translations yet. Only staff have the access to directly download the translations - you are welcome to reach out to us in our [contributors chat room](https://chat.freecodecamp.org/channel/contributors), or you can translate the English markdown files locally for testing purposes. -Quando tiver os arquivos em mãos, você precisará colocá-los no diretório correto. Para os desafios do currículo, você deve colocar as pastas de certificação (por exemplo, `01-responsive-web-design`) no diretório `curriculum/challenges/{lang}`. Para nossas traduções em Dothraki, esse diretório seria `curriculum/challenges/dothraki`. Os arquivos `.json` de tradução do client vão no diretório `client/i18n/locales/{lang}`. +Once you have the files, you will need to place them in the correct directory. For the curriculum challenges, you should place the certification folders (i.e. `01-responsive-web-design`) within the `curriculum/challenges/{lang}` directory. For our Dothraki translations, this would be `curriculum/challenges/dothraki`. The client translation `.json` files will go in the `client/i18n/locales/{lang}` directory. -Quando estes arquivos estiverem no local certo, você deve poder usar `npm run develop` para ver sua versão traduzida do freeCodeCamp. +Once these are in place, you should be able to run `npm run develop` to view your translated version of freeCodeCamp. -> [!ATTENTION] Embora você possa realizar as traduções localmente para fins de teste, lembramos a todos que as traduções _não_ devem ser enviadas pelo GitHub e devem ser feitas somente pelo Crowdin. Certifique-se de reiniciar sua base de código local após realizar os testes. +> [!ATTENTION] While you may perform translations locally for the purpose of testing, we remind everyone that translations should _not_ be submitted through GitHub and should only be done through Crowdin. Be sure to reset your local codebase after you are done testing. diff --git a/docs/i18n/portuguese/how-to-work-on-coding-challenges.md b/docs/i18n/portuguese/how-to-work-on-coding-challenges.md index 2fe19fdbbe..34afa44cd8 100644 --- a/docs/i18n/portuguese/how-to-work-on-coding-challenges.md +++ b/docs/i18n/portuguese/how-to-work-on-coding-challenges.md @@ -75,7 +75,7 @@ assert.equal( # --notes-- -Extra information for a challenge, in markdown +Informações extras para um desafio, em markdown # --seed-- @@ -93,7 +93,7 @@ Código avaliado após o código do usuário, e pouco antes dos testes ## --seed-contents-- -Boilerplate code to render to the editor. This section should only contain code inside backticks, like the following: +Código Boilerplate para renderizar para o editor. Esta seção deve somente conter código dentro de crases, como o seguinte exemplo: ```html @@ -118,7 +118,7 @@ console.log('freeCodeCamp is awesome!'); # --solutions-- -Solutions are used for the CI tests to ensure that changes to the hints will still pass as intended +Soluções são usadas para os testes CI a fim de garantir que mudanças nas dicas ainda passem conforme o esperado ```js // primeira solução - a(s) linguagem(ns) deve(m) ser a mesma do código fornecido. @@ -138,27 +138,27 @@ Solutions are used for the CI tests to ensure that changes to the hints will sti # --question-- -These fields are currently used for the multiple-choice Python challenges. +Esses espaços são utilizados geralmente para questões de múltipla escolha dos desafios de Python. ## --text-- -The question text goes here. +O texto da questão vêm aqui. ## --answers-- -Answer 1 +Resposta 1 --- -Answer 2 +Resposta 2 --- -More answers +Mais respostas ## --video-solution-- -The number for the correct answer goes here. +O número da resposta correta fica aqui. ```` > [!NOTE] @@ -190,9 +190,9 @@ $ ObjectId() ObjectId("5a474d78df58bafeb3535d34") ```` -The result is a new id, for example `5a474d78df58bafeb3535d34` above. +O resultado é um novo id, por exemplo `5a474d78df58bafeb3535d34` acima. -Once you have your id, put it into the markdown file as the `id` field at the top, e.g. +Quando tiver seu id, coloque-o no arquivo markdown como campo `id` no topo, ex. ```yml --- @@ -202,13 +202,13 @@ title: Título do desafio ## Nomeando desafios -Naming things is hard. We've made it easier by imposing some constraints. +Nomear coisas é difícil. Nós facilitamos com algumas restrições. -All challenge titles should be explicit and should follow this pattern: +Todos os títulos dos desafios devem estar explícitos e devem seguir este padrão: -\[verb\]\[object clause\] +\[verbo\]\[frase objetiva\] -Here are some example challenge names: +Aqui estão alguns exemplos de nomes para desafios: - Usar a notação de sentido horário para especificar o preenchimento (padding) de um elemento - Condensar arrays com .reduce @@ -216,19 +216,19 @@ Here are some example challenge names: ## Descrições/instruções do desafio -Sentences should be clear and concise with minimal jargon. If used, jargon should be immediately defined in plain English. +As frases devem ser claras e resumidas com o mínimo de termos técnicos. Se usado, o termo técnico deve ser imediatamente definido em inglês simples. -Keep paragraphs short (around 1-4 sentences). People are more likely to read several short paragraphs than a wall of text. +Mantenha os parágrafos curtos (em torno de 1-4 frases). É mais provável que as pessoas leiam vários parágrafos curtos do que um parágrafo enorme. -Challenge text should use the second person ("you") to help to give it a conversational tone. This way the text and instructions seem to speak directly to the camper working through the challenge. Try to avoid using the first person ("I", "we", "let's", and "us"). +O desafio de texto deve usar a segunda pessoa ("você") para ajudar a dar um tom coloquial. Dessa forma, o texto e as instruções parecem falar diretamente ao usuário freeCodeCamp que está resolvendo o desafio. Tente evitar usar a primeira pessoa ("eu", "nós", "vamos"). -Don't use outbound links. These interrupt the flow. Campers should never have to google anything during these challenges. If there are resources you think campers would benefit from, add them to the challenge's Guide-related article. +Não use links externos. Eles interrompem o fluxo. Os usuários do freeCodeCamp nunca devem precisar pesquisar nada no Google durante esses desafios. Se há recursos que você acha que os usuários irão se beneficiar, adicione-os no artigo relacionado ao guia do desafio. -You can add diagrams if necessary. +Você pode adicionar diagramas se necessário. -Don't use emojis or emoticons in challenges. freeCodeCamp has a global community, and the cultural meaning of an emoji or emoticon may be different around the world. Also, emojis can render differently on different systems. +Não use emojis ou emoticons em desafios. O freeCodeCamp possui uma comunidade global, e o significado cultural de um emoji ou emoticon pode ser diferente ao redor do mundo. Além disso, emojis podem ser mostrados de maneiras diferentes em diferentes sistemas. -Proper nouns should use correct capitalization when possible. Below is a list of words as they should appear in the challenges. +Substantivos próprios devem começar com letra maiúscula quando possível. Abaixo está uma lista de palavras e como devem aparecem nos desafios. - JavaScript (letras maiúsculas em "J" e "S" e sem abreviações) - Node.js @@ -236,28 +236,28 @@ Proper nouns should use correct capitalization when possible. Below is a list of ### A regra dos 2 minutos -Each challenge should be solvable within 120 seconds by a native English speaker who has completed the challenges leading up to it. This includes the amount of time it takes to read the directions/instructions understand the seeded code, write their code and get all the tests to pass. +Cada desafio deve ser resolvido em 120 segundos por um nativo da língua inglesa que tenha concluído os desafios anteriores. Isso inclui a quantidade de tempo que leva para ler as instruções, entender o código fornecido, escrever o código e passar nos testes. -If it takes longer than two minutes to complete the challenge, you have two options: +Se levar mais do que dois minutos para completar um desafio, você tem duas opções: - Simplifique o desafio, ou - Divida o desafio em dois desafios. -The 2-minute rule forces you, the challenge designer, to make your directions concise, your seed code clear, and your tests straight-forward. +A regra dos 2 minutos força quem criou o desafio a deixar as instruções resumidas, o código fornecido limpo e seus testes diretos. -We track how long it takes for campers to solve changes and use this information to identify challenges that need to be simplified or split. +Acompanhamos quanto dura para os usuários resolverem mudanças e usamos essa informação para identificar desafios que precisam ser simplificados ou divididos. ### Modularidade -Each challenge should teach exactly one concept, and that concept should be apparent from the challenge's name. +Cada desafio deve ensinar exatamente um conceito, e esse conceito deve estar aparente a partir do nome do desafio. -We can reinforce previously covered concepts through repetition and variations - for example, introducing h1 elements in one challenge, then h3 elements a few challenges later. +Podemos reforçar conceitos citados anteriormente através de repetição e variações - por exemplo, introduzir elementos h1 em um desafio, então elementos h3 depois. -Our goal is to have thousands of 2-minute challenges. These can flow together and reiterate previously-covered concepts. +Nossa meta é ter vários desafios de 2 minutos. Eles podem se completar e relembrar conceitos anteriormente citados. ### Formatando o texto do desafio -Here are specific formatting guidelines for challenge text and examples: +Aqui estão diretrizes de formatação específicas para o texto do desafio e exemplos: - Palavras chaves da linguagem ficam entre `` \` `` crases. Por exemplo, nomes de tags HTML ou nomes de propriedade CSS. - Referências a códigos (ex. função, método ou nomes de variáveis) devem estar entre `` \` ``. Veja o exemplo abaixo: @@ -270,9 +270,9 @@ Use `parseInt` para converter a variável `realNumber` em um número inteiro. - Blocos de código com várias linhas **devem ser precedidos por uma linha vazia**. A próxima linha deve começar com três crases seguidas imediatamente por uma das [linguagens suportadas](https://prismjs.com/#supported-languages). Para completar o bloco de código, você deve começar uma nova linha que apenas possui três crases e **outra linha vazia**. Veja o exemplo abaixo: - Os espaços importam no Markdown. Então, recomendamos que os mantenham visíveis no seu editor. -**Note:** If you are going to use an example code in YAML, use `yaml` instead of `yml` for the language to the right of the backticks. +**Observação:** se você for usar um exemplo de código em YAML, use `yaml` ao invés de `yml` para a linguagem à direita das crases. -The following is an example of code: +Exemplo de código: ````md ```{language} @@ -319,13 +319,13 @@ Exemplo de um comentário de uma linha em JavaScript: // Mude somente abaixo dessa linha ```` -Example of a valid CSS comment: +Exemplo de um comentário válido em CSS: ```css /* Only change code above this line */ ``` -If a challenge only has a single place where code changes are needed, please use the comments in the following example to instruct the user where changes should be made. +Se um desafio tem apenas um lugar onde as mudanças de código são necessárias, use os comentários seguindo o exemplo a seguir para instruir o usuário sobre o local onde as mudanças devem ser feitas. ```js var a = 3; @@ -338,7 +338,7 @@ b = 9 + b; c = c + 7; ``` -If a challenge has multiple places where the user is expected to change code (i.e. the React challenges) +Se um desafio tem múltiplos lugares onde se espera que o usuário faça mudanças no código (ex. os desafios de React) ```jsx class MyComponent extends React.Component { @@ -371,9 +371,9 @@ class MyComponent extends React.Component { ### Tradução de comentários de código seed -There are separate comment dictionaries for each language. The [English version of the comment dictionary](/curriculum/dictionaries/english/comments.js) is the basis for the translations found in the corresponding non-English versions of the files. The non-English version of the Chinese comment dictionary would be located at `/curriculum/dictionaries/chinese/comments.js`. Each dictionary consists of an array of objects with a unique `id` property and a `text` property. Only the `text` should be modified to encompass the translation of the corresponding English comment. +Existem dicionários de comentários separados para cada linguagem. A [versão em inglês do dicionário de comentários](/curriculum/dictionaries/english/comments.js) é a base para as traduções encontradas nas versões correspondentes dos arquivos em outros idiomas. A versão não inglesa do dicionário de comentário chinesa pode ser encontrada em `/curriculum/dictionaries/chinese/comments.js`. Cada dicionário consiste em um array de objetos com uma propriedade de `id` única e uma propriedade de `text`. Somente a propriedade `text` deve ser modificada para englobar a tradução do comentário correspondente em inglês. -Some comments may contain a word/phrase that should not be translated. For example, variable names or proper library names like "React" should not be translated. See the comment below as an example. The word `myGlobal` should not be translated. +Alguns comentários podem conter uma palavra/frase que não deve ser traduzida. Por exemplo, nomes de variáveis, ou nomes próprios de bibliotecas como "React" não devem ser traduzidas. Veja o comentário abaixo como um exemplo. A palavra `myGlobal` não deve ser traduzida. ```text Declare a variável myGlobal abaixo desta linha @@ -385,13 +385,13 @@ Declare a variável myGlobal abaixo desta linha ## Dicas e soluções -Each challenge has a `Get a Hint` button, so a user can access any hints/solutions which have been created for the challenge. Curriculum hints/solutions topics are located on [our forum](https://forum.freecodecamp.org/c/guide) under the `Guide` category. +Cada desafio tem um botão `Get a Hint`, assim, o usuário pode acessar qualquer dica/solução que foi criada para aquele desafio. Os tópicos de dicas/soluções são encontrados no [nosso fórum](https://forum.freecodecamp.org/c/guide), abaixo da categoria `Guide`. -If you find a problem with an existing challenge's hints/solutions topic, you can make suggestions in the [contributors category](https://forum.freecodecamp.org/c/contributors) on the forum. Moderators and users with trust level 3 will review the comments and decide whether or not to include the changes in the corresponding hint/solutions topic. +Se você encontrar um problema nas dicas/tópicos de solução de um desafio existente, você pode fazer sugestões na [categoria de contribuidores](https://forum.freecodecamp.org/c/contributors) no fórum. Os moderadores e usuários com o nível de confiança 3 vão revisar os comentários e decidir quais incluir as mudanças nos tópicos correspondentes de dicas/soluções. ### Adicionando um novo tópico de dicas/soluções em um desafio -Take the following steps when adding a new challenge hints/solutions related topic. +Faça o passo-a-passo a seguir quando for adicionar novos tópicos de dicas/soluções relacionadas a um desafio. 1. Comece seguindo os mesmos passos para criar um novo tópico, mas revise o seguinte para criar o título. 2. O título do tópico deve começar com `freeCodeCamp Challenge Guide:` concatenado com o título atual do desafio de currículo. Por exemplo, se o desafio é chamado "`Chunky Monkey`", o título do tópico seria "`freeCodeCamp Challenge Guide: Chunky Monkey`". @@ -400,7 +400,7 @@ Take the following steps when adding a new challenge hints/solutions related top ### Diretrizes para o conteúdo dos tópicos de dicas e soluções -When proposing a solution for a curriculum challenge related Guide topic, the full code must be added. This includes all the original seed code plus any changes needed to pass all the challenge tests. The following template should be used when creating new hints/solutions topics: +Ao propor uma solução para um tópico do guia relacionado a um desafio de currículo, o código completo deve ser adicionado. Isso inclui todo o código seed original, assim como as alterações necessárias para passar em todos os testes do desafio. O modelo a seguir deve ser usado ao criar um novo tópico de dicas/soluções: ````md # O nome do desafio fica aqui @@ -481,12 +481,12 @@ Você também é capaz de testar um desafio individualmente seguindo as seguinte cd curriculum ``` -2. Run the following for each challenge file for which you have changed (replacing `challenge-title-goes-here` with the full title of the challenge): +2. Execute o comando a seguir para cada arquivo de desafio no qual você fez alteraçõess (substituindo `challenge-title-goes-here` com o título completo do desafio): ``` npm run test -- -g challenge-title-goes-here ``` -Once you have verified that each challenge you've worked on passes the tests, [please create a pull request](how-to-open-a-pull-request.md). +Quando você verificar que cada desafio modificado passou nos testes, [crie um pull request](how-to-open-a-pull-request.md). > [!TIP] Você pode definir a variável de ambiente `LOCALE` no `.env` no idioma do(s) desafio(s) que precisa testar. > @@ -494,7 +494,7 @@ Once you have verified that each challenge you've worked on passes the tests, [p ### Links úteis -Creating and Editing Challenges: +Criação e edição de desafios: 1. [Tipos de desafio](https://github.com/freeCodeCamp/freeCodeCamp/blob/main/client/utils/challenge-types.js#L1-L13) - o que significam os valores do tipo de desafio numérico (enum). diff --git a/docs/i18n/ukrainian/devops.md b/docs/i18n/ukrainian/devops.md index d2b53dfc68..b613fd8423 100644 --- a/docs/i18n/ukrainian/devops.md +++ b/docs/i18n/ukrainian/devops.md @@ -536,7 +536,7 @@ Provisioning VMs with the Code 2. Update `npm` and install PM2 and setup `logrotate` and startup on boot ```console - npm i -g npm@6 + npm i -g npm@8 npm i -g pm2 npm install -g serve pm2 install pm2-logrotate diff --git a/docs/i18n/ukrainian/how-to-test-translations-locally.md b/docs/i18n/ukrainian/how-to-test-translations-locally.md index c0ff23e4c1..8ef754c12c 100644 --- a/docs/i18n/ukrainian/how-to-test-translations-locally.md +++ b/docs/i18n/ukrainian/how-to-test-translations-locally.md @@ -8,9 +8,10 @@ If you would like to test your translations on a local instance of the freeCodeC There are a few steps to take in order to allow the codebase to build in your desired language. -First, visit the `config/i18n/all-langs.js` file to add the language to the available languages list and configure the values. There are four objects here. +First, visit the `config/i18n/all-langs.ts` file to add the language to the available languages list and configure the values. There are four objects here. - `availableLangs`: For both the `client` and `curriculum` arrays, add the text name of the language. This is the value that will be used in the `.env` file later. +- `auditedCerts`: Add the text name of the language as the _key_, and add an array of `SuperBlocks.{cert}` variables as the _value_. This tells the client which certifications are fully translated. - `i18nextCodes`: These are the ISO language codes for each language. You will need to add the appropriate ISO code for the language you are enabling. These do need to be unique for each language. - `langDisplayNames`: These are the display names for the language selector in the navigation menu. - `langCodes`: These are the language codes used for formatting dates and numbers. These should be Unicode CLDR codes instead of ISO codes. @@ -29,6 +30,45 @@ const availableLangs = { ] }; +export const auditedCerts = { + espanol: [ + SuperBlocks.RespWebDesign, + SuperBlocks.JsAlgoDataStruct, + SuperBlocks.FrontEndDevLibs, + SuperBlocks.DataVis, + SuperBlocks.BackEndDevApis + ], + chinese: [ + SuperBlocks.RespWebDesign, + SuperBlocks.JsAlgoDataStruct, + SuperBlocks.FrontEndDevLibs, + SuperBlocks.DataVis, + SuperBlocks.BackEndDevApis, + SuperBlocks.QualityAssurance, + SuperBlocks.SciCompPy, + SuperBlocks.DataAnalysisPy, + SuperBlocks.InfoSec, + SuperBlocks.MachineLearningPy + ], + 'chinese-traditional': [ + SuperBlocks.RespWebDesign, + SuperBlocks.JsAlgoDataStruct, + SuperBlocks.FrontEndDevLibs, + SuperBlocks.DataVis, + SuperBlocks.BackEndDevApis, + SuperBlocks.QualityAssurance, + SuperBlocks.SciCompPy, + SuperBlocks.DataAnalysisPy, + SuperBlocks.InfoSec, + SuperBlocks.MachineLearningPy + ], + dothraki: [ + SuperBlocks.RespWebDesign, + SuperBlocks.JsAlgoDataStruct, + SuperBlocks.FrontEndDevLibs + ] +}; + const i18nextCodes = { english: 'en', espanol: 'es', @@ -54,10 +94,12 @@ const langCodes = { }; ``` -Next, open the `client/src/utils/algolia-locale-setup.js` file. This data is used for the search bar that loads `/news` articles. While it is unlikely that you are going to test this functionality, missing the data for your language can lead to errors when attempting to build the codebase locally. +Next, open the `client/src/utils/algolia-locale-setup.ts` file. This data is used for the search bar that loads `/news` articles. While it is unlikely that you are going to test this functionality, missing the data for your language can lead to errors when attempting to build the codebase locally. Add an object for your language to the `algoliaIndices` object. You should use the values for the `english` object for local testing, replacing the `english` key with your language's `availableLangs` value. +> [!NOTE] If we have already deployed an instance of news in your target language, you can update the values to reflect the live instance. Otherwise, use the English values. + If you were to add Dothraki: ```js @@ -85,40 +127,6 @@ const algoliaIndices = { }; ``` -Next, you will need to tell the client which certifications are translated, and which are still in English. Open the `utils/is-audited.js` file. Within the `auditedCerts`, add a new key with your language's `availableLangs` value. Assign the value of that key to an array containing the _dashed names_ for the certifications that have been translated. Refer to the existing data for those dashed names. - -Continuing the work to enable Dothraki - we have translated the first three certifications: - -```js -const auditedCerts = { - espanol: [ - 'responsive-web-design', - 'javascript-algorithms-and-data-structures' - ], - chinese: [ - 'responsive-web-design', - 'javascript-algorithms-and-data-structures', - 'front-end-development-libraries', - 'data-visualization', - 'back-end-development-and-apis', - 'quality-assurance' - ], - 'chinese-traditional': [ - 'responsive-web-design', - 'javascript-algorithms-and-data-structures', - 'front-end-development-libraries', - 'data-visualization', - 'back-end-development-and-apis', - 'quality-assurance' - ], - dothraki: [ - 'responsive-web-design', - 'javascript-algorithms-and-data-structures', - 'front-end-development-libraries' - ] -}; -``` - Finally, in your `.env` file, set `CLIENT_LOCALE` and `CURRICULUM_LOCALE` to your new language (use the `availableLangs` value.) ```txt @@ -143,7 +151,7 @@ For the video challenges, you need to change a few things. First add the new loc ... ``` -Then add an id for the new language to any video challenge in an audited block. For example, if `auditedCerts` in `all-langs.js` includes `scientific-computing-with-python` for `dothraki`, then you must add a `dothraki` entry in `videoLocaleIds`. The frontmatter should then look like this: +Then add an id for the new language to any video challenge in an audited block. For example, if `auditedCerts` in `all-langs.ts` includes `scientific-computing-with-python` for `dothraki`, then you must add a `dothraki` entry in `videoLocaleIds`. The frontmatter should then look like this: ```yml videoLocaleIds: From 4564b71d0e5fe698caa67bba2663c31e23af5b8e Mon Sep 17 00:00:00 2001 From: "Nicholas Carrigan (he/him)" Date: Sat, 11 Dec 2021 09:10:27 -0800 Subject: [PATCH 19/63] fix(client): i18n news configs (#44463) Co-authored-by: Mrugesh Mohapatra <1884376+raisedadead@users.noreply.github.com> --- client/src/utils/algolia-locale-setup.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/client/src/utils/algolia-locale-setup.ts b/client/src/utils/algolia-locale-setup.ts index a5cd08e4a3..8d9b3728a4 100644 --- a/client/src/utils/algolia-locale-setup.ts +++ b/client/src/utils/algolia-locale-setup.ts @@ -21,15 +21,15 @@ const algoliaIndices = { name: 'news-zh', searchPage: 'https://chinese.freecodecamp.org/news/search' }, - // TODO: Replace with i18n pages when shipped italian: { - name: 'news', - searchPage: 'https://www.freecodecamp.org/news/search/' + name: 'news-it', + searchPage: 'https://www.freecodecamp.org/italian/news/search/' }, portuguese: { - name: 'news', - searchPage: 'https://www.freecodecamp.org/news/search/' + name: 'news-pt', + searchPage: 'https://www.freecodecamp.org/portuguese/news/search/' }, + // TODO: Replace with Ukrainian news when we have more useful resources on that instance ukrainian: { name: 'news', searchPage: 'https://www.freecodecamp.org/news/search/' From 9c386c829f1ee01706e66bf99474ae51aa699031 Mon Sep 17 00:00:00 2001 From: Josh Date: Sat, 11 Dec 2021 19:33:46 +0000 Subject: [PATCH 20/63] fix(client): prevent unusual commas in iframe (#44477) * fix: Moved src files in the head * fix: Removed excess indents Co-authored-by: Canopius --- client/src/templates/Challenges/rechallenge/builders.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/templates/Challenges/rechallenge/builders.js b/client/src/templates/Challenges/rechallenge/builders.js index 38ad633ee0..3ea596c579 100644 --- a/client/src/templates/Challenges/rechallenge/builders.js +++ b/client/src/templates/Challenges/rechallenge/builders.js @@ -91,7 +91,7 @@ A required file can not have both a src and a link: src = ${src}, link = ${link} } return ''; }) - .reduce((head, element) => head.concat(element), []); + .join('\n'); const indexHtml = findIndexHtml(challengeFiles); From ae7535299ea98189acdb3c75ce1d4f9e43975e80 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sun, 12 Dec 2021 08:20:16 +0000 Subject: [PATCH 21/63] fix(deps): update dependency @loadable/component to v5.15.2 --- client/package.json | 2 +- package-lock.json | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/client/package.json b/client/package.json index bf8ca18bbc..37f74dc547 100644 --- a/client/package.json +++ b/client/package.json @@ -48,7 +48,7 @@ "@freecodecamp/react-bootstrap": "0.32.3", "@freecodecamp/react-calendar-heatmap": "1.0.0", "@freecodecamp/strip-comments": "3.0.1", - "@loadable/component": "5.15.0", + "@loadable/component": "5.15.2", "@reach/router": "1.3.4", "@stripe/react-stripe-js": "1.6.0", "@stripe/stripe-js": "1.22.0", diff --git a/package-lock.json b/package-lock.json index d946e22e33..8d8fd23f95 100644 --- a/package-lock.json +++ b/package-lock.json @@ -216,7 +216,7 @@ "@freecodecamp/react-bootstrap": "0.32.3", "@freecodecamp/react-calendar-heatmap": "1.0.0", "@freecodecamp/strip-comments": "3.0.1", - "@loadable/component": "5.15.0", + "@loadable/component": "5.15.2", "@reach/router": "1.3.4", "@stripe/react-stripe-js": "1.6.0", "@stripe/stripe-js": "1.22.0", @@ -4373,9 +4373,9 @@ } }, "node_modules/@loadable/component": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/@loadable/component/-/component-5.15.0.tgz", - "integrity": "sha512-g63rQzypPOZi0BeGsK4ST2MYhsFR+i7bhL8k/McUoWDNMDuTTdUlQ2GACKxqh5sI/dNC/6nVoPrycMnSylnAgQ==", + "version": "5.15.2", + "resolved": "https://registry.npmjs.org/@loadable/component/-/component-5.15.2.tgz", + "integrity": "sha512-ryFAZOX5P2vFkUdzaAtTG88IGnr9qxSdvLRvJySXcUA4B4xVWurUNADu3AnKPksxOZajljqTrDEDcYjeL4lvLw==", "dependencies": { "@babel/runtime": "^7.7.7", "hoist-non-react-statics": "^3.3.1", @@ -57683,7 +57683,7 @@ "@freecodecamp/react-bootstrap": "0.32.3", "@freecodecamp/react-calendar-heatmap": "1.0.0", "@freecodecamp/strip-comments": "3.0.1", - "@loadable/component": "5.15.0", + "@loadable/component": "5.15.2", "@reach/router": "1.3.4", "@stripe/react-stripe-js": "1.6.0", "@stripe/stripe-js": "1.22.0", @@ -59300,9 +59300,9 @@ } }, "@loadable/component": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/@loadable/component/-/component-5.15.0.tgz", - "integrity": "sha512-g63rQzypPOZi0BeGsK4ST2MYhsFR+i7bhL8k/McUoWDNMDuTTdUlQ2GACKxqh5sI/dNC/6nVoPrycMnSylnAgQ==", + "version": "5.15.2", + "resolved": "https://registry.npmjs.org/@loadable/component/-/component-5.15.2.tgz", + "integrity": "sha512-ryFAZOX5P2vFkUdzaAtTG88IGnr9qxSdvLRvJySXcUA4B4xVWurUNADu3AnKPksxOZajljqTrDEDcYjeL4lvLw==", "requires": { "@babel/runtime": "^7.7.7", "hoist-non-react-statics": "^3.3.1", From 361794aacdc3590b0269c11235a5f0d1aa3fcd0d Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 13 Dec 2021 01:05:41 +0000 Subject: [PATCH 22/63] chore(deps): update dependency postcss to v8.4.5 --- client/package.json | 2 +- package-lock.json | 20 ++++++++++---------- tools/ui-components/package.json | 2 +- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/client/package.json b/client/package.json index 37f74dc547..c46b258c5a 100644 --- a/client/package.json +++ b/client/package.json @@ -86,7 +86,7 @@ "nanoid": "3.1.30", "normalize-url": "4.5.1", "path-browserify": "1.0.1", - "postcss": "8.4.4", + "postcss": "8.4.5", "prismjs": "1.25.0", "process": "0.11.10", "prop-types": "15.7.2", diff --git a/package-lock.json b/package-lock.json index 8d8fd23f95..a4bdcc75ea 100644 --- a/package-lock.json +++ b/package-lock.json @@ -254,7 +254,7 @@ "nanoid": "3.1.30", "normalize-url": "4.5.1", "path-browserify": "1.0.1", - "postcss": "8.4.4", + "postcss": "8.4.5", "prismjs": "1.25.0", "process": "0.11.10", "prop-types": "15.7.2", @@ -43261,9 +43261,9 @@ } }, "node_modules/postcss": { - "version": "8.4.4", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.4.tgz", - "integrity": "sha512-joU6fBsN6EIer28Lj6GDFoC/5yOZzLCfn0zHAn/MYXI7aPt4m4hK5KC5ovEZXy+lnCjmYIbQWngvju2ddyEr8Q==", + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz", + "integrity": "sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==", "dependencies": { "nanoid": "^3.1.30", "picocolors": "^1.0.0", @@ -55217,7 +55217,7 @@ "babel-loader": "8.2.3", "babel-plugin-transform-react-remove-prop-types": "0.4.24", "cross-env": "7.0.3", - "postcss": "8.4.4", + "postcss": "8.4.5", "postcss-import": "14.0.2", "rimraf": "3.0.2", "rollup": "2.61.1", @@ -57731,7 +57731,7 @@ "nanoid": "3.1.30", "normalize-url": "4.5.1", "path-browserify": "1.0.1", - "postcss": "8.4.4", + "postcss": "8.4.5", "prismjs": "1.25.0", "process": "0.11.10", "prop-types": "15.7.2", @@ -58092,7 +58092,7 @@ "babel-loader": "8.2.3", "babel-plugin-transform-react-remove-prop-types": "0.4.24", "cross-env": "7.0.3", - "postcss": "8.4.4", + "postcss": "8.4.5", "postcss-import": "14.0.2", "react": "16.14.0", "react-dom": "16.14.0", @@ -89534,9 +89534,9 @@ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" }, "postcss": { - "version": "8.4.4", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.4.tgz", - "integrity": "sha512-joU6fBsN6EIer28Lj6GDFoC/5yOZzLCfn0zHAn/MYXI7aPt4m4hK5KC5ovEZXy+lnCjmYIbQWngvju2ddyEr8Q==", + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz", + "integrity": "sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==", "requires": { "nanoid": "^3.1.30", "picocolors": "^1.0.0", diff --git a/tools/ui-components/package.json b/tools/ui-components/package.json index d1402cddc7..5da5c46ad5 100644 --- a/tools/ui-components/package.json +++ b/tools/ui-components/package.json @@ -45,7 +45,7 @@ "babel-loader": "8.2.3", "babel-plugin-transform-react-remove-prop-types": "0.4.24", "cross-env": "7.0.3", - "postcss": "8.4.4", + "postcss": "8.4.5", "postcss-import": "14.0.2", "rimraf": "3.0.2", "rollup": "2.61.1", From 129083de9787c69d55cbf258f9a4b5a3bd1f9e4c Mon Sep 17 00:00:00 2001 From: camperbot Date: Mon, 13 Dec 2021 21:03:40 +0530 Subject: [PATCH 23/63] chore(i18n,docs): update translations (#44483) --- .../how-to-test-translations-locally.md | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/docs/i18n/portuguese/how-to-test-translations-locally.md b/docs/i18n/portuguese/how-to-test-translations-locally.md index c6f4884cd4..1fe5b48313 100644 --- a/docs/i18n/portuguese/how-to-test-translations-locally.md +++ b/docs/i18n/portuguese/how-to-test-translations-locally.md @@ -8,13 +8,13 @@ Se você gostaria de testar suas traduções em uma instância local do site Fre Existem algumas etapas a serem seguidas para permitir que a base de código seja compilada no idioma desejado. -First, visit the `config/i18n/all-langs.ts` file to add the language to the available languages list and configure the values. Existem quatro objetos aqui. +Primeiro, visite o arquivo `config/i18n/all-langs.ts` para adicionar o idioma à lista de idiomas disponíveis e configurar os valores. Existem quatro objetos aqui. - `availableLangs`: tanto para o array `client` quanto para o array `curriculum`, adicione o nome do idioma. Esse valor é o que será usado no arquivo `.env` depois. -- `auditedCerts`: Add the text name of the language as the _key_, and add an array of `SuperBlocks.{cert}` variables as the _value_. This tells the client which certifications are fully translated. -- `i18nextCodes`: These are the ISO language codes for each language. You will need to add the appropriate ISO code for the language you are enabling. These do need to be unique for each language. -- `langDisplayNames`: These are the display names for the language selector in the navigation menu. -- `langCodes`: These are the language codes used for formatting dates and numbers. These should be Unicode CLDR codes instead of ISO codes. +- `auditedCerts`: adicione o nome do texto do idioma como a _chave_ e adicione um array de variáveis `SuperBlocks.{cert}` como o _valor_. Isto informa ao cliente quais certificações estão totalmente traduzidas. +- `i18nextCodes`: esses são os códigos ISO de cada linguagem. Você vai precisar do código ISO apropriado para o idioma que você está habilitando. Eles precisam ser únicos para cada idioma. +- `langDisplayNames`: esses são os nomes dos idiomas que aparecerão para a seleção no menu de navegação. +- `langCodes`: esses são os códigos de idiomas usados para formatar datas e números. Esses deverão ser códigos Unicode CLDR ao invés de códigos ISO. Como um exemplo, se você tivesse que habilitar o idioma Dothraki como seu idioma, os objetos `all-langs.js` devem ficar assim: @@ -94,11 +94,11 @@ const langCodes = { }; ``` -Next, open the `client/src/utils/algolia-locale-setup.ts` file. Esse dado é usado para a barra de busca que carrega os artigos `/news`. Embora seja improvável que você venha a testar essa funcionalidade, não ter os dados para o seu idioma pode levar a erros quando tentar criar a base de código localmente. +Agora, abra o arquivo `client/src/utils/algolia-locale-setup.ts`. Esse dado é usado para a barra de busca que carrega os artigos `/news`. Embora seja improvável que você venha a testar essa funcionalidade, não ter os dados para o seu idioma pode levar a erros quando tentar criar a base de código localmente. Adicione um objeto para seu idioma no objeto `algoliaIndices`. Você deve usar os valores do objeto `english` para o teste local, substituindo a chave `english` pelo valor de `availableLangs` do seu idioma. -> [!NOTE] If we have already deployed an instance of news in your target language, you can update the values to reflect the live instance. Otherwise, use the English values. +> [!NOTE] Se nós já implantamos uma instância do editorial em sua língua-alvo, você pode atualizar os valores para refletir a instância que já está implantada. Do contrário, use os valores em inglês. Se você fosse adicionar Dothraki: @@ -127,7 +127,7 @@ const algoliaIndices = { }; ``` -Finally, in your `.env` file, set `CLIENT_LOCALE` and `CURRICULUM_LOCALE` to your new language (use the `availableLangs` value.) +Por fim, em seu arquivo `.env`, definimos `CLIENT_LOCALE` e `CURRICULUM_LOCALE` com o valor de seu novo idioma (use o valor de `availableLangs`.) ```txt CLIENT_LOCALE="dothraki" @@ -136,7 +136,7 @@ CURRICULUM_LOCALE="dothraki" ## Ativando vídeos localizados -For the video challenges, you need to change a few things. First add the new locale to the GraphQL query in the `client/src/templates/Challenges/video/Show.tsx` file. For example, adding Dothraki to the query: +Para os desafios em vídeo, você precisa fazer algumas alterações. Primeiro, adicione o novo idioma (locale) à consulta do GraphQL no arquivo `client/src/templates/Challenges/video/Show.tsx`. Por exemplo, para adicionar Dothraki à consulta: ```tsx query VideoChallenge($slug: String!) { @@ -151,7 +151,7 @@ For the video challenges, you need to change a few things. First add the new loc ... ``` -Then add an id for the new language to any video challenge in an audited block. For example, if `auditedCerts` in `all-langs.ts` includes `scientific-computing-with-python` for `dothraki`, then you must add a `dothraki` entry in `videoLocaleIds`. The frontmatter should then look like this: +Em seguida, adicione um id para o novo idioma para qualquer desafio em vídeo em um bloco auditado. Por exemplo, se `auditedCerts` em `all-langs.ts` inclui `scientific-computing-with-python` para `dothraki`, você deve adicionar uma entrada em `dothraki` em `videoLocaleIds`. O frontmatter dever ter essa aparência: ```yml videoLocaleIds: @@ -159,11 +159,11 @@ videoLocaleIds: italian: hiRTRAqNlpE portuguese: AelGAcoMXbI dothraki: new-id-here -dashedName: introduction-why-program +nomeComTracos: introducao-por-que-programar --- ``` -Update the `VideoLocaleIds` interface in `client/src/redux/prop-types` to include the new language. +Atualize a interface de `VideoLocaleIds` em `client/src/redux/prop-types` para que ela inclua o novo idioma. ```ts export interface VideoLocaleIds { @@ -174,7 +174,7 @@ export interface VideoLocaleIds { } ``` -And finally update the challenge schema in `curriculum/schema/challengeSchema.js`. +Por fim, atualize o schema de desafios em `curriculum/schema/challengeSchema.js`. ```js videoLocaleIds: Joi.when('challengeType', { @@ -190,10 +190,10 @@ videoLocaleIds: Joi.when('challengeType', { ## Carregando traduções -Because the language has not been approved for production, our scripts are not automatically downloading the translations yet. Only staff have the access to directly download the translations - you are welcome to reach out to us in our [contributors chat room](https://chat.freecodecamp.org/channel/contributors), or you can translate the English markdown files locally for testing purposes. +Como o idioma ainda não foi aprovado para produção, nossos scripts ainda não estão baixando automaticamente as traduções. Somente membros da equipe têm acesso para baixar as traduções diretamente – entre em contato conosco quando quiser em nossa [sala de chat dos contribuidores](https://chat.freecodecamp.org/channel/contributors) ou traduza os arquivos de markdown em inglês localmente para fins de teste. -Once you have the files, you will need to place them in the correct directory. For the curriculum challenges, you should place the certification folders (i.e. `01-responsive-web-design`) within the `curriculum/challenges/{lang}` directory. For our Dothraki translations, this would be `curriculum/challenges/dothraki`. The client translation `.json` files will go in the `client/i18n/locales/{lang}` directory. +Quando tiver os arquivos em mãos, você precisará colocá-los no diretório correto. Para os desafios do currículo, você deve colocar as pastas de certificação (por exemplo, `01-responsive-web-design`) no diretório `curriculum/challenges/{lang}`. Para nossas traduções em Dothraki, esse diretório seria `curriculum/challenges/dothraki`. Os arquivos `.json` de tradução do client vão no diretório `client/i18n/locales/{lang}`. -Once these are in place, you should be able to run `npm run develop` to view your translated version of freeCodeCamp. +Quando estes arquivos estiverem no local certo, você deve poder usar `npm run develop` para ver sua versão traduzida do freeCodeCamp. -> [!ATTENTION] While you may perform translations locally for the purpose of testing, we remind everyone that translations should _not_ be submitted through GitHub and should only be done through Crowdin. Be sure to reset your local codebase after you are done testing. +> [!ATTENTION] Embora você possa realizar as traduções localmente para fins de teste, lembramos a todos que as traduções _não_ devem ser enviadas pelo GitHub e devem ser feitas somente pelo Crowdin. Certifique-se de reiniciar sua base de código local após realizar os testes. From cd9c57a8c55f866682c7bce16ac0d942d8679f26 Mon Sep 17 00:00:00 2001 From: Ahmad Abdolsaheb Date: Mon, 13 Dec 2021 19:25:21 +0300 Subject: [PATCH 24/63] feat(client): optimize donation form for holiday alert (#44482) * feat(client): optmize donation form for holiday alert * feat: remove key from i18n --- client/i18n/locales/english/translations.json | 1 - client/src/components/Donation/donate-form.tsx | 17 +++++++++++++---- client/src/components/Intro/index.tsx | 2 +- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/client/i18n/locales/english/translations.json b/client/i18n/locales/english/translations.json index 2a4ac07f1f..373bc45cf3 100644 --- a/client/i18n/locales/english/translations.json +++ b/client/i18n/locales/english/translations.json @@ -32,7 +32,6 @@ "profile": "Profile", "news": "News", "donate": "Donate", - "support-our-nonprofit": "Support our non-profit", "update-settings": "Update my account settings", "sign-me-out": "Sign me out of freeCodeCamp", "flag-user": "Flag This User's Account for Abuse", diff --git a/client/src/components/Donation/donate-form.tsx b/client/src/components/Donation/donate-form.tsx index e41389ca5e..58f5f6d90a 100644 --- a/client/src/components/Donation/donate-form.tsx +++ b/client/src/components/Donation/donate-form.tsx @@ -16,6 +16,7 @@ import { } from '../../../../config/donation-settings'; import { isSignedInSelector, + isDonatingSelector, signInLoadingSelector, donationFormStateSelector, addDonation, @@ -70,6 +71,7 @@ type DonateFormProps = { donationFormState: DonateFormState; isMinimalForm?: boolean; isSignedIn: boolean; + isDonating: boolean; showLoading: boolean; t: ( label: string, @@ -82,15 +84,18 @@ type DonateFormProps = { const mapStateToProps = createSelector( signInLoadingSelector, isSignedInSelector, + isDonatingSelector, donationFormStateSelector, userSelector, ( showLoading: DonateFormProps['showLoading'], isSignedIn: DonateFormProps['isSignedIn'], + isDonating: DonateFormProps['isDonating'], donationFormState: DonateFormState, { email, theme }: { email: string; theme: Themes } ) => ({ isSignedIn, + isDonating, showLoading, donationFormState, email, @@ -310,7 +315,8 @@ class DonateForm extends Component { theme, t, isMinimalForm, - isSignedIn + isSignedIn, + isDonating } = this.props; const priorityTheme = defaultTheme ? defaultTheme : theme; const isOneTime = donationDuration === 'onetime'; @@ -318,6 +324,7 @@ class DonateForm extends Component { isOneTime ? 'donate.wallet-label' : 'donate.wallet-label-1', { usd: donationAmount / 100 } )}:`; + const showMinimalPayments = isMinimalForm || !isDonating; return ( <> @@ -342,14 +349,16 @@ class DonateForm extends Component { donationDuration={donationDuration} handlePaymentButtonLoad={this.handlePaymentButtonLoad} handleProcessing={handleProcessing} - isMinimalForm={isMinimalForm} + isMinimalForm={showMinimalPayments} isPaypalLoading={loading.paypal} isSignedIn={isSignedIn} onDonationStateChange={this.onDonationStateChange} theme={priorityTheme} /> - - {isMinimalForm && ( + {(!loading.stripe || !loading.paypal) && ( + + )} + {showMinimalPayments && ( <>
{t('donate.or-card')}
- {t('buttons.support-our-nonprofit')} + {t('buttons.donate')}

From fc3756656ab43cbbeec2989e5bcc936e4be50c17 Mon Sep 17 00:00:00 2001 From: camperbot Date: Mon, 13 Dec 2021 22:11:12 +0530 Subject: [PATCH 25/63] chore(i18n,curriculum): update translations (#44484) --- .../file-metadata-microservice.md | 22 ++++---- .../timestamp-microservice.md | 30 +++++------ .../url-shortener-microservice.md | 22 ++++---- .../stock-price-checker.md | 52 +++++++++---------- 4 files changed, 63 insertions(+), 63 deletions(-) diff --git a/curriculum/challenges/ukrainian/05-back-end-development-and-apis/back-end-development-and-apis-projects/file-metadata-microservice.md b/curriculum/challenges/ukrainian/05-back-end-development-and-apis/back-end-development-and-apis-projects/file-metadata-microservice.md index 73a21855f9..09caebba8e 100644 --- a/curriculum/challenges/ukrainian/05-back-end-development-and-apis/back-end-development-and-apis-projects/file-metadata-microservice.md +++ b/curriculum/challenges/ukrainian/05-back-end-development-and-apis/back-end-development-and-apis-projects/file-metadata-microservice.md @@ -1,6 +1,6 @@ --- id: bd7158d8c443edefaeb5bd0f -title: File Metadata Microservice +title: Мікросервіс метаданих файлу challengeType: 4 forumTopicId: 301506 dashedName: file-metadata-microservice @@ -8,21 +8,21 @@ dashedName: file-metadata-microservice # --description-- -Build a full stack JavaScript app that is functionally similar to this: . Working on this project will involve you writing your code using one of the following methods: +Створіть full stack додаток на JavaScript, який функціонально схожий до цього:. Робота над цим проектом залучатиме тебе писати свій код використовуючи один з наступних методів: -- Clone [this GitHub repo](https://github.com/freeCodeCamp/boilerplate-project-filemetadata/) and complete your project locally. -- Use [our Replit starter project](https://replit.com/github/freeCodeCamp/boilerplate-project-filemetadata) to complete your project. -- Use a site builder of your choice to complete the project. Be sure to incorporate all the files from our GitHub repo. +- Клонувати [цей репозиторій з GitHub](https://github.com/freeCodeCamp/boilerplate-project-filemetadata/) та локально завершити свій проект. +- Використати [наш проект для початківців на Replit](https://replit.com/github/freeCodeCamp/boilerplate-project-filemetadata) для завершення свого проекту. +- Використати конструктор сайтів на свій вибір для завершення проекту. Впевніться, що ви зберегли всі файли із нашого GitHub репозиторію. -When you are done, make sure a working demo of your project is hosted somewhere public. Then submit the URL to it in the `Solution Link` field. Optionally, also submit a link to your project's source code in the `GitHub Link` field. +По завершенню переконайтеся, що працююча демоверсія вашого проекту розміщена у відкритому доступі. Потім введіть його URL-адресу в поле `Solution Link`. За бажанням також можете ввести посилання на вихідний код вашого проєкту в полі `GitHub Link`. # --instructions-- -**HINT:** You can use the `multer` npm package to handle file uploading. +**ПІДКАЗКА:** Ви можете використовувати npm пакет `multer` щоб опрацювати завантаження файлу. # --hints-- -You should provide your own project, not the example URL. +Вам необхідно вказати свій власний проект, а не приклад URL-адреси. ```js (getUserInput) => { @@ -34,7 +34,7 @@ You should provide your own project, not the example URL. }; ``` -You can submit a form that includes a file upload. +Ви можете надіслати форму, що включає в себе завантаження файлу. ```js async (getUserInput) => { @@ -45,7 +45,7 @@ async (getUserInput) => { }; ``` -The form file input field has the `name` attribute set to `upfile`. +Поле вводу файлу форми має параметр `name` встановлений в `upfile`. ```js async (getUserInput) => { @@ -56,7 +56,7 @@ async (getUserInput) => { }; ``` -When you submit a file, you receive the file `name`, `type`, and `size` in bytes within the JSON response. +Коли ви надсилаєте файл, ви отримуєте `name`, `type` і `size` файлу в байтах у відповіді JSON. ```js async (getUserInput) => { diff --git a/curriculum/challenges/ukrainian/05-back-end-development-and-apis/back-end-development-and-apis-projects/timestamp-microservice.md b/curriculum/challenges/ukrainian/05-back-end-development-and-apis/back-end-development-and-apis-projects/timestamp-microservice.md index 3e27c39463..5bb3dc8366 100644 --- a/curriculum/challenges/ukrainian/05-back-end-development-and-apis/back-end-development-and-apis-projects/timestamp-microservice.md +++ b/curriculum/challenges/ukrainian/05-back-end-development-and-apis/back-end-development-and-apis-projects/timestamp-microservice.md @@ -1,6 +1,6 @@ --- id: bd7158d8c443edefaeb5bdef -title: Timestamp Microservice +title: Мікросервіс часової мітки challengeType: 4 forumTopicId: 301508 dashedName: timestamp-microservice @@ -8,19 +8,19 @@ dashedName: timestamp-microservice # --description-- -Build a full stack JavaScript app that is functionally similar to this: . Working on this project will involve you writing your code using one of the following methods: +Створіть full stack додаток на JavaScript, який функціонально схожий до цього: . Робота над цим проектом залучатиме тебе писати свій код використовуючи один з наступних методів: -- Clone [this GitHub repo](https://github.com/freeCodeCamp/boilerplate-project-timestamp/) and complete your project locally. -- Use [our Replit starter project](https://replit.com/github/freeCodeCamp/boilerplate-project-timestamp) to complete your project. -- Use a site builder of your choice to complete the project. Be sure to incorporate all the files from our GitHub repo. +- Клонувати [цей репозиторій з GitHub](https://github.com/freeCodeCamp/boilerplate-project-timestamp/) та локально завершити свій проект. +- Використати [наш проект для початківців на Replit](https://replit.com/github/freeCodeCamp/boilerplate-project-timestamp) для завершення свого проекту. +- Використати конструктор сайтів на свій вибір для завершення проекту. Впевніться, що ви зберегли всі файли із нашого GitHub репозиторію. -When you are done, make sure a working demo of your project is hosted somewhere public. Then submit the URL to it in the `Solution Link` field. Optionally, also submit a link to your project's source code in the `GitHub Link` field. +По завершенню переконайтеся, що працююча демоверсія вашого проєкту розміщена у відкритому доступі. Потім введіть його URL-адресу в поле `Solution Link`. За бажанням також можете ввести посилання на вихідний код вашого проєкту в полі `GitHub Link`. -**Note:** Time zones conversion is not a purpose of this project, so assume all sent valid dates will be parsed with `new Date()` as GMT dates. +**Зверніть увагу:** оскільки мета проєкту не в перетворенні часу, припускайте, що усі відправлені дати будуть розглянуті `new Date()` як GMT. # --hints-- -You should provide your own project, not the example URL. +Вам необхідно вказати свій власний проект, а не приклад URL-адреси. ```js (getUserInput) => { @@ -30,7 +30,7 @@ You should provide your own project, not the example URL. }; ``` -A request to `/api/:date?` with a valid date should return a JSON object with a `unix` key that is a Unix timestamp of the input date in milliseconds +Запит на `/api/:date?` з дійсною датою має повернути об’єкт JSON з `unix` ключем, який є часовою міткою Unix введеної дати в мілісекундах ```js (getUserInput) => @@ -48,7 +48,7 @@ A request to `/api/:date?` with a valid date should return a JSON object with a ); ``` -A request to `/api/:date?` with a valid date should return a JSON object with a `utc` key that is a string of the input date in the format: `Thu, 01 Jan 1970 00:00:00 GMT` +Запит на `/api/:date?` з дійсною датою має повернути об'єкт JSON з `utc` ключем, який є рядком введеної дати в форматі: `Thu, 01 Jan 1970 00:00:00 GMT` ```js (getUserInput) => @@ -66,7 +66,7 @@ A request to `/api/:date?` with a valid date should return a JSON object with a ); ``` -A request to `/api/1451001600000` should return `{ unix: 1451001600000, utc: "Fri, 25 Dec 2015 00:00:00 GMT" }` +Запит до `/api/1451001600000` має повертати `{ unix: 1451001600000, utc: "Fri, 25 Dec 2015 00:00:00 GMT" }` ```js (getUserInput) => @@ -83,7 +83,7 @@ A request to `/api/1451001600000` should return `{ unix: 1451001600000, utc: "Fr ); ``` -Your project can handle dates that can be successfully parsed by `new Date(date_string)` +Ваш проєкт може обробляти дати, які можуть бути успішно розпарсені за допомогою `new Date(date_string)` ```js (getUserInput) => @@ -100,7 +100,7 @@ Your project can handle dates that can be successfully parsed by `new Date(date_ ); ``` -If the input date string is invalid, the api returns an object having the structure `{ error : "Invalid Date" }` +Якщо введений рядок дати невірний, api повертає об'єкт, що має структуру `{ error : "Invalid Date" }` ```js (getUserInput) => @@ -114,7 +114,7 @@ If the input date string is invalid, the api returns an object having the struct ); ``` -An empty date parameter should return the current time in a JSON object with a `unix` key +Порожній параметр дати має повернути поточний час в об'єкті JSON з ключем `unix` ```js (getUserInput) => @@ -129,7 +129,7 @@ An empty date parameter should return the current time in a JSON object with a ` ); ``` -An empty date parameter should return the current time in a JSON object with a `utc` key +Порожній параметр дати має повернути поточний час в об'єкті JSON з ключем `utc` ```js (getUserInput) => diff --git a/curriculum/challenges/ukrainian/05-back-end-development-and-apis/back-end-development-and-apis-projects/url-shortener-microservice.md b/curriculum/challenges/ukrainian/05-back-end-development-and-apis/back-end-development-and-apis-projects/url-shortener-microservice.md index b10b50c3a9..63b48c1f3a 100644 --- a/curriculum/challenges/ukrainian/05-back-end-development-and-apis/back-end-development-and-apis-projects/url-shortener-microservice.md +++ b/curriculum/challenges/ukrainian/05-back-end-development-and-apis/back-end-development-and-apis-projects/url-shortener-microservice.md @@ -1,6 +1,6 @@ --- id: bd7158d8c443edefaeb5bd0e -title: URL Shortener Microservice +title: Мікросервіс скорочування URL-адрес challengeType: 4 forumTopicId: 301509 dashedName: url-shortener-microservice @@ -8,21 +8,21 @@ dashedName: url-shortener-microservice # --description-- -Build a full stack JavaScript app that is functionally similar to this: . Working on this project will involve you writing your code using one of the following methods: +Створіть повний пакет додатку на JavaScript, який функціонально схожий до цього:. Робота над цим проєктом включатиме написання коду одним із таких методів: -- Clone [this GitHub repo](https://github.com/freeCodeCamp/boilerplate-project-urlshortener/) and complete your project locally. -- Use [our Replit starter project](https://replit.com/github/freeCodeCamp/boilerplate-project-urlshortener) to complete your project. -- Use a site builder of your choice to complete the project. Be sure to incorporate all the files from our GitHub repo. +- Клонувати [цей репозиторій з GitHub](https://github.com/freeCodeCamp/boilerplate-project-urlshortener/) та локально завершити свій проект. +- Використати [наш проект для початківців на Replit](https://replit.com/github/freeCodeCamp/boilerplate-project-urlshortener) для завершення свого проекту. +- Використати конструктор сайту на свій вибір для завершення проекту. Впевнитися, що включили всі файли з нашого репозиторію GitHub. -When you are done, make sure a working demo of your project is hosted somewhere public. Then submit the URL to it in the `Solution Link` field. Optionally, also submit a link to your project's source code in the `GitHub Link` field. +По завершенню переконайтеся, що працююча демо-версія вашого проекту розміщена у відкритому доступі. Потім введіть його URL-адресу в поле `Solution Link`. За бажанням також можете ввести посилання на вихідний код вашого проєкту в полі `GitHub Link`. # --instructions-- -**HINT:** Do not forget to use a body parsing middleware to handle the POST requests. Also, you can use the function `dns.lookup(host, cb)` from the `dns` core module to verify a submitted URL. +**ПІДКАЗКА:** не забудьте використовувати проміжне програмне забезпечення body parsing для обробки запитів POST. Також ви можете використовувати функцію `dns.lookup(host, cb)` з основного модуля `dns` для перевірки надісланої URL-адреси. # --hints-- -You should provide your own project, not the example URL. +Вам необхідно вказати свій власний проект, а не приклад URL-адреси. ```js (getUserInput) => { @@ -34,7 +34,7 @@ You should provide your own project, not the example URL. }; ``` -You can POST a URL to `/api/shorturl` and get a JSON response with `original_url` and `short_url` properties. Here's an example: `{ original_url : 'https://freeCodeCamp.org', short_url : 1}` +Ви можете POST URL до `/api/shorturl` та отримати відповідь JSON з властивостями `original_url` і `short_url`. Ось приклад: `{ original_url : 'https://freeCodeCamp.org', short_url : 1}` ```js async (getUserInput) => { @@ -56,7 +56,7 @@ async (getUserInput) => { }; ``` -When you visit `/api/shorturl/`, you will be redirected to the original URL. +Коли ви відкриєте `/api/shorturl/`, вас буде перенаправлено на оригінальне URL. ```js async (getUserInput) => { @@ -88,7 +88,7 @@ async (getUserInput) => { }; ``` -If you pass an invalid URL that doesn't follow the valid `http://www.example.com` format, the JSON response will contain `{ error: 'invalid url' }` +Якщо ви введете недійсний URL, який не відповідає дійсному формату `http://www.example.com` , то відповідь JSON буде містити `{ error: 'invalid url' }` ```js async (getUserInput) => { diff --git a/curriculum/challenges/ukrainian/09-information-security/information-security-projects/stock-price-checker.md b/curriculum/challenges/ukrainian/09-information-security/information-security-projects/stock-price-checker.md index c982308617..4d7baddcb5 100644 --- a/curriculum/challenges/ukrainian/09-information-security/information-security-projects/stock-price-checker.md +++ b/curriculum/challenges/ukrainian/09-information-security/information-security-projects/stock-price-checker.md @@ -1,6 +1,6 @@ --- id: 587d824a367417b2b2512c44 -title: Stock Price Checker +title: Перевірка ціни на ринку акцій challengeType: 4 forumTopicId: 301572 dashedName: stock-price-checker @@ -8,38 +8,38 @@ dashedName: stock-price-checker # --description-- -Build a full stack JavaScript app that is functionally similar to this: . +Напишіть повний пакет програми JavaScript, що функціонально подібний до цього: . -Since all reliable stock price APIs require an API key, we've built a workaround. Use to get up-to-date stock price information without needing to sign up for your own key. +Оскільки всі надійні API цін на акції вимагають API-ключа, ми створили обхідний шлях. Користуйтесь , аби отримувати актуальну інформацію про ціни на акції без необхідності підписуватись на власний ключ. -Working on this project will involve you writing your code using one of the following methods: +При роботі над цим проєктом Ви будете писати код, використовуючи один із наступних методів: -- Clone [this GitHub repo](https://github.com/freeCodeCamp/boilerplate-project-stockchecker/) and complete your project locally. -- Use [our Replit starter project](https://replit.com/github/freeCodeCamp/boilerplate-project-stockchecker) to complete your project. -- Use a site builder of your choice to complete the project. Be sure to incorporate all the files from our GitHub repo. +- Дублюйте [цей репозиторій GitHub](https://github.com/freeCodeCamp/boilerplate-project-stockchecker/) та завершіть свій проєкт локально. +- Використовуйте [наш стартовий проєкт Replit](https://replit.com/github/freeCodeCamp/boilerplate-project-stockchecker) для завершення Вашого проєкту. +- Використовуйте конструктор сайту на власний розсуд, щоб завершити проєкт. Впевніться, що Ви включили усі файли з нашого репозиторію GitHub. -When you are done, make sure a working demo of your project is hosted somewhere public. Then submit the URL to it in the `Solution Link` field. Optionally, also submit a link to your project's source code in the `GitHub Link` field. +Коли Ви завершите роботу, переконайтесь, що робоча демоверсія Вашого проєкту розміщена у вільному доступі. Потім введіть URL-адресу проєкту у поле `Solution Link`. За бажанням також введіть посилання на вихідний код проєкту у полі `GitHub Link`. # --instructions-- -1. SET `NODE_ENV` to `test` without quotes and set `DB` to your MongoDB connection string -2. Complete the project in `routes/api.js` or by creating a handler/controller -3. You will add any security features to `server.js` -4. You will create all of the functional tests in `tests/2_functional-tests.js` +1. Встановіть `NODE_ENV` до `test` без лапок та встановіть `DB` на ваш MongoDB +2. Завершіть проект в `routes/api.js` або через створення обробника/контролера +3. Додайте будь-які заходи безпеки до `server.js` +4. Створіть усі функціональні тести в `tests/2_functional-tests.js` -**Note** Privacy Considerations: Due to the requirement that only 1 like per IP should be accepted, you will have to save IP addresses. It is important to remain compliant with data privacy laws such as the General Data Protection Regulation. One option is to get permission to save the user's data, but it is much simpler to anonymize it. For this challenge, remember to anonymize IP addresses before saving them to the database. If you need ideas on how to do this, you may choose to hash the data, truncate it, or set part of the IP address to 0. +**Зверніть увагу** на питання конфіденційності: вам доведеться зберегти IP-адресу. Важливо дотримуватися законів про конфіденційність даних, як от загального регламенту про захист даних. Один із варіантів — отримати дозвіл на збереження даних користувача, однак все ж простіше зробити їх анонімними. Не забудьте зробити ваші IP-адреси анонімними, перш ніж зберігати їх до бази даних у цьому завданні. Для цього ви можете скористатися хеш-функцією, методом truncate чи просто змінити частину IP-адреси на 0. -Write the following tests in `tests/2_functional-tests.js`: +Напишіть наступні тести в `tests/2_functional-tests.js`: -- Viewing one stock: GET request to `/api/stock-prices/` -- Viewing one stock and liking it: GET request to `/api/stock-prices/` -- Viewing the same stock and liking it again: GET request to `/api/stock-prices/` -- Viewing two stocks: GET request to `/api/stock-prices/` -- Viewing two stocks and liking them: GET request to `/api/stock-prices/` +- Перегляд однієї акції: запит GET до `/api/stock-prices/` +- Якщо Ви переглянули одну акцію й вона Вам сподобалась: запит GET в `/api/stock-prices/` +- Якщо Ви переглянули ту ж саму акцію й обрали її знову: запит GET в `/api/stock-prices/` +- Якщо Ви переглянули дві акції: запит GET в `/api/stock-prices/` +- Якщо Ви переглянули дві акції та вони Вам сподобались: запит GET в `/api/stock-prices/` # --hints-- -You can provide your own project, not the example URL. +Ви можете додати свій проєкт, а не URL-посилання прикладу. ```js (getUserInput) => { @@ -49,7 +49,7 @@ You can provide your own project, not the example URL. }; ``` -You should set the content security policies to only allow loading of scripts and CSS from your server. +Ви маєте налаштувати політику безпеки вмісту так, щоб дозволити завантаження скриптів та CSS лише з вашого сервера. ```js async (getUserInput) => { @@ -64,7 +64,7 @@ async (getUserInput) => { }; ``` -You can send a `GET` request to `/api/stock-prices`, passing a NASDAQ stock symbol to a `stock` query parameter. The returned object will contain a property named `stockData`. +Ви можете надіслати запит `GET` до `/api/stock-prices`, передаючи символ акції NASDAQ в параметр запиту `stock`. Отриманий об'єкт міститиме властивість із назвою `stockData`. ```js async (getUserInput) => { @@ -76,7 +76,7 @@ async (getUserInput) => { }; ``` -The `stockData` property includes the `stock` symbol as a string, the `price` as a number, and `likes` as a number. +Властивість `stockData` включає символ `stock` у вигляді строки, `price` та `likes` у вигляді чисел. ```js async (getUserInput) => { @@ -91,13 +91,13 @@ async (getUserInput) => { }; ``` -You can also pass along a `like` field as `true` (boolean) to have your like added to the stock(s). Only 1 like per IP should be accepted. +Ви також можете передати поле `like` як `true` (логічний тип), аби ваші вподобання було додано до акції(й). Приймається лише одне вподобання на IP. ```js ``` -If you pass along 2 stocks, the returned value will be an array with information about both stocks. Instead of `likes`, it will display `rel_likes` (the difference between the likes on both stocks) for both `stockData` objects. +Якщо Ви передасте 2 акції, то отриманим значенням буде масив із інформацією про обидві акції. Замість `likes` буде показано `rel_likes` (різниця між уподобаннями на обох акціях) для обох об'єктів `stockData`. ```js async (getUserInput) => { @@ -112,7 +112,7 @@ async (getUserInput) => { }; ``` -All 5 functional tests are complete and passing. +Усі 5 функціональних тестів завершено та успішно пройдено. ```js async (getUserInput) => { From 7ccf418f10814c9c639f9faa9554c04f6d0deca6 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 13 Dec 2021 17:58:05 +0000 Subject: [PATCH 26/63] fix(deps): update dependency react-i18next to v11.15.1 --- client/package.json | 2 +- package-lock.json | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/client/package.json b/client/package.json index c46b258c5a..3ec9364c8f 100644 --- a/client/package.json +++ b/client/package.json @@ -98,7 +98,7 @@ "react-ga": "3.3.0", "react-helmet": "6.1.0", "react-hotkeys": "2.0.0", - "react-i18next": "11.15.0", + "react-i18next": "11.15.1", "react-instantsearch-dom": "6.17.0", "react-lazy-load": "3.1.13", "react-monaco-editor": "0.40.0", diff --git a/package-lock.json b/package-lock.json index a4bdcc75ea..46e8fdd69c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -266,7 +266,7 @@ "react-ga": "3.3.0", "react-helmet": "6.1.0", "react-hotkeys": "2.0.0", - "react-i18next": "11.15.0", + "react-i18next": "11.15.1", "react-instantsearch-dom": "6.17.0", "react-lazy-load": "3.1.13", "react-monaco-editor": "0.40.0", @@ -45152,9 +45152,9 @@ } }, "node_modules/react-i18next": { - "version": "11.15.0", - "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-11.15.0.tgz", - "integrity": "sha512-7JOIO7KkKSxB7Ycof6ilx9aQ/tviInTqN2sqHyKrjd5MKHyFyKyXVkYrb7KmG/ISFPA4ugWwor5Qsq8IVyQ/Cg==", + "version": "11.15.1", + "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-11.15.1.tgz", + "integrity": "sha512-lnje1uKu5XeM5MLvfbt1oygF+nEIZnpOM4Iu8bkx5ECD4XRYgi3SJDmolrp0EDxDHeK2GgFb+vEEK0hsZ9sjeA==", "dependencies": { "@babel/runtime": "^7.14.5", "html-escaper": "^2.0.2", @@ -57743,7 +57743,7 @@ "react-ga": "3.3.0", "react-helmet": "6.1.0", "react-hotkeys": "2.0.0", - "react-i18next": "11.15.0", + "react-i18next": "11.15.1", "react-instantsearch-dom": "6.17.0", "react-lazy-load": "3.1.13", "react-monaco-editor": "0.40.0", @@ -90867,9 +90867,9 @@ } }, "react-i18next": { - "version": "11.15.0", - "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-11.15.0.tgz", - "integrity": "sha512-7JOIO7KkKSxB7Ycof6ilx9aQ/tviInTqN2sqHyKrjd5MKHyFyKyXVkYrb7KmG/ISFPA4ugWwor5Qsq8IVyQ/Cg==", + "version": "11.15.1", + "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-11.15.1.tgz", + "integrity": "sha512-lnje1uKu5XeM5MLvfbt1oygF+nEIZnpOM4Iu8bkx5ECD4XRYgi3SJDmolrp0EDxDHeK2GgFb+vEEK0hsZ9sjeA==", "requires": { "@babel/runtime": "^7.14.5", "html-escaper": "^2.0.2", From b4b3ecd5ce62feea1408a7a403c3c5bc39983a06 Mon Sep 17 00:00:00 2001 From: Najmieh Sadat Safarabadi Date: Tue, 14 Dec 2021 01:02:34 +0330 Subject: [PATCH 27/63] fix(curriculum): remove unnecessary quotation marks (#44486) --- .../link-to-internal-sections-of-a-page-with-anchor-elements.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/curriculum/challenges/english/01-responsive-web-design/basic-html-and-html5/link-to-internal-sections-of-a-page-with-anchor-elements.md b/curriculum/challenges/english/01-responsive-web-design/basic-html-and-html5/link-to-internal-sections-of-a-page-with-anchor-elements.md index b951c3fa6e..6e2b5097e2 100644 --- a/curriculum/challenges/english/01-responsive-web-design/basic-html-and-html5/link-to-internal-sections-of-a-page-with-anchor-elements.md +++ b/curriculum/challenges/english/01-responsive-web-design/basic-html-and-html5/link-to-internal-sections-of-a-page-with-anchor-elements.md @@ -25,7 +25,7 @@ When users click the `Contacts` link, they'll be taken to the section of the web # --instructions-- -Change your external link to an internal link by changing the `href` attribute to `"#footer"` and the text from `cat photos` to `Jump to Bottom`. +Change your external link to an internal link by changing the `href` attribute to `#footer` and the text from `cat photos` to `Jump to Bottom`. Remove the `target="_blank"` attribute from the anchor tag since this causes the linked document to open in a new window tab. From bb05b67c4781bc5d52305ab06fd6f06ac2e366e1 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 13 Dec 2021 22:09:28 +0000 Subject: [PATCH 28/63] chore(deps): update dependency jest to v27.4.5 --- package-lock.json | 414 +++++++++++++++++++++++----------------------- package.json | 2 +- 2 files changed, 208 insertions(+), 208 deletions(-) diff --git a/package-lock.json b/package-lock.json index 46e8fdd69c..97eab93988 100644 --- a/package-lock.json +++ b/package-lock.json @@ -83,7 +83,7 @@ "execa": "5.1.1", "faker": "5.5.3", "husky": "7.0.4", - "jest": "27.4.4", + "jest": "27.4.5", "js-yaml": "3.14.1", "lint-staged": "12.1.2", "lodash": "4.17.21", @@ -3787,15 +3787,15 @@ } }, "node_modules/@jest/core": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.4.4.tgz", - "integrity": "sha512-xBNPVqYAdAiAMXnb4ugx9Cdmr0S52lBsLbQMR/sGBRO0810VSPKiuSDtuup6qdkK1e9vxbv3KK3IAP1QFAp8mw==", + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.4.5.tgz", + "integrity": "sha512-3tm/Pevmi8bDsgvo73nX8p/WPng6KWlCyScW10FPEoN1HU4pwI83tJ3TsFvi1FfzsjwUlMNEPowgb/rPau/LTQ==", "dev": true, "dependencies": { "@jest/console": "^27.4.2", - "@jest/reporters": "^27.4.4", + "@jest/reporters": "^27.4.5", "@jest/test-result": "^27.4.2", - "@jest/transform": "^27.4.4", + "@jest/transform": "^27.4.5", "@jest/types": "^27.4.2", "@types/node": "*", "ansi-escapes": "^4.2.1", @@ -3804,15 +3804,15 @@ "exit": "^0.1.2", "graceful-fs": "^4.2.4", "jest-changed-files": "^27.4.2", - "jest-config": "^27.4.4", - "jest-haste-map": "^27.4.4", + "jest-config": "^27.4.5", + "jest-haste-map": "^27.4.5", "jest-message-util": "^27.4.2", "jest-regex-util": "^27.4.0", - "jest-resolve": "^27.4.4", - "jest-resolve-dependencies": "^27.4.4", - "jest-runner": "^27.4.4", - "jest-runtime": "^27.4.4", - "jest-snapshot": "^27.4.4", + "jest-resolve": "^27.4.5", + "jest-resolve-dependencies": "^27.4.5", + "jest-runner": "^27.4.5", + "jest-runtime": "^27.4.5", + "jest-snapshot": "^27.4.5", "jest-util": "^27.4.2", "jest-validate": "^27.4.2", "jest-watcher": "^27.4.2", @@ -3959,15 +3959,15 @@ } }, "node_modules/@jest/reporters": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.4.4.tgz", - "integrity": "sha512-ssyJSw9B9Awb1QaxDhIPSs4de1b7SE2kv7tqFehQL13xpn5HUkMYZK/ufTOXiCAnXFOZS+XDl1GaQ/LmJAzI1A==", + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.4.5.tgz", + "integrity": "sha512-3orsG4vi8zXuBqEoy2LbnC1kuvkg1KQUgqNxmxpQgIOQEPeV0onvZu+qDQnEoX8qTQErtqn/xzcnbpeTuOLSiA==", "dev": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", "@jest/console": "^27.4.2", "@jest/test-result": "^27.4.2", - "@jest/transform": "^27.4.4", + "@jest/transform": "^27.4.5", "@jest/types": "^27.4.2", "@types/node": "*", "chalk": "^4.0.0", @@ -3980,10 +3980,10 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.0.2", - "jest-haste-map": "^27.4.4", - "jest-resolve": "^27.4.4", + "jest-haste-map": "^27.4.5", + "jest-resolve": "^27.4.5", "jest-util": "^27.4.2", - "jest-worker": "^27.4.4", + "jest-worker": "^27.4.5", "slash": "^3.0.0", "source-map": "^0.6.0", "string-length": "^4.0.1", @@ -4061,9 +4061,9 @@ } }, "node_modules/@jest/reporters/node_modules/jest-worker": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.4.tgz", - "integrity": "sha512-jfwxYJvfua1b1XkyuyPh01ATmgg4e5fPM/muLmhy9Qc6dmiwacQB0MLHaU6IjEsv/+nAixHGxTn8WllA27Pn0w==", + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.5.tgz", + "integrity": "sha512-f2s8kEdy15cv9r7q4KkzGXvlY0JTcmCbMHZBfSQDwW77REr45IDWwd0lksDFeVHH2jJ5pqb90T77XscrjeGzzg==", "dev": true, "dependencies": { "@types/node": "*", @@ -4158,24 +4158,24 @@ } }, "node_modules/@jest/test-sequencer": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.4.4.tgz", - "integrity": "sha512-mCh+d4JTGTtX7vr13d7q2GHJy33nAobEwtEJ8X3u7R8+0ImVO2eAsQzsLfX8lyvdYHBxYABhqbYuaUNo42/pQw==", + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.4.5.tgz", + "integrity": "sha512-n5woIn/1v+FT+9hniymHPARA9upYUmfi5Pw9ewVwXCDlK4F5/Gkees9v8vdjGdAIJ2MPHLHodiajLpZZanWzEQ==", "dev": true, "dependencies": { "@jest/test-result": "^27.4.2", "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.4.4", - "jest-runtime": "^27.4.4" + "jest-haste-map": "^27.4.5", + "jest-runtime": "^27.4.5" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/@jest/transform": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.4.4.tgz", - "integrity": "sha512-7U/nDSrGsGzL7+X8ScNFV71w8u8knJQWSa9C2xsrrKLMOgb+rWuCG4VAyWke/53BU96GnT+Ka81xCAHA5gk6zA==", + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.4.5.tgz", + "integrity": "sha512-PuMet2UlZtlGzwc6L+aZmR3I7CEBpqadO03pU40l2RNY2fFJ191b9/ITB44LNOhVtsyykx0OZvj0PCyuLm7Eew==", "dev": true, "dependencies": { "@babel/core": "^7.1.0", @@ -4185,7 +4185,7 @@ "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.4.4", + "jest-haste-map": "^27.4.5", "jest-regex-util": "^27.4.0", "jest-util": "^27.4.2", "micromatch": "^4.0.4", @@ -17430,12 +17430,12 @@ } }, "node_modules/babel-jest": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.4.4.tgz", - "integrity": "sha512-+6RVutZxOQgJkt4svgTHPFtOQlVe9dUg3wrimIAM38pY6hL/nsL8glfFSUjD9jNVjaVjzkCzj6loFFecrjr9Qw==", + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.4.5.tgz", + "integrity": "sha512-3uuUTjXbgtODmSv/DXO9nZfD52IyC2OYTFaXGRzL0kpykzroaquCrD5+lZNafTvZlnNqZHt5pb0M08qVBZnsnA==", "dev": true, "dependencies": { - "@jest/transform": "^27.4.4", + "@jest/transform": "^27.4.5", "@jest/types": "^27.4.2", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.0.0", @@ -33098,14 +33098,14 @@ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, "node_modules/jest": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/jest/-/jest-27.4.4.tgz", - "integrity": "sha512-AXwEIFa58Uf1Jno3/KSo5HZZ0/2Xwqvfrz0/3bmTwImkFlbOvz5vARAW9nTrxRLkojjkitaZ1KNKAtw3JRFAaA==", + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/jest/-/jest-27.4.5.tgz", + "integrity": "sha512-uT5MiVN3Jppt314kidCk47MYIRilJjA/l2mxwiuzzxGUeJIvA8/pDaJOAX5KWvjAo7SCydcW0/4WEtgbLMiJkg==", "dev": true, "dependencies": { - "@jest/core": "^27.4.4", + "@jest/core": "^27.4.5", "import-local": "^3.0.2", - "jest-cli": "^27.4.4" + "jest-cli": "^27.4.5" }, "bin": { "jest": "bin/jest.js" @@ -33137,9 +33137,9 @@ } }, "node_modules/jest-circus": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.4.4.tgz", - "integrity": "sha512-4DWhvQerDq5X4GaqhEUoZiBhuNdKDGr0geW0iJwarbDljAmGaGOErKQG+z2PBr0vgN05z7tsGSY51mdWr8E4xg==", + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.4.5.tgz", + "integrity": "sha512-eTNWa9wsvBwPykhMMShheafbwyakcdHZaEYh5iRrQ0PFJxkDP/e3U/FvzGuKWu2WpwUA3C3hPlfpuzvOdTVqnw==", "dev": true, "dependencies": { "@jest/environment": "^27.4.4", @@ -33154,8 +33154,8 @@ "jest-each": "^27.4.2", "jest-matcher-utils": "^27.4.2", "jest-message-util": "^27.4.2", - "jest-runtime": "^27.4.4", - "jest-snapshot": "^27.4.4", + "jest-runtime": "^27.4.5", + "jest-snapshot": "^27.4.5", "jest-util": "^27.4.2", "pretty-format": "^27.4.2", "slash": "^3.0.0", @@ -33246,19 +33246,19 @@ } }, "node_modules/jest-cli": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.4.4.tgz", - "integrity": "sha512-+MfsHnZPUOBigCBURuQFRpgYoPCgmIFkICkqt4SrramZCUp/UAuWcst4pMZb84O3VU8JyKJmnpGG4qH8ClQloA==", + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.4.5.tgz", + "integrity": "sha512-hrky3DSgE0u7sQxaCL7bdebEPHx5QzYmrGuUjaPLmPE8jx5adtvGuOlRspvMoVLTTDOHRnZDoRLYJuA+VCI7Hg==", "dev": true, "dependencies": { - "@jest/core": "^27.4.4", + "@jest/core": "^27.4.5", "@jest/test-result": "^27.4.2", "@jest/types": "^27.4.2", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.4", "import-local": "^3.0.2", - "jest-config": "^27.4.4", + "jest-config": "^27.4.5", "jest-util": "^27.4.2", "jest-validate": "^27.4.2", "prompts": "^2.0.1", @@ -33397,28 +33397,28 @@ } }, "node_modules/jest-config": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.4.4.tgz", - "integrity": "sha512-6lxg0ugO6KS2zKEbpdDwBzu1IT0Xg4/VhxXMuBu+z/5FvBjLCEMTaWQm3bCaGCZUR9j9FK4DzUIxyhIgn6kVEg==", + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.4.5.tgz", + "integrity": "sha512-t+STVJtPt+fpqQ8GBw850NtSQbnDOw/UzdPfzDaHQ48/AylQlW7LHj3dH+ndxhC1UxJ0Q3qkq7IH+nM1skwTwA==", "dev": true, "dependencies": { "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^27.4.4", + "@jest/test-sequencer": "^27.4.5", "@jest/types": "^27.4.2", - "babel-jest": "^27.4.4", + "babel-jest": "^27.4.5", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.1", "graceful-fs": "^4.2.4", - "jest-circus": "^27.4.4", + "jest-circus": "^27.4.5", "jest-environment-jsdom": "^27.4.4", "jest-environment-node": "^27.4.4", "jest-get-type": "^27.4.0", - "jest-jasmine2": "^27.4.4", + "jest-jasmine2": "^27.4.5", "jest-regex-util": "^27.4.0", - "jest-resolve": "^27.4.4", - "jest-runner": "^27.4.4", + "jest-resolve": "^27.4.5", + "jest-runner": "^27.4.5", "jest-util": "^27.4.2", "jest-validate": "^27.4.2", "micromatch": "^4.0.4", @@ -33750,9 +33750,9 @@ } }, "node_modules/jest-haste-map": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.4.4.tgz", - "integrity": "sha512-kvspmHmgPIZoDaqUsvsJFTaspuxhATvdO6wsFNGNSi8kfdiOCEEvECNbht8xG+eE5Ol88JyJmp2D7RF4dYo85Q==", + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.4.5.tgz", + "integrity": "sha512-oJm1b5qhhPs78K24EDGifWS0dELYxnoBiDhatT/FThgB9yxqUm5F6li3Pv+Q+apMBmmPNzOBnZ7ZxWMB1Leq1Q==", "dev": true, "dependencies": { "@jest/types": "^27.4.2", @@ -33764,7 +33764,7 @@ "jest-regex-util": "^27.4.0", "jest-serializer": "^27.4.0", "jest-util": "^27.4.2", - "jest-worker": "^27.4.4", + "jest-worker": "^27.4.5", "micromatch": "^4.0.4", "walker": "^1.0.7" }, @@ -33785,9 +33785,9 @@ } }, "node_modules/jest-haste-map/node_modules/jest-worker": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.4.tgz", - "integrity": "sha512-jfwxYJvfua1b1XkyuyPh01ATmgg4e5fPM/muLmhy9Qc6dmiwacQB0MLHaU6IjEsv/+nAixHGxTn8WllA27Pn0w==", + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.5.tgz", + "integrity": "sha512-f2s8kEdy15cv9r7q4KkzGXvlY0JTcmCbMHZBfSQDwW77REr45IDWwd0lksDFeVHH2jJ5pqb90T77XscrjeGzzg==", "dev": true, "dependencies": { "@types/node": "*", @@ -33814,9 +33814,9 @@ } }, "node_modules/jest-jasmine2": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.4.4.tgz", - "integrity": "sha512-ygk2tUgtLeN3ouj4KEYw9p81GLI1EKrnvourPULN5gdgB482PH5op9gqaRG0IenbJhBbbRwiSvh5NoBoQZSqdA==", + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.4.5.tgz", + "integrity": "sha512-oUnvwhJDj2LhOiUB1kdnJjkx8C5PwgUZQb9urF77mELH9DGR4e2GqpWQKBOYXWs5+uTN9BGDqRz3Aeg5Wts7aw==", "dev": true, "dependencies": { "@babel/traverse": "^7.1.0", @@ -33832,8 +33832,8 @@ "jest-each": "^27.4.2", "jest-matcher-utils": "^27.4.2", "jest-message-util": "^27.4.2", - "jest-runtime": "^27.4.4", - "jest-snapshot": "^27.4.4", + "jest-runtime": "^27.4.5", + "jest-snapshot": "^27.4.5", "jest-util": "^27.4.2", "pretty-format": "^27.4.2", "throat": "^6.0.1" @@ -34336,15 +34336,15 @@ } }, "node_modules/jest-resolve": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.4.4.tgz", - "integrity": "sha512-Yh5jK3PBmDbm01Rc8pT0XqpBlTPEGwWp7cN61ijJuwony/tR2Taof3TLy6yfNiuRS8ucUOPO7NBYm3ei38kkcg==", + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.4.5.tgz", + "integrity": "sha512-xU3z1BuOz/hUhVUL+918KqUgK+skqOuUsAi7A+iwoUldK6/+PW+utK8l8cxIWT9AW7IAhGNXjSAh1UYmjULZZw==", "dev": true, "dependencies": { "@jest/types": "^27.4.2", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.4.4", + "jest-haste-map": "^27.4.5", "jest-pnp-resolver": "^1.2.2", "jest-util": "^27.4.2", "jest-validate": "^27.4.2", @@ -34357,14 +34357,14 @@ } }, "node_modules/jest-resolve-dependencies": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.4.4.tgz", - "integrity": "sha512-iAnpCXh81sd9nbyqySvm5/aV9X6JZKE0dQyFXTC8tptXcdrgS0vjPFy+mEgzPHxXw+tq4TQupuTa0n8OXwRIxw==", + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.4.5.tgz", + "integrity": "sha512-elEVvkvRK51y037NshtEkEnukMBWvlPzZHiL847OrIljJ8yIsujD2GXRPqDXC4rEVKbcdsy7W0FxoZb4WmEs7w==", "dev": true, "dependencies": { "@jest/types": "^27.4.2", "jest-regex-util": "^27.4.0", - "jest-snapshot": "^27.4.4" + "jest-snapshot": "^27.4.5" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" @@ -34450,15 +34450,15 @@ } }, "node_modules/jest-runner": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.4.4.tgz", - "integrity": "sha512-AXv/8Q0Xf1puWnDf52m7oLrK7sXcv6re0V/kItwTSVHJbX7Oebm07oGFQqGmq0R0mhO1zpmB3OpqRuaCN2elPA==", + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.4.5.tgz", + "integrity": "sha512-/irauncTfmY1WkTaRQGRWcyQLzK1g98GYG/8QvIPviHgO1Fqz1JYeEIsSfF+9mc/UTA6S+IIHFgKyvUrtiBIZg==", "dev": true, "dependencies": { "@jest/console": "^27.4.2", "@jest/environment": "^27.4.4", "@jest/test-result": "^27.4.2", - "@jest/transform": "^27.4.4", + "@jest/transform": "^27.4.5", "@jest/types": "^27.4.2", "@types/node": "*", "chalk": "^4.0.0", @@ -34468,13 +34468,13 @@ "jest-docblock": "^27.4.0", "jest-environment-jsdom": "^27.4.4", "jest-environment-node": "^27.4.4", - "jest-haste-map": "^27.4.4", + "jest-haste-map": "^27.4.5", "jest-leak-detector": "^27.4.2", "jest-message-util": "^27.4.2", - "jest-resolve": "^27.4.4", - "jest-runtime": "^27.4.4", + "jest-resolve": "^27.4.5", + "jest-runtime": "^27.4.5", "jest-util": "^27.4.2", - "jest-worker": "^27.4.4", + "jest-worker": "^27.4.5", "source-map-support": "^0.5.6", "throat": "^6.0.1" }, @@ -34541,9 +34541,9 @@ } }, "node_modules/jest-runner/node_modules/jest-worker": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.4.tgz", - "integrity": "sha512-jfwxYJvfua1b1XkyuyPh01ATmgg4e5fPM/muLmhy9Qc6dmiwacQB0MLHaU6IjEsv/+nAixHGxTn8WllA27Pn0w==", + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.5.tgz", + "integrity": "sha512-f2s8kEdy15cv9r7q4KkzGXvlY0JTcmCbMHZBfSQDwW77REr45IDWwd0lksDFeVHH2jJ5pqb90T77XscrjeGzzg==", "dev": true, "dependencies": { "@types/node": "*", @@ -34582,9 +34582,9 @@ } }, "node_modules/jest-runtime": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.4.4.tgz", - "integrity": "sha512-tZGay6P6vXJq8t4jVFAUzYHx+lzIHXjz+rj1XBk6mAR1Lwtf5kz0Uun7qNuU+oqpZu4+hhuxpUfXb6j30bEPqA==", + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.4.5.tgz", + "integrity": "sha512-CIYqwuJQXHQtPd/idgrx4zgJ6iCb6uBjQq1RSAGQrw2S8XifDmoM1Ot8NRd80ooAm+ZNdHVwsktIMGlA1F1FAQ==", "dev": true, "dependencies": { "@jest/console": "^27.4.2", @@ -34592,7 +34592,7 @@ "@jest/globals": "^27.4.4", "@jest/source-map": "^27.4.0", "@jest/test-result": "^27.4.2", - "@jest/transform": "^27.4.4", + "@jest/transform": "^27.4.5", "@jest/types": "^27.4.2", "@types/yargs": "^16.0.0", "chalk": "^4.0.0", @@ -34602,12 +34602,12 @@ "exit": "^0.1.2", "glob": "^7.1.3", "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.4.4", + "jest-haste-map": "^27.4.5", "jest-message-util": "^27.4.2", "jest-mock": "^27.4.2", "jest-regex-util": "^27.4.0", - "jest-resolve": "^27.4.4", - "jest-snapshot": "^27.4.4", + "jest-resolve": "^27.4.5", + "jest-snapshot": "^27.4.5", "jest-util": "^27.4.2", "jest-validate": "^27.4.2", "slash": "^3.0.0", @@ -34758,9 +34758,9 @@ } }, "node_modules/jest-snapshot": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.4.4.tgz", - "integrity": "sha512-yy+rpCvYMOjTl7IMuaMI9OP9WT229zi8BhdNHm6e6mttAOIzvIiCxFoZ6yRxaV3HDPPgMryi+ReX2b8+IQJdPA==", + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.4.5.tgz", + "integrity": "sha512-eCi/iM1YJFrJWiT9de4+RpWWWBqsHiYxFG9V9o/n0WXs6GpW4lUt4FAHAgFPTLPqCUVzrMQmSmTZSgQzwqR7IQ==", "dev": true, "dependencies": { "@babel/core": "^7.7.2", @@ -34769,7 +34769,7 @@ "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/traverse": "^7.7.2", "@babel/types": "^7.0.0", - "@jest/transform": "^27.4.4", + "@jest/transform": "^27.4.5", "@jest/types": "^27.4.2", "@types/babel__traverse": "^7.0.4", "@types/prettier": "^2.1.5", @@ -34779,10 +34779,10 @@ "graceful-fs": "^4.2.4", "jest-diff": "^27.4.2", "jest-get-type": "^27.4.0", - "jest-haste-map": "^27.4.4", + "jest-haste-map": "^27.4.5", "jest-matcher-utils": "^27.4.2", "jest-message-util": "^27.4.2", - "jest-resolve": "^27.4.4", + "jest-resolve": "^27.4.5", "jest-util": "^27.4.2", "natural-compare": "^1.4.0", "pretty-format": "^27.4.2", @@ -58859,15 +58859,15 @@ } }, "@jest/core": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.4.4.tgz", - "integrity": "sha512-xBNPVqYAdAiAMXnb4ugx9Cdmr0S52lBsLbQMR/sGBRO0810VSPKiuSDtuup6qdkK1e9vxbv3KK3IAP1QFAp8mw==", + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.4.5.tgz", + "integrity": "sha512-3tm/Pevmi8bDsgvo73nX8p/WPng6KWlCyScW10FPEoN1HU4pwI83tJ3TsFvi1FfzsjwUlMNEPowgb/rPau/LTQ==", "dev": true, "requires": { "@jest/console": "^27.4.2", - "@jest/reporters": "^27.4.4", + "@jest/reporters": "^27.4.5", "@jest/test-result": "^27.4.2", - "@jest/transform": "^27.4.4", + "@jest/transform": "^27.4.5", "@jest/types": "^27.4.2", "@types/node": "*", "ansi-escapes": "^4.2.1", @@ -58876,15 +58876,15 @@ "exit": "^0.1.2", "graceful-fs": "^4.2.4", "jest-changed-files": "^27.4.2", - "jest-config": "^27.4.4", - "jest-haste-map": "^27.4.4", + "jest-config": "^27.4.5", + "jest-haste-map": "^27.4.5", "jest-message-util": "^27.4.2", "jest-regex-util": "^27.4.0", - "jest-resolve": "^27.4.4", - "jest-resolve-dependencies": "^27.4.4", - "jest-runner": "^27.4.4", - "jest-runtime": "^27.4.4", - "jest-snapshot": "^27.4.4", + "jest-resolve": "^27.4.5", + "jest-resolve-dependencies": "^27.4.5", + "jest-runner": "^27.4.5", + "jest-runtime": "^27.4.5", + "jest-snapshot": "^27.4.5", "jest-util": "^27.4.2", "jest-validate": "^27.4.2", "jest-watcher": "^27.4.2", @@ -58989,15 +58989,15 @@ } }, "@jest/reporters": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.4.4.tgz", - "integrity": "sha512-ssyJSw9B9Awb1QaxDhIPSs4de1b7SE2kv7tqFehQL13xpn5HUkMYZK/ufTOXiCAnXFOZS+XDl1GaQ/LmJAzI1A==", + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.4.5.tgz", + "integrity": "sha512-3orsG4vi8zXuBqEoy2LbnC1kuvkg1KQUgqNxmxpQgIOQEPeV0onvZu+qDQnEoX8qTQErtqn/xzcnbpeTuOLSiA==", "dev": true, "requires": { "@bcoe/v8-coverage": "^0.2.3", "@jest/console": "^27.4.2", "@jest/test-result": "^27.4.2", - "@jest/transform": "^27.4.4", + "@jest/transform": "^27.4.5", "@jest/types": "^27.4.2", "@types/node": "*", "chalk": "^4.0.0", @@ -59010,10 +59010,10 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.0.2", - "jest-haste-map": "^27.4.4", - "jest-resolve": "^27.4.4", + "jest-haste-map": "^27.4.5", + "jest-resolve": "^27.4.5", "jest-util": "^27.4.2", - "jest-worker": "^27.4.4", + "jest-worker": "^27.4.5", "slash": "^3.0.0", "source-map": "^0.6.0", "string-length": "^4.0.1", @@ -59062,9 +59062,9 @@ "dev": true }, "jest-worker": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.4.tgz", - "integrity": "sha512-jfwxYJvfua1b1XkyuyPh01ATmgg4e5fPM/muLmhy9Qc6dmiwacQB0MLHaU6IjEsv/+nAixHGxTn8WllA27Pn0w==", + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.5.tgz", + "integrity": "sha512-f2s8kEdy15cv9r7q4KkzGXvlY0JTcmCbMHZBfSQDwW77REr45IDWwd0lksDFeVHH2jJ5pqb90T77XscrjeGzzg==", "dev": true, "requires": { "@types/node": "*", @@ -59138,21 +59138,21 @@ } }, "@jest/test-sequencer": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.4.4.tgz", - "integrity": "sha512-mCh+d4JTGTtX7vr13d7q2GHJy33nAobEwtEJ8X3u7R8+0ImVO2eAsQzsLfX8lyvdYHBxYABhqbYuaUNo42/pQw==", + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.4.5.tgz", + "integrity": "sha512-n5woIn/1v+FT+9hniymHPARA9upYUmfi5Pw9ewVwXCDlK4F5/Gkees9v8vdjGdAIJ2MPHLHodiajLpZZanWzEQ==", "dev": true, "requires": { "@jest/test-result": "^27.4.2", "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.4.4", - "jest-runtime": "^27.4.4" + "jest-haste-map": "^27.4.5", + "jest-runtime": "^27.4.5" } }, "@jest/transform": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.4.4.tgz", - "integrity": "sha512-7U/nDSrGsGzL7+X8ScNFV71w8u8knJQWSa9C2xsrrKLMOgb+rWuCG4VAyWke/53BU96GnT+Ka81xCAHA5gk6zA==", + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.4.5.tgz", + "integrity": "sha512-PuMet2UlZtlGzwc6L+aZmR3I7CEBpqadO03pU40l2RNY2fFJ191b9/ITB44LNOhVtsyykx0OZvj0PCyuLm7Eew==", "dev": true, "requires": { "@babel/core": "^7.1.0", @@ -59162,7 +59162,7 @@ "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.4.4", + "jest-haste-map": "^27.4.5", "jest-regex-util": "^27.4.0", "jest-util": "^27.4.2", "micromatch": "^4.0.4", @@ -69456,12 +69456,12 @@ } }, "babel-jest": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.4.4.tgz", - "integrity": "sha512-+6RVutZxOQgJkt4svgTHPFtOQlVe9dUg3wrimIAM38pY6hL/nsL8glfFSUjD9jNVjaVjzkCzj6loFFecrjr9Qw==", + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.4.5.tgz", + "integrity": "sha512-3uuUTjXbgtODmSv/DXO9nZfD52IyC2OYTFaXGRzL0kpykzroaquCrD5+lZNafTvZlnNqZHt5pb0M08qVBZnsnA==", "dev": true, "requires": { - "@jest/transform": "^27.4.4", + "@jest/transform": "^27.4.5", "@jest/types": "^27.4.2", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.0.0", @@ -81716,14 +81716,14 @@ } }, "jest": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/jest/-/jest-27.4.4.tgz", - "integrity": "sha512-AXwEIFa58Uf1Jno3/KSo5HZZ0/2Xwqvfrz0/3bmTwImkFlbOvz5vARAW9nTrxRLkojjkitaZ1KNKAtw3JRFAaA==", + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/jest/-/jest-27.4.5.tgz", + "integrity": "sha512-uT5MiVN3Jppt314kidCk47MYIRilJjA/l2mxwiuzzxGUeJIvA8/pDaJOAX5KWvjAo7SCydcW0/4WEtgbLMiJkg==", "dev": true, "requires": { - "@jest/core": "^27.4.4", + "@jest/core": "^27.4.5", "import-local": "^3.0.2", - "jest-cli": "^27.4.4" + "jest-cli": "^27.4.5" } }, "jest-changed-files": { @@ -81738,9 +81738,9 @@ } }, "jest-circus": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.4.4.tgz", - "integrity": "sha512-4DWhvQerDq5X4GaqhEUoZiBhuNdKDGr0geW0iJwarbDljAmGaGOErKQG+z2PBr0vgN05z7tsGSY51mdWr8E4xg==", + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.4.5.tgz", + "integrity": "sha512-eTNWa9wsvBwPykhMMShheafbwyakcdHZaEYh5iRrQ0PFJxkDP/e3U/FvzGuKWu2WpwUA3C3hPlfpuzvOdTVqnw==", "dev": true, "requires": { "@jest/environment": "^27.4.4", @@ -81755,8 +81755,8 @@ "jest-each": "^27.4.2", "jest-matcher-utils": "^27.4.2", "jest-message-util": "^27.4.2", - "jest-runtime": "^27.4.4", - "jest-snapshot": "^27.4.4", + "jest-runtime": "^27.4.5", + "jest-snapshot": "^27.4.5", "jest-util": "^27.4.2", "pretty-format": "^27.4.2", "slash": "^3.0.0", @@ -81822,19 +81822,19 @@ } }, "jest-cli": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.4.4.tgz", - "integrity": "sha512-+MfsHnZPUOBigCBURuQFRpgYoPCgmIFkICkqt4SrramZCUp/UAuWcst4pMZb84O3VU8JyKJmnpGG4qH8ClQloA==", + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.4.5.tgz", + "integrity": "sha512-hrky3DSgE0u7sQxaCL7bdebEPHx5QzYmrGuUjaPLmPE8jx5adtvGuOlRspvMoVLTTDOHRnZDoRLYJuA+VCI7Hg==", "dev": true, "requires": { - "@jest/core": "^27.4.4", + "@jest/core": "^27.4.5", "@jest/test-result": "^27.4.2", "@jest/types": "^27.4.2", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.4", "import-local": "^3.0.2", - "jest-config": "^27.4.4", + "jest-config": "^27.4.5", "jest-util": "^27.4.2", "jest-validate": "^27.4.2", "prompts": "^2.0.1", @@ -81931,28 +81931,28 @@ } }, "jest-config": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.4.4.tgz", - "integrity": "sha512-6lxg0ugO6KS2zKEbpdDwBzu1IT0Xg4/VhxXMuBu+z/5FvBjLCEMTaWQm3bCaGCZUR9j9FK4DzUIxyhIgn6kVEg==", + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.4.5.tgz", + "integrity": "sha512-t+STVJtPt+fpqQ8GBw850NtSQbnDOw/UzdPfzDaHQ48/AylQlW7LHj3dH+ndxhC1UxJ0Q3qkq7IH+nM1skwTwA==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^27.4.4", + "@jest/test-sequencer": "^27.4.5", "@jest/types": "^27.4.2", - "babel-jest": "^27.4.4", + "babel-jest": "^27.4.5", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.1", "graceful-fs": "^4.2.4", - "jest-circus": "^27.4.4", + "jest-circus": "^27.4.5", "jest-environment-jsdom": "^27.4.4", "jest-environment-node": "^27.4.4", "jest-get-type": "^27.4.0", - "jest-jasmine2": "^27.4.4", + "jest-jasmine2": "^27.4.5", "jest-regex-util": "^27.4.0", - "jest-resolve": "^27.4.4", - "jest-runner": "^27.4.4", + "jest-resolve": "^27.4.5", + "jest-runner": "^27.4.5", "jest-util": "^27.4.2", "jest-validate": "^27.4.2", "micromatch": "^4.0.4", @@ -82195,9 +82195,9 @@ "dev": true }, "jest-haste-map": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.4.4.tgz", - "integrity": "sha512-kvspmHmgPIZoDaqUsvsJFTaspuxhATvdO6wsFNGNSi8kfdiOCEEvECNbht8xG+eE5Ol88JyJmp2D7RF4dYo85Q==", + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.4.5.tgz", + "integrity": "sha512-oJm1b5qhhPs78K24EDGifWS0dELYxnoBiDhatT/FThgB9yxqUm5F6li3Pv+Q+apMBmmPNzOBnZ7ZxWMB1Leq1Q==", "dev": true, "requires": { "@jest/types": "^27.4.2", @@ -82210,7 +82210,7 @@ "jest-regex-util": "^27.4.0", "jest-serializer": "^27.4.0", "jest-util": "^27.4.2", - "jest-worker": "^27.4.4", + "jest-worker": "^27.4.5", "micromatch": "^4.0.4", "walker": "^1.0.7" }, @@ -82222,9 +82222,9 @@ "dev": true }, "jest-worker": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.4.tgz", - "integrity": "sha512-jfwxYJvfua1b1XkyuyPh01ATmgg4e5fPM/muLmhy9Qc6dmiwacQB0MLHaU6IjEsv/+nAixHGxTn8WllA27Pn0w==", + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.5.tgz", + "integrity": "sha512-f2s8kEdy15cv9r7q4KkzGXvlY0JTcmCbMHZBfSQDwW77REr45IDWwd0lksDFeVHH2jJ5pqb90T77XscrjeGzzg==", "dev": true, "requires": { "@types/node": "*", @@ -82244,9 +82244,9 @@ } }, "jest-jasmine2": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.4.4.tgz", - "integrity": "sha512-ygk2tUgtLeN3ouj4KEYw9p81GLI1EKrnvourPULN5gdgB482PH5op9gqaRG0IenbJhBbbRwiSvh5NoBoQZSqdA==", + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.4.5.tgz", + "integrity": "sha512-oUnvwhJDj2LhOiUB1kdnJjkx8C5PwgUZQb9urF77mELH9DGR4e2GqpWQKBOYXWs5+uTN9BGDqRz3Aeg5Wts7aw==", "dev": true, "requires": { "@babel/traverse": "^7.1.0", @@ -82262,8 +82262,8 @@ "jest-each": "^27.4.2", "jest-matcher-utils": "^27.4.2", "jest-message-util": "^27.4.2", - "jest-runtime": "^27.4.4", - "jest-snapshot": "^27.4.4", + "jest-runtime": "^27.4.5", + "jest-snapshot": "^27.4.5", "jest-util": "^27.4.2", "pretty-format": "^27.4.2", "throat": "^6.0.1" @@ -82638,15 +82638,15 @@ "dev": true }, "jest-resolve": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.4.4.tgz", - "integrity": "sha512-Yh5jK3PBmDbm01Rc8pT0XqpBlTPEGwWp7cN61ijJuwony/tR2Taof3TLy6yfNiuRS8ucUOPO7NBYm3ei38kkcg==", + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.4.5.tgz", + "integrity": "sha512-xU3z1BuOz/hUhVUL+918KqUgK+skqOuUsAi7A+iwoUldK6/+PW+utK8l8cxIWT9AW7IAhGNXjSAh1UYmjULZZw==", "dev": true, "requires": { "@jest/types": "^27.4.2", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.4.4", + "jest-haste-map": "^27.4.5", "jest-pnp-resolver": "^1.2.2", "jest-util": "^27.4.2", "jest-validate": "^27.4.2", @@ -82713,26 +82713,26 @@ } }, "jest-resolve-dependencies": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.4.4.tgz", - "integrity": "sha512-iAnpCXh81sd9nbyqySvm5/aV9X6JZKE0dQyFXTC8tptXcdrgS0vjPFy+mEgzPHxXw+tq4TQupuTa0n8OXwRIxw==", + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.4.5.tgz", + "integrity": "sha512-elEVvkvRK51y037NshtEkEnukMBWvlPzZHiL847OrIljJ8yIsujD2GXRPqDXC4rEVKbcdsy7W0FxoZb4WmEs7w==", "dev": true, "requires": { "@jest/types": "^27.4.2", "jest-regex-util": "^27.4.0", - "jest-snapshot": "^27.4.4" + "jest-snapshot": "^27.4.5" } }, "jest-runner": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.4.4.tgz", - "integrity": "sha512-AXv/8Q0Xf1puWnDf52m7oLrK7sXcv6re0V/kItwTSVHJbX7Oebm07oGFQqGmq0R0mhO1zpmB3OpqRuaCN2elPA==", + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.4.5.tgz", + "integrity": "sha512-/irauncTfmY1WkTaRQGRWcyQLzK1g98GYG/8QvIPviHgO1Fqz1JYeEIsSfF+9mc/UTA6S+IIHFgKyvUrtiBIZg==", "dev": true, "requires": { "@jest/console": "^27.4.2", "@jest/environment": "^27.4.4", "@jest/test-result": "^27.4.2", - "@jest/transform": "^27.4.4", + "@jest/transform": "^27.4.5", "@jest/types": "^27.4.2", "@types/node": "*", "chalk": "^4.0.0", @@ -82742,13 +82742,13 @@ "jest-docblock": "^27.4.0", "jest-environment-jsdom": "^27.4.4", "jest-environment-node": "^27.4.4", - "jest-haste-map": "^27.4.4", + "jest-haste-map": "^27.4.5", "jest-leak-detector": "^27.4.2", "jest-message-util": "^27.4.2", - "jest-resolve": "^27.4.4", - "jest-runtime": "^27.4.4", + "jest-resolve": "^27.4.5", + "jest-runtime": "^27.4.5", "jest-util": "^27.4.2", - "jest-worker": "^27.4.4", + "jest-worker": "^27.4.5", "source-map-support": "^0.5.6", "throat": "^6.0.1" }, @@ -82794,9 +82794,9 @@ "dev": true }, "jest-worker": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.4.tgz", - "integrity": "sha512-jfwxYJvfua1b1XkyuyPh01ATmgg4e5fPM/muLmhy9Qc6dmiwacQB0MLHaU6IjEsv/+nAixHGxTn8WllA27Pn0w==", + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.5.tgz", + "integrity": "sha512-f2s8kEdy15cv9r7q4KkzGXvlY0JTcmCbMHZBfSQDwW77REr45IDWwd0lksDFeVHH2jJ5pqb90T77XscrjeGzzg==", "dev": true, "requires": { "@types/node": "*", @@ -82827,9 +82827,9 @@ } }, "jest-runtime": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.4.4.tgz", - "integrity": "sha512-tZGay6P6vXJq8t4jVFAUzYHx+lzIHXjz+rj1XBk6mAR1Lwtf5kz0Uun7qNuU+oqpZu4+hhuxpUfXb6j30bEPqA==", + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.4.5.tgz", + "integrity": "sha512-CIYqwuJQXHQtPd/idgrx4zgJ6iCb6uBjQq1RSAGQrw2S8XifDmoM1Ot8NRd80ooAm+ZNdHVwsktIMGlA1F1FAQ==", "dev": true, "requires": { "@jest/console": "^27.4.2", @@ -82837,7 +82837,7 @@ "@jest/globals": "^27.4.4", "@jest/source-map": "^27.4.0", "@jest/test-result": "^27.4.2", - "@jest/transform": "^27.4.4", + "@jest/transform": "^27.4.5", "@jest/types": "^27.4.2", "@types/yargs": "^16.0.0", "chalk": "^4.0.0", @@ -82847,12 +82847,12 @@ "exit": "^0.1.2", "glob": "^7.1.3", "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.4.4", + "jest-haste-map": "^27.4.5", "jest-message-util": "^27.4.2", "jest-mock": "^27.4.2", "jest-regex-util": "^27.4.0", - "jest-resolve": "^27.4.4", - "jest-snapshot": "^27.4.4", + "jest-resolve": "^27.4.5", + "jest-snapshot": "^27.4.5", "jest-util": "^27.4.2", "jest-validate": "^27.4.2", "slash": "^3.0.0", @@ -82966,9 +82966,9 @@ } }, "jest-snapshot": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.4.4.tgz", - "integrity": "sha512-yy+rpCvYMOjTl7IMuaMI9OP9WT229zi8BhdNHm6e6mttAOIzvIiCxFoZ6yRxaV3HDPPgMryi+ReX2b8+IQJdPA==", + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.4.5.tgz", + "integrity": "sha512-eCi/iM1YJFrJWiT9de4+RpWWWBqsHiYxFG9V9o/n0WXs6GpW4lUt4FAHAgFPTLPqCUVzrMQmSmTZSgQzwqR7IQ==", "dev": true, "requires": { "@babel/core": "^7.7.2", @@ -82977,7 +82977,7 @@ "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/traverse": "^7.7.2", "@babel/types": "^7.0.0", - "@jest/transform": "^27.4.4", + "@jest/transform": "^27.4.5", "@jest/types": "^27.4.2", "@types/babel__traverse": "^7.0.4", "@types/prettier": "^2.1.5", @@ -82987,10 +82987,10 @@ "graceful-fs": "^4.2.4", "jest-diff": "^27.4.2", "jest-get-type": "^27.4.0", - "jest-haste-map": "^27.4.4", + "jest-haste-map": "^27.4.5", "jest-matcher-utils": "^27.4.2", "jest-message-util": "^27.4.2", - "jest-resolve": "^27.4.4", + "jest-resolve": "^27.4.5", "jest-util": "^27.4.2", "natural-compare": "^1.4.0", "pretty-format": "^27.4.2", diff --git a/package.json b/package.json index ac39b34e7e..4f49be2b03 100644 --- a/package.json +++ b/package.json @@ -158,7 +158,7 @@ "execa": "5.1.1", "faker": "5.5.3", "husky": "7.0.4", - "jest": "27.4.4", + "jest": "27.4.5", "js-yaml": "3.14.1", "lint-staged": "12.1.2", "lodash": "4.17.21", From 5a1414e247bab459bec686608b516bf8936841ef Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 14 Dec 2021 00:48:13 +0000 Subject: [PATCH 29/63] chore(deps): update babel monorepo to v7.16.5 --- client/package.json | 10 +- curriculum/package.json | 8 +- package-lock.json | 1565 +++++++++++++++--------------- package.json | 10 +- tools/ui-components/package.json | 6 +- 5 files changed, 813 insertions(+), 786 deletions(-) diff --git a/client/package.json b/client/package.json index 3ec9364c8f..1e9d60c40d 100644 --- a/client/package.json +++ b/client/package.json @@ -33,12 +33,12 @@ "validate-keys": "tsc -p ../tools/ && node ../tools/scripts/lint/validate-keys.js" }, "dependencies": { - "@babel/plugin-proposal-export-default-from": "7.16.0", - "@babel/plugin-proposal-function-bind": "7.16.0", + "@babel/plugin-proposal-export-default-from": "7.16.5", + "@babel/plugin-proposal-function-bind": "7.16.5", "@babel/polyfill": "7.12.1", - "@babel/preset-env": "7.16.4", - "@babel/preset-react": "7.16.0", - "@babel/standalone": "7.16.4", + "@babel/preset-env": "7.16.5", + "@babel/preset-react": "7.16.5", + "@babel/standalone": "7.16.5", "@fortawesome/fontawesome": "1.1.8", "@fortawesome/fontawesome-svg-core": "1.2.36", "@fortawesome/free-brands-svg-icons": "5.15.4", diff --git a/curriculum/package.json b/curriculum/package.json index 051c81c55d..ad82f817a1 100644 --- a/curriculum/package.json +++ b/curriculum/package.json @@ -29,11 +29,11 @@ "test:full-output": "cross-env FULL_OUTPUT=true mocha --delay --reporter progress" }, "devDependencies": { - "@babel/core": "7.16.0", + "@babel/core": "7.16.5", "@babel/polyfill": "7.12.1", - "@babel/preset-env": "7.16.4", - "@babel/preset-typescript": "7.16.0", - "@babel/register": "7.16.0", + "@babel/preset-env": "7.16.5", + "@babel/preset-typescript": "7.16.5", + "@babel/register": "7.16.5", "acorn": "8.5.0", "acorn-jsx": "5.3.2", "babel-plugin-dynamic-import-node": "2.3.3", diff --git a/package-lock.json b/package-lock.json index 97eab93988..777315bda1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26,11 +26,11 @@ "invariant": "2.2.4" }, "devDependencies": { - "@babel/eslint-parser": "7.16.3", - "@babel/plugin-proposal-function-bind": "7.16.0", - "@babel/preset-env": "7.16.4", - "@babel/preset-react": "7.16.0", - "@babel/preset-typescript": "7.16.0", + "@babel/eslint-parser": "7.16.5", + "@babel/plugin-proposal-function-bind": "7.16.5", + "@babel/preset-env": "7.16.5", + "@babel/preset-react": "7.16.5", + "@babel/preset-typescript": "7.16.5", "@testing-library/cypress": "7.0.7", "@testing-library/dom": "8.11.1", "@testing-library/jest-dom": "5.16.1", @@ -201,12 +201,12 @@ "version": "0.0.1", "license": "BSD-3-Clause", "dependencies": { - "@babel/plugin-proposal-export-default-from": "7.16.0", - "@babel/plugin-proposal-function-bind": "7.16.0", + "@babel/plugin-proposal-export-default-from": "7.16.5", + "@babel/plugin-proposal-function-bind": "7.16.5", "@babel/polyfill": "7.12.1", - "@babel/preset-env": "7.16.4", - "@babel/preset-react": "7.16.0", - "@babel/standalone": "7.16.4", + "@babel/preset-env": "7.16.5", + "@babel/preset-react": "7.16.5", + "@babel/standalone": "7.16.5", "@fortawesome/fontawesome": "1.1.8", "@fortawesome/fontawesome-svg-core": "1.2.36", "@fortawesome/free-brands-svg-icons": "5.15.4", @@ -417,11 +417,11 @@ "version": "0.0.0-next.4", "license": "(BSD-3-Clause AND CC-BY-SA-4.0)", "devDependencies": { - "@babel/core": "7.16.0", + "@babel/core": "7.16.5", "@babel/polyfill": "7.12.1", - "@babel/preset-env": "7.16.4", - "@babel/preset-typescript": "7.16.0", - "@babel/register": "7.16.0", + "@babel/preset-env": "7.16.5", + "@babel/preset-typescript": "7.16.5", + "@babel/register": "7.16.5", "acorn": "8.5.0", "acorn-jsx": "5.3.2", "babel-plugin-dynamic-import-node": "2.3.3", @@ -674,18 +674,18 @@ } }, "node_modules/@babel/core": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.0.tgz", - "integrity": "sha512-mYZEvshBRHGsIAiyH5PzCFTCfbWfoYbO/jcSdXQSUQu1/pW0xDZAUP7KEc32heqWTAfAHhV9j1vH8Sav7l+JNQ==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.5.tgz", + "integrity": "sha512-wUcenlLzuWMZ9Zt8S0KmFwGlH6QKRh3vsm/dhDA3CHkiTA45YuG1XkHRcNRl73EFPXDp/d5kVOU0/y7x2w6OaQ==", "dependencies": { "@babel/code-frame": "^7.16.0", - "@babel/generator": "^7.16.0", - "@babel/helper-compilation-targets": "^7.16.0", - "@babel/helper-module-transforms": "^7.16.0", - "@babel/helpers": "^7.16.0", - "@babel/parser": "^7.16.0", + "@babel/generator": "^7.16.5", + "@babel/helper-compilation-targets": "^7.16.3", + "@babel/helper-module-transforms": "^7.16.5", + "@babel/helpers": "^7.16.5", + "@babel/parser": "^7.16.5", "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.0", + "@babel/traverse": "^7.16.5", "@babel/types": "^7.16.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", @@ -724,9 +724,9 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/@babel/eslint-parser": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.16.3.tgz", - "integrity": "sha512-iB4ElZT0jAt7PKVaeVulOECdGe6UnmA/O0P9jlF5g5GBOwDVbna8AXhHRu4s27xQf6OkveyA8iTDv1jHdDejgQ==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.16.5.tgz", + "integrity": "sha512-mUqYa46lgWqHKQ33Q6LNCGp/wPR3eqOYTUixHFsfrSQqRxH0+WOzca75iEjFr5RDGH1dDz622LaHhLOzOuQRUA==", "dependencies": { "eslint-scope": "^5.1.1", "eslint-visitor-keys": "^2.1.0", @@ -741,9 +741,9 @@ } }, "node_modules/@babel/generator": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.0.tgz", - "integrity": "sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.5.tgz", + "integrity": "sha512-kIvCdjZqcdKqoDbVVdt5R99icaRtrtYhYK/xux5qiWCBmfdvEYMFZ68QCrpE5cbFM1JsuArUNs1ZkuKtTtUcZA==", "dependencies": { "@babel/types": "^7.16.0", "jsesc": "^2.5.1", @@ -765,9 +765,9 @@ } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.0.tgz", - "integrity": "sha512-9KuleLT0e77wFUku6TUkqZzCEymBdtuQQ27MhEKzf9UOOJu3cYj98kyaDAzxpC7lV6DGiZFuC8XqDsq8/Kl6aQ==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.5.tgz", + "integrity": "sha512-3JEA9G5dmmnIWdzaT9d0NmFRgYnWUThLsDaL7982H0XqqWr56lRrsmwheXFMjR+TMl7QMBb6mzy9kvgr1lRLUA==", "dependencies": { "@babel/helper-explode-assignable-expression": "^7.16.0", "@babel/types": "^7.16.0" @@ -794,15 +794,16 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.0.tgz", - "integrity": "sha512-XLwWvqEaq19zFlF5PTgOod4bUA+XbkR4WLQBct1bkzmxJGB0ZEJaoKF4c8cgH9oBtCDuYJ8BP5NB9uFiEgO5QA==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.5.tgz", + "integrity": "sha512-NEohnYA7mkB8L5JhU7BLwcBdU3j83IziR9aseMueWGeAjblbul3zzb8UvJ3a1zuBiqCMObzCJHFqKIQE6hTVmg==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.16.0", + "@babel/helper-environment-visitor": "^7.16.5", "@babel/helper-function-name": "^7.16.0", - "@babel/helper-member-expression-to-functions": "^7.16.0", + "@babel/helper-member-expression-to-functions": "^7.16.5", "@babel/helper-optimise-call-expression": "^7.16.0", - "@babel/helper-replace-supers": "^7.16.0", + "@babel/helper-replace-supers": "^7.16.5", "@babel/helper-split-export-declaration": "^7.16.0" }, "engines": { @@ -866,6 +867,17 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.5.tgz", + "integrity": "sha512-ODQyc5AnxmZWm/R2W7fzhamOk1ey8gSguo5SGvF0zcB3uUzRpTRmM/jmLSm9bDMyPlvbyJ+PwPEK0BWIoZ9wjg==", + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-explode-assignable-expression": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.0.tgz", @@ -913,9 +925,9 @@ } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.0.tgz", - "integrity": "sha512-bsjlBFPuWT6IWhl28EdrQ+gTvSvj5tqVP5Xeftp07SEuz5pLnsXZuDkDD3Rfcxy0IsHmbZ+7B2/9SHzxO0T+sQ==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.5.tgz", + "integrity": "sha512-7fecSXq7ZrLE+TWshbGT+HyCLkxloWNhTbU2QM1NTI/tDqyf0oZiMcEfYtDuUDCo528EOlt39G1rftea4bRZIw==", "dependencies": { "@babel/types": "^7.16.0" }, @@ -935,17 +947,17 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.0.tgz", - "integrity": "sha512-My4cr9ATcaBbmaEa8M0dZNA74cfI6gitvUAskgDtAFmAqyFKDSHQo5YstxPbN+lzHl2D9l/YOEFqb2mtUh4gfA==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.5.tgz", + "integrity": "sha512-CkvMxgV4ZyyioElFwcuWnDCcNIeyqTkCm9BxXZi73RR1ozqlpboqsbGUNvRTflgZtFbbJ1v5Emvm+lkjMYY/LQ==", "dependencies": { + "@babel/helper-environment-visitor": "^7.16.5", "@babel/helper-module-imports": "^7.16.0", - "@babel/helper-replace-supers": "^7.16.0", "@babel/helper-simple-access": "^7.16.0", "@babel/helper-split-export-declaration": "^7.16.0", "@babel/helper-validator-identifier": "^7.15.7", "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.0", + "@babel/traverse": "^7.16.5", "@babel/types": "^7.16.0" }, "engines": { @@ -964,20 +976,20 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.5.tgz", + "integrity": "sha512-59KHWHXxVA9K4HNF4sbHCf+eJeFe0Te/ZFGqBT4OjXhrwvA04sGfaEGsVTdsjoszq0YTP49RC9UKe5g8uN2RwQ==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.16.4", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.4.tgz", - "integrity": "sha512-vGERmmhR+s7eH5Y/cp8PCVzj4XEjerq8jooMfxFdA5xVtAk9Sh4AQsrWgiErUEBjtGrBtOFKDUcWQFW4/dFwMA==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.5.tgz", + "integrity": "sha512-X+aAJldyxrOmN9v3FKp+Hu1NO69VWgYgDGq6YDykwRPzxs5f2N+X988CBXS7EQahDU+Vpet5QYMqLk+nsp+Qxw==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.16.0", - "@babel/helper-wrap-function": "^7.16.0", + "@babel/helper-wrap-function": "^7.16.5", "@babel/types": "^7.16.0" }, "engines": { @@ -985,13 +997,14 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.0.tgz", - "integrity": "sha512-TQxuQfSCdoha7cpRNJvfaYxxxzmbxXw/+6cS7V02eeDYyhxderSoMVALvwupA54/pZcOTtVeJ0xccp1nGWladA==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.5.tgz", + "integrity": "sha512-ao3seGVa/FZCMCCNDuBcqnBFSbdr8N2EW35mzojx3TwfIbdPmNK+JV6+2d5bR0Z71W5ocLnQp9en/cTF7pBJiQ==", "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.16.0", + "@babel/helper-environment-visitor": "^7.16.5", + "@babel/helper-member-expression-to-functions": "^7.16.5", "@babel/helper-optimise-call-expression": "^7.16.0", - "@babel/traverse": "^7.16.0", + "@babel/traverse": "^7.16.5", "@babel/types": "^7.16.0" }, "engines": { @@ -1048,13 +1061,13 @@ } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.0.tgz", - "integrity": "sha512-VVMGzYY3vkWgCJML+qVLvGIam902mJW0FvT7Avj1zEe0Gn7D93aWdLblYARTxEw+6DhZmtzhBM2zv0ekE5zg1g==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.5.tgz", + "integrity": "sha512-2J2pmLBqUqVdJw78U0KPNdeE2qeuIyKoG4mKV7wAq3mc4jJG282UgjZw4ZYDnqiWQuS3Y3IYdF/AQ6CpyBV3VA==", "dependencies": { "@babel/helper-function-name": "^7.16.0", "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.0", + "@babel/traverse": "^7.16.5", "@babel/types": "^7.16.0" }, "engines": { @@ -1062,12 +1075,12 @@ } }, "node_modules/@babel/helpers": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.3.tgz", - "integrity": "sha512-Xn8IhDlBPhvYTvgewPKawhADichOsbkZuzN7qz2BusOM0brChsyXMDJvldWaYMMUNiCQdQzNEioXTp3sC8Nt8w==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.5.tgz", + "integrity": "sha512-TLgi6Lh71vvMZGEkFuIxzaPsyeYCHQ5jJOOX1f0xXn0uciFuE8cEk0wyBquMcCxBXZ5BJhE2aUB7pnWTD150Tw==", "dependencies": { "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.3", + "@babel/traverse": "^7.16.5", "@babel/types": "^7.16.0" }, "engines": { @@ -1122,9 +1135,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.16.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.4.tgz", - "integrity": "sha512-6V0qdPUaiVHH3RtZeLIsc+6pDhbYzHR8ogA8w+f+Wc77DuXto19g2QUwveINoS34Uw+W8/hQDGJCx+i4n7xcng==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.5.tgz", + "integrity": "sha512-+Ce7T5iPNWzfu9C1aB5tN3Lyafs5xb3Ic7vBWyZL2KXT3QSdD1dD3CvgOzPmQKoNNRt6uauc0XwNJTQtXC2/Mw==", "bin": { "parser": "bin/babel-parser.js" }, @@ -1163,12 +1176,12 @@ } }, "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.16.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.4.tgz", - "integrity": "sha512-/CUekqaAaZCQHleSK/9HajvcD/zdnJiKRiuUFq8ITE+0HsPzquf53cpFiqAwl/UfmJbR6n5uGPQSPdrmKOvHHg==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.5.tgz", + "integrity": "sha512-C/FX+3HNLV6sz7AqbTQqEo1L9/kfrKjxcVtgyBCmvIgOjvuBVUWooDoi7trsLxOzCEo5FccjRvKHkfDsJFZlfA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-remap-async-to-generator": "^7.16.4", + "@babel/helper-plugin-utils": "^7.16.5", + "@babel/helper-remap-async-to-generator": "^7.16.5", "@babel/plugin-syntax-async-generators": "^7.8.4" }, "engines": { @@ -1179,12 +1192,12 @@ } }, "node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.0.tgz", - "integrity": "sha512-mCF3HcuZSY9Fcx56Lbn+CGdT44ioBMMvjNVldpKtj8tpniETdLjnxdHI1+sDWXIM1nNt+EanJOZ3IG9lzVjs7A==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.5.tgz", + "integrity": "sha512-pJD3HjgRv83s5dv1sTnDbZOaTjghKEz8KUn1Kbh2eAIRhGuyQ1XSeI4xVXU3UlIEVA3DAyIdxqT1eRn7Wcn55A==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-create-class-features-plugin": "^7.16.5", + "@babel/helper-plugin-utils": "^7.16.5" }, "engines": { "node": ">=6.9.0" @@ -1194,12 +1207,12 @@ } }, "node_modules/@babel/plugin-proposal-class-static-block": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.0.tgz", - "integrity": "sha512-mAy3sdcY9sKAkf3lQbDiv3olOfiLqI51c9DR9b19uMoR2Z6r5pmGl7dfNFqEvqOyqbf1ta4lknK4gc5PJn3mfA==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.5.tgz", + "integrity": "sha512-EEFzuLZcm/rNJ8Q5krK+FRKdVkd6FjfzT9tuSZql9sQn64K0hHA2KLJ0DqVot9/iV6+SsuadC5yI39zWnm+nmQ==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-create-class-features-plugin": "^7.16.5", + "@babel/helper-plugin-utils": "^7.16.5", "@babel/plugin-syntax-class-static-block": "^7.14.5" }, "engines": { @@ -1227,11 +1240,11 @@ } }, "node_modules/@babel/plugin-proposal-dynamic-import": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.0.tgz", - "integrity": "sha512-QGSA6ExWk95jFQgwz5GQ2Dr95cf7eI7TKutIXXTb7B1gCLTCz5hTjFTQGfLFBBiC5WSNi7udNwWsqbbMh1c4yQ==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.5.tgz", + "integrity": "sha512-P05/SJZTTvHz79LNYTF8ff5xXge0kk5sIIWAypcWgX4BTRUgyHc8wRxJ/Hk+mU0KXldgOOslKaeqnhthcDJCJQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3" }, "engines": { @@ -1242,12 +1255,12 @@ } }, "node_modules/@babel/plugin-proposal-export-default-from": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.16.0.tgz", - "integrity": "sha512-kFAhaIbh5qbBwETRNa/cgGmPJ/BicXhIyrZhAkyYhf/Z9LXCTRGO1mvUwczto0Hl1q4YtzP9cRtTKT4wujm38Q==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.16.5.tgz", + "integrity": "sha512-pU4aCS+AzGjDD/6LnwSmeelmtqfMSjzQxs7+/AS673bYsshK1XZm9eth6OkgivVscQM8XdkVYhrb6tPFVTBVHA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-export-default-from": "^7.16.0" + "@babel/helper-plugin-utils": "^7.16.5", + "@babel/plugin-syntax-export-default-from": "^7.16.5" }, "engines": { "node": ">=6.9.0" @@ -1257,11 +1270,11 @@ } }, "node_modules/@babel/plugin-proposal-export-namespace-from": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.0.tgz", - "integrity": "sha512-CjI4nxM/D+5wCnhD11MHB1AwRSAYeDT+h8gCdcVJZ/OK7+wRzFsf7PFPWVpVpNRkHMmMkQWAHpTq+15IXQ1diA==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.5.tgz", + "integrity": "sha512-i+sltzEShH1vsVydvNaTRsgvq2vZsfyrd7K7vPLUU/KgS0D5yZMe6uipM0+izminnkKrEfdUnz7CxMRb6oHZWw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.5", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, "engines": { @@ -1272,12 +1285,12 @@ } }, "node_modules/@babel/plugin-proposal-function-bind": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-function-bind/-/plugin-proposal-function-bind-7.16.0.tgz", - "integrity": "sha512-oTf/NztwTma6O4e16Iy6+DOqodQydc1/MLmENMTduigCYxvUvLblCRP5Tu3PkAGPKq5/F3lB44GWLc+egJi3VA==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-function-bind/-/plugin-proposal-function-bind-7.16.5.tgz", + "integrity": "sha512-rOr/gYNm8pTBAfnwr/F6uSPjFJMqE2L1jLCoVrAcrt1he5e9F6pV6Cl4JBrFBbUnA+ETMnVFZIhfVbTq7So0Gw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-function-bind": "^7.16.0" + "@babel/helper-plugin-utils": "^7.16.5", + "@babel/plugin-syntax-function-bind": "^7.16.5" }, "engines": { "node": ">=6.9.0" @@ -1287,11 +1300,11 @@ } }, "node_modules/@babel/plugin-proposal-json-strings": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.0.tgz", - "integrity": "sha512-kouIPuiv8mSi5JkEhzApg5Gn6hFyKPnlkO0a9YSzqRurH8wYzSlf6RJdzluAsbqecdW5pBvDJDfyDIUR/vLxvg==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.5.tgz", + "integrity": "sha512-QQJueTFa0y9E4qHANqIvMsuxM/qcLQmKttBACtPCQzGUEizsXDACGonlPiSwynHfOa3vNw0FPMVvQzbuXwh4SQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.5", "@babel/plugin-syntax-json-strings": "^7.8.3" }, "engines": { @@ -1302,11 +1315,11 @@ } }, "node_modules/@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.0.tgz", - "integrity": "sha512-pbW0fE30sVTYXXm9lpVQQ/Vc+iTeQKiXlaNRZPPN2A2VdlWyAtsUrsQ3xydSlDW00TFMK7a8m3cDTkBF5WnV3Q==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.5.tgz", + "integrity": "sha512-xqibl7ISO2vjuQM+MzR3rkd0zfNWltk7n9QhaD8ghMmMceVguYrNDt7MikRyj4J4v3QehpnrU8RYLnC7z/gZLA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.5", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, "engines": { @@ -1317,11 +1330,11 @@ } }, "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.0.tgz", - "integrity": "sha512-3bnHA8CAFm7cG93v8loghDYyQ8r97Qydf63BeYiGgYbjKKB/XP53W15wfRC7dvKfoiJ34f6Rbyyx2btExc8XsQ==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.5.tgz", + "integrity": "sha512-YwMsTp/oOviSBhrjwi0vzCUycseCYwoXnLiXIL3YNjHSMBHicGTz7GjVU/IGgz4DtOEXBdCNG72pvCX22ehfqg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.5", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" }, "engines": { @@ -1332,11 +1345,11 @@ } }, "node_modules/@babel/plugin-proposal-numeric-separator": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.0.tgz", - "integrity": "sha512-FAhE2I6mjispy+vwwd6xWPyEx3NYFS13pikDBWUAFGZvq6POGs5eNchw8+1CYoEgBl9n11I3NkzD7ghn25PQ9Q==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.5.tgz", + "integrity": "sha512-DvB9l/TcsCRvsIV9v4jxR/jVP45cslTVC0PMVHvaJhhNuhn2Y1SOhCSFlPK777qLB5wb8rVDaNoqMTyOqtY5Iw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.5", "@babel/plugin-syntax-numeric-separator": "^7.10.4" }, "engines": { @@ -1347,15 +1360,15 @@ } }, "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.0.tgz", - "integrity": "sha512-LU/+jp89efe5HuWJLmMmFG0+xbz+I2rSI7iLc1AlaeSMDMOGzWlc5yJrMN1d04osXN4sSfpo4O+azkBNBes0jg==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.5.tgz", + "integrity": "sha512-UEd6KpChoyPhCoE840KRHOlGhEZFutdPDMGj+0I56yuTTOaT51GzmnEl/0uT41fB/vD2nT+Pci2KjezyE3HmUw==", "dependencies": { - "@babel/compat-data": "^7.16.0", - "@babel/helper-compilation-targets": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/compat-data": "^7.16.4", + "@babel/helper-compilation-targets": "^7.16.3", + "@babel/helper-plugin-utils": "^7.16.5", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.16.0" + "@babel/plugin-transform-parameters": "^7.16.5" }, "engines": { "node": ">=6.9.0" @@ -1365,11 +1378,11 @@ } }, "node_modules/@babel/plugin-proposal-optional-catch-binding": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.0.tgz", - "integrity": "sha512-kicDo0A/5J0nrsCPbn89mTG3Bm4XgYi0CZtvex9Oyw7gGZE3HXGD0zpQNH+mo+tEfbo8wbmMvJftOwpmPy7aVw==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.5.tgz", + "integrity": "sha512-ihCMxY1Iljmx4bWy/PIMJGXN4NS4oUj1MKynwO07kiKms23pNvIn1DMB92DNB2R0EA882sw0VXIelYGdtF7xEQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.5", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" }, "engines": { @@ -1380,11 +1393,11 @@ } }, "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.0.tgz", - "integrity": "sha512-Y4rFpkZODfHrVo70Uaj6cC1JJOt3Pp0MdWSwIKtb8z1/lsjl9AmnB7ErRFV+QNGIfcY1Eruc2UMx5KaRnXjMyg==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.5.tgz", + "integrity": "sha512-kzdHgnaXRonttiTfKYnSVafbWngPPr2qKw9BWYBESl91W54e+9R5pP70LtWxV56g0f05f/SQrwHYkfvbwcdQ/A==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, @@ -1396,12 +1409,12 @@ } }, "node_modules/@babel/plugin-proposal-private-methods": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.0.tgz", - "integrity": "sha512-IvHmcTHDFztQGnn6aWq4t12QaBXTKr1whF/dgp9kz84X6GUcwq9utj7z2wFCUfeOup/QKnOlt2k0zxkGFx9ubg==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.5.tgz", + "integrity": "sha512-+yFMO4BGT3sgzXo+lrq7orX5mAZt57DwUK6seqII6AcJnJOIhBJ8pzKH47/ql/d426uQ7YhN8DpUFirQzqYSUA==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-create-class-features-plugin": "^7.16.5", + "@babel/helper-plugin-utils": "^7.16.5" }, "engines": { "node": ">=6.9.0" @@ -1411,13 +1424,13 @@ } }, "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.0.tgz", - "integrity": "sha512-3jQUr/HBbMVZmi72LpjQwlZ55i1queL8KcDTQEkAHihttJnAPrcvG9ZNXIfsd2ugpizZo595egYV6xy+pv4Ofw==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.5.tgz", + "integrity": "sha512-+YGh5Wbw0NH3y/E5YMu6ci5qTDmAEVNoZ3I54aB6nVEOZ5BQ7QJlwKq5pYVucQilMByGn/bvX0af+uNaPRCabA==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.16.0", - "@babel/helper-create-class-features-plugin": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-create-class-features-plugin": "^7.16.5", + "@babel/helper-plugin-utils": "^7.16.5", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { @@ -1428,12 +1441,12 @@ } }, "node_modules/@babel/plugin-proposal-unicode-property-regex": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.0.tgz", - "integrity": "sha512-ti7IdM54NXv29cA4+bNNKEMS4jLMCbJgl+Drv+FgYy0erJLAxNAIXcNjNjrRZEcWq0xJHsNVwQezskMFpF8N9g==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.5.tgz", + "integrity": "sha512-s5sKtlKQyFSatt781HQwv1hoM5BQ9qRH30r+dK56OLDsHmV74mzwJNX7R1yMuE7VZKG5O6q/gmOGSAO6ikTudg==", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" }, "engines": { "node": ">=4" @@ -1517,11 +1530,11 @@ } }, "node_modules/@babel/plugin-syntax-export-default-from": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.16.0.tgz", - "integrity": "sha512-xllLOdBj77mFSw8s02I+2SSQGHOftbWTlGmagheuNk/gjQsk7IrYsR/EosXVAVpgIUFffLckB/iPRioQYLHSrQ==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.16.5.tgz", + "integrity": "sha512-tvY55nhq4mSG9WbM7IZcLIhdc5jzIZu0PQKJHtZ16+dF7oBxKbqV/Z0e9ta2zaLMvUjH+3rJv1hbZ0+lpXzuFQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" }, "engines": { "node": ">=6.9.0" @@ -1557,11 +1570,11 @@ } }, "node_modules/@babel/plugin-syntax-function-bind": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-function-bind/-/plugin-syntax-function-bind-7.16.0.tgz", - "integrity": "sha512-L+B4rMnFg2ElQUTjSr3gfmIAJ3ej/BeKGW32AL01qpLhkI4Vw1C+W8p6wl8S6eYqWSj9X9d/lyuQWI5JFYjCWw==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-function-bind/-/plugin-syntax-function-bind-7.16.5.tgz", + "integrity": "sha512-Jn09tjgZuJIQdbqQCkBQErzjO4LV2NDUz03HSowJD0km7iXsKPX6Sk0G7xIkUItenYNLfkndlWojeTyYC6QbBA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" }, "engines": { "node": ">=6.9.0" @@ -1594,11 +1607,11 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.0.tgz", - "integrity": "sha512-8zv2+xiPHwly31RK4RmnEYY5zziuF3O7W2kIDW+07ewWDh6Oi0dRq8kwvulRkFgt6DB97RlKs5c1y068iPlCUg==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.5.tgz", + "integrity": "sha512-42OGssv9NPk4QHKVgIHlzeLgPOW5rGgfV5jzG90AhcXXIv6hu/eqj63w4VgvRxdvZY3AlYeDgPiSJ3BqAd1Y6Q==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" }, "engines": { "node": ">=6.9.0" @@ -1716,11 +1729,11 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.0.tgz", - "integrity": "sha512-vIFb5250Rbh7roWARvCLvIJ/PtAU5Lhv7BtZ1u24COwpI9Ypjsh+bZcKk6rlIyalK+r0jOc1XQ8I4ovNxNrWrA==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.5.tgz", + "integrity": "sha512-8bTHiiZyMOyfZFULjsCnYOWG059FVMes0iljEHSfARhNgFfpsqE92OrCffv3veSw9rwMkYcFe9bj0ZoXU2IGtQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" }, "engines": { "node": ">=6.9.0" @@ -1730,13 +1743,13 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.0.tgz", - "integrity": "sha512-PbIr7G9kR8tdH6g8Wouir5uVjklETk91GMVSUq+VaOgiinbCkBP6Q7NN/suM/QutZkMJMvcyAriogcYAdhg8Gw==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.5.tgz", + "integrity": "sha512-TMXgfioJnkXU+XRoj7P2ED7rUm5jbnDWwlCuFVTpQboMfbSya5WrmubNBAMlk7KXvywpo8rd8WuYZkis1o2H8w==", "dependencies": { "@babel/helper-module-imports": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-remap-async-to-generator": "^7.16.0" + "@babel/helper-plugin-utils": "^7.16.5", + "@babel/helper-remap-async-to-generator": "^7.16.5" }, "engines": { "node": ">=6.9.0" @@ -1746,11 +1759,11 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.0.tgz", - "integrity": "sha512-V14As3haUOP4ZWrLJ3VVx5rCnrYhMSHN/jX7z6FAt5hjRkLsb0snPCmJwSOML5oxkKO4FNoNv7V5hw/y2bjuvg==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.5.tgz", + "integrity": "sha512-BxmIyKLjUGksJ99+hJyL/HIxLIGnLKtw772zYDER7UuycDZ+Xvzs98ZQw6NGgM2ss4/hlFAaGiZmMNKvValEjw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" }, "engines": { "node": ">=6.9.0" @@ -1760,11 +1773,11 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.0.tgz", - "integrity": "sha512-27n3l67/R3UrXfizlvHGuTwsRIFyce3D/6a37GRxn28iyTPvNXaW4XvznexRh1zUNLPjbLL22Id0XQElV94ruw==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.5.tgz", + "integrity": "sha512-JxjSPNZSiOtmxjX7PBRBeRJTUKTyJ607YUYeT0QJCNdsedOe+/rXITjP08eG8xUpsLfPirgzdCFN+h0w6RI+pQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" }, "engines": { "node": ">=6.9.0" @@ -1774,15 +1787,16 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.0.tgz", - "integrity": "sha512-HUxMvy6GtAdd+GKBNYDWCIA776byUQH8zjnfjxwT1P1ARv/wFu8eBDpmXQcLS/IwRtrxIReGiplOwMeyO7nsDQ==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.5.tgz", + "integrity": "sha512-DzJ1vYf/7TaCYy57J3SJ9rV+JEuvmlnvvyvYKFbk5u46oQbBvuB9/0w+YsVsxkOv8zVWKpDmUoj4T5ILHoXevA==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.16.0", + "@babel/helper-environment-visitor": "^7.16.5", "@babel/helper-function-name": "^7.16.0", "@babel/helper-optimise-call-expression": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-replace-supers": "^7.16.0", + "@babel/helper-plugin-utils": "^7.16.5", + "@babel/helper-replace-supers": "^7.16.5", "@babel/helper-split-export-declaration": "^7.16.0", "globals": "^11.1.0" }, @@ -1794,11 +1808,11 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.0.tgz", - "integrity": "sha512-63l1dRXday6S8V3WFY5mXJwcRAnPYxvFfTlt67bwV1rTyVTM5zrp0DBBb13Kl7+ehkCVwIZPumPpFP/4u70+Tw==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.5.tgz", + "integrity": "sha512-n1+O7xtU5lSLraRzX88CNcpl7vtGdPakKzww74bVwpAIRgz9JVLJJpOLb0uYqcOaXVM0TL6X0RVeIJGD2CnCkg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" }, "engines": { "node": ">=6.9.0" @@ -1808,11 +1822,11 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.0.tgz", - "integrity": "sha512-Q7tBUwjxLTsHEoqktemHBMtb3NYwyJPTJdM+wDwb0g8PZ3kQUIzNvwD5lPaqW/p54TXBc/MXZu9Jr7tbUEUM8Q==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.5.tgz", + "integrity": "sha512-GuRVAsjq+c9YPK6NeTkRLWyQskDC099XkBSVO+6QzbnOnH2d/4mBVXYStaPrZD3dFRfg00I6BFJ9Atsjfs8mlg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" }, "engines": { "node": ">=6.9.0" @@ -1822,12 +1836,12 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.0.tgz", - "integrity": "sha512-FXlDZfQeLILfJlC6I1qyEwcHK5UpRCFkaoVyA1nk9A1L1Yu583YO4un2KsLBsu3IJb4CUbctZks8tD9xPQubLw==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.5.tgz", + "integrity": "sha512-iQiEMt8Q4/5aRGHpGVK2Zc7a6mx7qEAO7qehgSug3SDImnuMzgmm/wtJALXaz25zUj1PmnNHtShjFgk4PDx4nw==", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" }, "engines": { "node": ">=6.9.0" @@ -1837,11 +1851,11 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.0.tgz", - "integrity": "sha512-LIe2kcHKAZOJDNxujvmp6z3mfN6V9lJxubU4fJIGoQCkKe3Ec2OcbdlYP+vW++4MpxwG0d1wSDOJtQW5kLnkZQ==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.5.tgz", + "integrity": "sha512-81tijpDg2a6I1Yhj4aWY1l3O1J4Cg/Pd7LfvuaH2VVInAkXtzibz9+zSPdUM1WvuUi128ksstAP0hM5w48vQgg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" }, "engines": { "node": ">=6.9.0" @@ -1851,12 +1865,12 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.0.tgz", - "integrity": "sha512-OwYEvzFI38hXklsrbNivzpO3fh87skzx8Pnqi4LoSYeav0xHlueSoCJrSgTPfnbyzopo5b3YVAJkFIcUpK2wsw==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.5.tgz", + "integrity": "sha512-12rba2HwemQPa7BLIKCzm1pT2/RuQHtSFHdNl41cFiC6oi4tcrp7gjB07pxQvFpcADojQywSjblQth6gJyE6CA==", "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.5", + "@babel/helper-plugin-utils": "^7.16.5" }, "engines": { "node": ">=6.9.0" @@ -1882,11 +1896,11 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.0.tgz", - "integrity": "sha512-5QKUw2kO+GVmKr2wMYSATCTTnHyscl6sxFRAY+rvN7h7WB0lcG0o4NoV6ZQU32OZGVsYUsfLGgPQpDFdkfjlJQ==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.5.tgz", + "integrity": "sha512-+DpCAJFPAvViR17PIMi9x2AE34dll5wNlXO43wagAX2YcRGgEVHCNFC4azG85b4YyyFarvkc/iD5NPrz4Oneqw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" }, "engines": { "node": ">=6.9.0" @@ -1896,12 +1910,12 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.0.tgz", - "integrity": "sha512-lBzMle9jcOXtSOXUpc7tvvTpENu/NuekNJVova5lCCWCV9/U1ho2HH2y0p6mBg8fPm/syEAbfaaemYGOHCY3mg==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.5.tgz", + "integrity": "sha512-Fuec/KPSpVLbGo6z1RPw4EE1X+z9gZk1uQmnYy7v4xr4TO9p41v1AoUuXEtyqAI7H+xNJYSICzRqZBhDEkd3kQ==", "dependencies": { "@babel/helper-function-name": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" }, "engines": { "node": ">=6.9.0" @@ -1911,11 +1925,11 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.0.tgz", - "integrity": "sha512-gQDlsSF1iv9RU04clgXqRjrPyyoJMTclFt3K1cjLmTKikc0s/6vE3hlDeEVC71wLTRu72Fq7650kABrdTc2wMQ==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.5.tgz", + "integrity": "sha512-B1j9C/IfvshnPcklsc93AVLTrNVa69iSqztylZH6qnmiAsDDOmmjEYqOm3Ts2lGSgTSywnBNiqC949VdD0/gfw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" }, "engines": { "node": ">=6.9.0" @@ -1925,11 +1939,11 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.0.tgz", - "integrity": "sha512-WRpw5HL4Jhnxw8QARzRvwojp9MIE7Tdk3ez6vRyUk1MwgjJN0aNpRoXainLR5SgxmoXx/vsXGZ6OthP6t/RbUg==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.5.tgz", + "integrity": "sha512-d57i3vPHWgIde/9Y8W/xSFUndhvhZN5Wu2TjRrN1MVz5KzdUihKnfDVlfP1U7mS5DNj/WHHhaE4/tTi4hIyHwQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" }, "engines": { "node": ">=6.9.0" @@ -1939,12 +1953,12 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.0.tgz", - "integrity": "sha512-rWFhWbCJ9Wdmzln1NmSCqn7P0RAD+ogXG/bd9Kg5c7PKWkJtkiXmYsMBeXjDlzHpVTJ4I/hnjs45zX4dEv81xw==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.5.tgz", + "integrity": "sha512-oHI15S/hdJuSCfnwIz+4lm6wu/wBn7oJ8+QrkzPPwSFGXk8kgdI/AIKcbR/XnD1nQVMg/i6eNaXpszbGuwYDRQ==", "dependencies": { - "@babel/helper-module-transforms": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-module-transforms": "^7.16.5", + "@babel/helper-plugin-utils": "^7.16.5", "babel-plugin-dynamic-import-node": "^2.3.3" }, "engines": { @@ -1955,12 +1969,12 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.0.tgz", - "integrity": "sha512-Dzi+NWqyEotgzk/sb7kgQPJQf7AJkQBWsVp1N6JWc1lBVo0vkElUnGdr1PzUBmfsCCN5OOFya3RtpeHk15oLKQ==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.5.tgz", + "integrity": "sha512-ABhUkxvoQyqhCWyb8xXtfwqNMJD7tx+irIRnUh6lmyFud7Jln1WzONXKlax1fg/ey178EXbs4bSGNd6PngO+SQ==", "dependencies": { - "@babel/helper-module-transforms": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-module-transforms": "^7.16.5", + "@babel/helper-plugin-utils": "^7.16.5", "@babel/helper-simple-access": "^7.16.0", "babel-plugin-dynamic-import-node": "^2.3.3" }, @@ -1972,13 +1986,13 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.0.tgz", - "integrity": "sha512-yuGBaHS3lF1m/5R+6fjIke64ii5luRUg97N2wr+z1sF0V+sNSXPxXDdEEL/iYLszsN5VKxVB1IPfEqhzVpiqvg==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.5.tgz", + "integrity": "sha512-53gmLdScNN28XpjEVIm7LbWnD/b/TpbwKbLk6KV4KqC9WyU6rq1jnNmVG6UgAdQZVVGZVoik3DqHNxk4/EvrjA==", "dependencies": { "@babel/helper-hoist-variables": "^7.16.0", - "@babel/helper-module-transforms": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-module-transforms": "^7.16.5", + "@babel/helper-plugin-utils": "^7.16.5", "@babel/helper-validator-identifier": "^7.15.7", "babel-plugin-dynamic-import-node": "^2.3.3" }, @@ -1990,12 +2004,12 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.0.tgz", - "integrity": "sha512-nx4f6no57himWiHhxDM5pjwhae5vLpTK2zCnDH8+wNLJy0TVER/LJRHl2bkt6w9Aad2sPD5iNNoUpY3X9sTGDg==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.5.tgz", + "integrity": "sha512-qTFnpxHMoenNHkS3VoWRdwrcJ3FhX567GvDA3hRZKF0Dj8Fmg0UzySZp3AP2mShl/bzcywb/UWAMQIjA1bhXvw==", "dependencies": { - "@babel/helper-module-transforms": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-module-transforms": "^7.16.5", + "@babel/helper-plugin-utils": "^7.16.5" }, "engines": { "node": ">=6.9.0" @@ -2005,9 +2019,9 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.0.tgz", - "integrity": "sha512-LogN88uO+7EhxWc8WZuQ8vxdSyVGxhkh8WTC3tzlT8LccMuQdA81e9SGV6zY7kY2LjDhhDOFdQVxdGwPyBCnvg==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.5.tgz", + "integrity": "sha512-/wqGDgvFUeKELW6ex6QB7dLVRkd5ehjw34tpXu1nhKC0sFfmaLabIswnpf8JgDyV2NeDmZiwoOb0rAmxciNfjA==", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.16.0" }, @@ -2019,11 +2033,11 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.0.tgz", - "integrity": "sha512-fhjrDEYv2DBsGN/P6rlqakwRwIp7rBGLPbrKxwh7oVt5NNkIhZVOY2GRV+ULLsQri1bDqwDWnU3vhlmx5B2aCw==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.5.tgz", + "integrity": "sha512-ZaIrnXF08ZC8jnKR4/5g7YakGVL6go6V9ql6Jl3ecO8PQaQqFE74CuM384kezju7Z9nGCCA20BqZaR1tJ/WvHg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" }, "engines": { "node": ">=6.9.0" @@ -2033,12 +2047,12 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.0.tgz", - "integrity": "sha512-fds+puedQHn4cPLshoHcR1DTMN0q1V9ou0mUjm8whx9pGcNvDrVVrgw+KJzzCaiTdaYhldtrUps8DWVMgrSEyg==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.5.tgz", + "integrity": "sha512-tded+yZEXuxt9Jdtkc1RraW1zMF/GalVxaVVxh41IYwirdRgyAxxxCKZ9XB7LxZqmsjfjALxupNE1MIz9KH+Zg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-replace-supers": "^7.16.0" + "@babel/helper-plugin-utils": "^7.16.5", + "@babel/helper-replace-supers": "^7.16.5" }, "engines": { "node": ">=6.9.0" @@ -2048,11 +2062,11 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.3.tgz", - "integrity": "sha512-3MaDpJrOXT1MZ/WCmkOFo7EtmVVC8H4EUZVrHvFOsmwkk4lOjQj8rzv8JKUZV4YoQKeoIgk07GO+acPU9IMu/w==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.5.tgz", + "integrity": "sha512-B3O6AL5oPop1jAVg8CV+haeUte9oFuY85zu0jwnRNZZi3tVAbJriu5tag/oaO2kGaQM/7q7aGPBlTI5/sr9enA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" }, "engines": { "node": ">=6.9.0" @@ -2062,11 +2076,11 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.0.tgz", - "integrity": "sha512-XLldD4V8+pOqX2hwfWhgwXzGdnDOThxaNTgqagOcpBgIxbUvpgU2FMvo5E1RyHbk756WYgdbS0T8y0Cj9FKkWQ==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.5.tgz", + "integrity": "sha512-+IRcVW71VdF9pEH/2R/Apab4a19LVvdVsr/gEeotH00vSDVlKD+XgfSIw+cgGWsjDB/ziqGv/pGoQZBIiQVXHg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" }, "engines": { "node": ">=6.9.0" @@ -2076,11 +2090,11 @@ } }, "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.0.tgz", - "integrity": "sha512-FJFdJAqaCpndL+pIf0aeD/qlQwT7QXOvR6Cc8JPvNhKJBi2zc/DPc4g05Y3fbD/0iWAMQFGij4+Xw+4L/BMpTg==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.5.tgz", + "integrity": "sha512-dHYCOnzSsXFz8UcdNQIHGvg94qPL/teF7CCiCEMRxmA1G2p5Mq4JnKVowCDxYfiQ9D7RstaAp9kwaSI+sXbnhw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" }, "engines": { "node": ">=6.9.0" @@ -2090,14 +2104,14 @@ } }, "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.16.0.tgz", - "integrity": "sha512-rqDgIbukZ44pqq7NIRPGPGNklshPkvlmvqjdx3OZcGPk4zGIenYkxDTvl3LsSL8gqcc3ZzGmXPE6hR/u/voNOw==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.16.5.tgz", + "integrity": "sha512-+arLIz1d7kmwX0fKxTxbnoeG85ONSnLpvdODa4P3pc1sS7CV1hfmtYWufkW/oYsPnkDrEeQFxhUWcFnrXW7jQQ==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.16.0", "@babel/helper-module-imports": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-jsx": "^7.16.0", + "@babel/helper-plugin-utils": "^7.16.5", + "@babel/plugin-syntax-jsx": "^7.16.5", "@babel/types": "^7.16.0" }, "engines": { @@ -2108,11 +2122,11 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.0.tgz", - "integrity": "sha512-qq65iSqBRq0Hr3wq57YG2AmW0H6wgTnIzpffTphrUWUgLCOK+zf1f7G0vuOiXrp7dU1qq+fQBoqZ3wCDAkhFzw==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.5.tgz", + "integrity": "sha512-uQSLacMZSGLCxOw20dzo1dmLlKkd+DsayoV54q3MHXhbqgPzoiGerZQgNPl/Ro8/OcXV2ugfnkx+rxdS0sN5Uw==", "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.16.0" + "@babel/plugin-transform-react-jsx": "^7.16.5" }, "engines": { "node": ">=6.9.0" @@ -2122,12 +2136,12 @@ } }, "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.0.tgz", - "integrity": "sha512-NC/Bj2MG+t8Ef5Pdpo34Ay74X4Rt804h5y81PwOpfPtmAK3i6CizmQqwyBQzIepz1Yt8wNr2Z2L7Lu3qBMfZMA==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.5.tgz", + "integrity": "sha512-0nYU30hCxnCVCbRjSy9ahlhWZ2Sn6khbY4FqR91W+2RbSqkWEbVu2gXh45EqNy4Bq7sRU+H4i0/6YKwOSzh16A==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" }, "engines": { "node": ">=6.9.0" @@ -2137,9 +2151,9 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.0.tgz", - "integrity": "sha512-JAvGxgKuwS2PihiSFaDrp94XOzzTUeDeOQlcKzVAyaPap7BnZXK/lvMDiubkPTdotPKOIZq9xWXWnggUMYiExg==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.5.tgz", + "integrity": "sha512-2z+it2eVWU8TtQQRauvGUqZwLy4+7rTfo6wO4npr+fvvN1SW30ZF3O/ZRCNmTuu4F5MIP8OJhXAhRV5QMJOuYg==", "dependencies": { "regenerator-transform": "^0.14.2" }, @@ -2151,11 +2165,11 @@ } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.0.tgz", - "integrity": "sha512-Dgs8NNCehHSvXdhEhln8u/TtJxfVwGYCgP2OOr5Z3Ar+B+zXicEOKNTyc+eca2cuEOMtjW6m9P9ijOt8QdqWkg==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.5.tgz", + "integrity": "sha512-aIB16u8lNcf7drkhXJRoggOxSTUAuihTSTfAcpynowGJOZiGf+Yvi7RuTwFzVYSYPmWyARsPqUGoZWWWxLiknw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" }, "engines": { "node": ">=6.9.0" @@ -2184,11 +2198,11 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.0.tgz", - "integrity": "sha512-iVb1mTcD8fuhSv3k99+5tlXu5N0v8/DPm2mO3WACLG6al1CGZH7v09HJyUb1TtYl/Z+KrM6pHSIJdZxP5A+xow==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.5.tgz", + "integrity": "sha512-ZbuWVcY+MAXJuuW7qDoCwoxDUNClfZxoo7/4swVbOW1s/qYLOMHlm9YRWMsxMFuLs44eXsv4op1vAaBaBaDMVg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" }, "engines": { "node": ">=6.9.0" @@ -2198,11 +2212,11 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.0.tgz", - "integrity": "sha512-Ao4MSYRaLAQczZVp9/7E7QHsCuK92yHRrmVNRe/SlEJjhzivq0BSn8mEraimL8wizHZ3fuaHxKH0iwzI13GyGg==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.5.tgz", + "integrity": "sha512-5d6l/cnG7Lw4tGHEoga4xSkYp1euP7LAtrah1h1PgJ3JY7yNsjybsxQAnVK4JbtReZ/8z6ASVmd3QhYYKLaKZw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0" }, "engines": { @@ -2213,11 +2227,11 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.0.tgz", - "integrity": "sha512-/ntT2NljR9foobKk4E/YyOSwcGUXtYWv5tinMK/3RkypyNBNdhHUaq6Orw5DWq9ZcNlS03BIlEALFeQgeVAo4Q==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.5.tgz", + "integrity": "sha512-usYsuO1ID2LXxzuUxifgWtJemP7wL2uZtyrTVM4PKqsmJycdS4U4mGovL5xXkfUheds10Dd2PjoQLXw6zCsCbg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" }, "engines": { "node": ">=6.9.0" @@ -2227,11 +2241,11 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.0.tgz", - "integrity": "sha512-Rd4Ic89hA/f7xUSJQk5PnC+4so50vBoBfxjdQAdvngwidM8jYIBVxBZ/sARxD4e0yMXRbJVDrYf7dyRtIIKT6Q==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.5.tgz", + "integrity": "sha512-gnyKy9RyFhkovex4BjKWL3BVYzUDG6zC0gba7VMLbQoDuqMfJ1SDXs8k/XK41Mmt1Hyp4qNAvGFb9hKzdCqBRQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" }, "engines": { "node": ">=6.9.0" @@ -2241,11 +2255,11 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.0.tgz", - "integrity": "sha512-++V2L8Bdf4vcaHi2raILnptTBjGEFxn5315YU+e8+EqXIucA+q349qWngCLpUYqqv233suJ6NOienIVUpS9cqg==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.5.tgz", + "integrity": "sha512-ldxCkW180qbrvyCVDzAUZqB0TAeF8W/vGJoRcaf75awm6By+PxfJKvuqVAnq8N9wz5Xa6mSpM19OfVKKVmGHSQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" }, "engines": { "node": ">=6.9.0" @@ -2271,11 +2285,11 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.0.tgz", - "integrity": "sha512-VFi4dhgJM7Bpk8lRc5CMaRGlKZ29W9C3geZjt9beuzSUrlJxsNwX7ReLwaL6WEvsOf2EQkyIJEPtF8EXjB/g2A==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.5.tgz", + "integrity": "sha512-shiCBHTIIChGLdyojsKQjoAyB8MBwat25lKM7MJjbe1hE0bgIppD+LX9afr41lLHOhqceqeWl4FkLp+Bgn9o1Q==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" }, "engines": { "node": ">=6.9.0" @@ -2285,12 +2299,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.0.tgz", - "integrity": "sha512-jHLK4LxhHjvCeZDWyA9c+P9XH1sOxRd1RO9xMtDVRAOND/PczPqizEtVdx4TQF/wyPaewqpT+tgQFYMnN/P94A==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.5.tgz", + "integrity": "sha512-GTJ4IW012tiPEMMubd7sD07iU9O/LOo8Q/oU4xNhcaq0Xn8+6TcUQaHtC8YxySo1T+ErQ8RaWogIEeFhKGNPzw==", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" }, "engines": { "node": ">=6.9.0" @@ -2310,31 +2324,31 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.16.4", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.4.tgz", - "integrity": "sha512-v0QtNd81v/xKj4gNKeuAerQ/azeNn/G1B1qMLeXOcV8+4TWlD2j3NV1u8q29SDFBXx/NBq5kyEAO+0mpRgacjA==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.5.tgz", + "integrity": "sha512-MiJJW5pwsktG61NDxpZ4oJ1CKxM1ncam9bzRtx9g40/WkLRkxFP6mhpkYV0/DxcciqoiHicx291+eUQrXb/SfQ==", "dependencies": { "@babel/compat-data": "^7.16.4", "@babel/helper-compilation-targets": "^7.16.3", - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.5", "@babel/helper-validator-option": "^7.14.5", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.2", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.0", - "@babel/plugin-proposal-async-generator-functions": "^7.16.4", - "@babel/plugin-proposal-class-properties": "^7.16.0", - "@babel/plugin-proposal-class-static-block": "^7.16.0", - "@babel/plugin-proposal-dynamic-import": "^7.16.0", - "@babel/plugin-proposal-export-namespace-from": "^7.16.0", - "@babel/plugin-proposal-json-strings": "^7.16.0", - "@babel/plugin-proposal-logical-assignment-operators": "^7.16.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0", - "@babel/plugin-proposal-numeric-separator": "^7.16.0", - "@babel/plugin-proposal-object-rest-spread": "^7.16.0", - "@babel/plugin-proposal-optional-catch-binding": "^7.16.0", - "@babel/plugin-proposal-optional-chaining": "^7.16.0", - "@babel/plugin-proposal-private-methods": "^7.16.0", - "@babel/plugin-proposal-private-property-in-object": "^7.16.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.16.0", + "@babel/plugin-proposal-async-generator-functions": "^7.16.5", + "@babel/plugin-proposal-class-properties": "^7.16.5", + "@babel/plugin-proposal-class-static-block": "^7.16.5", + "@babel/plugin-proposal-dynamic-import": "^7.16.5", + "@babel/plugin-proposal-export-namespace-from": "^7.16.5", + "@babel/plugin-proposal-json-strings": "^7.16.5", + "@babel/plugin-proposal-logical-assignment-operators": "^7.16.5", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.5", + "@babel/plugin-proposal-numeric-separator": "^7.16.5", + "@babel/plugin-proposal-object-rest-spread": "^7.16.5", + "@babel/plugin-proposal-optional-catch-binding": "^7.16.5", + "@babel/plugin-proposal-optional-chaining": "^7.16.5", + "@babel/plugin-proposal-private-methods": "^7.16.5", + "@babel/plugin-proposal-private-property-in-object": "^7.16.5", + "@babel/plugin-proposal-unicode-property-regex": "^7.16.5", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", @@ -2349,38 +2363,38 @@ "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.16.0", - "@babel/plugin-transform-async-to-generator": "^7.16.0", - "@babel/plugin-transform-block-scoped-functions": "^7.16.0", - "@babel/plugin-transform-block-scoping": "^7.16.0", - "@babel/plugin-transform-classes": "^7.16.0", - "@babel/plugin-transform-computed-properties": "^7.16.0", - "@babel/plugin-transform-destructuring": "^7.16.0", - "@babel/plugin-transform-dotall-regex": "^7.16.0", - "@babel/plugin-transform-duplicate-keys": "^7.16.0", - "@babel/plugin-transform-exponentiation-operator": "^7.16.0", - "@babel/plugin-transform-for-of": "^7.16.0", - "@babel/plugin-transform-function-name": "^7.16.0", - "@babel/plugin-transform-literals": "^7.16.0", - "@babel/plugin-transform-member-expression-literals": "^7.16.0", - "@babel/plugin-transform-modules-amd": "^7.16.0", - "@babel/plugin-transform-modules-commonjs": "^7.16.0", - "@babel/plugin-transform-modules-systemjs": "^7.16.0", - "@babel/plugin-transform-modules-umd": "^7.16.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.0", - "@babel/plugin-transform-new-target": "^7.16.0", - "@babel/plugin-transform-object-super": "^7.16.0", - "@babel/plugin-transform-parameters": "^7.16.3", - "@babel/plugin-transform-property-literals": "^7.16.0", - "@babel/plugin-transform-regenerator": "^7.16.0", - "@babel/plugin-transform-reserved-words": "^7.16.0", - "@babel/plugin-transform-shorthand-properties": "^7.16.0", - "@babel/plugin-transform-spread": "^7.16.0", - "@babel/plugin-transform-sticky-regex": "^7.16.0", - "@babel/plugin-transform-template-literals": "^7.16.0", - "@babel/plugin-transform-typeof-symbol": "^7.16.0", - "@babel/plugin-transform-unicode-escapes": "^7.16.0", - "@babel/plugin-transform-unicode-regex": "^7.16.0", + "@babel/plugin-transform-arrow-functions": "^7.16.5", + "@babel/plugin-transform-async-to-generator": "^7.16.5", + "@babel/plugin-transform-block-scoped-functions": "^7.16.5", + "@babel/plugin-transform-block-scoping": "^7.16.5", + "@babel/plugin-transform-classes": "^7.16.5", + "@babel/plugin-transform-computed-properties": "^7.16.5", + "@babel/plugin-transform-destructuring": "^7.16.5", + "@babel/plugin-transform-dotall-regex": "^7.16.5", + "@babel/plugin-transform-duplicate-keys": "^7.16.5", + "@babel/plugin-transform-exponentiation-operator": "^7.16.5", + "@babel/plugin-transform-for-of": "^7.16.5", + "@babel/plugin-transform-function-name": "^7.16.5", + "@babel/plugin-transform-literals": "^7.16.5", + "@babel/plugin-transform-member-expression-literals": "^7.16.5", + "@babel/plugin-transform-modules-amd": "^7.16.5", + "@babel/plugin-transform-modules-commonjs": "^7.16.5", + "@babel/plugin-transform-modules-systemjs": "^7.16.5", + "@babel/plugin-transform-modules-umd": "^7.16.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.5", + "@babel/plugin-transform-new-target": "^7.16.5", + "@babel/plugin-transform-object-super": "^7.16.5", + "@babel/plugin-transform-parameters": "^7.16.5", + "@babel/plugin-transform-property-literals": "^7.16.5", + "@babel/plugin-transform-regenerator": "^7.16.5", + "@babel/plugin-transform-reserved-words": "^7.16.5", + "@babel/plugin-transform-shorthand-properties": "^7.16.5", + "@babel/plugin-transform-spread": "^7.16.5", + "@babel/plugin-transform-sticky-regex": "^7.16.5", + "@babel/plugin-transform-template-literals": "^7.16.5", + "@babel/plugin-transform-typeof-symbol": "^7.16.5", + "@babel/plugin-transform-unicode-escapes": "^7.16.5", + "@babel/plugin-transform-unicode-regex": "^7.16.5", "@babel/preset-modules": "^0.1.5", "@babel/types": "^7.16.0", "babel-plugin-polyfill-corejs2": "^0.3.0", @@ -2429,16 +2443,16 @@ } }, "node_modules/@babel/preset-react": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.16.0.tgz", - "integrity": "sha512-d31IFW2bLRB28uL1WoElyro8RH5l6531XfxMtCeCmp6RVAF1uTfxxUA0LH1tXl+psZdwfmIbwoG4U5VwgbhtLw==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.16.5.tgz", + "integrity": "sha512-3kzUOQeaxY/2vhPDS7CX/KGEGu/1bOYGvdRDJ2U5yjEz5o5jmIeTPLoiQBPGjfhPascLuW5OlMiPzwOOuB6txg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.5", "@babel/helper-validator-option": "^7.14.5", - "@babel/plugin-transform-react-display-name": "^7.16.0", - "@babel/plugin-transform-react-jsx": "^7.16.0", - "@babel/plugin-transform-react-jsx-development": "^7.16.0", - "@babel/plugin-transform-react-pure-annotations": "^7.16.0" + "@babel/plugin-transform-react-display-name": "^7.16.5", + "@babel/plugin-transform-react-jsx": "^7.16.5", + "@babel/plugin-transform-react-jsx-development": "^7.16.5", + "@babel/plugin-transform-react-pure-annotations": "^7.16.5" }, "engines": { "node": ">=6.9.0" @@ -2448,13 +2462,13 @@ } }, "node_modules/@babel/preset-typescript": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.16.0.tgz", - "integrity": "sha512-txegdrZYgO9DlPbv+9QOVpMnKbOtezsLHWsnsRF4AjbSIsVaujrq1qg8HK0mxQpWv0jnejt0yEoW1uWpvbrDTg==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.16.5.tgz", + "integrity": "sha512-lmAWRoJ9iOSvs3DqOndQpj8XqXkzaiQs50VG/zESiI9D3eoZhGriU675xNCr0UwvsuXrhMAGvyk1w+EVWF3u8Q==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.5", "@babel/helper-validator-option": "^7.14.5", - "@babel/plugin-transform-typescript": "^7.16.0" + "@babel/plugin-transform-typescript": "^7.16.1" }, "engines": { "node": ">=6.9.0" @@ -2464,9 +2478,9 @@ } }, "node_modules/@babel/register": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.16.0.tgz", - "integrity": "sha512-lzl4yfs0zVXnooeLE0AAfYaT7F3SPA8yB2Bj4W1BiZwLbMS3MZH35ZvCWSRHvneUugwuM+Wsnrj7h0F7UmU3NQ==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.16.5.tgz", + "integrity": "sha512-NpluD+cToBiZiDsG3y9rtIcqDyivsahpaM9csfyfiq1qQWduSmihUZ+ruIqqSDGjZKZMJfgAElo9x2YWlOQuRw==", "dev": true, "dependencies": { "clone-deep": "^4.0.1", @@ -2506,9 +2520,9 @@ } }, "node_modules/@babel/standalone": { - "version": "7.16.4", - "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.16.4.tgz", - "integrity": "sha512-FDRLwjeQfPm5jaHNuB+vwNyGCp24Ah3kEsbLzKmh0eSru+QCr4DmjgbRPoz71AwXLVtXU+l/i7MlVlIj5XO7Gw==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.16.5.tgz", + "integrity": "sha512-f6eufO52OVzOF808R42AEjqzaaJuVmFn8DRpumd16Pyju7CgNw9j7gsHg8w/VDUxeikixG6KWvTyN2u1bh13qg==", "engines": { "node": ">=6.9.0" } @@ -2527,16 +2541,17 @@ } }, "node_modules/@babel/traverse": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.3.tgz", - "integrity": "sha512-eolumr1vVMjqevCpwVO99yN/LoGL0EyHiLO5I043aYQvwOJ9eR5UsZSClHVCzfhBduMAsSzgA/6AyqPjNayJag==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.5.tgz", + "integrity": "sha512-FOCODAzqUMROikDYLYxl4nmwiLlu85rNqBML/A5hKRVXG2LV8d0iMqgPzdYTcIpjZEBB7D6UDU9vxRZiriASdQ==", "dependencies": { "@babel/code-frame": "^7.16.0", - "@babel/generator": "^7.16.0", + "@babel/generator": "^7.16.5", + "@babel/helper-environment-visitor": "^7.16.5", "@babel/helper-function-name": "^7.16.0", "@babel/helper-hoist-variables": "^7.16.0", "@babel/helper-split-export-declaration": "^7.16.0", - "@babel/parser": "^7.16.3", + "@babel/parser": "^7.16.5", "@babel/types": "^7.16.0", "debug": "^4.1.0", "globals": "^11.1.0" @@ -55191,14 +55206,14 @@ "version": "0.0.1", "license": "BSD-3-Clause", "dependencies": { - "@babel/preset-typescript": "7.16.0", + "@babel/preset-typescript": "7.16.5", "react": "16.14.0", "react-dom": "16.14.0", "typescript": "4.5.3" }, "devDependencies": { - "@babel/core": "7.16.0", - "@babel/preset-env": "7.16.4", + "@babel/core": "7.16.5", + "@babel/preset-env": "7.16.5", "@rollup/plugin-babel": "5.3.0", "@rollup/plugin-commonjs": "19.0.2", "@rollup/plugin-node-resolve": "13.0.6", @@ -55810,18 +55825,18 @@ "integrity": "sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q==" }, "@babel/core": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.0.tgz", - "integrity": "sha512-mYZEvshBRHGsIAiyH5PzCFTCfbWfoYbO/jcSdXQSUQu1/pW0xDZAUP7KEc32heqWTAfAHhV9j1vH8Sav7l+JNQ==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.5.tgz", + "integrity": "sha512-wUcenlLzuWMZ9Zt8S0KmFwGlH6QKRh3vsm/dhDA3CHkiTA45YuG1XkHRcNRl73EFPXDp/d5kVOU0/y7x2w6OaQ==", "requires": { "@babel/code-frame": "^7.16.0", - "@babel/generator": "^7.16.0", - "@babel/helper-compilation-targets": "^7.16.0", - "@babel/helper-module-transforms": "^7.16.0", - "@babel/helpers": "^7.16.0", - "@babel/parser": "^7.16.0", + "@babel/generator": "^7.16.5", + "@babel/helper-compilation-targets": "^7.16.3", + "@babel/helper-module-transforms": "^7.16.5", + "@babel/helpers": "^7.16.5", + "@babel/parser": "^7.16.5", "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.0", + "@babel/traverse": "^7.16.5", "@babel/types": "^7.16.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", @@ -55847,9 +55862,9 @@ } }, "@babel/eslint-parser": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.16.3.tgz", - "integrity": "sha512-iB4ElZT0jAt7PKVaeVulOECdGe6UnmA/O0P9jlF5g5GBOwDVbna8AXhHRu4s27xQf6OkveyA8iTDv1jHdDejgQ==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.16.5.tgz", + "integrity": "sha512-mUqYa46lgWqHKQ33Q6LNCGp/wPR3eqOYTUixHFsfrSQqRxH0+WOzca75iEjFr5RDGH1dDz622LaHhLOzOuQRUA==", "requires": { "eslint-scope": "^5.1.1", "eslint-visitor-keys": "^2.1.0", @@ -55857,9 +55872,9 @@ } }, "@babel/generator": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.0.tgz", - "integrity": "sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.5.tgz", + "integrity": "sha512-kIvCdjZqcdKqoDbVVdt5R99icaRtrtYhYK/xux5qiWCBmfdvEYMFZ68QCrpE5cbFM1JsuArUNs1ZkuKtTtUcZA==", "requires": { "@babel/types": "^7.16.0", "jsesc": "^2.5.1", @@ -55875,9 +55890,9 @@ } }, "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.0.tgz", - "integrity": "sha512-9KuleLT0e77wFUku6TUkqZzCEymBdtuQQ27MhEKzf9UOOJu3cYj98kyaDAzxpC7lV6DGiZFuC8XqDsq8/Kl6aQ==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.5.tgz", + "integrity": "sha512-3JEA9G5dmmnIWdzaT9d0NmFRgYnWUThLsDaL7982H0XqqWr56lRrsmwheXFMjR+TMl7QMBb6mzy9kvgr1lRLUA==", "requires": { "@babel/helper-explode-assignable-expression": "^7.16.0", "@babel/types": "^7.16.0" @@ -55895,15 +55910,16 @@ } }, "@babel/helper-create-class-features-plugin": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.0.tgz", - "integrity": "sha512-XLwWvqEaq19zFlF5PTgOod4bUA+XbkR4WLQBct1bkzmxJGB0ZEJaoKF4c8cgH9oBtCDuYJ8BP5NB9uFiEgO5QA==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.5.tgz", + "integrity": "sha512-NEohnYA7mkB8L5JhU7BLwcBdU3j83IziR9aseMueWGeAjblbul3zzb8UvJ3a1zuBiqCMObzCJHFqKIQE6hTVmg==", "requires": { "@babel/helper-annotate-as-pure": "^7.16.0", + "@babel/helper-environment-visitor": "^7.16.5", "@babel/helper-function-name": "^7.16.0", - "@babel/helper-member-expression-to-functions": "^7.16.0", + "@babel/helper-member-expression-to-functions": "^7.16.5", "@babel/helper-optimise-call-expression": "^7.16.0", - "@babel/helper-replace-supers": "^7.16.0", + "@babel/helper-replace-supers": "^7.16.5", "@babel/helper-split-export-declaration": "^7.16.0" } }, @@ -55946,6 +55962,14 @@ } } }, + "@babel/helper-environment-visitor": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.5.tgz", + "integrity": "sha512-ODQyc5AnxmZWm/R2W7fzhamOk1ey8gSguo5SGvF0zcB3uUzRpTRmM/jmLSm9bDMyPlvbyJ+PwPEK0BWIoZ9wjg==", + "requires": { + "@babel/types": "^7.16.0" + } + }, "@babel/helper-explode-assignable-expression": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.0.tgz", @@ -55981,9 +56005,9 @@ } }, "@babel/helper-member-expression-to-functions": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.0.tgz", - "integrity": "sha512-bsjlBFPuWT6IWhl28EdrQ+gTvSvj5tqVP5Xeftp07SEuz5pLnsXZuDkDD3Rfcxy0IsHmbZ+7B2/9SHzxO0T+sQ==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.5.tgz", + "integrity": "sha512-7fecSXq7ZrLE+TWshbGT+HyCLkxloWNhTbU2QM1NTI/tDqyf0oZiMcEfYtDuUDCo528EOlt39G1rftea4bRZIw==", "requires": { "@babel/types": "^7.16.0" } @@ -55997,17 +56021,17 @@ } }, "@babel/helper-module-transforms": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.0.tgz", - "integrity": "sha512-My4cr9ATcaBbmaEa8M0dZNA74cfI6gitvUAskgDtAFmAqyFKDSHQo5YstxPbN+lzHl2D9l/YOEFqb2mtUh4gfA==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.5.tgz", + "integrity": "sha512-CkvMxgV4ZyyioElFwcuWnDCcNIeyqTkCm9BxXZi73RR1ozqlpboqsbGUNvRTflgZtFbbJ1v5Emvm+lkjMYY/LQ==", "requires": { + "@babel/helper-environment-visitor": "^7.16.5", "@babel/helper-module-imports": "^7.16.0", - "@babel/helper-replace-supers": "^7.16.0", "@babel/helper-simple-access": "^7.16.0", "@babel/helper-split-export-declaration": "^7.16.0", "@babel/helper-validator-identifier": "^7.15.7", "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.0", + "@babel/traverse": "^7.16.5", "@babel/types": "^7.16.0" } }, @@ -56020,28 +56044,29 @@ } }, "@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==" + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.5.tgz", + "integrity": "sha512-59KHWHXxVA9K4HNF4sbHCf+eJeFe0Te/ZFGqBT4OjXhrwvA04sGfaEGsVTdsjoszq0YTP49RC9UKe5g8uN2RwQ==" }, "@babel/helper-remap-async-to-generator": { - "version": "7.16.4", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.4.tgz", - "integrity": "sha512-vGERmmhR+s7eH5Y/cp8PCVzj4XEjerq8jooMfxFdA5xVtAk9Sh4AQsrWgiErUEBjtGrBtOFKDUcWQFW4/dFwMA==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.5.tgz", + "integrity": "sha512-X+aAJldyxrOmN9v3FKp+Hu1NO69VWgYgDGq6YDykwRPzxs5f2N+X988CBXS7EQahDU+Vpet5QYMqLk+nsp+Qxw==", "requires": { "@babel/helper-annotate-as-pure": "^7.16.0", - "@babel/helper-wrap-function": "^7.16.0", + "@babel/helper-wrap-function": "^7.16.5", "@babel/types": "^7.16.0" } }, "@babel/helper-replace-supers": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.0.tgz", - "integrity": "sha512-TQxuQfSCdoha7cpRNJvfaYxxxzmbxXw/+6cS7V02eeDYyhxderSoMVALvwupA54/pZcOTtVeJ0xccp1nGWladA==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.5.tgz", + "integrity": "sha512-ao3seGVa/FZCMCCNDuBcqnBFSbdr8N2EW35mzojx3TwfIbdPmNK+JV6+2d5bR0Z71W5ocLnQp9en/cTF7pBJiQ==", "requires": { - "@babel/helper-member-expression-to-functions": "^7.16.0", + "@babel/helper-environment-visitor": "^7.16.5", + "@babel/helper-member-expression-to-functions": "^7.16.5", "@babel/helper-optimise-call-expression": "^7.16.0", - "@babel/traverse": "^7.16.0", + "@babel/traverse": "^7.16.5", "@babel/types": "^7.16.0" } }, @@ -56080,23 +56105,23 @@ "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==" }, "@babel/helper-wrap-function": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.0.tgz", - "integrity": "sha512-VVMGzYY3vkWgCJML+qVLvGIam902mJW0FvT7Avj1zEe0Gn7D93aWdLblYARTxEw+6DhZmtzhBM2zv0ekE5zg1g==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.5.tgz", + "integrity": "sha512-2J2pmLBqUqVdJw78U0KPNdeE2qeuIyKoG4mKV7wAq3mc4jJG282UgjZw4ZYDnqiWQuS3Y3IYdF/AQ6CpyBV3VA==", "requires": { "@babel/helper-function-name": "^7.16.0", "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.0", + "@babel/traverse": "^7.16.5", "@babel/types": "^7.16.0" } }, "@babel/helpers": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.3.tgz", - "integrity": "sha512-Xn8IhDlBPhvYTvgewPKawhADichOsbkZuzN7qz2BusOM0brChsyXMDJvldWaYMMUNiCQdQzNEioXTp3sC8Nt8w==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.5.tgz", + "integrity": "sha512-TLgi6Lh71vvMZGEkFuIxzaPsyeYCHQ5jJOOX1f0xXn0uciFuE8cEk0wyBquMcCxBXZ5BJhE2aUB7pnWTD150Tw==", "requires": { "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.3", + "@babel/traverse": "^7.16.5", "@babel/types": "^7.16.0" } }, @@ -56133,9 +56158,9 @@ } }, "@babel/parser": { - "version": "7.16.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.4.tgz", - "integrity": "sha512-6V0qdPUaiVHH3RtZeLIsc+6pDhbYzHR8ogA8w+f+Wc77DuXto19g2QUwveINoS34Uw+W8/hQDGJCx+i4n7xcng==" + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.5.tgz", + "integrity": "sha512-+Ce7T5iPNWzfu9C1aB5tN3Lyafs5xb3Ic7vBWyZL2KXT3QSdD1dD3CvgOzPmQKoNNRt6uauc0XwNJTQtXC2/Mw==" }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { "version": "7.16.2", @@ -56156,31 +56181,31 @@ } }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.16.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.4.tgz", - "integrity": "sha512-/CUekqaAaZCQHleSK/9HajvcD/zdnJiKRiuUFq8ITE+0HsPzquf53cpFiqAwl/UfmJbR6n5uGPQSPdrmKOvHHg==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.5.tgz", + "integrity": "sha512-C/FX+3HNLV6sz7AqbTQqEo1L9/kfrKjxcVtgyBCmvIgOjvuBVUWooDoi7trsLxOzCEo5FccjRvKHkfDsJFZlfA==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-remap-async-to-generator": "^7.16.4", + "@babel/helper-plugin-utils": "^7.16.5", + "@babel/helper-remap-async-to-generator": "^7.16.5", "@babel/plugin-syntax-async-generators": "^7.8.4" } }, "@babel/plugin-proposal-class-properties": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.0.tgz", - "integrity": "sha512-mCF3HcuZSY9Fcx56Lbn+CGdT44ioBMMvjNVldpKtj8tpniETdLjnxdHI1+sDWXIM1nNt+EanJOZ3IG9lzVjs7A==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.5.tgz", + "integrity": "sha512-pJD3HjgRv83s5dv1sTnDbZOaTjghKEz8KUn1Kbh2eAIRhGuyQ1XSeI4xVXU3UlIEVA3DAyIdxqT1eRn7Wcn55A==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-create-class-features-plugin": "^7.16.5", + "@babel/helper-plugin-utils": "^7.16.5" } }, "@babel/plugin-proposal-class-static-block": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.0.tgz", - "integrity": "sha512-mAy3sdcY9sKAkf3lQbDiv3olOfiLqI51c9DR9b19uMoR2Z6r5pmGl7dfNFqEvqOyqbf1ta4lknK4gc5PJn3mfA==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.5.tgz", + "integrity": "sha512-EEFzuLZcm/rNJ8Q5krK+FRKdVkd6FjfzT9tuSZql9sQn64K0hHA2KLJ0DqVot9/iV6+SsuadC5yI39zWnm+nmQ==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-create-class-features-plugin": "^7.16.5", + "@babel/helper-plugin-utils": "^7.16.5", "@babel/plugin-syntax-class-static-block": "^7.14.5" } }, @@ -56196,135 +56221,135 @@ } }, "@babel/plugin-proposal-dynamic-import": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.0.tgz", - "integrity": "sha512-QGSA6ExWk95jFQgwz5GQ2Dr95cf7eI7TKutIXXTb7B1gCLTCz5hTjFTQGfLFBBiC5WSNi7udNwWsqbbMh1c4yQ==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.5.tgz", + "integrity": "sha512-P05/SJZTTvHz79LNYTF8ff5xXge0kk5sIIWAypcWgX4BTRUgyHc8wRxJ/Hk+mU0KXldgOOslKaeqnhthcDJCJQ==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3" } }, "@babel/plugin-proposal-export-default-from": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.16.0.tgz", - "integrity": "sha512-kFAhaIbh5qbBwETRNa/cgGmPJ/BicXhIyrZhAkyYhf/Z9LXCTRGO1mvUwczto0Hl1q4YtzP9cRtTKT4wujm38Q==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.16.5.tgz", + "integrity": "sha512-pU4aCS+AzGjDD/6LnwSmeelmtqfMSjzQxs7+/AS673bYsshK1XZm9eth6OkgivVscQM8XdkVYhrb6tPFVTBVHA==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-export-default-from": "^7.16.0" + "@babel/helper-plugin-utils": "^7.16.5", + "@babel/plugin-syntax-export-default-from": "^7.16.5" } }, "@babel/plugin-proposal-export-namespace-from": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.0.tgz", - "integrity": "sha512-CjI4nxM/D+5wCnhD11MHB1AwRSAYeDT+h8gCdcVJZ/OK7+wRzFsf7PFPWVpVpNRkHMmMkQWAHpTq+15IXQ1diA==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.5.tgz", + "integrity": "sha512-i+sltzEShH1vsVydvNaTRsgvq2vZsfyrd7K7vPLUU/KgS0D5yZMe6uipM0+izminnkKrEfdUnz7CxMRb6oHZWw==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.5", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" } }, "@babel/plugin-proposal-function-bind": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-function-bind/-/plugin-proposal-function-bind-7.16.0.tgz", - "integrity": "sha512-oTf/NztwTma6O4e16Iy6+DOqodQydc1/MLmENMTduigCYxvUvLblCRP5Tu3PkAGPKq5/F3lB44GWLc+egJi3VA==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-function-bind/-/plugin-proposal-function-bind-7.16.5.tgz", + "integrity": "sha512-rOr/gYNm8pTBAfnwr/F6uSPjFJMqE2L1jLCoVrAcrt1he5e9F6pV6Cl4JBrFBbUnA+ETMnVFZIhfVbTq7So0Gw==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-function-bind": "^7.16.0" + "@babel/helper-plugin-utils": "^7.16.5", + "@babel/plugin-syntax-function-bind": "^7.16.5" } }, "@babel/plugin-proposal-json-strings": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.0.tgz", - "integrity": "sha512-kouIPuiv8mSi5JkEhzApg5Gn6hFyKPnlkO0a9YSzqRurH8wYzSlf6RJdzluAsbqecdW5pBvDJDfyDIUR/vLxvg==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.5.tgz", + "integrity": "sha512-QQJueTFa0y9E4qHANqIvMsuxM/qcLQmKttBACtPCQzGUEizsXDACGonlPiSwynHfOa3vNw0FPMVvQzbuXwh4SQ==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.5", "@babel/plugin-syntax-json-strings": "^7.8.3" } }, "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.0.tgz", - "integrity": "sha512-pbW0fE30sVTYXXm9lpVQQ/Vc+iTeQKiXlaNRZPPN2A2VdlWyAtsUrsQ3xydSlDW00TFMK7a8m3cDTkBF5WnV3Q==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.5.tgz", + "integrity": "sha512-xqibl7ISO2vjuQM+MzR3rkd0zfNWltk7n9QhaD8ghMmMceVguYrNDt7MikRyj4J4v3QehpnrU8RYLnC7z/gZLA==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.5", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" } }, "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.0.tgz", - "integrity": "sha512-3bnHA8CAFm7cG93v8loghDYyQ8r97Qydf63BeYiGgYbjKKB/XP53W15wfRC7dvKfoiJ34f6Rbyyx2btExc8XsQ==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.5.tgz", + "integrity": "sha512-YwMsTp/oOviSBhrjwi0vzCUycseCYwoXnLiXIL3YNjHSMBHicGTz7GjVU/IGgz4DtOEXBdCNG72pvCX22ehfqg==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.5", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" } }, "@babel/plugin-proposal-numeric-separator": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.0.tgz", - "integrity": "sha512-FAhE2I6mjispy+vwwd6xWPyEx3NYFS13pikDBWUAFGZvq6POGs5eNchw8+1CYoEgBl9n11I3NkzD7ghn25PQ9Q==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.5.tgz", + "integrity": "sha512-DvB9l/TcsCRvsIV9v4jxR/jVP45cslTVC0PMVHvaJhhNuhn2Y1SOhCSFlPK777qLB5wb8rVDaNoqMTyOqtY5Iw==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.5", "@babel/plugin-syntax-numeric-separator": "^7.10.4" } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.0.tgz", - "integrity": "sha512-LU/+jp89efe5HuWJLmMmFG0+xbz+I2rSI7iLc1AlaeSMDMOGzWlc5yJrMN1d04osXN4sSfpo4O+azkBNBes0jg==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.5.tgz", + "integrity": "sha512-UEd6KpChoyPhCoE840KRHOlGhEZFutdPDMGj+0I56yuTTOaT51GzmnEl/0uT41fB/vD2nT+Pci2KjezyE3HmUw==", "requires": { - "@babel/compat-data": "^7.16.0", - "@babel/helper-compilation-targets": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/compat-data": "^7.16.4", + "@babel/helper-compilation-targets": "^7.16.3", + "@babel/helper-plugin-utils": "^7.16.5", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.16.0" + "@babel/plugin-transform-parameters": "^7.16.5" } }, "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.0.tgz", - "integrity": "sha512-kicDo0A/5J0nrsCPbn89mTG3Bm4XgYi0CZtvex9Oyw7gGZE3HXGD0zpQNH+mo+tEfbo8wbmMvJftOwpmPy7aVw==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.5.tgz", + "integrity": "sha512-ihCMxY1Iljmx4bWy/PIMJGXN4NS4oUj1MKynwO07kiKms23pNvIn1DMB92DNB2R0EA882sw0VXIelYGdtF7xEQ==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.5", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" } }, "@babel/plugin-proposal-optional-chaining": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.0.tgz", - "integrity": "sha512-Y4rFpkZODfHrVo70Uaj6cC1JJOt3Pp0MdWSwIKtb8z1/lsjl9AmnB7ErRFV+QNGIfcY1Eruc2UMx5KaRnXjMyg==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.5.tgz", + "integrity": "sha512-kzdHgnaXRonttiTfKYnSVafbWngPPr2qKw9BWYBESl91W54e+9R5pP70LtWxV56g0f05f/SQrwHYkfvbwcdQ/A==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", "@babel/plugin-syntax-optional-chaining": "^7.8.3" } }, "@babel/plugin-proposal-private-methods": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.0.tgz", - "integrity": "sha512-IvHmcTHDFztQGnn6aWq4t12QaBXTKr1whF/dgp9kz84X6GUcwq9utj7z2wFCUfeOup/QKnOlt2k0zxkGFx9ubg==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.5.tgz", + "integrity": "sha512-+yFMO4BGT3sgzXo+lrq7orX5mAZt57DwUK6seqII6AcJnJOIhBJ8pzKH47/ql/d426uQ7YhN8DpUFirQzqYSUA==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-create-class-features-plugin": "^7.16.5", + "@babel/helper-plugin-utils": "^7.16.5" } }, "@babel/plugin-proposal-private-property-in-object": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.0.tgz", - "integrity": "sha512-3jQUr/HBbMVZmi72LpjQwlZ55i1queL8KcDTQEkAHihttJnAPrcvG9ZNXIfsd2ugpizZo595egYV6xy+pv4Ofw==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.5.tgz", + "integrity": "sha512-+YGh5Wbw0NH3y/E5YMu6ci5qTDmAEVNoZ3I54aB6nVEOZ5BQ7QJlwKq5pYVucQilMByGn/bvX0af+uNaPRCabA==", "requires": { "@babel/helper-annotate-as-pure": "^7.16.0", - "@babel/helper-create-class-features-plugin": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-create-class-features-plugin": "^7.16.5", + "@babel/helper-plugin-utils": "^7.16.5", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" } }, "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.0.tgz", - "integrity": "sha512-ti7IdM54NXv29cA4+bNNKEMS4jLMCbJgl+Drv+FgYy0erJLAxNAIXcNjNjrRZEcWq0xJHsNVwQezskMFpF8N9g==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.5.tgz", + "integrity": "sha512-s5sKtlKQyFSatt781HQwv1hoM5BQ9qRH30r+dK56OLDsHmV74mzwJNX7R1yMuE7VZKG5O6q/gmOGSAO6ikTudg==", "requires": { "@babel/helper-create-regexp-features-plugin": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" } }, "@babel/plugin-syntax-async-generators": { @@ -56378,11 +56403,11 @@ } }, "@babel/plugin-syntax-export-default-from": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.16.0.tgz", - "integrity": "sha512-xllLOdBj77mFSw8s02I+2SSQGHOftbWTlGmagheuNk/gjQsk7IrYsR/EosXVAVpgIUFffLckB/iPRioQYLHSrQ==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.16.5.tgz", + "integrity": "sha512-tvY55nhq4mSG9WbM7IZcLIhdc5jzIZu0PQKJHtZ16+dF7oBxKbqV/Z0e9ta2zaLMvUjH+3rJv1hbZ0+lpXzuFQ==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" } }, "@babel/plugin-syntax-export-namespace-from": { @@ -56403,11 +56428,11 @@ } }, "@babel/plugin-syntax-function-bind": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-function-bind/-/plugin-syntax-function-bind-7.16.0.tgz", - "integrity": "sha512-L+B4rMnFg2ElQUTjSr3gfmIAJ3ej/BeKGW32AL01qpLhkI4Vw1C+W8p6wl8S6eYqWSj9X9d/lyuQWI5JFYjCWw==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-function-bind/-/plugin-syntax-function-bind-7.16.5.tgz", + "integrity": "sha512-Jn09tjgZuJIQdbqQCkBQErzjO4LV2NDUz03HSowJD0km7iXsKPX6Sk0G7xIkUItenYNLfkndlWojeTyYC6QbBA==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" } }, "@babel/plugin-syntax-import-meta": { @@ -56428,11 +56453,11 @@ } }, "@babel/plugin-syntax-jsx": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.0.tgz", - "integrity": "sha512-8zv2+xiPHwly31RK4RmnEYY5zziuF3O7W2kIDW+07ewWDh6Oi0dRq8kwvulRkFgt6DB97RlKs5c1y068iPlCUg==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.5.tgz", + "integrity": "sha512-42OGssv9NPk4QHKVgIHlzeLgPOW5rGgfV5jzG90AhcXXIv6hu/eqj63w4VgvRxdvZY3AlYeDgPiSJ3BqAd1Y6Q==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" } }, "@babel/plugin-syntax-logical-assignment-operators": { @@ -56508,93 +56533,94 @@ } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.0.tgz", - "integrity": "sha512-vIFb5250Rbh7roWARvCLvIJ/PtAU5Lhv7BtZ1u24COwpI9Ypjsh+bZcKk6rlIyalK+r0jOc1XQ8I4ovNxNrWrA==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.5.tgz", + "integrity": "sha512-8bTHiiZyMOyfZFULjsCnYOWG059FVMes0iljEHSfARhNgFfpsqE92OrCffv3veSw9rwMkYcFe9bj0ZoXU2IGtQ==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.0.tgz", - "integrity": "sha512-PbIr7G9kR8tdH6g8Wouir5uVjklETk91GMVSUq+VaOgiinbCkBP6Q7NN/suM/QutZkMJMvcyAriogcYAdhg8Gw==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.5.tgz", + "integrity": "sha512-TMXgfioJnkXU+XRoj7P2ED7rUm5jbnDWwlCuFVTpQboMfbSya5WrmubNBAMlk7KXvywpo8rd8WuYZkis1o2H8w==", "requires": { "@babel/helper-module-imports": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-remap-async-to-generator": "^7.16.0" + "@babel/helper-plugin-utils": "^7.16.5", + "@babel/helper-remap-async-to-generator": "^7.16.5" } }, "@babel/plugin-transform-block-scoped-functions": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.0.tgz", - "integrity": "sha512-V14As3haUOP4ZWrLJ3VVx5rCnrYhMSHN/jX7z6FAt5hjRkLsb0snPCmJwSOML5oxkKO4FNoNv7V5hw/y2bjuvg==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.5.tgz", + "integrity": "sha512-BxmIyKLjUGksJ99+hJyL/HIxLIGnLKtw772zYDER7UuycDZ+Xvzs98ZQw6NGgM2ss4/hlFAaGiZmMNKvValEjw==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" } }, "@babel/plugin-transform-block-scoping": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.0.tgz", - "integrity": "sha512-27n3l67/R3UrXfizlvHGuTwsRIFyce3D/6a37GRxn28iyTPvNXaW4XvznexRh1zUNLPjbLL22Id0XQElV94ruw==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.5.tgz", + "integrity": "sha512-JxjSPNZSiOtmxjX7PBRBeRJTUKTyJ607YUYeT0QJCNdsedOe+/rXITjP08eG8xUpsLfPirgzdCFN+h0w6RI+pQ==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" } }, "@babel/plugin-transform-classes": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.0.tgz", - "integrity": "sha512-HUxMvy6GtAdd+GKBNYDWCIA776byUQH8zjnfjxwT1P1ARv/wFu8eBDpmXQcLS/IwRtrxIReGiplOwMeyO7nsDQ==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.5.tgz", + "integrity": "sha512-DzJ1vYf/7TaCYy57J3SJ9rV+JEuvmlnvvyvYKFbk5u46oQbBvuB9/0w+YsVsxkOv8zVWKpDmUoj4T5ILHoXevA==", "requires": { "@babel/helper-annotate-as-pure": "^7.16.0", + "@babel/helper-environment-visitor": "^7.16.5", "@babel/helper-function-name": "^7.16.0", "@babel/helper-optimise-call-expression": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-replace-supers": "^7.16.0", + "@babel/helper-plugin-utils": "^7.16.5", + "@babel/helper-replace-supers": "^7.16.5", "@babel/helper-split-export-declaration": "^7.16.0", "globals": "^11.1.0" } }, "@babel/plugin-transform-computed-properties": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.0.tgz", - "integrity": "sha512-63l1dRXday6S8V3WFY5mXJwcRAnPYxvFfTlt67bwV1rTyVTM5zrp0DBBb13Kl7+ehkCVwIZPumPpFP/4u70+Tw==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.5.tgz", + "integrity": "sha512-n1+O7xtU5lSLraRzX88CNcpl7vtGdPakKzww74bVwpAIRgz9JVLJJpOLb0uYqcOaXVM0TL6X0RVeIJGD2CnCkg==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" } }, "@babel/plugin-transform-destructuring": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.0.tgz", - "integrity": "sha512-Q7tBUwjxLTsHEoqktemHBMtb3NYwyJPTJdM+wDwb0g8PZ3kQUIzNvwD5lPaqW/p54TXBc/MXZu9Jr7tbUEUM8Q==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.5.tgz", + "integrity": "sha512-GuRVAsjq+c9YPK6NeTkRLWyQskDC099XkBSVO+6QzbnOnH2d/4mBVXYStaPrZD3dFRfg00I6BFJ9Atsjfs8mlg==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" } }, "@babel/plugin-transform-dotall-regex": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.0.tgz", - "integrity": "sha512-FXlDZfQeLILfJlC6I1qyEwcHK5UpRCFkaoVyA1nk9A1L1Yu583YO4un2KsLBsu3IJb4CUbctZks8tD9xPQubLw==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.5.tgz", + "integrity": "sha512-iQiEMt8Q4/5aRGHpGVK2Zc7a6mx7qEAO7qehgSug3SDImnuMzgmm/wtJALXaz25zUj1PmnNHtShjFgk4PDx4nw==", "requires": { "@babel/helper-create-regexp-features-plugin": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.0.tgz", - "integrity": "sha512-LIe2kcHKAZOJDNxujvmp6z3mfN6V9lJxubU4fJIGoQCkKe3Ec2OcbdlYP+vW++4MpxwG0d1wSDOJtQW5kLnkZQ==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.5.tgz", + "integrity": "sha512-81tijpDg2a6I1Yhj4aWY1l3O1J4Cg/Pd7LfvuaH2VVInAkXtzibz9+zSPdUM1WvuUi128ksstAP0hM5w48vQgg==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" } }, "@babel/plugin-transform-exponentiation-operator": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.0.tgz", - "integrity": "sha512-OwYEvzFI38hXklsrbNivzpO3fh87skzx8Pnqi4LoSYeav0xHlueSoCJrSgTPfnbyzopo5b3YVAJkFIcUpK2wsw==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.5.tgz", + "integrity": "sha512-12rba2HwemQPa7BLIKCzm1pT2/RuQHtSFHdNl41cFiC6oi4tcrp7gjB07pxQvFpcADojQywSjblQth6gJyE6CA==", "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.5", + "@babel/helper-plugin-utils": "^7.16.5" } }, "@babel/plugin-transform-flow-strip-types": { @@ -56608,172 +56634,172 @@ } }, "@babel/plugin-transform-for-of": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.0.tgz", - "integrity": "sha512-5QKUw2kO+GVmKr2wMYSATCTTnHyscl6sxFRAY+rvN7h7WB0lcG0o4NoV6ZQU32OZGVsYUsfLGgPQpDFdkfjlJQ==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.5.tgz", + "integrity": "sha512-+DpCAJFPAvViR17PIMi9x2AE34dll5wNlXO43wagAX2YcRGgEVHCNFC4azG85b4YyyFarvkc/iD5NPrz4Oneqw==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" } }, "@babel/plugin-transform-function-name": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.0.tgz", - "integrity": "sha512-lBzMle9jcOXtSOXUpc7tvvTpENu/NuekNJVova5lCCWCV9/U1ho2HH2y0p6mBg8fPm/syEAbfaaemYGOHCY3mg==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.5.tgz", + "integrity": "sha512-Fuec/KPSpVLbGo6z1RPw4EE1X+z9gZk1uQmnYy7v4xr4TO9p41v1AoUuXEtyqAI7H+xNJYSICzRqZBhDEkd3kQ==", "requires": { "@babel/helper-function-name": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" } }, "@babel/plugin-transform-literals": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.0.tgz", - "integrity": "sha512-gQDlsSF1iv9RU04clgXqRjrPyyoJMTclFt3K1cjLmTKikc0s/6vE3hlDeEVC71wLTRu72Fq7650kABrdTc2wMQ==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.5.tgz", + "integrity": "sha512-B1j9C/IfvshnPcklsc93AVLTrNVa69iSqztylZH6qnmiAsDDOmmjEYqOm3Ts2lGSgTSywnBNiqC949VdD0/gfw==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" } }, "@babel/plugin-transform-member-expression-literals": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.0.tgz", - "integrity": "sha512-WRpw5HL4Jhnxw8QARzRvwojp9MIE7Tdk3ez6vRyUk1MwgjJN0aNpRoXainLR5SgxmoXx/vsXGZ6OthP6t/RbUg==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.5.tgz", + "integrity": "sha512-d57i3vPHWgIde/9Y8W/xSFUndhvhZN5Wu2TjRrN1MVz5KzdUihKnfDVlfP1U7mS5DNj/WHHhaE4/tTi4hIyHwQ==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" } }, "@babel/plugin-transform-modules-amd": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.0.tgz", - "integrity": "sha512-rWFhWbCJ9Wdmzln1NmSCqn7P0RAD+ogXG/bd9Kg5c7PKWkJtkiXmYsMBeXjDlzHpVTJ4I/hnjs45zX4dEv81xw==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.5.tgz", + "integrity": "sha512-oHI15S/hdJuSCfnwIz+4lm6wu/wBn7oJ8+QrkzPPwSFGXk8kgdI/AIKcbR/XnD1nQVMg/i6eNaXpszbGuwYDRQ==", "requires": { - "@babel/helper-module-transforms": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-module-transforms": "^7.16.5", + "@babel/helper-plugin-utils": "^7.16.5", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.0.tgz", - "integrity": "sha512-Dzi+NWqyEotgzk/sb7kgQPJQf7AJkQBWsVp1N6JWc1lBVo0vkElUnGdr1PzUBmfsCCN5OOFya3RtpeHk15oLKQ==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.5.tgz", + "integrity": "sha512-ABhUkxvoQyqhCWyb8xXtfwqNMJD7tx+irIRnUh6lmyFud7Jln1WzONXKlax1fg/ey178EXbs4bSGNd6PngO+SQ==", "requires": { - "@babel/helper-module-transforms": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-module-transforms": "^7.16.5", + "@babel/helper-plugin-utils": "^7.16.5", "@babel/helper-simple-access": "^7.16.0", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.0.tgz", - "integrity": "sha512-yuGBaHS3lF1m/5R+6fjIke64ii5luRUg97N2wr+z1sF0V+sNSXPxXDdEEL/iYLszsN5VKxVB1IPfEqhzVpiqvg==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.5.tgz", + "integrity": "sha512-53gmLdScNN28XpjEVIm7LbWnD/b/TpbwKbLk6KV4KqC9WyU6rq1jnNmVG6UgAdQZVVGZVoik3DqHNxk4/EvrjA==", "requires": { "@babel/helper-hoist-variables": "^7.16.0", - "@babel/helper-module-transforms": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-module-transforms": "^7.16.5", + "@babel/helper-plugin-utils": "^7.16.5", "@babel/helper-validator-identifier": "^7.15.7", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-umd": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.0.tgz", - "integrity": "sha512-nx4f6no57himWiHhxDM5pjwhae5vLpTK2zCnDH8+wNLJy0TVER/LJRHl2bkt6w9Aad2sPD5iNNoUpY3X9sTGDg==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.5.tgz", + "integrity": "sha512-qTFnpxHMoenNHkS3VoWRdwrcJ3FhX567GvDA3hRZKF0Dj8Fmg0UzySZp3AP2mShl/bzcywb/UWAMQIjA1bhXvw==", "requires": { - "@babel/helper-module-transforms": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-module-transforms": "^7.16.5", + "@babel/helper-plugin-utils": "^7.16.5" } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.0.tgz", - "integrity": "sha512-LogN88uO+7EhxWc8WZuQ8vxdSyVGxhkh8WTC3tzlT8LccMuQdA81e9SGV6zY7kY2LjDhhDOFdQVxdGwPyBCnvg==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.5.tgz", + "integrity": "sha512-/wqGDgvFUeKELW6ex6QB7dLVRkd5ehjw34tpXu1nhKC0sFfmaLabIswnpf8JgDyV2NeDmZiwoOb0rAmxciNfjA==", "requires": { "@babel/helper-create-regexp-features-plugin": "^7.16.0" } }, "@babel/plugin-transform-new-target": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.0.tgz", - "integrity": "sha512-fhjrDEYv2DBsGN/P6rlqakwRwIp7rBGLPbrKxwh7oVt5NNkIhZVOY2GRV+ULLsQri1bDqwDWnU3vhlmx5B2aCw==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.5.tgz", + "integrity": "sha512-ZaIrnXF08ZC8jnKR4/5g7YakGVL6go6V9ql6Jl3ecO8PQaQqFE74CuM384kezju7Z9nGCCA20BqZaR1tJ/WvHg==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" } }, "@babel/plugin-transform-object-super": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.0.tgz", - "integrity": "sha512-fds+puedQHn4cPLshoHcR1DTMN0q1V9ou0mUjm8whx9pGcNvDrVVrgw+KJzzCaiTdaYhldtrUps8DWVMgrSEyg==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.5.tgz", + "integrity": "sha512-tded+yZEXuxt9Jdtkc1RraW1zMF/GalVxaVVxh41IYwirdRgyAxxxCKZ9XB7LxZqmsjfjALxupNE1MIz9KH+Zg==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-replace-supers": "^7.16.0" + "@babel/helper-plugin-utils": "^7.16.5", + "@babel/helper-replace-supers": "^7.16.5" } }, "@babel/plugin-transform-parameters": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.3.tgz", - "integrity": "sha512-3MaDpJrOXT1MZ/WCmkOFo7EtmVVC8H4EUZVrHvFOsmwkk4lOjQj8rzv8JKUZV4YoQKeoIgk07GO+acPU9IMu/w==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.5.tgz", + "integrity": "sha512-B3O6AL5oPop1jAVg8CV+haeUte9oFuY85zu0jwnRNZZi3tVAbJriu5tag/oaO2kGaQM/7q7aGPBlTI5/sr9enA==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" } }, "@babel/plugin-transform-property-literals": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.0.tgz", - "integrity": "sha512-XLldD4V8+pOqX2hwfWhgwXzGdnDOThxaNTgqagOcpBgIxbUvpgU2FMvo5E1RyHbk756WYgdbS0T8y0Cj9FKkWQ==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.5.tgz", + "integrity": "sha512-+IRcVW71VdF9pEH/2R/Apab4a19LVvdVsr/gEeotH00vSDVlKD+XgfSIw+cgGWsjDB/ziqGv/pGoQZBIiQVXHg==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" } }, "@babel/plugin-transform-react-display-name": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.0.tgz", - "integrity": "sha512-FJFdJAqaCpndL+pIf0aeD/qlQwT7QXOvR6Cc8JPvNhKJBi2zc/DPc4g05Y3fbD/0iWAMQFGij4+Xw+4L/BMpTg==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.5.tgz", + "integrity": "sha512-dHYCOnzSsXFz8UcdNQIHGvg94qPL/teF7CCiCEMRxmA1G2p5Mq4JnKVowCDxYfiQ9D7RstaAp9kwaSI+sXbnhw==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" } }, "@babel/plugin-transform-react-jsx": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.16.0.tgz", - "integrity": "sha512-rqDgIbukZ44pqq7NIRPGPGNklshPkvlmvqjdx3OZcGPk4zGIenYkxDTvl3LsSL8gqcc3ZzGmXPE6hR/u/voNOw==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.16.5.tgz", + "integrity": "sha512-+arLIz1d7kmwX0fKxTxbnoeG85ONSnLpvdODa4P3pc1sS7CV1hfmtYWufkW/oYsPnkDrEeQFxhUWcFnrXW7jQQ==", "requires": { "@babel/helper-annotate-as-pure": "^7.16.0", "@babel/helper-module-imports": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-jsx": "^7.16.0", + "@babel/helper-plugin-utils": "^7.16.5", + "@babel/plugin-syntax-jsx": "^7.16.5", "@babel/types": "^7.16.0" } }, "@babel/plugin-transform-react-jsx-development": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.0.tgz", - "integrity": "sha512-qq65iSqBRq0Hr3wq57YG2AmW0H6wgTnIzpffTphrUWUgLCOK+zf1f7G0vuOiXrp7dU1qq+fQBoqZ3wCDAkhFzw==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.5.tgz", + "integrity": "sha512-uQSLacMZSGLCxOw20dzo1dmLlKkd+DsayoV54q3MHXhbqgPzoiGerZQgNPl/Ro8/OcXV2ugfnkx+rxdS0sN5Uw==", "requires": { - "@babel/plugin-transform-react-jsx": "^7.16.0" + "@babel/plugin-transform-react-jsx": "^7.16.5" } }, "@babel/plugin-transform-react-pure-annotations": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.0.tgz", - "integrity": "sha512-NC/Bj2MG+t8Ef5Pdpo34Ay74X4Rt804h5y81PwOpfPtmAK3i6CizmQqwyBQzIepz1Yt8wNr2Z2L7Lu3qBMfZMA==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.5.tgz", + "integrity": "sha512-0nYU30hCxnCVCbRjSy9ahlhWZ2Sn6khbY4FqR91W+2RbSqkWEbVu2gXh45EqNy4Bq7sRU+H4i0/6YKwOSzh16A==", "requires": { "@babel/helper-annotate-as-pure": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" } }, "@babel/plugin-transform-regenerator": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.0.tgz", - "integrity": "sha512-JAvGxgKuwS2PihiSFaDrp94XOzzTUeDeOQlcKzVAyaPap7BnZXK/lvMDiubkPTdotPKOIZq9xWXWnggUMYiExg==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.5.tgz", + "integrity": "sha512-2z+it2eVWU8TtQQRauvGUqZwLy4+7rTfo6wO4npr+fvvN1SW30ZF3O/ZRCNmTuu4F5MIP8OJhXAhRV5QMJOuYg==", "requires": { "regenerator-transform": "^0.14.2" } }, "@babel/plugin-transform-reserved-words": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.0.tgz", - "integrity": "sha512-Dgs8NNCehHSvXdhEhln8u/TtJxfVwGYCgP2OOr5Z3Ar+B+zXicEOKNTyc+eca2cuEOMtjW6m9P9ijOt8QdqWkg==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.5.tgz", + "integrity": "sha512-aIB16u8lNcf7drkhXJRoggOxSTUAuihTSTfAcpynowGJOZiGf+Yvi7RuTwFzVYSYPmWyARsPqUGoZWWWxLiknw==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" } }, "@babel/plugin-transform-runtime": { @@ -56790,44 +56816,44 @@ } }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.0.tgz", - "integrity": "sha512-iVb1mTcD8fuhSv3k99+5tlXu5N0v8/DPm2mO3WACLG6al1CGZH7v09HJyUb1TtYl/Z+KrM6pHSIJdZxP5A+xow==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.5.tgz", + "integrity": "sha512-ZbuWVcY+MAXJuuW7qDoCwoxDUNClfZxoo7/4swVbOW1s/qYLOMHlm9YRWMsxMFuLs44eXsv4op1vAaBaBaDMVg==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" } }, "@babel/plugin-transform-spread": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.0.tgz", - "integrity": "sha512-Ao4MSYRaLAQczZVp9/7E7QHsCuK92yHRrmVNRe/SlEJjhzivq0BSn8mEraimL8wizHZ3fuaHxKH0iwzI13GyGg==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.5.tgz", + "integrity": "sha512-5d6l/cnG7Lw4tGHEoga4xSkYp1euP7LAtrah1h1PgJ3JY7yNsjybsxQAnVK4JbtReZ/8z6ASVmd3QhYYKLaKZw==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0" } }, "@babel/plugin-transform-sticky-regex": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.0.tgz", - "integrity": "sha512-/ntT2NljR9foobKk4E/YyOSwcGUXtYWv5tinMK/3RkypyNBNdhHUaq6Orw5DWq9ZcNlS03BIlEALFeQgeVAo4Q==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.5.tgz", + "integrity": "sha512-usYsuO1ID2LXxzuUxifgWtJemP7wL2uZtyrTVM4PKqsmJycdS4U4mGovL5xXkfUheds10Dd2PjoQLXw6zCsCbg==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" } }, "@babel/plugin-transform-template-literals": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.0.tgz", - "integrity": "sha512-Rd4Ic89hA/f7xUSJQk5PnC+4so50vBoBfxjdQAdvngwidM8jYIBVxBZ/sARxD4e0yMXRbJVDrYf7dyRtIIKT6Q==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.5.tgz", + "integrity": "sha512-gnyKy9RyFhkovex4BjKWL3BVYzUDG6zC0gba7VMLbQoDuqMfJ1SDXs8k/XK41Mmt1Hyp4qNAvGFb9hKzdCqBRQ==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.0.tgz", - "integrity": "sha512-++V2L8Bdf4vcaHi2raILnptTBjGEFxn5315YU+e8+EqXIucA+q349qWngCLpUYqqv233suJ6NOienIVUpS9cqg==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.5.tgz", + "integrity": "sha512-ldxCkW180qbrvyCVDzAUZqB0TAeF8W/vGJoRcaf75awm6By+PxfJKvuqVAnq8N9wz5Xa6mSpM19OfVKKVmGHSQ==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" } }, "@babel/plugin-transform-typescript": { @@ -56841,20 +56867,20 @@ } }, "@babel/plugin-transform-unicode-escapes": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.0.tgz", - "integrity": "sha512-VFi4dhgJM7Bpk8lRc5CMaRGlKZ29W9C3geZjt9beuzSUrlJxsNwX7ReLwaL6WEvsOf2EQkyIJEPtF8EXjB/g2A==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.5.tgz", + "integrity": "sha512-shiCBHTIIChGLdyojsKQjoAyB8MBwat25lKM7MJjbe1hE0bgIppD+LX9afr41lLHOhqceqeWl4FkLp+Bgn9o1Q==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" } }, "@babel/plugin-transform-unicode-regex": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.0.tgz", - "integrity": "sha512-jHLK4LxhHjvCeZDWyA9c+P9XH1sOxRd1RO9xMtDVRAOND/PczPqizEtVdx4TQF/wyPaewqpT+tgQFYMnN/P94A==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.5.tgz", + "integrity": "sha512-GTJ4IW012tiPEMMubd7sD07iU9O/LOo8Q/oU4xNhcaq0Xn8+6TcUQaHtC8YxySo1T+ErQ8RaWogIEeFhKGNPzw==", "requires": { "@babel/helper-create-regexp-features-plugin": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.5" } }, "@babel/polyfill": { @@ -56867,31 +56893,31 @@ } }, "@babel/preset-env": { - "version": "7.16.4", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.4.tgz", - "integrity": "sha512-v0QtNd81v/xKj4gNKeuAerQ/azeNn/G1B1qMLeXOcV8+4TWlD2j3NV1u8q29SDFBXx/NBq5kyEAO+0mpRgacjA==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.5.tgz", + "integrity": "sha512-MiJJW5pwsktG61NDxpZ4oJ1CKxM1ncam9bzRtx9g40/WkLRkxFP6mhpkYV0/DxcciqoiHicx291+eUQrXb/SfQ==", "requires": { "@babel/compat-data": "^7.16.4", "@babel/helper-compilation-targets": "^7.16.3", - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.5", "@babel/helper-validator-option": "^7.14.5", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.2", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.0", - "@babel/plugin-proposal-async-generator-functions": "^7.16.4", - "@babel/plugin-proposal-class-properties": "^7.16.0", - "@babel/plugin-proposal-class-static-block": "^7.16.0", - "@babel/plugin-proposal-dynamic-import": "^7.16.0", - "@babel/plugin-proposal-export-namespace-from": "^7.16.0", - "@babel/plugin-proposal-json-strings": "^7.16.0", - "@babel/plugin-proposal-logical-assignment-operators": "^7.16.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0", - "@babel/plugin-proposal-numeric-separator": "^7.16.0", - "@babel/plugin-proposal-object-rest-spread": "^7.16.0", - "@babel/plugin-proposal-optional-catch-binding": "^7.16.0", - "@babel/plugin-proposal-optional-chaining": "^7.16.0", - "@babel/plugin-proposal-private-methods": "^7.16.0", - "@babel/plugin-proposal-private-property-in-object": "^7.16.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.16.0", + "@babel/plugin-proposal-async-generator-functions": "^7.16.5", + "@babel/plugin-proposal-class-properties": "^7.16.5", + "@babel/plugin-proposal-class-static-block": "^7.16.5", + "@babel/plugin-proposal-dynamic-import": "^7.16.5", + "@babel/plugin-proposal-export-namespace-from": "^7.16.5", + "@babel/plugin-proposal-json-strings": "^7.16.5", + "@babel/plugin-proposal-logical-assignment-operators": "^7.16.5", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.5", + "@babel/plugin-proposal-numeric-separator": "^7.16.5", + "@babel/plugin-proposal-object-rest-spread": "^7.16.5", + "@babel/plugin-proposal-optional-catch-binding": "^7.16.5", + "@babel/plugin-proposal-optional-chaining": "^7.16.5", + "@babel/plugin-proposal-private-methods": "^7.16.5", + "@babel/plugin-proposal-private-property-in-object": "^7.16.5", + "@babel/plugin-proposal-unicode-property-regex": "^7.16.5", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", @@ -56906,38 +56932,38 @@ "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.16.0", - "@babel/plugin-transform-async-to-generator": "^7.16.0", - "@babel/plugin-transform-block-scoped-functions": "^7.16.0", - "@babel/plugin-transform-block-scoping": "^7.16.0", - "@babel/plugin-transform-classes": "^7.16.0", - "@babel/plugin-transform-computed-properties": "^7.16.0", - "@babel/plugin-transform-destructuring": "^7.16.0", - "@babel/plugin-transform-dotall-regex": "^7.16.0", - "@babel/plugin-transform-duplicate-keys": "^7.16.0", - "@babel/plugin-transform-exponentiation-operator": "^7.16.0", - "@babel/plugin-transform-for-of": "^7.16.0", - "@babel/plugin-transform-function-name": "^7.16.0", - "@babel/plugin-transform-literals": "^7.16.0", - "@babel/plugin-transform-member-expression-literals": "^7.16.0", - "@babel/plugin-transform-modules-amd": "^7.16.0", - "@babel/plugin-transform-modules-commonjs": "^7.16.0", - "@babel/plugin-transform-modules-systemjs": "^7.16.0", - "@babel/plugin-transform-modules-umd": "^7.16.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.0", - "@babel/plugin-transform-new-target": "^7.16.0", - "@babel/plugin-transform-object-super": "^7.16.0", - "@babel/plugin-transform-parameters": "^7.16.3", - "@babel/plugin-transform-property-literals": "^7.16.0", - "@babel/plugin-transform-regenerator": "^7.16.0", - "@babel/plugin-transform-reserved-words": "^7.16.0", - "@babel/plugin-transform-shorthand-properties": "^7.16.0", - "@babel/plugin-transform-spread": "^7.16.0", - "@babel/plugin-transform-sticky-regex": "^7.16.0", - "@babel/plugin-transform-template-literals": "^7.16.0", - "@babel/plugin-transform-typeof-symbol": "^7.16.0", - "@babel/plugin-transform-unicode-escapes": "^7.16.0", - "@babel/plugin-transform-unicode-regex": "^7.16.0", + "@babel/plugin-transform-arrow-functions": "^7.16.5", + "@babel/plugin-transform-async-to-generator": "^7.16.5", + "@babel/plugin-transform-block-scoped-functions": "^7.16.5", + "@babel/plugin-transform-block-scoping": "^7.16.5", + "@babel/plugin-transform-classes": "^7.16.5", + "@babel/plugin-transform-computed-properties": "^7.16.5", + "@babel/plugin-transform-destructuring": "^7.16.5", + "@babel/plugin-transform-dotall-regex": "^7.16.5", + "@babel/plugin-transform-duplicate-keys": "^7.16.5", + "@babel/plugin-transform-exponentiation-operator": "^7.16.5", + "@babel/plugin-transform-for-of": "^7.16.5", + "@babel/plugin-transform-function-name": "^7.16.5", + "@babel/plugin-transform-literals": "^7.16.5", + "@babel/plugin-transform-member-expression-literals": "^7.16.5", + "@babel/plugin-transform-modules-amd": "^7.16.5", + "@babel/plugin-transform-modules-commonjs": "^7.16.5", + "@babel/plugin-transform-modules-systemjs": "^7.16.5", + "@babel/plugin-transform-modules-umd": "^7.16.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.5", + "@babel/plugin-transform-new-target": "^7.16.5", + "@babel/plugin-transform-object-super": "^7.16.5", + "@babel/plugin-transform-parameters": "^7.16.5", + "@babel/plugin-transform-property-literals": "^7.16.5", + "@babel/plugin-transform-regenerator": "^7.16.5", + "@babel/plugin-transform-reserved-words": "^7.16.5", + "@babel/plugin-transform-shorthand-properties": "^7.16.5", + "@babel/plugin-transform-spread": "^7.16.5", + "@babel/plugin-transform-sticky-regex": "^7.16.5", + "@babel/plugin-transform-template-literals": "^7.16.5", + "@babel/plugin-transform-typeof-symbol": "^7.16.5", + "@babel/plugin-transform-unicode-escapes": "^7.16.5", + "@babel/plugin-transform-unicode-regex": "^7.16.5", "@babel/preset-modules": "^0.1.5", "@babel/types": "^7.16.0", "babel-plugin-polyfill-corejs2": "^0.3.0", @@ -56971,32 +56997,32 @@ } }, "@babel/preset-react": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.16.0.tgz", - "integrity": "sha512-d31IFW2bLRB28uL1WoElyro8RH5l6531XfxMtCeCmp6RVAF1uTfxxUA0LH1tXl+psZdwfmIbwoG4U5VwgbhtLw==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.16.5.tgz", + "integrity": "sha512-3kzUOQeaxY/2vhPDS7CX/KGEGu/1bOYGvdRDJ2U5yjEz5o5jmIeTPLoiQBPGjfhPascLuW5OlMiPzwOOuB6txg==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.5", "@babel/helper-validator-option": "^7.14.5", - "@babel/plugin-transform-react-display-name": "^7.16.0", - "@babel/plugin-transform-react-jsx": "^7.16.0", - "@babel/plugin-transform-react-jsx-development": "^7.16.0", - "@babel/plugin-transform-react-pure-annotations": "^7.16.0" + "@babel/plugin-transform-react-display-name": "^7.16.5", + "@babel/plugin-transform-react-jsx": "^7.16.5", + "@babel/plugin-transform-react-jsx-development": "^7.16.5", + "@babel/plugin-transform-react-pure-annotations": "^7.16.5" } }, "@babel/preset-typescript": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.16.0.tgz", - "integrity": "sha512-txegdrZYgO9DlPbv+9QOVpMnKbOtezsLHWsnsRF4AjbSIsVaujrq1qg8HK0mxQpWv0jnejt0yEoW1uWpvbrDTg==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.16.5.tgz", + "integrity": "sha512-lmAWRoJ9iOSvs3DqOndQpj8XqXkzaiQs50VG/zESiI9D3eoZhGriU675xNCr0UwvsuXrhMAGvyk1w+EVWF3u8Q==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.5", "@babel/helper-validator-option": "^7.14.5", - "@babel/plugin-transform-typescript": "^7.16.0" + "@babel/plugin-transform-typescript": "^7.16.1" } }, "@babel/register": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.16.0.tgz", - "integrity": "sha512-lzl4yfs0zVXnooeLE0AAfYaT7F3SPA8yB2Bj4W1BiZwLbMS3MZH35ZvCWSRHvneUugwuM+Wsnrj7h0F7UmU3NQ==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.16.5.tgz", + "integrity": "sha512-NpluD+cToBiZiDsG3y9rtIcqDyivsahpaM9csfyfiq1qQWduSmihUZ+ruIqqSDGjZKZMJfgAElo9x2YWlOQuRw==", "dev": true, "requires": { "clone-deep": "^4.0.1", @@ -57024,9 +57050,9 @@ } }, "@babel/standalone": { - "version": "7.16.4", - "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.16.4.tgz", - "integrity": "sha512-FDRLwjeQfPm5jaHNuB+vwNyGCp24Ah3kEsbLzKmh0eSru+QCr4DmjgbRPoz71AwXLVtXU+l/i7MlVlIj5XO7Gw==" + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.16.5.tgz", + "integrity": "sha512-f6eufO52OVzOF808R42AEjqzaaJuVmFn8DRpumd16Pyju7CgNw9j7gsHg8w/VDUxeikixG6KWvTyN2u1bh13qg==" }, "@babel/template": { "version": "7.16.0", @@ -57039,16 +57065,17 @@ } }, "@babel/traverse": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.3.tgz", - "integrity": "sha512-eolumr1vVMjqevCpwVO99yN/LoGL0EyHiLO5I043aYQvwOJ9eR5UsZSClHVCzfhBduMAsSzgA/6AyqPjNayJag==", + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.5.tgz", + "integrity": "sha512-FOCODAzqUMROikDYLYxl4nmwiLlu85rNqBML/A5hKRVXG2LV8d0iMqgPzdYTcIpjZEBB7D6UDU9vxRZiriASdQ==", "requires": { "@babel/code-frame": "^7.16.0", - "@babel/generator": "^7.16.0", + "@babel/generator": "^7.16.5", + "@babel/helper-environment-visitor": "^7.16.5", "@babel/helper-function-name": "^7.16.0", "@babel/helper-hoist-variables": "^7.16.0", "@babel/helper-split-export-declaration": "^7.16.0", - "@babel/parser": "^7.16.3", + "@babel/parser": "^7.16.5", "@babel/types": "^7.16.0", "debug": "^4.1.0", "globals": "^11.1.0" @@ -57665,12 +57692,12 @@ "@freecodecamp/client": { "version": "file:client", "requires": { - "@babel/plugin-proposal-export-default-from": "7.16.0", - "@babel/plugin-proposal-function-bind": "7.16.0", + "@babel/plugin-proposal-export-default-from": "7.16.5", + "@babel/plugin-proposal-function-bind": "7.16.5", "@babel/polyfill": "7.12.1", - "@babel/preset-env": "7.16.4", - "@babel/preset-react": "7.16.0", - "@babel/standalone": "7.16.4", + "@babel/preset-env": "7.16.5", + "@babel/preset-react": "7.16.5", + "@babel/standalone": "7.16.5", "@babel/types": "7.16.0", "@codesee/babel-plugin-instrument": "0.150.0", "@codesee/tracker": "0.150.0", @@ -57853,11 +57880,11 @@ "@freecodecamp/curriculum": { "version": "file:curriculum", "requires": { - "@babel/core": "7.16.0", + "@babel/core": "7.16.5", "@babel/polyfill": "7.12.1", - "@babel/preset-env": "7.16.4", - "@babel/preset-typescript": "7.16.0", - "@babel/register": "7.16.0", + "@babel/preset-env": "7.16.5", + "@babel/preset-typescript": "7.16.5", + "@babel/register": "7.16.5", "acorn": "8.5.0", "acorn-jsx": "5.3.2", "babel-plugin-dynamic-import-node": "2.3.3", @@ -58071,9 +58098,9 @@ "@freecodecamp/ui": { "version": "file:tools/ui-components", "requires": { - "@babel/core": "7.16.0", - "@babel/preset-env": "7.16.4", - "@babel/preset-typescript": "7.16.0", + "@babel/core": "7.16.5", + "@babel/preset-env": "7.16.5", + "@babel/preset-typescript": "7.16.5", "@rollup/plugin-babel": "5.3.0", "@rollup/plugin-commonjs": "19.0.2", "@rollup/plugin-node-resolve": "13.0.6", diff --git a/package.json b/package.json index 4f49be2b03..873940af82 100644 --- a/package.json +++ b/package.json @@ -101,11 +101,11 @@ "invariant": "2.2.4" }, "devDependencies": { - "@babel/eslint-parser": "7.16.3", - "@babel/plugin-proposal-function-bind": "7.16.0", - "@babel/preset-env": "7.16.4", - "@babel/preset-react": "7.16.0", - "@babel/preset-typescript": "7.16.0", + "@babel/eslint-parser": "7.16.5", + "@babel/plugin-proposal-function-bind": "7.16.5", + "@babel/preset-env": "7.16.5", + "@babel/preset-react": "7.16.5", + "@babel/preset-typescript": "7.16.5", "@testing-library/cypress": "7.0.7", "@testing-library/dom": "8.11.1", "@testing-library/jest-dom": "5.16.1", diff --git a/tools/ui-components/package.json b/tools/ui-components/package.json index 5da5c46ad5..c67ffbe7da 100644 --- a/tools/ui-components/package.json +++ b/tools/ui-components/package.json @@ -19,14 +19,14 @@ }, "homepage": "https://github.com/freeCodeCamp/freeCodeCamp#readme", "dependencies": { - "@babel/preset-typescript": "7.16.0", + "@babel/preset-typescript": "7.16.5", "react": "16.14.0", "react-dom": "16.14.0", "typescript": "4.5.3" }, "devDependencies": { - "@babel/core": "7.16.0", - "@babel/preset-env": "7.16.4", + "@babel/core": "7.16.5", + "@babel/preset-env": "7.16.5", "@rollup/plugin-babel": "5.3.0", "@rollup/plugin-commonjs": "19.0.2", "@rollup/plugin-node-resolve": "13.0.6", From 73c1ca1b4a563e9a88c4fe31b5a841138c114c35 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 14 Dec 2021 02:47:07 +0000 Subject: [PATCH 30/63] fix(deps): update dependency typescript to v4.5.4 --- client/package.json | 2 +- package-lock.json | 26 ++++++++++----------- package.json | 2 +- tools/challenge-helper-scripts/package.json | 2 +- tools/ui-components/package.json | 2 +- 5 files changed, 17 insertions(+), 17 deletions(-) diff --git a/client/package.json b/client/package.json index 1e9d60c40d..078627169e 100644 --- a/client/package.json +++ b/client/package.json @@ -123,7 +123,7 @@ "store": "2.0.12", "stream-browserify": "3.0.0", "tone": "14.7.77", - "typescript": "4.5.3", + "typescript": "4.5.4", "uuid": "8.3.2", "validator": "13.7.0" }, diff --git a/package-lock.json b/package-lock.json index 777315bda1..830f957bec 100644 --- a/package-lock.json +++ b/package-lock.json @@ -96,7 +96,7 @@ "process": "0.11.10", "shx": "0.3.3", "start-server-and-test": "1.14.0", - "typescript": "4.5.3", + "typescript": "4.5.4", "webpack-bundle-analyzer": "4.5.0" }, "engines": { @@ -291,7 +291,7 @@ "store": "2.0.12", "stream-browserify": "3.0.0", "tone": "14.7.77", - "typescript": "4.5.3", + "typescript": "4.5.4", "uuid": "8.3.2", "validator": "13.7.0" }, @@ -51823,9 +51823,9 @@ } }, "node_modules/typescript": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.3.tgz", - "integrity": "sha512-eVYaEHALSt+s9LbvgEv4Ef+Tdq7hBiIZgii12xXJnukryt3pMgJf6aKhoCZ3FWQsu6sydEnkg11fYXLzhLBjeQ==", + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.4.tgz", + "integrity": "sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -54878,7 +54878,7 @@ "inquirer": "8.2.0", "prettier": "2.5.1", "ts-node": "10.4.0", - "typescript": "4.5.3" + "typescript": "4.5.4" }, "engines": { "node": ">=16", @@ -55209,7 +55209,7 @@ "@babel/preset-typescript": "7.16.5", "react": "16.14.0", "react-dom": "16.14.0", - "typescript": "4.5.3" + "typescript": "4.5.4" }, "devDependencies": { "@babel/core": "7.16.5", @@ -57799,7 +57799,7 @@ "store": "2.0.12", "stream-browserify": "3.0.0", "tone": "14.7.77", - "typescript": "4.5.3", + "typescript": "4.5.4", "uuid": "8.3.2", "validator": "13.7.0", "webpack": "5.65.0", @@ -57934,7 +57934,7 @@ "inquirer": "8.2.0", "prettier": "2.5.1", "ts-node": "10.4.0", - "typescript": "4.5.3" + "typescript": "4.5.4" }, "dependencies": { "acorn-walk": { @@ -58128,7 +58128,7 @@ "rollup-plugin-postcss": "4.0.2", "rollup-plugin-terser": "7.0.2", "tailwindcss": "2.2.19", - "typescript": "4.5.3" + "typescript": "4.5.4" }, "dependencies": { "@jest/transform": { @@ -96035,9 +96035,9 @@ } }, "typescript": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.3.tgz", - "integrity": "sha512-eVYaEHALSt+s9LbvgEv4Ef+Tdq7hBiIZgii12xXJnukryt3pMgJf6aKhoCZ3FWQsu6sydEnkg11fYXLzhLBjeQ==" + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.4.tgz", + "integrity": "sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==" }, "typescript-compare": { "version": "0.0.2", diff --git a/package.json b/package.json index 873940af82..a70ea311c1 100644 --- a/package.json +++ b/package.json @@ -171,7 +171,7 @@ "process": "0.11.10", "shx": "0.3.3", "start-server-and-test": "1.14.0", - "typescript": "4.5.3", + "typescript": "4.5.4", "webpack-bundle-analyzer": "4.5.0" } } diff --git a/tools/challenge-helper-scripts/package.json b/tools/challenge-helper-scripts/package.json index 37d99d8281..17ec7f440b 100644 --- a/tools/challenge-helper-scripts/package.json +++ b/tools/challenge-helper-scripts/package.json @@ -29,6 +29,6 @@ "inquirer": "8.2.0", "prettier": "2.5.1", "ts-node": "10.4.0", - "typescript": "4.5.3" + "typescript": "4.5.4" } } diff --git a/tools/ui-components/package.json b/tools/ui-components/package.json index c67ffbe7da..98f5842cae 100644 --- a/tools/ui-components/package.json +++ b/tools/ui-components/package.json @@ -22,7 +22,7 @@ "@babel/preset-typescript": "7.16.5", "react": "16.14.0", "react-dom": "16.14.0", - "typescript": "4.5.3" + "typescript": "4.5.4" }, "devDependencies": { "@babel/core": "7.16.5", From 0d8145307feb394be30887972bdc4c6ca2850ba1 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 14 Dec 2021 04:51:06 +0000 Subject: [PATCH 31/63] chore(deps): update dependency @rollup/plugin-node-resolve to v13.1.1 --- package-lock.json | 16 ++++++++-------- tools/ui-components/package.json | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index 830f957bec..ea17484cb6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5208,9 +5208,9 @@ } }, "node_modules/@rollup/plugin-node-resolve": { - "version": "13.0.6", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.0.6.tgz", - "integrity": "sha512-sFsPDMPd4gMqnh2gS0uIxELnoRUp5kBl5knxD2EO0778G1oOJv4G1vyT2cpWz75OU2jDVcXhjVUuTAczGyFNKA==", + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.1.1.tgz", + "integrity": "sha512-6QKtRevXLrmEig9UiMYt2fSvee9TyltGRfw+qSs6xjUnxwjOzTOqy+/Lpxsgjb8mJn1EQNbCDAvt89O4uzL5kw==", "dev": true, "dependencies": { "@rollup/pluginutils": "^3.1.0", @@ -55216,7 +55216,7 @@ "@babel/preset-env": "7.16.5", "@rollup/plugin-babel": "5.3.0", "@rollup/plugin-commonjs": "19.0.2", - "@rollup/plugin-node-resolve": "13.0.6", + "@rollup/plugin-node-resolve": "13.1.1", "@storybook/addon-actions": "6.4.9", "@storybook/addon-docs": "6.4.9", "@storybook/addon-essentials": "6.4.9", @@ -58103,7 +58103,7 @@ "@babel/preset-typescript": "7.16.5", "@rollup/plugin-babel": "5.3.0", "@rollup/plugin-commonjs": "19.0.2", - "@rollup/plugin-node-resolve": "13.0.6", + "@rollup/plugin-node-resolve": "13.1.1", "@storybook/addon-actions": "6.4.9", "@storybook/addon-docs": "6.4.9", "@storybook/addon-essentials": "6.4.9", @@ -59943,9 +59943,9 @@ } }, "@rollup/plugin-node-resolve": { - "version": "13.0.6", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.0.6.tgz", - "integrity": "sha512-sFsPDMPd4gMqnh2gS0uIxELnoRUp5kBl5knxD2EO0778G1oOJv4G1vyT2cpWz75OU2jDVcXhjVUuTAczGyFNKA==", + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.1.1.tgz", + "integrity": "sha512-6QKtRevXLrmEig9UiMYt2fSvee9TyltGRfw+qSs6xjUnxwjOzTOqy+/Lpxsgjb8mJn1EQNbCDAvt89O4uzL5kw==", "dev": true, "requires": { "@rollup/pluginutils": "^3.1.0", diff --git a/tools/ui-components/package.json b/tools/ui-components/package.json index 98f5842cae..1547f92df2 100644 --- a/tools/ui-components/package.json +++ b/tools/ui-components/package.json @@ -29,7 +29,7 @@ "@babel/preset-env": "7.16.5", "@rollup/plugin-babel": "5.3.0", "@rollup/plugin-commonjs": "19.0.2", - "@rollup/plugin-node-resolve": "13.0.6", + "@rollup/plugin-node-resolve": "13.1.1", "@storybook/addon-actions": "6.4.9", "@storybook/addon-docs": "6.4.9", "@storybook/addon-essentials": "6.4.9", From 6819cf5e1b5b348f20d284af0a1c9910dfeeb3f3 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 14 Dec 2021 08:38:09 +0000 Subject: [PATCH 32/63] chore(deps): update typescript-eslint monorepo to v5.7.0 --- package-lock.json | 140 +++++++++++++++++++++++----------------------- package.json | 4 +- 2 files changed, 72 insertions(+), 72 deletions(-) diff --git a/package-lock.json b/package-lock.json index ea17484cb6..ea68801777 100644 --- a/package-lock.json +++ b/package-lock.json @@ -64,8 +64,8 @@ "@types/sanitize-html": "2.6.0", "@types/store": "2.0.2", "@types/validator": "13.7.0", - "@typescript-eslint/eslint-plugin": "5.6.0", - "@typescript-eslint/parser": "5.6.0", + "@typescript-eslint/eslint-plugin": "5.7.0", + "@typescript-eslint/parser": "5.7.0", "babel-eslint": "10.1.0", "babel-plugin-transform-imports": "2.0.0", "cross-env": "7.0.3", @@ -15395,13 +15395,13 @@ "integrity": "sha512-S9q47ByT2pPvD65IvrWp7qppVMpk9WGMbVq9wbWZOHg6tnXSD4vyhao6nOSBwwfDdV2p3Kx9evA9vI+XWTfDvw==" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.6.0.tgz", - "integrity": "sha512-MIbeMy5qfLqtgs1hWd088k1hOuRsN9JrHUPwVVKCD99EOUqScd7SrwoZl4Gso05EAP9w1kvLWUVGJOVpRPkDPA==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.7.0.tgz", + "integrity": "sha512-8RTGBpNn5a9M628wBPrCbJ+v3YTEOE2qeZb7TDkGKTDXSj36KGRg92SpFFaR/0S3rSXQxM0Og/kV9EyadsYSBg==", "dev": true, "dependencies": { - "@typescript-eslint/experimental-utils": "5.6.0", - "@typescript-eslint/scope-manager": "5.6.0", + "@typescript-eslint/experimental-utils": "5.7.0", + "@typescript-eslint/scope-manager": "5.7.0", "debug": "^4.3.2", "functional-red-black-tree": "^1.0.1", "ignore": "^5.1.8", @@ -15483,15 +15483,15 @@ "dev": true }, "node_modules/@typescript-eslint/experimental-utils": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.6.0.tgz", - "integrity": "sha512-VDoRf3Qj7+W3sS/ZBXZh3LBzp0snDLEgvp6qj0vOAIiAPM07bd5ojQ3CTzF/QFl5AKh7Bh1ycgj6lFBJHUt/DA==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.7.0.tgz", + "integrity": "sha512-u57eZ5FbEpzN5kSjmVrSesovWslH2ZyNPnaXQMXWgH57d5+EVHEt76W75vVuI9qKZ5BMDKNfRN+pxcPEjQjb2A==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.6.0", - "@typescript-eslint/types": "5.6.0", - "@typescript-eslint/typescript-estree": "5.6.0", + "@typescript-eslint/scope-manager": "5.7.0", + "@typescript-eslint/types": "5.7.0", + "@typescript-eslint/typescript-estree": "5.7.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" }, @@ -15507,14 +15507,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.6.0.tgz", - "integrity": "sha512-YVK49NgdUPQ8SpCZaOpiq1kLkYRPMv9U5gcMrywzI8brtwZjr/tG3sZpuHyODt76W/A0SufNjYt9ZOgrC4tLIQ==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.7.0.tgz", + "integrity": "sha512-m/gWCCcS4jXw6vkrPQ1BjZ1vomP01PArgzvauBqzsoZ3urLbsRChexB8/YV8z9HwE3qlJM35FxfKZ1nfP/4x8g==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.6.0", - "@typescript-eslint/types": "5.6.0", - "@typescript-eslint/typescript-estree": "5.6.0", + "@typescript-eslint/scope-manager": "5.7.0", + "@typescript-eslint/types": "5.7.0", + "@typescript-eslint/typescript-estree": "5.7.0", "debug": "^4.3.2" }, "engines": { @@ -15557,13 +15557,13 @@ "dev": true }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.6.0.tgz", - "integrity": "sha512-1U1G77Hw2jsGWVsO2w6eVCbOg0HZ5WxL/cozVSTfqnL/eB9muhb8THsP0G3w+BB5xAHv9KptwdfYFAUfzcIh4A==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.7.0.tgz", + "integrity": "sha512-7mxR520DGq5F7sSSgM0HSSMJ+TFUymOeFRMfUfGFAVBv8BR+Jv1vHgAouYUvWRZeszVBJlLcc9fDdktxb5kmxA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.6.0", - "@typescript-eslint/visitor-keys": "5.6.0" + "@typescript-eslint/types": "5.7.0", + "@typescript-eslint/visitor-keys": "5.7.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -15574,9 +15574,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.6.0.tgz", - "integrity": "sha512-OIZffked7mXv4mXzWU5MgAEbCf9ecNJBKi+Si6/I9PpTaj+cf2x58h2oHW5/P/yTnPkKaayfjhLvx+crnl5ubA==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.7.0.tgz", + "integrity": "sha512-5AeYIF5p2kAneIpnLFve8g50VyAjq7udM7ApZZ9JYjdPjkz0LvODfuSHIDUVnIuUoxafoWzpFyU7Sqbxgi79mA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -15587,13 +15587,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.6.0.tgz", - "integrity": "sha512-92vK5tQaE81rK7fOmuWMrSQtK1IMonESR+RJR2Tlc7w4o0MeEdjgidY/uO2Gobh7z4Q1hhS94Cr7r021fMVEeA==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.7.0.tgz", + "integrity": "sha512-aO1Ql+izMrTnPj5aFFlEJkpD4jRqC4Gwhygu2oHK2wfVQpmOPbyDSveJ+r/NQo+PWV43M6uEAeLVbTi09dFLhg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.6.0", - "@typescript-eslint/visitor-keys": "5.6.0", + "@typescript-eslint/types": "5.7.0", + "@typescript-eslint/visitor-keys": "5.7.0", "debug": "^4.3.2", "globby": "^11.0.4", "is-glob": "^4.0.3", @@ -15670,12 +15670,12 @@ "dev": true }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.6.0.tgz", - "integrity": "sha512-1p7hDp5cpRFUyE3+lvA74egs+RWSgumrBpzBCDzfTFv0aQ7lIeay80yU0hIxgAhwQ6PcasW35kaOCyDOv6O/Ng==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.7.0.tgz", + "integrity": "sha512-hdohahZ4lTFcglZSJ3DGdzxQHBSxsLVqHzkiOmKi7xVAWC4y2c1bIMKmPJSrA4aOEoRUPOKQ87Y/taC7yVHpFg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.6.0", + "@typescript-eslint/types": "5.7.0", "eslint-visitor-keys": "^3.0.0" }, "engines": { @@ -67844,13 +67844,13 @@ "integrity": "sha512-S9q47ByT2pPvD65IvrWp7qppVMpk9WGMbVq9wbWZOHg6tnXSD4vyhao6nOSBwwfDdV2p3Kx9evA9vI+XWTfDvw==" }, "@typescript-eslint/eslint-plugin": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.6.0.tgz", - "integrity": "sha512-MIbeMy5qfLqtgs1hWd088k1hOuRsN9JrHUPwVVKCD99EOUqScd7SrwoZl4Gso05EAP9w1kvLWUVGJOVpRPkDPA==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.7.0.tgz", + "integrity": "sha512-8RTGBpNn5a9M628wBPrCbJ+v3YTEOE2qeZb7TDkGKTDXSj36KGRg92SpFFaR/0S3rSXQxM0Og/kV9EyadsYSBg==", "dev": true, "requires": { - "@typescript-eslint/experimental-utils": "5.6.0", - "@typescript-eslint/scope-manager": "5.6.0", + "@typescript-eslint/experimental-utils": "5.7.0", + "@typescript-eslint/scope-manager": "5.7.0", "debug": "^4.3.2", "functional-red-black-tree": "^1.0.1", "ignore": "^5.1.8", @@ -67901,28 +67901,28 @@ } }, "@typescript-eslint/experimental-utils": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.6.0.tgz", - "integrity": "sha512-VDoRf3Qj7+W3sS/ZBXZh3LBzp0snDLEgvp6qj0vOAIiAPM07bd5ojQ3CTzF/QFl5AKh7Bh1ycgj6lFBJHUt/DA==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.7.0.tgz", + "integrity": "sha512-u57eZ5FbEpzN5kSjmVrSesovWslH2ZyNPnaXQMXWgH57d5+EVHEt76W75vVuI9qKZ5BMDKNfRN+pxcPEjQjb2A==", "dev": true, "requires": { "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.6.0", - "@typescript-eslint/types": "5.6.0", - "@typescript-eslint/typescript-estree": "5.6.0", + "@typescript-eslint/scope-manager": "5.7.0", + "@typescript-eslint/types": "5.7.0", + "@typescript-eslint/typescript-estree": "5.7.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" } }, "@typescript-eslint/parser": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.6.0.tgz", - "integrity": "sha512-YVK49NgdUPQ8SpCZaOpiq1kLkYRPMv9U5gcMrywzI8brtwZjr/tG3sZpuHyODt76W/A0SufNjYt9ZOgrC4tLIQ==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.7.0.tgz", + "integrity": "sha512-m/gWCCcS4jXw6vkrPQ1BjZ1vomP01PArgzvauBqzsoZ3urLbsRChexB8/YV8z9HwE3qlJM35FxfKZ1nfP/4x8g==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.6.0", - "@typescript-eslint/types": "5.6.0", - "@typescript-eslint/typescript-estree": "5.6.0", + "@typescript-eslint/scope-manager": "5.7.0", + "@typescript-eslint/types": "5.7.0", + "@typescript-eslint/typescript-estree": "5.7.0", "debug": "^4.3.2" }, "dependencies": { @@ -67944,29 +67944,29 @@ } }, "@typescript-eslint/scope-manager": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.6.0.tgz", - "integrity": "sha512-1U1G77Hw2jsGWVsO2w6eVCbOg0HZ5WxL/cozVSTfqnL/eB9muhb8THsP0G3w+BB5xAHv9KptwdfYFAUfzcIh4A==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.7.0.tgz", + "integrity": "sha512-7mxR520DGq5F7sSSgM0HSSMJ+TFUymOeFRMfUfGFAVBv8BR+Jv1vHgAouYUvWRZeszVBJlLcc9fDdktxb5kmxA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.6.0", - "@typescript-eslint/visitor-keys": "5.6.0" + "@typescript-eslint/types": "5.7.0", + "@typescript-eslint/visitor-keys": "5.7.0" } }, "@typescript-eslint/types": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.6.0.tgz", - "integrity": "sha512-OIZffked7mXv4mXzWU5MgAEbCf9ecNJBKi+Si6/I9PpTaj+cf2x58h2oHW5/P/yTnPkKaayfjhLvx+crnl5ubA==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.7.0.tgz", + "integrity": "sha512-5AeYIF5p2kAneIpnLFve8g50VyAjq7udM7ApZZ9JYjdPjkz0LvODfuSHIDUVnIuUoxafoWzpFyU7Sqbxgi79mA==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.6.0.tgz", - "integrity": "sha512-92vK5tQaE81rK7fOmuWMrSQtK1IMonESR+RJR2Tlc7w4o0MeEdjgidY/uO2Gobh7z4Q1hhS94Cr7r021fMVEeA==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.7.0.tgz", + "integrity": "sha512-aO1Ql+izMrTnPj5aFFlEJkpD4jRqC4Gwhygu2oHK2wfVQpmOPbyDSveJ+r/NQo+PWV43M6uEAeLVbTi09dFLhg==", "dev": true, "requires": { - "@typescript-eslint/types": "5.6.0", - "@typescript-eslint/visitor-keys": "5.6.0", + "@typescript-eslint/types": "5.7.0", + "@typescript-eslint/visitor-keys": "5.7.0", "debug": "^4.3.2", "globby": "^11.0.4", "is-glob": "^4.0.3", @@ -68016,12 +68016,12 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.6.0.tgz", - "integrity": "sha512-1p7hDp5cpRFUyE3+lvA74egs+RWSgumrBpzBCDzfTFv0aQ7lIeay80yU0hIxgAhwQ6PcasW35kaOCyDOv6O/Ng==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.7.0.tgz", + "integrity": "sha512-hdohahZ4lTFcglZSJ3DGdzxQHBSxsLVqHzkiOmKi7xVAWC4y2c1bIMKmPJSrA4aOEoRUPOKQ87Y/taC7yVHpFg==", "dev": true, "requires": { - "@typescript-eslint/types": "5.6.0", + "@typescript-eslint/types": "5.7.0", "eslint-visitor-keys": "^3.0.0" }, "dependencies": { diff --git a/package.json b/package.json index a70ea311c1..bb89f51de5 100644 --- a/package.json +++ b/package.json @@ -139,8 +139,8 @@ "@types/sanitize-html": "2.6.0", "@types/store": "2.0.2", "@types/validator": "13.7.0", - "@typescript-eslint/eslint-plugin": "5.6.0", - "@typescript-eslint/parser": "5.6.0", + "@typescript-eslint/eslint-plugin": "5.7.0", + "@typescript-eslint/parser": "5.7.0", "babel-eslint": "10.1.0", "babel-plugin-transform-imports": "2.0.0", "cross-env": "7.0.3", From 34f19bd698724a75ef71b96fa9619e87060ce999 Mon Sep 17 00:00:00 2001 From: sidemt Date: Tue, 14 Dec 2021 23:42:57 +0900 Subject: [PATCH 33/63] fix(i18n): include period in translatable string (#44474) * fix: include period in translatable string * chore: update snapshot * fix: combine 2 strings into 1 * fix: add placeholder * fix: update snapshot Co-authored-by: Mrugesh Mohapatra --- client/i18n/locales/english/translations.json | 3 +-- .../Footer/__snapshots__/footer.test.tsx.snap | 5 ++--- client/src/components/Footer/index.tsx | 14 ++++++++------ 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/client/i18n/locales/english/translations.json b/client/i18n/locales/english/translations.json index 373bc45cf3..3a0bbc5ff3 100644 --- a/client/i18n/locales/english/translations.json +++ b/client/i18n/locales/english/translations.json @@ -216,8 +216,7 @@ "tax-exempt-status": "freeCodeCamp is a donor-supported tax-exempt 501(c)(3) nonprofit organization (United States Federal Tax Identification Number: 82-0779546)", "mission-statement": "Our mission: to help people learn to code for free. We accomplish this by creating thousands of videos, articles, and interactive coding lessons - all freely available to the public. We also have thousands of freeCodeCamp study groups around the world.", "donation-initiatives": "Donations to freeCodeCamp go toward our education initiatives, and help pay for servers, services, and staff.", - "donate-text": "You can", - "donate-link": "make a tax-deductible donation here", + "donate-text": "You can <1>make a tax-deductible donation here.", "trending-guides": "Trending Guides", "our-nonprofit": "Our Nonprofit", "links": { diff --git a/client/src/components/Footer/__snapshots__/footer.test.tsx.snap b/client/src/components/Footer/__snapshots__/footer.test.tsx.snap index affa2e18d4..526ecff419 100644 --- a/client/src/components/Footer/__snapshots__/footer.test.tsx.snap +++ b/client/src/components/Footer/__snapshots__/footer.test.tsx.snap @@ -25,13 +25,12 @@ exports[`