diff --git a/Makefile b/Makefile index 5d6f10a670..b0d0cae330 100644 --- a/Makefile +++ b/Makefile @@ -7,14 +7,14 @@ i18n = ./src/i18n transifex_input = $(i18n)/transifex_input.json # This directory must match .babelrc . -transifex_temp = ./temp/babel-plugin-react-intl +transifex_temp = ./temp/babel-plugin-formatjs precommit: npm run lint npm audit requirements: - npm install + npm ci i18n.extract: # Pulling display strings from .jsx files into .json files... diff --git a/README.rst b/README.rst index 52fc2faa29..20f8d50c10 100644 --- a/README.rst +++ b/README.rst @@ -1,12 +1,12 @@ -|Build Status| |ci-badge| |Codecov| |semantic-release| - +################## frontend-app-authn -==================== +################## -Please tag **@openedx/vanguards** on any PRs or issues. Thanks! +|Build Status| |ci-badge| |Codecov| |semantic-release| -Introduction ------------- +******** +Purpose +******** This is a micro-frontend application responsible for the login, registration and password reset functionality. @@ -22,9 +22,12 @@ This is a micro-frontend application responsible for the login, registration and - Progressive profiling page +*************** +Getting Started +*************** Installation ------------- +============ This MFE is bundled with `Devstack `_, see the `Getting Started `_ section for setup instructions. @@ -46,7 +49,7 @@ This MFE is bundled with `Devstack `_, see **Note:** Follow `Enable social auth locally `_ for enabling Social Sign-on Buttons (SSO) locally Environment Variables/Setup Notes ---------------------------------- +================================= This MFE is configured via environment variables supplied at build time. All micro-frontends have a shared set of required environment variables, as documented in the Open edX Developer Guide under `Required Environment Variables `__. @@ -114,7 +117,7 @@ The authentication micro-frontend also requires the following additional variabl edX-specific Environment Variables -********************************** +================================== Furthermore, there are several edX-specific environment variables that enable integrations with closed-source services private to the edX organization, and might be unsupported in Open edX. @@ -138,7 +141,8 @@ For more information see the document: `Micro-frontend applications in Open edX `__. How To Contribute ------------- +================= + Contributions are very welcome, and strongly encouraged! We've put together `some documentation that describes our contribution process `_. @@ -149,34 +153,58 @@ can find it it at `PULL_REQUEST_TEMPLATE.md `_. People ------- +====== The assigned maintainers for this component and other project details may be found in `Backstage `_. Backstage pulls this data from the ``catalog-info.yaml`` file in this repo. Reporting Security Issues -------------------------- +========================= -Please do not report security issues in public. Please email security@edx.org. +Please do not report security issues in public. Please email security@openedx.org. Known Issues ------------- +============ None License -------- +======= The code in this repository is licensed under the GNU Affero General Public License v3.0, unless otherwise noted. Please see `LICENSE `_ for details. + ============================== .. |Build Status| image:: https://api.travis-ci.com/edx/frontend-app-authn.svg?branch=master diff --git a/package-lock.json b/package-lock.json index 4dfba3bd4d..d4361912e8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,8 +9,8 @@ "version": "0.1.0", "license": "AGPL-3.0", "dependencies": { - "@edx/brand": "npm:@edx/brand-openedx@1.2.0", - "@edx/frontend-platform": "^5.0.0", + "@edx/brand": "npm:@openedx/brand-openedx@^1.2.2", + "@edx/frontend-platform": "^5.5.4", "@edx/paragon": "20.46.2", "@fortawesome/fontawesome-svg-core": "6.4.2", "@fortawesome/free-brands-svg-icons": "6.4.2", @@ -48,7 +48,7 @@ }, "devDependencies": { "@edx/browserslist-config": "^1.1.1", - "@edx/frontend-build": "12.9.8", + "@edx/frontend-build": "13.0.1", "@edx/reactifex": "1.1.0", "@wojtekmaj/enzyme-adapter-react-17": "^0.8.0", "babel-plugin-formatjs": "10.5.3", @@ -230,20 +230,21 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", - "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "dependencies": { - "@babel/highlight": "^7.22.5" + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.6.tgz", - "integrity": "sha512-29tfsWTq2Ftu7MXmimyC0C5FDZv5DYxOZkh3XD3+QW4V/BYuv/LyEsjj3c0hqedEaDt6DBfDvexMKU8YevdqFg==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.20.tgz", + "integrity": "sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw==", "engines": { "node": ">=6.9.0" } @@ -320,48 +321,45 @@ } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.5.tgz", - "integrity": "sha512-m1EP3lVOPptR+2DwD125gziZNcmoNSHGmJROKoy87loWUQyJaVXDgpmruWqDARZSmtYQ+Dl25okU8+qhVzuykw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", + "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.6.tgz", - "integrity": "sha512-534sYEqWD9VfUm3IPn2SLcH4Q3P86XL+QvqdC7ZsFrzyyPF3T4XGiVghF6PTYNdWg6pXuoqXxNQAhbYeEInTzA==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", + "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", "dependencies": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-validator-option": "^7.22.5", - "@nicolo-ribaudo/semver-v6": "^6.3.3", + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.15", "browserslist": "^4.21.9", - "lru-cache": "^5.1.1" + "lru-cache": "^5.1.1", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.5.tgz", - "integrity": "sha512-xkb58MyOYIslxu3gKmVXmjTtUPvBU4odYzbiIQbWwLKIHCsx6UGZGX6F1IznMFVnDdirseUZopzN+ZRt8Xb33Q==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz", + "integrity": "sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-environment-visitor": "^7.22.5", "@babel/helper-function-name": "^7.22.5", - "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.15", "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.5", - "semver": "^6.3.0" + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -371,13 +369,13 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.5.tgz", - "integrity": "sha512-1VpEFOIbMRaXyDeUwUfmTIxExLwQ+zkW+Bh5zXpApA3oQedBx9v/updixWxnx/bZpKw7u8VxWjb/qWpIcmPq8A==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", + "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "regexpu-core": "^5.3.1", - "semver": "^6.3.0" + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -387,9 +385,9 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.1.tgz", - "integrity": "sha512-kX4oXixDxG197yhX+J3Wp+NpL2wuCFjWQAr6yX2jtCnflK9ulMI51ULFGIrWiX1jGfvAxdHp+XQCcP2bZGPs9A==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.2.tgz", + "integrity": "sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw==", "dependencies": { "@babel/helper-compilation-targets": "^7.22.6", "@babel/helper-plugin-utils": "^7.22.5", @@ -398,13 +396,13 @@ "resolve": "^1.14.2" }, "peerDependencies": { - "@babel/core": "^7.4.0-0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", - "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "engines": { "node": ">=6.9.0" } @@ -433,43 +431,43 @@ } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz", - "integrity": "sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", + "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", - "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz", - "integrity": "sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz", + "integrity": "sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-optimise-call-expression": { @@ -492,14 +490,13 @@ } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.5.tgz", - "integrity": "sha512-cU0Sq1Rf4Z55fgz7haOakIyM7+x/uCFwXpLPaeRzfoUtAEAuUZjZvFPjL/rk5rW693dIgn2hng1W7xbT7lWT4g==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", + "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-wrap-function": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-wrap-function": "^7.22.20" }, "engines": { "node": ">=6.9.0" @@ -509,19 +506,19 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.5.tgz", - "integrity": "sha512-aLdNM5I3kdI/V9xGNyKSF3X/gTyMUBohTZ+/3QdQKAA9vxIiy12E+8E2HoOP1/DjeqU+g6as35QHJNMDDYpuCg==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", + "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-member-expression-to-functions": "^7.22.5", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-optimise-call-expression": "^7.22.5" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-simple-access": { @@ -547,9 +544,9 @@ } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.5.tgz", - "integrity": "sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dependencies": { "@babel/types": "^7.22.5" }, @@ -566,30 +563,29 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", - "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", - "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", + "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.5.tgz", - "integrity": "sha512-bYqLIBSEshYcYQyfks8ewYA8S30yaGSeRslcvKMvoUk6HHPySbxHq9YRi6ghhzEU+yhQv9bP/jXnygkStOcqZw==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", + "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", "dependencies": { "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/template": "^7.22.15", + "@babel/types": "^7.22.19" }, "engines": { "node": ">=6.9.0" @@ -609,12 +605,12 @@ } }, "node_modules/@babel/highlight": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", - "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", "dependencies": { - "@babel/helper-validator-identifier": "^7.22.5", - "chalk": "^2.0.0", + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, "engines": { @@ -622,9 +618,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.5.tgz", - "integrity": "sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", "bin": { "parser": "bin/babel-parser.js" }, @@ -633,9 +629,9 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.5.tgz", - "integrity": "sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.15.tgz", + "integrity": "sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg==", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -647,13 +643,13 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.5.tgz", - "integrity": "sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.15.tgz", + "integrity": "sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ==", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.22.5" + "@babel/plugin-transform-optional-chaining": "^7.22.15" }, "engines": { "node": ">=6.9.0" @@ -710,6 +706,7 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-unicode-property-regex instead.", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -992,13 +989,13 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.22.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.7.tgz", - "integrity": "sha512-7HmE7pk/Fmke45TODvxvkxRMV9RazV+ZZzhOL9AG8G29TLrr3jkjwF7uJfxZ30EoXpO+LJkq4oA8NjO2DTnEDg==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.15.tgz", + "integrity": "sha512-jBm1Es25Y+tVoTi5rfd5t1KLmL8ogLKpXszboWOTTtGFGz2RKnQe2yn7HbZ+kb/B8N0FVSGQo874NSlOU1T4+w==", "dependencies": { "@babel/helper-environment-visitor": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.9", "@babel/plugin-syntax-async-generators": "^7.8.4" }, "engines": { @@ -1039,9 +1036,9 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.5.tgz", - "integrity": "sha512-EcACl1i5fSQ6bt+YGuU/XGCeZKStLmyVGytWkpyhCLeQVA0eu6Wtiw92V+I1T/hnezUv7j74dA/Ro69gWcU+hg==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.0.tgz", + "integrity": "sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g==", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -1068,11 +1065,11 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.5.tgz", - "integrity": "sha512-SPToJ5eYZLxlnp1UzdARpOGeC2GbHvr9d/UV0EukuVx8atktg194oe+C5BqQ8jRTkgLRVOPYeXRSBg1IlMoVRA==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.11.tgz", + "integrity": "sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.11", "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-class-static-block": "^7.14.5" }, @@ -1084,18 +1081,18 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.5.tgz", - "integrity": "sha512-2edQhLfibpWpsVBx2n/GKOz6JdGQvLruZQfGr9l1qes2KQaWswjBzhQF7UDUZMNaMMQeYnQzxwOMPsbYF7wqPQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.15.tgz", + "integrity": "sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.15", "@babel/helper-environment-visitor": "^7.22.5", "@babel/helper-function-name": "^7.22.5", "@babel/helper-optimise-call-expression": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-split-export-declaration": "^7.22.6", "globals": "^11.1.0" }, "engines": { @@ -1121,9 +1118,9 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.5.tgz", - "integrity": "sha512-GfqcFuGW8vnEqTUBM7UtPd5A4q797LTvvwKxXTgRsFjoqaJiEg9deBG6kWeQYkVEL569NpnmpC0Pkr/8BLKGnQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.0.tgz", + "integrity": "sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg==", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -1164,9 +1161,9 @@ } }, "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.5.tgz", - "integrity": "sha512-0MC3ppTB1AMxd8fXjSrbPa7LT9hrImt+/fcj+Pg5YMD7UQyWp/02+JWpdnCymmsXwIx5Z+sYn1bwCn4ZJNvhqQ==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz", + "integrity": "sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3" @@ -1194,9 +1191,9 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.5.tgz", - "integrity": "sha512-X4hhm7FRnPgd4nDA4b/5V280xCx6oL7Oob5+9qVS5C13Zq4bh1qq7LU0GgRU6b5dBWBvhGaXYVB4AcN6+ol6vg==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.11.tgz", + "integrity": "sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" @@ -1209,9 +1206,9 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.5.tgz", - "integrity": "sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.15.tgz", + "integrity": "sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA==", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -1239,9 +1236,9 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.5.tgz", - "integrity": "sha512-DuCRB7fu8MyTLbEQd1ew3R85nx/88yMoqo2uPSjevMj3yoN7CDM8jkgrY0wmVxfJZyJ/B9fE1iq7EQppWQmR5A==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.11.tgz", + "integrity": "sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-json-strings": "^7.8.3" @@ -1268,9 +1265,9 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.5.tgz", - "integrity": "sha512-MQQOUW1KL8X0cDWfbwYP+TbVbZm16QmQXJQ+vndPtH/BoO0lOKpVoEDMI7+PskYxH+IiE0tS8xZye0qr1lGzSA==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz", + "integrity": "sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" @@ -1297,11 +1294,11 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz", - "integrity": "sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.0.tgz", + "integrity": "sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw==", "dependencies": { - "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.0", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { @@ -1312,11 +1309,11 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz", - "integrity": "sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.0.tgz", + "integrity": "sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ==", "dependencies": { - "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.0", "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-simple-access": "^7.22.5" }, @@ -1328,14 +1325,14 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.5.tgz", - "integrity": "sha512-emtEpoaTMsOs6Tzz+nbmcePl6AKVtS1yC4YNAeMun9U8YCsgadPNxnOPQ8GhHFB2qdx+LZu9LgoC0Lthuu05DQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.0.tgz", + "integrity": "sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg==", "dependencies": { "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.0", "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5" + "@babel/helper-validator-identifier": "^7.22.20" }, "engines": { "node": ">=6.9.0" @@ -1389,9 +1386,9 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.5.tgz", - "integrity": "sha512-6CF8g6z1dNYZ/VXok5uYkkBBICHZPiGEl7oDnAx2Mt1hlHVHOSIKWJaXHjQJA5VB43KZnXZDIexMchY4y2PGdA==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz", + "integrity": "sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" @@ -1404,9 +1401,9 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.5.tgz", - "integrity": "sha512-NbslED1/6M+sXiwwtcAB/nieypGw02Ejf4KtDeMkCEpP6gWFMX1wI9WKYua+4oBneCCEmulOkRpwywypVZzs/g==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz", + "integrity": "sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-numeric-separator": "^7.10.4" @@ -1419,15 +1416,15 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.5.tgz", - "integrity": "sha512-Kk3lyDmEslH9DnvCDA1s1kkd3YWQITiBOHngOtDL9Pt6BZjzqb6hiOlb8VfjiiQJ2unmegBqZu0rx5RxJb5vmQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.15.tgz", + "integrity": "sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q==", "dependencies": { - "@babel/compat-data": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.5", + "@babel/compat-data": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.22.5" + "@babel/plugin-transform-parameters": "^7.22.15" }, "engines": { "node": ">=6.9.0" @@ -1452,9 +1449,9 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.5.tgz", - "integrity": "sha512-pH8orJahy+hzZje5b8e2QIlBWQvGpelS76C63Z+jhZKsmzfNaPQ+LaW6dcJ9bxTpo1mtXbgHwy765Ro3jftmUg==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz", + "integrity": "sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" @@ -1467,9 +1464,9 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.5.tgz", - "integrity": "sha512-AconbMKOMkyG+xCng2JogMCDcqW8wedQAqpVIL4cOSescZ7+iW8utC6YDZLMCSUIReEA733gzRSaOSXMAt/4WQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.0.tgz", + "integrity": "sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g==", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", @@ -1483,9 +1480,9 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.5.tgz", - "integrity": "sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.15.tgz", + "integrity": "sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ==", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -1512,12 +1509,12 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.5.tgz", - "integrity": "sha512-/9xnaTTJcVoBtSSmrVyhtSvO3kbqS2ODoh2juEU72c3aYonNF0OMGiaz2gjukyKM2wBBYJP38S4JiE0Wfb5VMQ==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz", + "integrity": "sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.11", "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, @@ -1571,15 +1568,15 @@ } }, "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.5.tgz", - "integrity": "sha512-rog5gZaVbUip5iWDMTYbVM15XQq+RkUKhET/IHR6oizR+JEoN6CAfTTuHcK4vwUyzca30qqHqEpzBOnaRMWYMA==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.15.tgz", + "integrity": "sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-module-imports": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-jsx": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" @@ -1618,12 +1615,12 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.5.tgz", - "integrity": "sha512-rR7KePOE7gfEtNTh9Qw+iO3Q/e4DEsoQ+hdvM6QUDH7JRJ5qxq5AA52ZzBWbI5i9lfNuvySgOGP8ZN7LAmaiPw==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz", + "integrity": "sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", - "regenerator-transform": "^0.15.1" + "regenerator-transform": "^0.15.2" }, "engines": { "node": ">=6.9.0" @@ -1718,12 +1715,12 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.5.tgz", - "integrity": "sha512-SMubA9S7Cb5sGSFFUlqxyClTA9zWJ8qGQrppNUm05LtFuN1ELRFNndkix4zUJrC9F+YivWwa1dHMSyo0e0N9dA==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.15.tgz", + "integrity": "sha512-1uirS0TnijxvQLnlv5wQBwOX3E1wCFX7ITv+9pBV2wKEk4K+M5tqDaoNXnTH8tjEIYHLO98MwiTWO04Ggz4XuA==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-typescript": "^7.22.5" }, @@ -1735,9 +1732,9 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.5.tgz", - "integrity": "sha512-biEmVg1IYB/raUO5wT1tgfacCef15Fbzhkx493D3urBI++6hpJ+RFG4SrWMn0NEZLfvilqKf3QDrRVZHo08FYg==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz", + "integrity": "sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -1887,9 +1884,9 @@ } }, "node_modules/@babel/preset-modules": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", - "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6.tgz", + "integrity": "sha512-ID2yj6K/4lKfhuU3+EX4UvNbIt7eACFbHmNUjzA+ep+B5971CknnA/9DEWKbRokfbbtblxxxXFJJrH47UEAMVg==", "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", @@ -1898,7 +1895,7 @@ "esutils": "^2.0.2" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" } }, "node_modules/@babel/preset-react": { @@ -1921,15 +1918,15 @@ } }, "node_modules/@babel/preset-typescript": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.22.5.tgz", - "integrity": "sha512-YbPaal9LxztSGhmndR46FmAbkJ/1fAsw293tSU+I5E5h+cnJ3d4GTwyUgGYmOXJYdGA+uNePle4qbaRzj2NISQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.23.0.tgz", + "integrity": "sha512-6P6VVa/NM/VlAYj5s2Aq/gdVg8FSENCg3wlZ6Qau9AcPaoF5LbN1nyGlR9DTRIw9PpxI94e+ReydsJHcjwAweg==", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", "@babel/plugin-syntax-jsx": "^7.22.5", - "@babel/plugin-transform-modules-commonjs": "^7.22.5", - "@babel/plugin-transform-typescript": "^7.22.5" + "@babel/plugin-transform-modules-commonjs": "^7.23.0", + "@babel/plugin-transform-typescript": "^7.22.15" }, "engines": { "node": ">=6.9.0" @@ -1960,13 +1957,13 @@ "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" }, "node_modules/@babel/template": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", - "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dependencies": { - "@babel/code-frame": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" @@ -1993,12 +1990,12 @@ } }, "node_modules/@babel/types": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", - "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", "dependencies": { "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, "engines": { @@ -2034,9 +2031,9 @@ } }, "node_modules/@csstools/cascade-layer-name-parser": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-1.0.4.tgz", - "integrity": "sha512-zXMGsJetbLoXe+gjEES07MEGjL0Uy3hMxmnGtVBrRpVKr5KV9OgCB09zr/vLrsEtoVQTgJFewxaU8IYSAE4tjg==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-1.0.5.tgz", + "integrity": "sha512-v/5ODKNBMfBl0us/WQjlfsvSlYxfZLhNMVIsuCPib2ulTwGKYbKJbwqw671+qH9Y4wvWVnu7LBChvml/wBKjFg==", "funding": [ { "type": "github", @@ -2051,14 +2048,14 @@ "node": "^14 || ^16 || >=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^2.3.1", - "@csstools/css-tokenizer": "^2.2.0" + "@csstools/css-parser-algorithms": "^2.3.2", + "@csstools/css-tokenizer": "^2.2.1" } }, "node_modules/@csstools/css-parser-algorithms": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.3.1.tgz", - "integrity": "sha512-xrvsmVUtefWMWQsGgFffqWSK03pZ1vfDki4IVIIUxxDKnGBzqNgv0A7SB1oXtVNEkcVO8xi1ZrTL29HhSu5kGA==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.3.2.tgz", + "integrity": "sha512-sLYGdAdEY2x7TSw9FtmdaTrh2wFtRJO5VMbBrA8tEqEod7GEggFmxTSK9XqExib3yMuYNcvcTdCZIP6ukdjAIA==", "funding": [ { "type": "github", @@ -2073,13 +2070,13 @@ "node": "^14 || ^16 || >=18" }, "peerDependencies": { - "@csstools/css-tokenizer": "^2.2.0" + "@csstools/css-tokenizer": "^2.2.1" } }, "node_modules/@csstools/css-tokenizer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.2.0.tgz", - "integrity": "sha512-wErmsWCbsmig8sQKkM6pFhr/oPha1bHfvxsUY5CYSQxwyhA9Ulrs8EqCgClhg4Tgg2XapVstGqSVcz0xOYizZA==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.2.1.tgz", + "integrity": "sha512-Zmsf2f/CaEPWEVgw29odOj+WEVoiJy9s9NOv5GgNY9mZ1CZ7394By6wONrONrTsnNDv6F9hR02nvFihrGVGHBg==", "funding": [ { "type": "github", @@ -2095,9 +2092,9 @@ } }, "node_modules/@csstools/media-query-list-parser": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.2.tgz", - "integrity": "sha512-M8cFGGwl866o6++vIY7j1AKuq9v57cf+dGepScwCcbut9ypJNr4Cj+LLTWligYUZ0uyhEoJDKt5lvyBfh2L3ZQ==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.5.tgz", + "integrity": "sha512-IxVBdYzR8pYe89JiyXQuYk4aVVoCPhMJkz6ElRwlVysjwURTsTk/bmY/z4FfeRE+CRBMlykPwXEVUg8lThv7AQ==", "funding": [ { "type": "github", @@ -2112,8 +2109,8 @@ "node": "^14 || ^16 || >=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^2.3.0", - "@csstools/css-tokenizer": "^2.1.1" + "@csstools/css-parser-algorithms": "^2.3.2", + "@csstools/css-tokenizer": "^2.2.1" } }, "node_modules/@discoveryjs/json-ext": { @@ -2125,10 +2122,10 @@ } }, "node_modules/@edx/brand": { - "name": "@edx/brand-openedx", - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@edx/brand-openedx/-/brand-openedx-1.2.0.tgz", - "integrity": "sha512-r4PDN3rCgDsLovW44ayxoNNHgG5I4Rvss6MG5CrQEX4oW8YhQVEod+jJtwR5vi0mFLN2GIaMlDpd7iIy03VqXg==" + "name": "@openedx/brand-openedx", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@openedx/brand-openedx/-/brand-openedx-1.2.2.tgz", + "integrity": "sha512-mBvxR7aB9290j9+h3d/9G8VkG1b8ecLSmlxc0vskfm7DL/fKUzFmHAj3PI7Z4kkwCQOL4QT5mJHJKC0ZFf7qvQ==" }, "node_modules/@edx/browserslist-config": { "version": "1.2.0", @@ -2150,9 +2147,9 @@ } }, "node_modules/@edx/frontend-build": { - "version": "12.9.8", - "resolved": "https://registry.npmjs.org/@edx/frontend-build/-/frontend-build-12.9.8.tgz", - "integrity": "sha512-n3VNrHsMiG18Ld9pEVgXWTccJt4wNXP4/LwxC3avAaiQvDxk+q3IZ+TPEo3LUYxam4OcpPy/eRkvvV3b909QQQ==", + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/@edx/frontend-build/-/frontend-build-13.0.1.tgz", + "integrity": "sha512-XoR2Yt9FUXKfbah0AirS5ckARc+j0jLzTRtvpsaqg4bFhPIbv0HragqoLs8Y8SQfn4sZy2v6EZ3pA09P4OBwDg==", "dependencies": { "@babel/cli": "7.22.5", "@babel/core": "7.22.5", @@ -2164,13 +2161,14 @@ "@babel/preset-react": "7.22.5", "@edx/eslint-config": "3.2.0", "@edx/new-relic-source-map-webpack-plugin": "2.1.0", + "@formatjs/cli": "^6.0.3", "@fullhuman/postcss-purgecss": "5.0.0", "@pmmmwh/react-refresh-webpack-plugin": "0.5.11", - "@svgr/webpack": "8.0.1", - "autoprefixer": "10.4.15", + "@svgr/webpack": "8.1.0", + "autoprefixer": "10.4.16", "babel-jest": "26.6.3", "babel-loader": "9.1.3", - "babel-plugin-react-intl": "7.9.4", + "babel-plugin-formatjs": "^10.4.0", "babel-plugin-transform-imports": "2.0.0", "babel-polyfill": "6.26.0", "chalk": "4.1.2", @@ -2192,21 +2190,21 @@ "image-minimizer-webpack-plugin": "3.8.3", "jest": "26.6.3", "mini-css-extract-plugin": "1.6.2", - "postcss": "8.4.27", - "postcss-custom-media": "10.0.0", + "postcss": "8.4.31", + "postcss-custom-media": "10.0.1", "postcss-loader": "7.3.3", - "postcss-rtlcss": "4.0.7", + "postcss-rtlcss": "4.0.8", "react-dev-utils": "12.0.1", "react-refresh": "0.14.0", "resolve-url-loader": "5.0.0", "sass": "1.65.1", "sass-loader": "13.3.2", - "sharp": "0.32.4", + "sharp": "0.32.6", "source-map-loader": "4.0.1", "style-loader": "3.3.3", "url-loader": "4.1.1", "webpack": "5.88.2", - "webpack-bundle-analyzer": "4.9.0", + "webpack-bundle-analyzer": "4.9.1", "webpack-cli": "5.1.4", "webpack-dev-server": "4.15.1", "webpack-merge": "5.9.0" @@ -3350,9 +3348,9 @@ } }, "node_modules/@edx/frontend-platform": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@edx/frontend-platform/-/frontend-platform-5.0.0.tgz", - "integrity": "sha512-DD9/B4rnC3BKPiWlbEFF1JIYFbWC6vUBKTyN8sf4khi4DNhhWhsobk+iNeCWNzF9UgCPRbniIqesdV1F9NXNZw==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/@edx/frontend-platform/-/frontend-platform-5.5.4.tgz", + "integrity": "sha512-Yum+oST7XfDwDnDhBnzeR/mjp6O+G0g+5AZtIJ1BdTKQH1z9FObfim/pfoiI9STiYlguVpeWMkzWuca/QMLO/Q==", "dependencies": { "@cospired/i18n-iso-languages": "4.1.0", "@formatjs/intl-pluralrules": "4.3.3", @@ -3380,7 +3378,7 @@ }, "peerDependencies": { "@edx/frontend-build": ">= 8.1.0 || ^12.9.0-alpha.1", - "@edx/paragon": ">= 10.0.0 < 21.0.0", + "@edx/paragon": ">= 10.0.0 < 22.0.0", "prop-types": "^15.7.2", "react": "^16.9.0 || ^17.0.0", "react-dom": "^16.9.0 || ^17.0.0", @@ -3627,6 +3625,25 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/@formatjs/cli": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@formatjs/cli/-/cli-6.2.0.tgz", + "integrity": "sha512-sP04UpocRHYwSovUnunAZHYvCTVbNcaLtWKnr1lETGRUnRRQqnXy/3d2Ce271ELXmNUSde2eHRdu4rv2XaVaiQ==", + "bin": { + "formatjs": "bin/formatjs" + }, + "engines": { + "node": ">= 16" + }, + "peerDependencies": { + "vue": "^3.3.4" + }, + "peerDependenciesMeta": { + "vue": { + "optional": true + } + } + }, "node_modules/@formatjs/ecma402-abstract": { "version": "1.11.4", "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.11.4.tgz", @@ -3648,7 +3665,6 @@ "version": "2.6.0", "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.6.0.tgz", "integrity": "sha512-yT6at0qc0DANw9qM/TU8RZaCtfDXtj4pZM/IC2WnVU80yAcliS3KVDiuUt4jSQAeFL9JS5bc2hARnFmjPdA6qw==", - "dev": true, "dependencies": { "@formatjs/ecma402-abstract": "1.17.0", "@formatjs/icu-skeleton-parser": "1.6.0", @@ -3659,7 +3675,6 @@ "version": "1.17.0", "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.17.0.tgz", "integrity": "sha512-6ueQTeJZtwKjmh23bdkq/DMqH4l4bmfvtQH98blOSbiXv/OUiyijSW6jU22IT8BNM1ujCaEvJfTtyCYVH38EMQ==", - "dev": true, "dependencies": { "@formatjs/intl-localematcher": "0.4.0", "tslib": "^2.4.0" @@ -3669,7 +3684,6 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.4.0.tgz", "integrity": "sha512-bRTd+rKomvfdS4QDlVJ6TA/Jx1F2h/TBVO5LjvhQ7QPPHp19oPNMIum7W2CMEReq/zPxpmCeB31F9+5gl/qtvw==", - "dev": true, "dependencies": { "tslib": "^2.4.0" } @@ -3678,7 +3692,6 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.6.0.tgz", "integrity": "sha512-eMmxNpoX/J1IPUjPGSZwo0Wh+7CEvdEMddP2Jxg1gQJXfGfht/FdW2D5XDFj3VMbOTUQlDIdZJY7uC6O6gjPoA==", - "dev": true, "dependencies": { "@formatjs/ecma402-abstract": "1.17.0", "tslib": "^2.4.0" @@ -3688,7 +3701,6 @@ "version": "1.17.0", "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.17.0.tgz", "integrity": "sha512-6ueQTeJZtwKjmh23bdkq/DMqH4l4bmfvtQH98blOSbiXv/OUiyijSW6jU22IT8BNM1ujCaEvJfTtyCYVH38EMQ==", - "dev": true, "dependencies": { "@formatjs/intl-localematcher": "0.4.0", "tslib": "^2.4.0" @@ -3698,7 +3710,6 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.4.0.tgz", "integrity": "sha512-bRTd+rKomvfdS4QDlVJ6TA/Jx1F2h/TBVO5LjvhQ7QPPHp19oPNMIum7W2CMEReq/zPxpmCeB31F9+5gl/qtvw==", - "dev": true, "dependencies": { "tslib": "^2.4.0" } @@ -3753,23 +3764,6 @@ "tslib": "^2.1.0" } }, - "node_modules/@formatjs/intl-numberformat": { - "version": "5.7.6", - "resolved": "https://registry.npmjs.org/@formatjs/intl-numberformat/-/intl-numberformat-5.7.6.tgz", - "integrity": "sha512-ZlZfYtvbVHYZY5OG3RXizoCwxKxEKOrzEe2YOw9wbzoxF3PmFn0SAgojCFGLyNXkkR6xVxlylhbuOPf1dkIVNg==", - "dependencies": { - "@formatjs/ecma402-abstract": "1.4.0", - "tslib": "^2.0.1" - } - }, - "node_modules/@formatjs/intl-numberformat/node_modules/@formatjs/ecma402-abstract": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.4.0.tgz", - "integrity": "sha512-Mv027hcLFjE45K8UJ8PjRpdDGfR0aManEFj1KzoN8zXNveHGEygpZGfFf/FTTMl+QEVSrPAUlyxaCApvmv47AQ==", - "dependencies": { - "tslib": "^2.0.1" - } - }, "node_modules/@formatjs/intl-pluralrules": { "version": "4.3.3", "resolved": "https://registry.npmjs.org/@formatjs/intl-pluralrules/-/intl-pluralrules-4.3.3.tgz", @@ -4803,14 +4797,6 @@ "eslint-scope": "5.1.1" } }, - "node_modules/@nicolo-ribaudo/semver-v6": { - "version": "6.3.3", - "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/semver-v6/-/semver-v6-6.3.3.tgz", - "integrity": "sha512-3Yc1fUTs69MG/uZbJlLSI3JISMn2UV2rg+1D/vROUqZyh3l6iYHCs7GMp+M40ZD7yOdDbYjJcU1oTJhrc+dGKg==", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -5022,9 +5008,9 @@ } }, "node_modules/@polka/url": { - "version": "1.0.0-next.21", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", - "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==" + "version": "1.0.0-next.23", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.23.tgz", + "integrity": "sha512-C16M+IYz0rgRhWZdCmK+h58JMv8vijAA61gmz2rspCSwKwzBebpdcsiUmwrtJRdphuY30i6BSLEOP8ppbNLyLg==" }, "node_modules/@popperjs/core": { "version": "2.11.8", @@ -5240,9 +5226,9 @@ } }, "node_modules/@svgr/babel-plugin-transform-react-native-svg": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.0.0.tgz", - "integrity": "sha512-UKrY3860AQICgH7g+6h2zkoxeVEPLYwX/uAjmqo4PIq2FIHppwhIqZstIyTz0ZtlwreKR41O3W3BzsBBiJV2Aw==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz", + "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==", "engines": { "node": ">=14" }, @@ -5270,9 +5256,9 @@ } }, "node_modules/@svgr/babel-preset": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.0.0.tgz", - "integrity": "sha512-KLcjiZychInVrhs86OvcYPLTFu9L5XV2vj0XAaE1HwE3J3jLmIzRY8ttdeAg/iFyp8nhavJpafpDZTt+1LIpkQ==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz", + "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==", "dependencies": { "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", @@ -5280,7 +5266,7 @@ "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", - "@svgr/babel-plugin-transform-react-native-svg": "8.0.0", + "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", "@svgr/babel-plugin-transform-svg-component": "8.0.0" }, "engines": { @@ -5295,12 +5281,12 @@ } }, "node_modules/@svgr/core": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.0.0.tgz", - "integrity": "sha512-aJKtc+Pie/rFYsVH/unSkDaZGvEeylNv/s2cP+ta9/rYWxRVvoV/S4Qw65Kmrtah4CBK5PM6ISH9qUH7IJQCng==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", + "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", "dependencies": { "@babel/core": "^7.21.3", - "@svgr/babel-preset": "8.0.0", + "@svgr/babel-preset": "8.1.0", "camelcase": "^6.2.0", "cosmiconfig": "^8.1.3", "snake-case": "^3.0.4" @@ -5330,12 +5316,12 @@ } }, "node_modules/@svgr/plugin-jsx": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.0.1.tgz", - "integrity": "sha512-bfCFb+4ZsM3UuKP2t7KmDwn6YV8qVn9HIQJmau6xeQb/iV65Rpi7NBNBWA2hcCd4GKoCqG8hpaaDk5FDR0eH+g==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz", + "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==", "dependencies": { "@babel/core": "^7.21.3", - "@svgr/babel-preset": "8.0.0", + "@svgr/babel-preset": "8.1.0", "@svgr/hast-util-to-babel-ast": "8.0.0", "svg-parser": "^2.0.4" }, @@ -5351,9 +5337,9 @@ } }, "node_modules/@svgr/plugin-svgo": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-8.0.1.tgz", - "integrity": "sha512-29OJ1QmJgnohQHDAgAuY2h21xWD6TZiXji+hnx+W635RiXTAlHTbjrZDktfqzkN0bOeQEtNe+xgq73/XeWFfSg==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-8.1.0.tgz", + "integrity": "sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==", "dependencies": { "cosmiconfig": "^8.1.3", "deepmerge": "^4.3.1", @@ -5371,18 +5357,18 @@ } }, "node_modules/@svgr/webpack": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-8.0.1.tgz", - "integrity": "sha512-zSoeKcbCmfMXjA11uDuCJb+1LWNb3vy6Qw/VHj0Nfcl3UuqwuoZWknHsBIhCWvi4wU9vPui3aq054qjVyZqY4A==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-8.1.0.tgz", + "integrity": "sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA==", "dependencies": { "@babel/core": "^7.21.3", "@babel/plugin-transform-react-constant-elements": "^7.21.3", "@babel/preset-env": "^7.20.2", "@babel/preset-react": "^7.18.6", "@babel/preset-typescript": "^7.21.0", - "@svgr/core": "8.0.0", - "@svgr/plugin-jsx": "8.0.1", - "@svgr/plugin-svgo": "8.0.1" + "@svgr/core": "8.1.0", + "@svgr/plugin-jsx": "8.1.0", + "@svgr/plugin-svgo": "8.1.0" }, "engines": { "node": ">=14" @@ -5589,7 +5575,6 @@ "version": "7.10.0", "resolved": "https://registry.npmjs.org/@types/babel__helper-plugin-utils/-/babel__helper-plugin-utils-7.10.0.tgz", "integrity": "sha512-60YtHzhQ9HAkToHVV+TB4VLzBn9lrfgrsOjiJMtbv/c1jPdekBxaByd6DMsGBzROXWoIL6U3lEFvvbu69RkUoA==", - "dev": true, "dependencies": { "@types/babel__core": "*" } @@ -5695,14 +5680,6 @@ "@types/send": "*" } }, - "node_modules/@types/fs-extra": { - "version": "9.0.13", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", - "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/glob": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", @@ -5776,8 +5753,7 @@ "node_modules/@types/json-stable-stringify": { "version": "1.0.34", "resolved": "https://registry.npmjs.org/@types/json-stable-stringify/-/json-stable-stringify-1.0.34.tgz", - "integrity": "sha512-s2cfwagOQAS8o06TcwKfr9Wx11dNGbH2E9vJz1cqV+a/LOyhWNLUNd6JSRYNzvB4d29UuJX2M0Dj9vE1T8fRXw==", - "dev": true + "integrity": "sha512-s2cfwagOQAS8o06TcwKfr9Wx11dNGbH2E9vJz1cqV+a/LOyhWNLUNd6JSRYNzvB4d29UuJX2M0Dj9vE1T8fRXw==" }, "node_modules/@types/json5": { "version": "0.0.29", @@ -5876,15 +5852,6 @@ "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==" }, - "node_modules/@types/schema-utils": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@types/schema-utils/-/schema-utils-2.4.0.tgz", - "integrity": "sha512-454hrj5gz/FXcUE20ygfEiN4DxZ1sprUo0V1gqIqkNZ/CzoEzAZEll2uxMsuyz6BYjiQan4Aa65xbTemfzW9hQ==", - "deprecated": "This is a stub types definition. schema-utils provides its own type definitions, so you do not need this installed.", - "dependencies": { - "schema-utils": "*" - } - }, "node_modules/@types/send": { "version": "0.17.1", "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", @@ -6678,9 +6645,9 @@ } }, "node_modules/autoprefixer": { - "version": "10.4.15", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.15.tgz", - "integrity": "sha512-KCuPB8ZCIqFdA4HwKXsvz7j6gvSDNhDP7WnUjBleRkKjPdvCmHFuQ77ocavI8FT6NdvlBnE2UFr2H4Mycn8Vew==", + "version": "10.4.16", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", + "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==", "funding": [ { "type": "opencollective", @@ -6697,8 +6664,8 @@ ], "dependencies": { "browserslist": "^4.21.10", - "caniuse-lite": "^1.0.30001520", - "fraction.js": "^4.2.0", + "caniuse-lite": "^1.0.30001538", + "fraction.js": "^4.3.6", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", "postcss-value-parser": "^4.2.0" @@ -6936,7 +6903,6 @@ "version": "10.5.3", "resolved": "https://registry.npmjs.org/babel-plugin-formatjs/-/babel-plugin-formatjs-10.5.3.tgz", "integrity": "sha512-PBeryWyN2HY2VUGNFPQS6+DPNQ/I9zDZ97y38i1+LzIpIyTHBePECq/ehEABE73PvvF2irFiN7TCYBrQQw5+lA==", - "dev": true, "dependencies": { "@babel/core": "^7.10.4", "@babel/helper-plugin-utils": "^7.10.4", @@ -6955,7 +6921,6 @@ "version": "3.13.3", "resolved": "https://registry.npmjs.org/@formatjs/ts-transformer/-/ts-transformer-3.13.3.tgz", "integrity": "sha512-W6+huH4dLYx8eZfZue6fcreNzLZHoPboreqJSkickYCKIOicI35zC0Txb4xCT6kau/DXAKTpNEln3V2NgX6Igg==", - "dev": true, "dependencies": { "@formatjs/icu-messageformat-parser": "2.6.0", "@types/json-stable-stringify": "^1.0.32", @@ -6977,14 +6942,12 @@ "node_modules/babel-plugin-formatjs/node_modules/@types/node": { "version": "17.0.45", "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", - "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==", - "dev": true + "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==" }, "node_modules/babel-plugin-formatjs/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -6999,7 +6962,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -7015,7 +6977,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -7026,14 +6987,12 @@ "node_modules/babel-plugin-formatjs/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/babel-plugin-formatjs/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "engines": { "node": ">=8" } @@ -7042,7 +7001,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -7081,110 +7039,39 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.4.tgz", - "integrity": "sha512-9WeK9snM1BfxB38goUEv2FLnA6ja07UMfazFHzCXUb3NyDZAwfXvQiURQ6guTTMeHcOsdknULm1PDhs4uWtKyA==", + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.5.tgz", + "integrity": "sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg==", "dependencies": { "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.4.1", - "@nicolo-ribaudo/semver-v6": "^6.3.3" + "@babel/helper-define-polyfill-provider": "^0.4.2", + "semver": "^6.3.1" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.2.tgz", - "integrity": "sha512-Cid+Jv1BrY9ReW9lIfNlNpsI53N+FN7gE+f73zLAUbr9C52W4gKLWSByx47pfDJsEysojKArqOtOKZSVIIUTuQ==", + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.4.tgz", + "integrity": "sha512-9l//BZZsPR+5XjyJMPtZSK4jv0BsTO1zDac2GC6ygx9WLGlcsnRd1Co0B2zT5fF5Ic6BZy+9m3HNZ3QcOeDKfg==", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.1", - "core-js-compat": "^3.31.0" + "@babel/helper-define-polyfill-provider": "^0.4.2", + "core-js-compat": "^3.32.2" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.1.tgz", - "integrity": "sha512-L8OyySuI6OSQ5hFy9O+7zFjyr4WhAfRjLIOkhQGYl+emwJkd/S4XXT1JpfrgR1jrQ1NcGiOh+yAdGlF8pnC3Jw==", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.1" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/babel-plugin-react-intl": { - "version": "7.9.4", - "resolved": "https://registry.npmjs.org/babel-plugin-react-intl/-/babel-plugin-react-intl-7.9.4.tgz", - "integrity": "sha512-cMKrHEXrw43yT4M89Wbgq8A8N8lffSquj1Piwov/HVukR7jwOw8gf9btXNsQhT27ccyqEwy+M286JQYy0jby2g==", - "deprecated": "this package has been renamed to babel-plugin-formatjs", - "dependencies": { - "@babel/core": "^7.9.0", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/types": "^7.9.5", - "@formatjs/ts-transformer": "^2.6.0", - "@types/babel__core": "^7.1.7", - "@types/fs-extra": "^9.0.1", - "@types/schema-utils": "^2.4.0", - "fs-extra": "^9.0.0", - "intl-messageformat-parser": "^5.3.7", - "schema-utils": "^2.6.6" - } - }, - "node_modules/babel-plugin-react-intl/node_modules/@formatjs/ecma402-abstract": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.5.0.tgz", - "integrity": "sha512-wXv36yo+mfWllweN0Fq7sUs7PUiNopn7I0JpLTe3hGu6ZMR4CV7LqK1llhB18pndwpKoafQKb1et2DCJAOW20Q==", - "dependencies": { - "tslib": "^2.0.1" - } - }, - "node_modules/babel-plugin-react-intl/node_modules/@formatjs/ts-transformer": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/@formatjs/ts-transformer/-/ts-transformer-2.13.0.tgz", - "integrity": "sha512-mu7sHXZk1NWZrQ3eUqugpSYo8x5/tXkrI4uIbFqCEC0eNgQaIcoKgVeDFgDAcgG+cEme2atAUYSFF+DFWC4org==", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.2.tgz", + "integrity": "sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA==", "dependencies": { - "intl-messageformat-parser": "6.1.2", - "tslib": "^2.0.1", - "typescript": "^4.0" + "@babel/helper-define-polyfill-provider": "^0.4.2" }, "peerDependencies": { - "ts-jest": "^26.4.0" - }, - "peerDependenciesMeta": { - "ts-jest": { - "optional": true - } - } - }, - "node_modules/babel-plugin-react-intl/node_modules/@formatjs/ts-transformer/node_modules/intl-messageformat-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/intl-messageformat-parser/-/intl-messageformat-parser-6.1.2.tgz", - "integrity": "sha512-4GQDEPhl/ZMNDKwMsLqyw1LG2IAWjmLJXdmnRcHKeLQzpgtNYZI6lVw1279pqIkRk2MfKb9aDsVFzm565azK5A==", - "deprecated": "We've written a new parser that's 6x faster and is backwards compatible. Please use @formatjs/icu-messageformat-parser", - "dependencies": { - "@formatjs/ecma402-abstract": "1.5.0", - "tslib": "^2.0.1" - } - }, - "node_modules/babel-plugin-react-intl/node_modules/schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", - "dependencies": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-transform-imports": { @@ -7503,9 +7390,9 @@ "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" }, "node_modules/browserslist": { - "version": "4.21.10", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", - "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", + "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", "funding": [ { "type": "opencollective", @@ -7521,10 +7408,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001517", - "electron-to-chromium": "^1.4.477", + "caniuse-lite": "^1.0.30001541", + "electron-to-chromium": "^1.4.535", "node-releases": "^2.0.13", - "update-browserslist-db": "^1.0.11" + "update-browserslist-db": "^1.0.13" }, "bin": { "browserslist": "cli.js" @@ -7653,9 +7540,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001520", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001520.tgz", - "integrity": "sha512-tahF5O9EiiTzwTUqAeFjIZbn4Dnqxzz7ktrgGlMYNLH43Ul26IgTMH/zvL3DG0lZxBYnlT04axvInszUsZULdA==", + "version": "1.0.30001546", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001546.tgz", + "integrity": "sha512-zvtSJwuQFpewSyRrI3AsftF6rM0X80mZkChIt1spBGEvRglCrjTniXvinc8JKRoqTwXAgvqTImaN9igfSMtUBw==", "funding": [ { "type": "opencollective", @@ -8209,11 +8096,11 @@ } }, "node_modules/core-js-compat": { - "version": "3.31.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.31.1.tgz", - "integrity": "sha512-wIDWd2s5/5aJSdpOJHfSibxNODxoGoWOBHt8JSPB41NOE94M7kuTPZCYLOlTtuoXTsBPKobpJ6T+y0SSy5L9SA==", + "version": "3.33.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.33.0.tgz", + "integrity": "sha512-0w4LcLXsVEuNkIqwjjf9rjCoPhK8uqA4tMRh4Ge26vfLtUutshn+aRJU21I9LCJlh2QQHfisNToLjw1XEJLTWw==", "dependencies": { - "browserslist": "^4.21.9" + "browserslist": "^4.22.1" }, "funding": { "type": "opencollective", @@ -9019,9 +8906,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.492", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.492.tgz", - "integrity": "sha512-36K9b/6skMVwAIEsC7GiQ8I8N3soCALVSHqWHzNDtGemAcI9Xu8hP02cywWM0A794rTHm0b0zHPeLJHtgFVamQ==" + "version": "1.4.542", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.542.tgz", + "integrity": "sha512-6+cpa00G09N3sfh2joln4VUXHquWrOFx3FLZqiVQvl45+zS9DskDBTPvob+BhvFRmTBkyDSk0vvLMMRo/qc6mQ==" }, "node_modules/email-prop-type": { "version": "3.0.1", @@ -10294,9 +10181,9 @@ "integrity": "sha512-tJ01ulDWT2WhqxMKS20nXX6wyX2iInBYpbN3GO7yjKwXMY4qvkdBRxak9IFwBLlFDESox+SwSvqMCZDfe1tqeg==" }, "node_modules/fast-fifo": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.0.tgz", - "integrity": "sha512-IgfweLvEpwyA4WgiQe9Nx6VV2QkML2NkvZnk1oKnIzXgXdWxuhF7zw4DvLTPZJn6PIUneiAXPF24QmoEqHTjyw==" + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==" }, "node_modules/fast-glob": { "version": "3.2.12", @@ -10869,15 +10756,15 @@ } }, "node_modules/fraction.js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", - "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.6.tgz", + "integrity": "sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg==", "engines": { "node": "*" }, "funding": { "type": "patreon", - "url": "https://www.patreon.com/infusion" + "url": "https://github.com/sponsors/rawify" } }, "node_modules/fragment-cache": { @@ -11894,15 +11781,6 @@ "tslib": "^2.1.0" } }, - "node_modules/intl-messageformat-parser": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/intl-messageformat-parser/-/intl-messageformat-parser-5.5.1.tgz", - "integrity": "sha512-TvB3LqF2VtP6yI6HXlRT5TxX98HKha6hCcrg9dwlPwNaedVNuQA9KgBdtWKgiyakyCTYHQ+KJeFEstNKfZr64w==", - "deprecated": "We've written a new parser that's 6x faster and is backwards compatible. Please use @formatjs/icu-messageformat-parser", - "dependencies": { - "@formatjs/intl-numberformat": "^5.5.2" - } - }, "node_modules/intl-messageformat/node_modules/@formatjs/icu-messageformat-parser": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.1.0.tgz", @@ -15425,7 +15303,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.2.tgz", "integrity": "sha512-eunSSaEnxV12z+Z73y/j5N37/In40GK4GmsSy+tEHJMxknvqnA7/djeYtAgW0GsWHUfg+847WJjKaEylk2y09g==", - "dev": true, "dependencies": { "jsonify": "^0.0.1" }, @@ -15464,7 +15341,6 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", - "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -15634,8 +15510,12 @@ "node_modules/lodash.escape": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-4.0.1.tgz", - "integrity": "sha512-nXEOnb/jK9g0DYMr1/Xvq6l5xMD7GDG55+GSYIYmS0G4tBk/hURD4JR9WCavs04t33WmJx9kCyp9vJ+mr4BOUw==", - "dev": true + "integrity": "sha512-nXEOnb/jK9g0DYMr1/Xvq6l5xMD7GDG55+GSYIYmS0G4tBk/hURD4JR9WCavs04t33WmJx9kCyp9vJ+mr4BOUw==" + }, + "node_modules/lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==" }, "node_modules/lodash.flattendeep": { "version": "4.4.0", @@ -15643,6 +15523,11 @@ "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", "dev": true }, + "node_modules/lodash.invokemap": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.invokemap/-/lodash.invokemap-4.6.0.tgz", + "integrity": "sha512-CfkycNtMqgUlfjfdh2BhKO/ZXrP8ePOX5lEU/g0R3ItJcnuxWDwokMGKx1hWcfOikmyOVx6X9IwWnDGlgKl61w==" + }, "node_modules/lodash.isequal": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", @@ -15664,6 +15549,11 @@ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" }, + "node_modules/lodash.pullall": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.pullall/-/lodash.pullall-4.2.0.tgz", + "integrity": "sha512-VhqxBKH0ZxPpLhiu68YD1KnHmbhQJQctcipvmFnqIBDYzcIHzf3Zpu0tpeOKtR4x76p9yohc506eGdOjTmyIBg==" + }, "node_modules/lodash.snakecase": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", @@ -16115,9 +16005,9 @@ } }, "node_modules/node-abi": { - "version": "3.45.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.45.0.tgz", - "integrity": "sha512-iwXuFrMAcFVi/ZoZiqq8BzAdsLw9kxDfTC0HMyjXfSL/6CSDAGD5UmR7azrAgWV1zKYq7dUUMj4owusBWKLsiQ==", + "version": "3.47.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.47.0.tgz", + "integrity": "sha512-2s6B2CWZM//kPgwnuI0KrYwNjfdByE25zvAaEpq9IH4zcNsarH8Ihu/UuX6XMPEogDAxkuUFeZn60pXNHAqn3A==", "dependencies": { "semver": "^7.3.5" }, @@ -17023,9 +16913,9 @@ } }, "node_modules/postcss": { - "version": "8.4.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.27.tgz", - "integrity": "sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ==", + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "funding": [ { "type": "opencollective", @@ -17097,9 +16987,9 @@ } }, "node_modules/postcss-custom-media": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-10.0.0.tgz", - "integrity": "sha512-NxDn7C6GJ7X8TsWOa8MbCdq9rLERRLcPfQSp856k1jzMreL8X9M6iWk35JjPRIb9IfRnVohmxAylDRx7n4Rv4g==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-10.0.1.tgz", + "integrity": "sha512-fil7cosvzlIAYmZJPtNFcTH0Er7a3GveEK4q5Y/L24eWQHmiw8Fv/E5DMkVpdbNjkGzJxrvowOSt/Il9HZ06VQ==", "funding": [ { "type": "github", @@ -17111,10 +17001,10 @@ } ], "dependencies": { - "@csstools/cascade-layer-name-parser": "^1.0.3", - "@csstools/css-parser-algorithms": "^2.3.0", - "@csstools/css-tokenizer": "^2.1.1", - "@csstools/media-query-list-parser": "^2.1.2" + "@csstools/cascade-layer-name-parser": "^1.0.4", + "@csstools/css-parser-algorithms": "^2.3.1", + "@csstools/css-tokenizer": "^2.2.0", + "@csstools/media-query-list-parser": "^2.1.4" }, "engines": { "node": "^14 || ^16 || >=18" @@ -17534,9 +17424,9 @@ } }, "node_modules/postcss-rtlcss": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/postcss-rtlcss/-/postcss-rtlcss-4.0.7.tgz", - "integrity": "sha512-HUh9rtPOrAiPs0uYTebWixSN3PEO6evQ+bj6OmYG59v+pUSPmsfvbIm2VAySvTaHNbURez5beMkCXU/sQz+w0A==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/postcss-rtlcss/-/postcss-rtlcss-4.0.8.tgz", + "integrity": "sha512-CR2sY889PHnX6K8rjW9FG4Qvm9UJsIekDakMtEYGH3zgFp9XADMeaKcA0hPOmkClNh0jWbkaPBm0jZ6fHmqkJQ==", "dependencies": { "rtlcss": "4.1.0" }, @@ -17618,6 +17508,45 @@ "node": ">=10" } }, + "node_modules/prebuild-install/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prebuild-install/node_modules/tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/prebuild-install/node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -18840,9 +18769,9 @@ "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" }, "node_modules/regenerate-unicode-properties": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", - "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", + "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", "dependencies": { "regenerate": "^1.4.2" }, @@ -18856,9 +18785,9 @@ "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" }, "node_modules/regenerator-transform": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", - "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", "dependencies": { "@babel/runtime": "^7.8.4" } @@ -19878,9 +19807,9 @@ "integrity": "sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==" }, "node_modules/sharp": { - "version": "0.32.4", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.32.4.tgz", - "integrity": "sha512-exUnZewqVZC6UXqXuQ8fyJJv0M968feBi04jb9GcUHrWtkRoAKnbJt8IfwT4NJs7FskArbJ14JAFGVuooszoGg==", + "version": "0.32.6", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.32.6.tgz", + "integrity": "sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==", "hasInstallScript": true, "dependencies": { "color": "^4.2.3", @@ -19924,26 +19853,6 @@ "node": ">=10" } }, - "node_modules/sharp/node_modules/tar-fs": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.4.tgz", - "integrity": "sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==", - "dependencies": { - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^3.1.5" - } - }, - "node_modules/sharp/node_modules/tar-stream": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.6.tgz", - "integrity": "sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==", - "dependencies": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" - } - }, "node_modules/sharp/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", @@ -20057,13 +19966,13 @@ "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" }, "node_modules/sirv": { - "version": "1.0.19", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.19.tgz", - "integrity": "sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.3.tgz", + "integrity": "sha512-O9jm9BsID1P+0HOi81VpXPoDxYP374pkOLzACAoyUQ/3OUVndNpsz6wMnY2z+yOxzbllCKZrM+9QrWsv4THnyA==", "dependencies": { "@polka/url": "^1.0.0-next.20", "mrmime": "^1.0.0", - "totalist": "^1.0.0" + "totalist": "^3.0.0" }, "engines": { "node": ">= 10" @@ -20591,9 +20500,9 @@ } }, "node_modules/streamx": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.15.0.tgz", - "integrity": "sha512-HcxY6ncGjjklGs1xsP1aR71INYcsXFJet5CU1CHqihQ2J5nOsbd4OjgjHO42w/4QNv9gZb3BueV+Vxok5pLEXg==", + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.15.1.tgz", + "integrity": "sha512-fQMzy2O/Q47rgwErk/eGeLu/roaFWV0jVsogDmrszM9uIw8L5OA+t+V93MgYlufNptfjmYR1tOMWhei/Eh7TQA==", "dependencies": { "fast-fifo": "^1.1.0", "queue-tick": "^1.0.1" @@ -20936,42 +20845,23 @@ } }, "node_modules/tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.4.tgz", + "integrity": "sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==", "dependencies": { - "chownr": "^1.1.1", "mkdirp-classic": "^0.5.2", "pump": "^3.0.0", - "tar-stream": "^2.1.4" + "tar-stream": "^3.1.5" } }, "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tar-stream/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.6.tgz", + "integrity": "sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" } }, "node_modules/terminal-link": { @@ -21203,9 +21093,9 @@ } }, "node_modules/totalist": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", - "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", "engines": { "node": ">=6" } @@ -21546,9 +21436,9 @@ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, "node_modules/update-browserslist-db": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", - "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", "funding": [ { "type": "opencollective", @@ -21853,19 +21743,26 @@ } }, "node_modules/webpack-bundle-analyzer": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.9.0.tgz", - "integrity": "sha512-+bXGmO1LyiNx0i9enBu3H8mv42sj/BJWhZNFwjz92tVnBa9J3JMGo2an2IXlEleoDOPn/Hofl5hr/xCpObUDtw==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.9.1.tgz", + "integrity": "sha512-jnd6EoYrf9yMxCyYDPj8eutJvtjQNp8PHmni/e/ulydHBWhT5J3menXt3HEkScsu9YqMAcG4CfFjs3rj5pVU1w==", "dependencies": { "@discoveryjs/json-ext": "0.5.7", "acorn": "^8.0.4", "acorn-walk": "^8.0.0", - "chalk": "^4.1.0", "commander": "^7.2.0", + "escape-string-regexp": "^4.0.0", "gzip-size": "^6.0.0", - "lodash": "^4.17.20", + "is-plain-object": "^5.0.0", + "lodash.debounce": "^4.0.8", + "lodash.escape": "^4.0.1", + "lodash.flatten": "^4.4.0", + "lodash.invokemap": "^4.6.0", + "lodash.pullall": "^4.2.0", + "lodash.uniqby": "^4.7.0", "opener": "^1.5.2", - "sirv": "^1.0.7", + "picocolors": "^1.0.0", + "sirv": "^2.0.3", "ws": "^7.3.1" }, "bin": { @@ -21875,51 +21772,6 @@ "node": ">= 10.13.0" } }, - "node_modules/webpack-bundle-analyzer/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/webpack-bundle-analyzer/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/webpack-bundle-analyzer/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/webpack-bundle-analyzer/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, "node_modules/webpack-bundle-analyzer/node_modules/commander": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", @@ -21928,23 +21780,23 @@ "node": ">= 10" } }, - "node_modules/webpack-bundle-analyzer/node_modules/has-flag": { + "node_modules/webpack-bundle-analyzer/node_modules/escape-string-regexp": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/webpack-bundle-analyzer/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, + "node_modules/webpack-bundle-analyzer/node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, "node_modules/webpack-cli": { diff --git a/package.json b/package.json index 7093332b4e..b8a5a3b556 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ ], "scripts": { "build": "fedx-scripts webpack", - "i18n_extract": "BABEL_ENV=i18n fedx-scripts babel src --quiet > /dev/null", + "i18n_extract": "fedx-scripts formatjs extract", "lint": "fedx-scripts eslint --ext .js --ext .jsx .", "snapshot": "fedx-scripts jest --updateSnapshot", "start": "fedx-scripts webpack-dev-server --progress", @@ -32,8 +32,8 @@ "url": "https://github.com/openedx/frontend-app-authn/issues" }, "dependencies": { - "@edx/brand": "npm:@edx/brand-openedx@1.2.0", - "@edx/frontend-platform": "^5.0.0", + "@edx/brand": "npm:@openedx/brand-openedx@^1.2.2", + "@edx/frontend-platform": "^5.5.4", "@edx/paragon": "20.46.2", "@fortawesome/fontawesome-svg-core": "6.4.2", "@fortawesome/free-brands-svg-icons": "6.4.2", @@ -71,7 +71,7 @@ }, "devDependencies": { "@edx/browserslist-config": "^1.1.1", - "@edx/frontend-build": "12.9.8", + "@edx/frontend-build": "13.0.1", "@edx/reactifex": "1.1.0", "@wojtekmaj/enzyme-adapter-react-17": "^0.8.0", "babel-plugin-formatjs": "10.5.3", diff --git a/src/base-container/components/default-layout/MediumLayout.jsx b/src/base-container/components/default-layout/MediumLayout.jsx index d63d20c36b..a9f994170d 100644 --- a/src/base-container/components/default-layout/MediumLayout.jsx +++ b/src/base-container/components/default-layout/MediumLayout.jsx @@ -23,13 +23,15 @@ const MediumLayout = () => {

- {formatMessage(messages['start.learning'])} - - {formatMessage(messages['with.site.name'], { siteName: getConfig().SITE_NAME })} + + {formatMessage(messages['start.learning'])}{' '} + + {formatMessage(messages['with.site.name'], { siteName: getConfig().SITE_NAME })} +

diff --git a/src/base-container/components/default-layout/SmallLayout.jsx b/src/base-container/components/default-layout/SmallLayout.jsx index 12e568a42e..b93a72910c 100644 --- a/src/base-container/components/default-layout/SmallLayout.jsx +++ b/src/base-container/components/default-layout/SmallLayout.jsx @@ -17,17 +17,18 @@ const SmallLayout = () => { {getConfig().SITE_NAME} -
+

- {formatMessage(messages['start.learning'])} - - {formatMessage(messages['with.site.name'], { siteName: getConfig().SITE_NAME })} + + {formatMessage(messages['start.learning'])}{' '} + + {formatMessage(messages['with.site.name'], { siteName: getConfig().SITE_NAME })} +

diff --git a/src/base-container/components/welcome-page-layout/SmallLayout.jsx b/src/base-container/components/welcome-page-layout/SmallLayout.jsx index 06d20c7390..066e6021d0 100644 --- a/src/base-container/components/welcome-page-layout/SmallLayout.jsx +++ b/src/base-container/components/welcome-page-layout/SmallLayout.jsx @@ -16,7 +16,7 @@ const SmallLayout = ({ username }) => { {getConfig().SITE_NAME} -
+

diff --git a/src/common-components/EnterpriseSSO.jsx b/src/common-components/EnterpriseSSO.jsx index 4bfc5ae33b..f6b206bbe9 100644 --- a/src/common-components/EnterpriseSSO.jsx +++ b/src/common-components/EnterpriseSSO.jsx @@ -19,7 +19,8 @@ import { LOGIN_PAGE, SUPPORTED_ICON_CLASSES } from '../data/constants'; const EnterpriseSSO = (props) => { const { formatMessage } = useIntl(); const tpaProvider = props.provider; - const disablePublicAccountCreation = getConfig().ALLOW_PUBLIC_ACCOUNT_CREATION === false; + const hideRegistrationLink = getConfig().ALLOW_PUBLIC_ACCOUNT_CREATION === false + || getConfig().SHOW_REGISTRATION_LINKS === false; const handleSubmit = (e, url) => { e.preventDefault(); @@ -74,7 +75,7 @@ const EnterpriseSSO = (props) => { className="w-100" onClick={(e) => handleClick(e)} > - {disablePublicAccountCreation + {hideRegistrationLink ? formatMessage(messages['enterprisetpa.login.button.text.public.account.creation.disabled']) : formatMessage(messages['enterprisetpa.login.button.text'])} diff --git a/src/common-components/data/reducers.js b/src/common-components/data/reducers.js index 841ab96647..c2150cda80 100644 --- a/src/common-components/data/reducers.js +++ b/src/common-components/data/reducers.js @@ -2,9 +2,7 @@ import { THIRD_PARTY_AUTH_CONTEXT, THIRD_PARTY_AUTH_CONTEXT_CLEAR_ERROR_MSG } fr import { COMPLETE_STATE, FAILURE_STATE, PENDING_STATE } from '../../data/constants'; export const defaultState = { - fieldDescriptions: { - fields: {}, - }, + fieldDescriptions: {}, optionalFields: { fields: {}, extended_profile: [], @@ -33,7 +31,7 @@ const reducer = (state = defaultState, action = {}) => { case THIRD_PARTY_AUTH_CONTEXT.SUCCESS: { return { ...state, - fieldDescriptions: action.payload.fieldDescriptions.fields, + fieldDescriptions: action.payload.fieldDescriptions?.fields, optionalFields: action.payload.optionalFields, thirdPartyAuthContext: action.payload.thirdPartyAuthContext, thirdPartyAuthApiStatus: COMPLETE_STATE, diff --git a/src/config/index.js b/src/config/index.js index 5a9992190d..73560c5dcf 100644 --- a/src/config/index.js +++ b/src/config/index.js @@ -9,6 +9,7 @@ const configuration = { ENABLE_POST_REGISTRATION_RECOMMENDATIONS: process.env.ENABLE_POST_REGISTRATION_RECOMMENDATIONS || false, MARKETING_EMAILS_OPT_IN: process.env.MARKETING_EMAILS_OPT_IN || '', SHOW_CONFIGURABLE_EDX_FIELDS: process.env.SHOW_CONFIGURABLE_EDX_FIELDS || false, + SHOW_REGISTRATION_LINKS: process.env.SHOW_REGISTRATION_LINKS !== 'false', // Links ACTIVATION_EMAIL_SUPPORT_LINK: process.env.ACTIVATION_EMAIL_SUPPORT_LINK || null, AUTHN_PROGRESSIVE_PROFILING_SUPPORT_LINK: process.env.AUTHN_PROGRESSIVE_PROFILING_SUPPORT_LINK || null, diff --git a/src/data/tests/cookies.test.js b/src/data/tests/cookies.test.js new file mode 100644 index 0000000000..fd448dd248 --- /dev/null +++ b/src/data/tests/cookies.test.js @@ -0,0 +1,52 @@ +import { getConfig } from '@edx/frontend-platform'; +import Cookies from 'universal-cookie'; + +import { setCookie } from '../utils'; + +// Mock getConfig function +jest.mock('@edx/frontend-platform', () => ({ + getConfig: jest.fn(), +})); + +// Mock Cookies class +jest.mock('universal-cookie'); + +describe('setCookie function', () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('should set a cookie with default options', () => { + getConfig.mockReturnValue({ SESSION_COOKIE_DOMAIN: 'example.com' }); + + setCookie('testCookie', 'testValue'); + + expect(Cookies).toHaveBeenCalled(); + expect(Cookies).toHaveBeenCalledWith(); + expect(Cookies.prototype.set).toHaveBeenCalledWith('testCookie', 'testValue', { + domain: 'example.com', + path: '/', + }); + }); + + it('should set a cookie with specified expiry', () => { + getConfig.mockReturnValue({ SESSION_COOKIE_DOMAIN: 'example.com' }); + + const expiry = new Date('2023-12-31'); + setCookie('testCookie', 'testValue', expiry); + + expect(Cookies).toHaveBeenCalled(); + expect(Cookies).toHaveBeenCalledWith(); + expect(Cookies.prototype.set).toHaveBeenCalledWith('testCookie', 'testValue', { + domain: 'example.com', + path: '/', + expires: expiry, + }); + }); + + it('should not set a cookie if cookieName is undefined', () => { + setCookie(undefined, 'testValue'); + + expect(Cookies).not.toHaveBeenCalled(); + }); +}); diff --git a/src/data/utils/cookies.js b/src/data/utils/cookies.js index 6290e37335..1aad2858f0 100644 --- a/src/data/utils/cookies.js +++ b/src/data/utils/cookies.js @@ -2,10 +2,12 @@ import { getConfig } from '@edx/frontend-platform'; import Cookies from 'universal-cookie'; export default function setCookie(cookieName, cookieValue, cookieExpiry) { - const cookies = new Cookies(); - const options = { domain: getConfig().SESSION_COOKIE_DOMAIN, path: '/' }; - if (cookieExpiry) { - options.expires = cookieExpiry; + if (cookieName) { // To avoid setting getting exception when setting cookie with undefined names. + const cookies = new Cookies(); + const options = { domain: getConfig().SESSION_COOKIE_DOMAIN, path: '/' }; + if (cookieExpiry) { + options.expires = cookieExpiry; + } + cookies.set(cookieName, cookieValue, options); } - cookies.set(cookieName, cookieValue, options); } diff --git a/src/i18n/messages/ar.json b/src/i18n/messages/ar.json index e91cb68fa8..6b1e1bc9cc 100644 --- a/src/i18n/messages/ar.json +++ b/src/i18n/messages/ar.json @@ -1,11 +1,5 @@ { - "start.learning": "ابدأ التعلم ", - "with.site.name": "مع {siteName}", - "your.career.turning.point": "Your career turning point", - "is.here": "is here.", - "welcome.to.platform": "أهلا بك {username} في {siteName}", - "complete.your.profile.1": "أكمل", - "complete.your.profile.2": "ملفك الشخصي", + "error.notfound.message": "الصفحة التي تبحث عنها غير متوفرة أو هناك خطأ في العنوان. رجاءً تحقق من العنوان و حاول مجددًا.", "institution.login.page.sub.heading": "اختر مؤسستك من القائمة أدناه", "logistration.sign.in": "تسجيل الدخول", "logistration.register": "التسجيل", @@ -26,8 +20,7 @@ "registration.using.tpa.form.heading": "إتمام إنشاء حسابك", "zendesk.supportTitle": "edX Support", "zendesk.selectTicketForm": "الرجاء اختيار نوع الطلب الخاص بك:", - "error.notfound.message": "الصفحة التي تبحث عنها غير متوفرة أو هناك خطأ في العنوان. رجاءً تحقق من العنوان و حاول مجددًا.", - "forgot.password.confirmation.message": "لقد أرسلنا بريدًا إلكترونيًا إلى {email} به إرشادات لإعادة ضبط كلمة المرور الخاصة بك. إن لم تستلم رسالة إعادة ضبط كلمة المرور بعد دقيقة واحدة، فتحقق من إدخال عنوان البريد الإلكتروني الصحيح، أو تفقد مجلد الرسائل غير المرغوب فيها. إن احتجت مزيدًا من المساعدة، {supportLink}.", + "forgot.password.confirmation.message": "We sent an email to {email} with instructions to reset your password. If you do not receive a password reset message after 1 minute, verify that you entered the correct email address, or check your spam folder. If you need further assistance, {supportLink}.", "forgot.password.page.title": "نسيت كلمة المرور | {siteName}", "forgot.password.page.heading": "إعادة ضبط كلمة المرور", "forgot.password.page.instructions": "رجاءً أدخل عنوان بريدك الإلكتروني أدناه وسنرسل إليك بريدًا به إرشادات بخصوص كيفية إعادة ضبط كلمة مرورك.", @@ -42,7 +35,7 @@ "confirmation.message.title": "تفقّد بريدك الإلكتروني", "confirmation.support.link": "اتصل بالدعم الفني", "need.help.sign.in.text": "هل تحتاج مساعدة في تسجيل الدخول؟", - "additional.help.text": "للمزيد من المساعدة، اتصل بدعم {platformName} على ", + "additional.help.text": "For additional help, contact {platformName} support at", "sign.in.text": "تسجيل الدخول", "extend.field.errors": "{emailError} أدناه.", "invalid.token.heading": "رابط إعادة ضبط كلمة المرور غير صالح", @@ -53,9 +46,9 @@ "token.validation.internal.sever.error": "حدث خطأ ما. جرب تحديث الصفحة أو تحقق من اتصالك بالإنترنت.", "internal.server.error": "حدث خطأ ما. جرب تحديث الصفحة أو تحقق من اتصالك بالإنترنت.", "account.activation.error.message": "شي ما لم يسر على ما يرام، يرجى {supportLink} لحل هذه المشكلة.", - "login.inactive.user.error": "أنت بحاجة لتفعيل حسابك من أجل تسجيل الدخول{lineBreak}\n{lineBreak}لقد أرسلنا للتو رابطًا للتفعيل إلى {email}. إن لم تتلقّ بريدًا إلكترونيا، تفقّد مجلدات الرسائل غير المرغوب فيها أو {supportLink}.", + "login.inactive.user.error": "In order to sign in, you need to activate your account.{lineBreak} {lineBreak}We just sent an activation link to {email}. If you do not receive an email, check your spam folders or {supportLink}.", "allowed.domain.login.error": "كونك مستخدمًا على {allowedDomain}، فإن عليك تسجيل الدخول باستخدام {tpaLink} الخاص بـ {allowedDomain} .", - "login.incorrect.credentials.error.attempts.text.1": "اسم المستخدم أو البريد الإلكتروني أو كلمة المرور التي أدخلتها غير صحيحة. لديك {remainingAttempts, plural,\n one {محاولة واحدة}\n two {محاولتان}\n few {# محاولات}\n many {# محاولة}\n other {# محاولة}\n} أخرى لتسجيل الدخول قبل أن يتم إقفال حسابك مؤقتًا.", + "login.incorrect.credentials.error.attempts.text.1": "The username, email or password you entered is incorrect. You have {remainingAttempts} more sign in attempts before your account is temporarily locked.", "login.incorrect.credentials.error.attempts.text.2": "إن نسيت كلمة مرورك، {resetLink}", "account.locked.out.message.2": "لتكون في مأمن، يمكنك {resetLink} قبل تكرار المحاولة.", "login.incorrect.credentials.error.with.reset.link": "اسم المستخدم أو البريد الإلكتروني أو كلمة المرور التي أدخلتها غير صحيحة. يرجى تكرار المحاولة أو {resetLink}.", @@ -113,8 +106,9 @@ "recommendation.page.title": "التوصيات | {siteName}", "recommendation.page.heading": "لدينا بعض التوصيات لكي تبدأ.", "recommendation.skip.button": "التخطي مؤقتا", - "recommendation.option.trending": "Trending", + "recommendation.option.trending": "Trending Now", "recommendation.option.popular": "Most Popular", + "recommendation.option.recommended.for.you": "Recommended For You", "recommendation.product-card.pill-text.course": "Course", "recommendation.product-card.pill-text.professional-certificate": "Professional Certificate", "recommendation.product-card.pill-text.emeritus": "Offered on Emeritus", @@ -160,9 +154,6 @@ "terms.of.service": "شروط الخدمة", "registration.username.suggestion.label": "مقترح:", "did.you.mean.alert.text": "هل تقصد", - "register.page.terms.of.service.and.honor.code": "بإنشاءك حسابًا، فإنك توافق على {tosAndHonorCode} و تقر بأن {platformName} و كل عضو يعالج بياناتك الشخصية وفقًا لـ{privacyPolicy}.", - "register.page.honor.code": "اوافق على شروط {platformName} {tosAndHonorCode}", - "register.page.terms.of.service": "اوافق على {platformName} {termsOfService}", "sign.in": "تسجيل الدخول", "reset.password.page.title": "إعادة ضبط كلمة المرور | {siteName}", "reset.password": "إعادة ضبط كلمة المرور", @@ -176,5 +167,15 @@ "reset.server.rate.limit.error": "طلبات أكثر مما ينبغي.", "reset.password.success.heading": "تمت إعادة ضبط كلمة المرور.", "reset.password.success": "تمت إعادة ضبط كلمة مرورك. سجل الدخول إلى حسابك.", - "rate.limit.error": "حدث خطأ بسبب كثرة الطلبات. رجاءً حاول مرة أخرى بعد مضي بعض الوقت." + "rate.limit.error": "حدث خطأ بسبب كثرة الطلبات. رجاءً حاول مرة أخرى بعد مضي بعض الوقت.", + "start.learning": "ابدأ التعلم ", + "with.site.name": "مع {siteName}", + "your.career.turning.point": "Your career turning point", + "is.here": "is here.", + "welcome.to.platform": "أهلا بك {username} في {siteName}", + "complete.your.profile.1": "أكمل", + "complete.your.profile.2": "ملفك الشخصي", + "register.page.terms.of.service.and.honor.code": "By creating an account, you agree to the {tosAndHonorCode} and you acknowledge that {platformName} and each Member process your personal data in accordance with the {privacyPolicy}.", + "register.page.honor.code": "I agree to the {platformName} {tosAndHonorCode}", + "register.page.terms.of.service": "I agree to the {platformName} {termsOfService}" } \ No newline at end of file diff --git a/src/i18n/messages/de.json b/src/i18n/messages/de.json index 5c0dfae32e..283d1cc286 100644 --- a/src/i18n/messages/de.json +++ b/src/i18n/messages/de.json @@ -1,11 +1,5 @@ { - "start.learning": "Start learning", - "with.site.name": "with {siteName}", - "your.career.turning.point": "Your career turning point", - "is.here": "is here.", - "welcome.to.platform": "Welcome to {siteName}, {username}!", - "complete.your.profile.1": "Complete", - "complete.your.profile.2": "your profile", + "error.notfound.message": "The page you're looking for is unavailable or there's an error in the URL. Please check the URL and try again.", "institution.login.page.sub.heading": "Choose your institution from the list below", "logistration.sign.in": "Sign in", "logistration.register": "Register", @@ -26,8 +20,7 @@ "registration.using.tpa.form.heading": "Finish creating your account", "zendesk.supportTitle": "edX Support", "zendesk.selectTicketForm": "Please choose your request type:", - "error.notfound.message": "The page you're looking for is unavailable or there's an error in the URL. Please check the URL and try again.", - "forgot.password.confirmation.message": "We sent an email to {email} with instructions to reset your password.\n If you do not receive a password reset message after 1 minute, verify that you entered\n the correct email address, or check your spam folder. If you need further assistance, {supportLink}.", + "forgot.password.confirmation.message": "We sent an email to {email} with instructions to reset your password. If you do not receive a password reset message after 1 minute, verify that you entered the correct email address, or check your spam folder. If you need further assistance, {supportLink}.", "forgot.password.page.title": "Forgot Password | {siteName}", "forgot.password.page.heading": "Reset password", "forgot.password.page.instructions": "Please enter your email address below and we will send you an email with instructions on how to reset your password.", @@ -42,7 +35,7 @@ "confirmation.message.title": "Check your email", "confirmation.support.link": "contact technical support", "need.help.sign.in.text": "Need help signing in?", - "additional.help.text": "For additional help, contact {platformName} support at ", + "additional.help.text": "For additional help, contact {platformName} support at", "sign.in.text": "Sign in", "extend.field.errors": "{emailError} below.", "invalid.token.heading": "Invalid password reset link", @@ -53,9 +46,9 @@ "token.validation.internal.sever.error": "An error has occurred. Try refreshing the page, or check your internet connection.", "internal.server.error": "An error has occurred. Try refreshing the page, or check your internet connection.", "account.activation.error.message": "Something went wrong, please {supportLink} to resolve this issue.", - "login.inactive.user.error": "In order to sign in, you need to activate your account.{lineBreak}\n {lineBreak}We just sent an activation link to {email}. If you do not receive an email,\n check your spam folders or {supportLink}.", + "login.inactive.user.error": "In order to sign in, you need to activate your account.{lineBreak} {lineBreak}We just sent an activation link to {email}. If you do not receive an email, check your spam folders or {supportLink}.", "allowed.domain.login.error": "As {allowedDomain} user, You must login with your {allowedDomain} {tpaLink}.", - "login.incorrect.credentials.error.attempts.text.1": "The username, email or password you entered is incorrect. You have {remainingAttempts} more sign in\n attempts before your account is temporarily locked.", + "login.incorrect.credentials.error.attempts.text.1": "The username, email or password you entered is incorrect. You have {remainingAttempts} more sign in attempts before your account is temporarily locked.", "login.incorrect.credentials.error.attempts.text.2": "If you've forgotten your password, {resetLink}", "account.locked.out.message.2": "To be on the safe side, you can {resetLink} before trying again.", "login.incorrect.credentials.error.with.reset.link": "The username, email, or password you entered is incorrect. Please try again or {resetLink}.", @@ -113,8 +106,9 @@ "recommendation.page.title": "Recommendations | {siteName}", "recommendation.page.heading": "We have a few recommendations to get you started.", "recommendation.skip.button": "Skip for now", - "recommendation.option.trending": "Trending", + "recommendation.option.trending": "Trending Now", "recommendation.option.popular": "Most Popular", + "recommendation.option.recommended.for.you": "Recommended For You", "recommendation.product-card.pill-text.course": "Course", "recommendation.product-card.pill-text.professional-certificate": "Professional Certificate", "recommendation.product-card.pill-text.emeritus": "Offered on Emeritus", @@ -160,9 +154,6 @@ "terms.of.service": "Terms of Service", "registration.username.suggestion.label": "Suggested:", "did.you.mean.alert.text": "Did you mean", - "register.page.terms.of.service.and.honor.code": "By creating an account, you agree to the {tosAndHonorCode} and you acknowledge that {platformName} and each\n Member process your personal data in accordance with the {privacyPolicy}.", - "register.page.honor.code": "I agree to the {platformName} {tosAndHonorCode}", - "register.page.terms.of.service": "I agree to the {platformName} {termsOfService}", "sign.in": "Sign in", "reset.password.page.title": "Reset Password | {siteName}", "reset.password": "Reset password", @@ -176,5 +167,15 @@ "reset.server.rate.limit.error": "Too many requests.", "reset.password.success.heading": "Password reset complete.", "reset.password.success": "Your password has been reset. Sign in to your account.", - "rate.limit.error": "An error has occurred because of too many requests. Please try again after some time." + "rate.limit.error": "An error has occurred because of too many requests. Please try again after some time.", + "start.learning": "Start learning", + "with.site.name": "with {siteName}", + "your.career.turning.point": "Your career turning point", + "is.here": "is here.", + "welcome.to.platform": "Welcome to {siteName}, {username}!", + "complete.your.profile.1": "Complete", + "complete.your.profile.2": "your profile", + "register.page.terms.of.service.and.honor.code": "By creating an account, you agree to the {tosAndHonorCode} and you acknowledge that {platformName} and each Member process your personal data in accordance with the {privacyPolicy}.", + "register.page.honor.code": "I agree to the {platformName} {tosAndHonorCode}", + "register.page.terms.of.service": "I agree to the {platformName} {termsOfService}" } \ No newline at end of file diff --git a/src/i18n/messages/de_DE.json b/src/i18n/messages/de_DE.json index 05ba5af5b2..c9dc7aaca2 100644 --- a/src/i18n/messages/de_DE.json +++ b/src/i18n/messages/de_DE.json @@ -1,11 +1,5 @@ { - "start.learning": "Beginne zu lernen", - "with.site.name": "mit {siteName}", - "your.career.turning.point": "Your career turning point", - "is.here": "is here.", - "welcome.to.platform": "Willkommen bei {siteName}, {username}!", - "complete.your.profile.1": "Vervollständige", - "complete.your.profile.2": "dein Profil", + "error.notfound.message": "Die gesuchte Seite ist nicht verfügbar oder es liegt ein Fehler in der URL vor. Bitte überprüfen Sie die URL und versuchen Sie es erneut.", "institution.login.page.sub.heading": "Wählen Sie Ihre Institution aus der folgenden Liste aus", "logistration.sign.in": "Anmelden", "logistration.register": "Registrieren", @@ -26,8 +20,7 @@ "registration.using.tpa.form.heading": "Beenden Sie die Erstellung Ihres Kontos", "zendesk.supportTitle": "edX Support", "zendesk.selectTicketForm": "Please choose your request type:", - "error.notfound.message": "Die gesuchte Seite ist nicht verfügbar oder es liegt ein Fehler in der URL vor. Bitte überprüfen Sie die URL und versuchen Sie es erneut.", - "forgot.password.confirmation.message": "Wir haben eine E-Mail mit Anweisungen zum Zurücksetzen Ihres Passworts an {email} gesendet. Wenn Sie nach 1 Minute keine Nachricht zum Zurücksetzen des Passworts erhalten, überprüfen Sie, ob Sie die richtige E-Mail-Adresse eingegeben haben, oder überprüfen Sie Ihren Spam-Ordner. Wenn Sie weitere Hilfe benötigen, {supportLink}.", + "forgot.password.confirmation.message": "We sent an email to {email} with instructions to reset your password. If you do not receive a password reset message after 1 minute, verify that you entered the correct email address, or check your spam folder. If you need further assistance, {supportLink}.", "forgot.password.page.title": "Passwort vergessen | {siteName}", "forgot.password.page.heading": "Passwort zurücksetzen", "forgot.password.page.instructions": "Bitte geben Sie unten Ihre E-Mail-Adresse ein und wir senden Ihnen eine E-Mail mit Anweisungen zum Zurücksetzen Ihres Passworts.", @@ -42,7 +35,7 @@ "confirmation.message.title": "Prüfen Sie Ihr E-Mail-Postfach", "confirmation.support.link": "wenden Sie sich an den technischen Support", "need.help.sign.in.text": "Brauchen Sie Hilfe bei der Anmeldung?", - "additional.help.text": "Wenden Sie sich für weitere Hilfe an den {platformName}-Support unter", + "additional.help.text": "For additional help, contact {platformName} support at", "sign.in.text": "Anmelden", "extend.field.errors": "{emailError} unten.", "invalid.token.heading": "Ungültiger Link zum Zurücksetzen des Passworts", @@ -53,9 +46,9 @@ "token.validation.internal.sever.error": "Ein Fehler ist aufgetreten. Versuchen Sie, die Seite zu aktualisieren, oder überprüfen Sie Ihre Internetverbindung.", "internal.server.error": "Ein Fehler ist aufgetreten. Versuchen Sie, die Seite zu aktualisieren, oder überprüfen Sie Ihre Internetverbindung.", "account.activation.error.message": "Etwas ist schief gelaufen, bitte {supportLink} um dieses Problem zu lösen.", - "login.inactive.user.error": "Um sich anzumelden, müssen Sie Ihr Konto aktivieren.{lineBreak} {lineBreak}Wir haben gerade einen Aktivierungslink an {email} gesendet. Wenn Sie keine E-Mail erhalten, überprüfen Sie Ihre Spam-Ordner oder {supportLink}.", + "login.inactive.user.error": "In order to sign in, you need to activate your account.{lineBreak} {lineBreak}We just sent an activation link to {email}. If you do not receive an email, check your spam folders or {supportLink}.", "allowed.domain.login.error": "Als {allowedDomain}-Benutzer müssen Sie sich mit Ihrem {allowedDomain} {tpaLink} anmelden.", - "login.incorrect.credentials.error.attempts.text.1": "Der eingegebene Benutzername, die E-Mail oder das Passwort ist falsch. Sie haben {remainingAttempts} weitere Anmeldeversuche, bevor Ihr Konto vorübergehend gesperrt wird.", + "login.incorrect.credentials.error.attempts.text.1": "The username, email or password you entered is incorrect. You have {remainingAttempts} more sign in attempts before your account is temporarily locked.", "login.incorrect.credentials.error.attempts.text.2": "Wenn Sie Ihr Passwort vergessen haben, {resetLink}", "account.locked.out.message.2": "Um auf der sicheren Seite zu sein, können Sie {resetLink} tun, bevor Sie es erneut versuchen.", "login.incorrect.credentials.error.with.reset.link": "Der eingegebene Benutzername, die E-Mail-Adresse oder das Passwort ist falsch. Bitte versuchen Sie es erneut oder {resetLink}.", @@ -113,8 +106,9 @@ "recommendation.page.title": "Empfehlungen | {siteName}", "recommendation.page.heading": "Wir haben ein paar Empfehlungen für den Einstieg.", "recommendation.skip.button": "Überspringen", - "recommendation.option.trending": "Trending", + "recommendation.option.trending": "Trending Now", "recommendation.option.popular": "Most Popular", + "recommendation.option.recommended.for.you": "Recommended For You", "recommendation.product-card.pill-text.course": "Course", "recommendation.product-card.pill-text.professional-certificate": "Professional Certificate", "recommendation.product-card.pill-text.emeritus": "Offered on Emeritus", @@ -160,9 +154,6 @@ "terms.of.service": "Nutzungsbedingungen", "registration.username.suggestion.label": "Empfohlen:", "did.you.mean.alert.text": "Meinten Sie", - "register.page.terms.of.service.and.honor.code": "Wenn Sie ein Konto erstellen, stimmen Sie den {tosAndHonorCode} zu und erkennen an, dass {platformName} und jedes \nMitglied Ihre personenbezogenen Daten in Übereinstimmung mit den {privacyPolicy} verarbeitet.", - "register.page.honor.code": "Ich stimme den {platformName} {tosAndHonorCode} zu", - "register.page.terms.of.service": "Ich stimme den {platformName} {termsOfService} zu", "sign.in": "Anmelden", "reset.password.page.title": "Passwort zurücksetzen | {siteName}", "reset.password": "Passwort zurücksetzen", @@ -176,5 +167,15 @@ "reset.server.rate.limit.error": "Zu viele Anfragen.", "reset.password.success.heading": "Zurücksetzen des Passworts abgeschlossen.", "reset.password.success": "Ihr Passwort wurde zurückgesetzt. Melden Sie sich bei Ihrem Konto an.", - "rate.limit.error": "Aufgrund zu vieler Anfragen ist ein Fehler aufgetreten. Bitte versuchen Sie es nach einiger Zeit erneut." + "rate.limit.error": "Aufgrund zu vieler Anfragen ist ein Fehler aufgetreten. Bitte versuchen Sie es nach einiger Zeit erneut.", + "start.learning": "Beginne zu lernen", + "with.site.name": "mit {siteName}", + "your.career.turning.point": "Your career turning point", + "is.here": "is here.", + "welcome.to.platform": "Willkommen bei {siteName}, {username}!", + "complete.your.profile.1": "Vervollständige", + "complete.your.profile.2": "dein Profil", + "register.page.terms.of.service.and.honor.code": "By creating an account, you agree to the {tosAndHonorCode} and you acknowledge that {platformName} and each Member process your personal data in accordance with the {privacyPolicy}.", + "register.page.honor.code": "I agree to the {platformName} {tosAndHonorCode}", + "register.page.terms.of.service": "I agree to the {platformName} {termsOfService}" } \ No newline at end of file diff --git a/src/i18n/messages/es_419.json b/src/i18n/messages/es_419.json index 86c07360d5..9af0d0b5e0 100644 --- a/src/i18n/messages/es_419.json +++ b/src/i18n/messages/es_419.json @@ -1,11 +1,5 @@ { - "start.learning": "Empieza a aprender", - "with.site.name": "con {siteName}", - "your.career.turning.point": "El punto de inflexión de tu carrera", - "is.here": "es aquí.", - "welcome.to.platform": "¡Bienvenido a {siteName}, {username}!", - "complete.your.profile.1": "Completado", - "complete.your.profile.2": "tu perfil ", + "error.notfound.message": "La página que estas buscando no está disponible o hay un error en la URL. Por favor, verifica la URL y vuelve a intentarlo.", "institution.login.page.sub.heading": "Selecciona tu institución de la lista siguiente", "logistration.sign.in": "Iniciar sesión", "logistration.register": "Registrarse", @@ -26,8 +20,7 @@ "registration.using.tpa.form.heading": "Termina de crear tu cuenta", "zendesk.supportTitle": "Soporte edX", "zendesk.selectTicketForm": "Elegir el tipo de solicitud:", - "error.notfound.message": "La página que estas buscando no está disponible o hay un error en la URL. Por favor, verifica la URL y vuelve a intentarlo.", - "forgot.password.confirmation.message": "Hemos enviado un correo electrónico a {email} con instrucciones para restablecer tu contraseña.\n Si no recibes un mensaje de restablecimiento de contraseña después de 1 minuto, verifica que has introducido\n la dirección de correo electrónico correcta, o comprueba tu carpeta de correo no deseado. Si necesitas más ayuda, {supportLink}.", + "forgot.password.confirmation.message": "Enviamos un correo electrónico a {email} con instrucciones para restablecer su contraseña. Si no recibe un mensaje de restablecimiento de contraseña después de 1 minuto, verifique que ingresó la dirección de correo electrónico correcta o verifique su carpeta de correo no deseado. Si necesita más ayuda, {supportLink}.", "forgot.password.page.title": "Olvidé la contraseña | {siteName}", "forgot.password.page.heading": "Restablecer mi contraseña", "forgot.password.page.instructions": "Por favor, introduce tu dirección de correo electrónico y te enviaremos un correo electrónico con instrucciones sobre cómo restablecer tu contraseña.", @@ -42,7 +35,7 @@ "confirmation.message.title": "Verifica tu correo electrónico", "confirmation.support.link": "entra en contacto con el equipo de soporte técnico", "need.help.sign.in.text": "¿Necesitas ayuda para iniciar sesión?", - "additional.help.text": "Para obtener ayuda adicional, comuníquese con el soporte de {platformName} en", + "additional.help.text": "Para obtener ayuda adicional, comuníquese con el soporte {platformName} en", "sign.in.text": "Iniciar sesión", "extend.field.errors": "{emailError} a continuación.", "invalid.token.heading": "Enlace de restablecimiento de contraseña inválido", @@ -53,9 +46,9 @@ "token.validation.internal.sever.error": "Se ha producido un error. Intenta actualizar la página o verifica tu conexión a Internet.", "internal.server.error": "Se ha producido un error. Intenta actualizar la página o verifica tu conexión a Internet.", "account.activation.error.message": "Algo no funcionó correctamente, por favor {supportLink} para resolver este problema.", - "login.inactive.user.error": "Para iniciar sesión, debes activar tu cuenta..{lineBreak}\n {lineBreak} Acabamos de enviar un enlace de activación a {email}. Si no recibes un correo electrónico,\n revisa tus carpetas de spam o {supportLink}.", + "login.inactive.user.error": "Para iniciar sesión, debe activar su cuenta.{lineBreak} {lineBreak}Acabamos de enviar un enlace de activación a {email}. Si no recibe un correo electrónico, revise sus carpetas de spam o {supportLink}.", "allowed.domain.login.error": "Como usuario {allowedDomain}, debe iniciar sesión con su {allowedDomain} {tpaLink}.", - "login.incorrect.credentials.error.attempts.text.1": "El nombre de usuario, el email o la contraseña que has introducido son incorrectos. Tienes {remainingAttempts} intentos más de inicio de sesión\n antes de que tu cuenta se bloquee temporalmente.", + "login.incorrect.credentials.error.attempts.text.1": "El nombre de usuario, correo electrónico o contraseña que ingresó es incorrecto. Tiene {remainingAttempts} más intentos de inicio de sesión antes de que su cuenta se bloquee temporalmente.", "login.incorrect.credentials.error.attempts.text.2": "Si has olvidado tu contraseña, {resetLink}", "account.locked.out.message.2": "Para estar seguro, puedes {resetLink} antes de volver a intentarlo.", "login.incorrect.credentials.error.with.reset.link": "El nombre de usuario, el correo electrónico o la contraseña que has introducido son incorrectos. Por favor, inténtalo de nuevo o {resetLink}.", @@ -115,6 +108,7 @@ "recommendation.skip.button": "Saltar por ahora ", "recommendation.option.trending": "Tendencias", "recommendation.option.popular": "Más popular", + "recommendation.option.recommended.for.you": "Recomendado para usted", "recommendation.product-card.pill-text.course": "Curso", "recommendation.product-card.pill-text.professional-certificate": "Certificado profesional", "recommendation.product-card.pill-text.emeritus": "Ofrecido en Emeritus", @@ -160,9 +154,6 @@ "terms.of.service": "Términos de servicio", "registration.username.suggestion.label": "Se recomienda:", "did.you.mean.alert.text": "¿Quieres decir", - "register.page.terms.of.service.and.honor.code": "Al crear una cuenta, aceptas el {tosAndHonorCode} y reconoces que {platformName} y cada\n Miembro procesa tus datos personales de acuerdo con la {privacyPolicy}.", - "register.page.honor.code": "Acepto las {platformName} {tosAndHonorCode}", - "register.page.terms.of.service": "Acepto las {platformName} {termsOfService}", "sign.in": "Iniciar sesión", "reset.password.page.title": "Restablecer contraseña | {siteName}", "reset.password": "Restablecer mi contraseña", @@ -176,5 +167,15 @@ "reset.server.rate.limit.error": "Demasiadas solicitudes.", "reset.password.success.heading": "Restablecimiento de la contraseña completado.", "reset.password.success": "Tu contraseña ha sido restablecida. Acceda a tu cuenta.", - "rate.limit.error": "Se ha producido un error debido a demasiadas solicitudes. Por favor, inténtalo de nuevo después de algún tiempo." + "rate.limit.error": "Se ha producido un error debido a demasiadas solicitudes. Por favor, inténtalo de nuevo después de algún tiempo.", + "start.learning": "Empieza a aprender", + "with.site.name": "con {siteName}", + "your.career.turning.point": "El punto de inflexión de tu carrera", + "is.here": "es aquí.", + "welcome.to.platform": "¡Bienvenido a {siteName}, {username}!", + "complete.your.profile.1": "Completado", + "complete.your.profile.2": "tu perfil ", + "register.page.terms.of.service.and.honor.code": "Al crear una cuenta, acepta {tosAndHonorCode} y reconoce que {platformName} y cada miembro procesan sus datos personales de acuerdo con {privacyPolicy}.", + "register.page.honor.code": "Acepto las {platformName} {tosAndHonorCode}", + "register.page.terms.of.service": "Acepto las {platformName} {termsOfService}" } \ No newline at end of file diff --git a/src/i18n/messages/fa_IR.json b/src/i18n/messages/fa_IR.json index e0e0aba7f4..1a3db3f7e5 100644 --- a/src/i18n/messages/fa_IR.json +++ b/src/i18n/messages/fa_IR.json @@ -1,11 +1,5 @@ { - "start.learning": "آغاز یادگیری", - "with.site.name": "با {siteName}", - "your.career.turning.point": "نقطه عطف حرفه ای شما", - "is.here": "اینجاست.", - "welcome.to.platform": "خوش آمدید به {siteName}, {username}!", - "complete.your.profile.1": "کامل", - "complete.your.profile.2": "پرونده کاربری شما", + "error.notfound.message": "صفحه مورد نظر شما در دسترس نیست یا خطایی در نشانی اینترنتی وجود دارد. لطفاً نشانی اینترنتی را بررسی کرده و دوباره تلاش کنید.", "institution.login.page.sub.heading": "موسسه خود را از فهرست زیر برگزینید", "logistration.sign.in": "ورود", "logistration.register": "ثبت‌نام", @@ -26,8 +20,7 @@ "registration.using.tpa.form.heading": "ساخت حساب کاربری خود را به اتمام برسانید", "zendesk.supportTitle": "پشتیبانی edX", "zendesk.selectTicketForm": "لطفا نوع درخواست خود را انتخاب کنید:", - "error.notfound.message": "صفحه مورد نظر شما در دسترس نیست یا خطایی در نشانی اینترنتی وجود دارد. لطفاً نشانی اینترنتی را بررسی کرده و دوباره تلاش کنید.", - "forgot.password.confirmation.message": "ما رایانامه‌ای به‌همراه دستورالعمل بازنشانی گذرواژه به {email} ارسال کردیم. اگر پس از 1 دقیقه پیام بازنشانی را دریافت نکردید، بررسی کنید که نشانی رایانامه را صحیح وارد کرده‌اید یا پوشه هرزنامه خود را بررسی کنید. اگر به دریافت راهنمایی بیشتری، با {supportLink} تماس بگیرید.", + "forgot.password.confirmation.message": "We sent an email to {email} with instructions to reset your password. If you do not receive a password reset message after 1 minute, verify that you entered the correct email address, or check your spam folder. If you need further assistance, {supportLink}.", "forgot.password.page.title": "فراموش گذرواژه | {siteName}", "forgot.password.page.heading": "بازتنظیم گذرواژه", "forgot.password.page.instructions": "لطفا نشانی رایانامه خود را در قسمت زیر وارد کنید و ما رایانامه‌ای حاوی دستورالعمل نحوه بازتنظیم مجدد گذرواژه برای شما ارسال خواهیم کرد.", @@ -42,7 +35,7 @@ "confirmation.message.title": "صندوق رایانامه خود را ببینید", "confirmation.support.link": "با پشتیبانی فنی تماس بگیرید", "need.help.sign.in.text": "برای ورود به سامانه نیاز به کمک دارید؟", - "additional.help.text": "برای دریافت راهنمایی بیشتر، با پشتیبانی {platformName} در این آدرس تماس بگیرید", + "additional.help.text": "For additional help, contact {platformName} support at", "sign.in.text": "ورود", "extend.field.errors": "{emailError} زیر.", "invalid.token.heading": "پیوند بازتنظیم گذرواژه معتبر نیست", @@ -53,9 +46,9 @@ "token.validation.internal.sever.error": "خطایی رخ داده است. صفحه را دوباره بارگیری کنید یا اتصال اینترنت خود را بررسی کنید.", "internal.server.error": "خطایی رخ داده است. صفحه را دوباره بارگیری کنید یا اتصال اینترنت خود را بررسی کنید.", "account.activation.error.message": "اشتباهی رخ داد، لطفاً برای حل این مساله ، به این قسمت{supportLink} مراجعه کنید.", - "login.inactive.user.error": "برای ورود به سامانه، باید حساب کاربری خود را فعال کنید.{lineBreak} {lineBreak}هم اکنون پیوند فعالسازی را به {email} فرستادیم. اگر رایانامه‌ای دریافت نکردید، پوشه‌های هرزنامه یا {supportLink} را بررسی کنید.", + "login.inactive.user.error": "In order to sign in, you need to activate your account.{lineBreak} {lineBreak}We just sent an activation link to {email}. If you do not receive an email, check your spam folders or {supportLink}.", "allowed.domain.login.error": "به عنوان کاربر {allowedDomain}، باید با {allowedDomain} {tpaLink} خود وارد شوید.", - "login.incorrect.credentials.error.attempts.text.1": "نام کاربری، نشانی رایانامه یا گذرواژه‌ای که وارد کرده‌اید نادرست است. پیش از اینکه حساب کاربری شما موقتا قفل شود، {remainingAttempts} تلاش دیگر برای ورود به سامانه دارید.", + "login.incorrect.credentials.error.attempts.text.1": "The username, email or password you entered is incorrect. You have {remainingAttempts} more sign in attempts before your account is temporarily locked.", "login.incorrect.credentials.error.attempts.text.2": "اگر گذرواژه خود را فراموش کرده‌اید، {resetLink}", "account.locked.out.message.2": "برای حفظ امنیت، می‌توانید پیش از تلاش مجدد، {resetLink} را انجام دهید.", "login.incorrect.credentials.error.with.reset.link": "نام کاربری، نشانی رایانامه یا گذرواژه‌ای که وارد کردید درست نیست. لطفاً دوباره امتحان کنید یا {resetLink}.", @@ -113,8 +106,9 @@ "recommendation.page.title": "توصیه ها | {siteName}", "recommendation.page.heading": "ما چند توصیه برای شروع کار داریم.", "recommendation.skip.button": "فعلا بگذرید", - "recommendation.option.trending": "پرطرفدار", + "recommendation.option.trending": "Trending Now", "recommendation.option.popular": "محبوبترین", + "recommendation.option.recommended.for.you": "Recommended For You", "recommendation.product-card.pill-text.course": "دوره آموزشی", "recommendation.product-card.pill-text.professional-certificate": "گواهی حرفه‌ای", "recommendation.product-card.pill-text.emeritus": "ارائه شده در Emeritus", @@ -160,9 +154,6 @@ "terms.of.service": "شرایط استفاده از خدمات", "registration.username.suggestion.label": "پیشنهادشده:", "did.you.mean.alert.text": "منظور شما این بود", - "register.page.terms.of.service.and.honor.code": "با ایجاد یک حساب کاربری، با {tosAndHonorCode} موافقت می‌کنید و تصدیق می‌کنید که {platformName} و هر عضو داده‌های شخصی شما را مطابق با {privacyPolicy} پردازش می‌کنند.", - "register.page.honor.code": "من با {platformName} {tosAndHonorCode} موافقم", - "register.page.terms.of.service": "من با {platformName} {termsOfService} موافقم", "sign.in": "ورود", "reset.password.page.title": "بازتنظیم گذرواژه | {siteName}", "reset.password": "بازتنظیم گذرواژه", @@ -176,5 +167,15 @@ "reset.server.rate.limit.error": "تعداد درخواست‌ها خیلی زیاد است.", "reset.password.success.heading": "بازتنظیم گذرواژه  تکمیل شد.", "reset.password.success": "گذرواژه شما بازتنظیم شد. وارد حساب کاربری خود شوید", - "rate.limit.error": "به دلیل درخواست‌های زیاد، خطایی روی داده است. لطفا بعد از مدتی دوباره امتحان کنید." + "rate.limit.error": "به دلیل درخواست‌های زیاد، خطایی روی داده است. لطفا بعد از مدتی دوباره امتحان کنید.", + "start.learning": "آغاز یادگیری", + "with.site.name": "با {siteName}", + "your.career.turning.point": "نقطه عطف حرفه ای شما", + "is.here": "اینجاست.", + "welcome.to.platform": "خوش آمدید به {siteName}, {username}!", + "complete.your.profile.1": "کامل", + "complete.your.profile.2": "پرونده کاربری شما", + "register.page.terms.of.service.and.honor.code": "By creating an account, you agree to the {tosAndHonorCode} and you acknowledge that {platformName} and each Member process your personal data in accordance with the {privacyPolicy}.", + "register.page.honor.code": "I agree to the {platformName} {tosAndHonorCode}", + "register.page.terms.of.service": "I agree to the {platformName} {termsOfService}" } \ No newline at end of file diff --git a/src/i18n/messages/fr.json b/src/i18n/messages/fr.json index 241fe9376d..6c9bfec56c 100644 --- a/src/i18n/messages/fr.json +++ b/src/i18n/messages/fr.json @@ -1,11 +1,5 @@ { - "start.learning": "Démarrer l'apprentissage", - "with.site.name": "avec {siteName}", - "your.career.turning.point": "Your career turning point", - "is.here": "is here.", - "welcome.to.platform": "Bienvenue sur {siteName}, {username}!", - "complete.your.profile.1": "Terminé", - "complete.your.profile.2": "votre profil", + "error.notfound.message": "La page que vous recherchez n'est pas disponible ou il y a une erreur dans l'URL. Veuillez vérifier l'URL et réessayer.", "institution.login.page.sub.heading": "Sélectionner votre institution dans la liste ci-dessous", "logistration.sign.in": "Connectez-vous", "logistration.register": "S'inscrire", @@ -26,8 +20,7 @@ "registration.using.tpa.form.heading": "Terminer la création de votre compte", "zendesk.supportTitle": "edX Support", "zendesk.selectTicketForm": "Please choose your request type:", - "error.notfound.message": "La page que vous recherchez n'est pas disponible ou il y a une erreur dans l'URL. Veuillez vérifier l'URL et réessayer.", - "forgot.password.confirmation.message": "Nous avons envoyé un courriel à {email} avec des instructions pour réinitialiser votre mot de passe.\n Si vous ne recevez pas de message de réinitialisation de mot de passe après 1 minute, vérifiez que vous avez saisi\nl'adresse courriel correctement, ou vérifiez votre dossier de courriel indésirable. Si vous avez besoin d'aide supplémentaire, {supportLink}.", + "forgot.password.confirmation.message": "We sent an email to {email} with instructions to reset your password. If you do not receive a password reset message after 1 minute, verify that you entered the correct email address, or check your spam folder. If you need further assistance, {supportLink}.", "forgot.password.page.title": " Mot de passe oublié | {siteName}", "forgot.password.page.heading": "Réinitialiser le mot de passe", "forgot.password.page.instructions": "Veuillez entrer votre adresse courriel ci-dessous et nous vous enverrons un courriel avec les instructions pour réinitialiser votre mot de passe.", @@ -42,7 +35,7 @@ "confirmation.message.title": "Vérifiez votre email", "confirmation.support.link": "contacter le support technique", "need.help.sign.in.text": "Besoin d'aide pour vous enregistrer?", - "additional.help.text": "For additional help, contact {platformName} support at ", + "additional.help.text": "For additional help, contact {platformName} support at", "sign.in.text": "Connectez-vous", "extend.field.errors": "{emailError} ci-dessous.", "invalid.token.heading": "Lien de réinitialisation du mot de passe non valide", @@ -53,9 +46,9 @@ "token.validation.internal.sever.error": "Une erreur est survenue. Essayer de rafraîchir la page, ou vérifier votre connexion Internet.", "internal.server.error": "Une erreur est survenue. Essayer de rafraîchir la page, ou vérifier votre connexion Internet.", "account.activation.error.message": "Une erreur s'est produite, veuillez {supportLink} pour résoudre ce problème.", - "login.inactive.user.error": "Pour vous connecter, vous devez activer votre compte.{lineBreak}\n {lineBreak}Nous venons d'envoyer un lien d'activation à {email}. Si vous ne recevez pas de courriel,\n vérifiez vos dossiers de spam ou {supportLink}.", + "login.inactive.user.error": "In order to sign in, you need to activate your account.{lineBreak} {lineBreak}We just sent an activation link to {email}. If you do not receive an email, check your spam folders or {supportLink}.", "allowed.domain.login.error": "As {allowedDomain} user, You must login with your {allowedDomain} {tpaLink}.", - "login.incorrect.credentials.error.attempts.text.1": "Le nom d'utilisateur, le courriel ou le mot de passe que vous avez entré est incorrect. Vous avez {remainingAttempts} tentatives\n de connexion avant que votre compte soit temporairement verrouillé.", + "login.incorrect.credentials.error.attempts.text.1": "The username, email or password you entered is incorrect. You have {remainingAttempts} more sign in attempts before your account is temporarily locked.", "login.incorrect.credentials.error.attempts.text.2": "Si vous avez oublié votre mot de passe, {resetLink}", "account.locked.out.message.2": "Par mesure de sécurité, vous pouvez {resetLink} avant de réessayer.", "login.incorrect.credentials.error.with.reset.link": "Le nom d'utilisateur, l'adresse courriel ou le mot de passe que vous avez saisis sont incorrects. Veuillez réessayer ou {resetLink}.", @@ -113,8 +106,9 @@ "recommendation.page.title": "Recommendations | {siteName}", "recommendation.page.heading": "We have a few recommendations to get you started.", "recommendation.skip.button": "Skip for now", - "recommendation.option.trending": "Trending", + "recommendation.option.trending": "Trending Now", "recommendation.option.popular": "Most Popular", + "recommendation.option.recommended.for.you": "Recommended For You", "recommendation.product-card.pill-text.course": "Course", "recommendation.product-card.pill-text.professional-certificate": "Professional Certificate", "recommendation.product-card.pill-text.emeritus": "Offered on Emeritus", @@ -160,9 +154,6 @@ "terms.of.service": " Conditions d'utilisation", "registration.username.suggestion.label": "Suggéré :", "did.you.mean.alert.text": "Vouliez-vous dire", - "register.page.terms.of.service.and.honor.code": "En créant un compte, vous acceptez le {tosAndHonorCode} et vous reconnaissez que {platformName} et chaque\n membre peut traiter vos données personnelles conformément à la {privacyPolicy}.", - "register.page.honor.code": "I agree to the {platformName} {tosAndHonorCode}", - "register.page.terms.of.service": "I agree to the {platformName} {termsOfService}", "sign.in": "Connectez-vous", "reset.password.page.title": "Réinitialiser le mot de passe | {siteName}", "reset.password": "Réinitialiser le mot de passe", @@ -176,5 +167,15 @@ "reset.server.rate.limit.error": "Trop de demandes.", "reset.password.success.heading": "Réinitialisation du mot de passe complétée.", "reset.password.success": "Votre mot de passe a été réinitialisé. Connectez-vous à votre compte.", - "rate.limit.error": "Une erreur s'est produite en raison d'un trop grand nombre de demandes. Veuillez réessayer après un certain temps." + "rate.limit.error": "Une erreur s'est produite en raison d'un trop grand nombre de demandes. Veuillez réessayer après un certain temps.", + "start.learning": "Démarrer l'apprentissage", + "with.site.name": "avec {siteName}", + "your.career.turning.point": "Your career turning point", + "is.here": "is here.", + "welcome.to.platform": "Bienvenue sur {siteName}, {username}!", + "complete.your.profile.1": "Terminé", + "complete.your.profile.2": "votre profil", + "register.page.terms.of.service.and.honor.code": "By creating an account, you agree to the {tosAndHonorCode} and you acknowledge that {platformName} and each Member process your personal data in accordance with the {privacyPolicy}.", + "register.page.honor.code": "I agree to the {platformName} {tosAndHonorCode}", + "register.page.terms.of.service": "I agree to the {platformName} {termsOfService}" } \ No newline at end of file diff --git a/src/i18n/messages/fr_CA.json b/src/i18n/messages/fr_CA.json index 95433ddf68..559a6deab9 100644 --- a/src/i18n/messages/fr_CA.json +++ b/src/i18n/messages/fr_CA.json @@ -1,11 +1,5 @@ { - "start.learning": "Commencez à apprendre", - "with.site.name": "avec {siteName}", - "your.career.turning.point": "Votre tournant de carrière", - "is.here": "est là.", - "welcome.to.platform": "Bienvenue sur {siteName}, {username}!", - "complete.your.profile.1": "Complet", - "complete.your.profile.2": "votre profil", + "error.notfound.message": "La page que vous recherchez n'est pas disponible ou il y a une erreur dans l'URL. Veuillez vérifier l'URL et réessayer.", "institution.login.page.sub.heading": "Sélectionner votre institution dans la liste ci-dessous", "logistration.sign.in": "Connexion", "logistration.register": "Inscription", @@ -26,8 +20,7 @@ "registration.using.tpa.form.heading": "Terminer la création de votre compte", "zendesk.supportTitle": "Prise en charge d'edX", "zendesk.selectTicketForm": "Veuillez choisir votre type de demande :", - "error.notfound.message": "La page que vous recherchez n'est pas disponible ou il y a une erreur dans l'URL. Veuillez vérifier l'URL et réessayer.", - "forgot.password.confirmation.message": "Nous avons envoyé un courriel à {email} avec des instructions pour réinitialiser votre mot de passe.\n Si vous ne recevez pas de message de réinitialisation de mot de passe après 1 minute, vérifiez que vous avez saisi\nl'adresse courriel correctement, ou vérifiez votre dossier de pourriels. Si vous avez besoin d'aide supplémentaire, {supportLink}.", + "forgot.password.confirmation.message": "Nous avons envoyé un courriel à {email} avec des instructions pour réinitialiser votre mot de passe. Si vous ne recevez pas de message de réinitialisation de mot de passe après 1 minute, vérifiez que vous avez saisi l'adresse courriel correctement, ou vérifiez votre dossier de pourriels. Si vous avez besoin d'aide supplémentaire, contactez {supportLink}.", "forgot.password.page.title": "Mot de passe oublié | {siteName}", "forgot.password.page.heading": "Réinitialiser le mot de passe", "forgot.password.page.instructions": "Veuillez entrer votre adresse courriel ci-dessous et nous vous enverrons un courriel avec les instructions pour réinitialiser votre mot de passe.", @@ -42,7 +35,7 @@ "confirmation.message.title": "Vérifiez votre courriel", "confirmation.support.link": "contacter le support technique", "need.help.sign.in.text": "Besoin d'aide pour vous connecter?", - "additional.help.text": "Pour obtenir une aide supplémentaire, contactez l'assistance {platformName} à l'adresse ", + "additional.help.text": "Pour obtenir de l'aide supplémentaire, contactez l'assistance {platformName} à l'adresse", "sign.in.text": "Connexion", "extend.field.errors": "{emailError} ci-dessous.", "invalid.token.heading": "Lien de réinitialisation du mot de passe non valide", @@ -53,9 +46,9 @@ "token.validation.internal.sever.error": "Une erreur est survenue. Essayer de rafraîchir la page, ou vérifier votre connexion Internet.", "internal.server.error": "Une erreur est survenue. Essayer de rafraîchir la page, ou vérifier votre connexion Internet.", "account.activation.error.message": "Une erreur s'est produite, veuillez {supportLink} pour résoudre ce problème.", - "login.inactive.user.error": "Pour vous connecter, vous devez activer votre compte.{lineBreak}\n {lineBreak}Nous venons d'envoyer un lien d'activation à {email}. Si vous ne recevez pas de courriel,\n vérifiez vos dossiers de pourriels ou {supportLink}.", + "login.inactive.user.error": "Pour vous connecter, vous devez activer votre compte.{lineBreak}{lineBreak}Nous venons d'envoyer un lien d'activation à {email}. Si vous ne recevez pas de courriel, vérifiez vos dossiers de pourriels ou {supportLink}.", "allowed.domain.login.error": "En tant qu'utilisateur {allowedDomain}, vous devez vous connecter avec votre {allowedDomain} {tpaLink}.", - "login.incorrect.credentials.error.attempts.text.1": "Le nom d'utilisateur, le courriel ou le mot de passe que vous avez entré sont incorrects. Vous avez {remainingAttempts} tentatives\n de connexion avant que votre compte soit temporairement verrouillé.", + "login.incorrect.credentials.error.attempts.text.1": "Le nom d'utilisateur, le courriel ou le mot de passe que vous avez entré sont incorrects. Vous avez {remainingAttempts} tentatives de connexion avant que votre compte soit temporairement verrouillé.", "login.incorrect.credentials.error.attempts.text.2": "Si vous avez oublié votre mot de passe, {resetLink}", "account.locked.out.message.2": "Par mesure de sécurité, vous pouvez {resetLink} avant de réessayer.", "login.incorrect.credentials.error.with.reset.link": "Le nom d'utilisateur, l'adresse courriel ou le mot de passe que vous avez saisis sont incorrects. Veuillez réessayer ou {resetLink}.", @@ -113,12 +106,13 @@ "recommendation.page.title": "Recommandations | {siteName}", "recommendation.page.heading": "Nous avons quelques recommandations pour vous aider à démarrer.", "recommendation.skip.button": "Ignorer pour l'instant", - "recommendation.option.trending": "Tendance", + "recommendation.option.trending": "Tendances actuelles", "recommendation.option.popular": "Le plus populaire", + "recommendation.option.recommended.for.you": "Recommandé pour vous", "recommendation.product-card.pill-text.course": "Cours", "recommendation.product-card.pill-text.professional-certificate": "Attestation professionnelle", "recommendation.product-card.pill-text.emeritus": "Offert à titre émérite", - "recommendation.product-card.pill-text.shorelight": "Offert par Shorelight", + "recommendation.product-card.pill-text.shorelight": "Offert via Shorelight", "recommendation.product-card.footer-text.number-of-courses": "{length} {label}", "recommendation.product-card.footer-text.subscription": "Abonnement", "recommendation.product-card.launch-icon.sr-text": "Ouvre un lien dans un nouvel onglet", @@ -160,9 +154,6 @@ "terms.of.service": "Conditions générales du service", "registration.username.suggestion.label": "Suggéré :", "did.you.mean.alert.text": "Vouliez-vous dire", - "register.page.terms.of.service.and.honor.code": "En créant un compte, vous acceptez le {tosAndHonorCode} et vous reconnaissez que {platformName} et chaque\n membre peut traiter vos données personnelles conformément à la {privacyPolicy}.", - "register.page.honor.code": "J'accepte le {tosAndHonorCode} {platformName}", - "register.page.terms.of.service": "J'accepte les {termsOfService} {platformName}", "sign.in": "Connexion", "reset.password.page.title": "Réinitialiser le mot de passe | {siteName}", "reset.password": "Réinitialiser le mot de passe", @@ -176,5 +167,15 @@ "reset.server.rate.limit.error": "Trop de demandes.", "reset.password.success.heading": "Réinitialisation du mot de passe complétée.", "reset.password.success": "Votre mot de passe a été réinitialisé. Connectez-vous à votre compte.", - "rate.limit.error": "Une erreur s'est produite en raison d'un trop grand nombre de demandes. Veuillez réessayer après un certain temps." + "rate.limit.error": "Une erreur s'est produite en raison d'un trop grand nombre de demandes. Veuillez réessayer après un certain temps.", + "start.learning": "Commencez à apprendre", + "with.site.name": "avec {siteName}", + "your.career.turning.point": "Un tournant dans votre carrière", + "is.here": "est là.", + "welcome.to.platform": "Bienvenue sur {siteName}, {username}!", + "complete.your.profile.1": "Complet", + "complete.your.profile.2": "votre profil", + "register.page.terms.of.service.and.honor.code": "En créant un compte, vous acceptez le {tosAndHonorCode} et vous reconnaissez que {platformName} et chaque membre traitent vos données personnelles conformément au {privacyPolicy}.", + "register.page.honor.code": "J'accepte le {tosAndHonorCode} {platformName}", + "register.page.terms.of.service": "J'accepte les {termsOfService} {platformName}" } \ No newline at end of file diff --git a/src/i18n/messages/hi.json b/src/i18n/messages/hi.json index 5c0dfae32e..283d1cc286 100644 --- a/src/i18n/messages/hi.json +++ b/src/i18n/messages/hi.json @@ -1,11 +1,5 @@ { - "start.learning": "Start learning", - "with.site.name": "with {siteName}", - "your.career.turning.point": "Your career turning point", - "is.here": "is here.", - "welcome.to.platform": "Welcome to {siteName}, {username}!", - "complete.your.profile.1": "Complete", - "complete.your.profile.2": "your profile", + "error.notfound.message": "The page you're looking for is unavailable or there's an error in the URL. Please check the URL and try again.", "institution.login.page.sub.heading": "Choose your institution from the list below", "logistration.sign.in": "Sign in", "logistration.register": "Register", @@ -26,8 +20,7 @@ "registration.using.tpa.form.heading": "Finish creating your account", "zendesk.supportTitle": "edX Support", "zendesk.selectTicketForm": "Please choose your request type:", - "error.notfound.message": "The page you're looking for is unavailable or there's an error in the URL. Please check the URL and try again.", - "forgot.password.confirmation.message": "We sent an email to {email} with instructions to reset your password.\n If you do not receive a password reset message after 1 minute, verify that you entered\n the correct email address, or check your spam folder. If you need further assistance, {supportLink}.", + "forgot.password.confirmation.message": "We sent an email to {email} with instructions to reset your password. If you do not receive a password reset message after 1 minute, verify that you entered the correct email address, or check your spam folder. If you need further assistance, {supportLink}.", "forgot.password.page.title": "Forgot Password | {siteName}", "forgot.password.page.heading": "Reset password", "forgot.password.page.instructions": "Please enter your email address below and we will send you an email with instructions on how to reset your password.", @@ -42,7 +35,7 @@ "confirmation.message.title": "Check your email", "confirmation.support.link": "contact technical support", "need.help.sign.in.text": "Need help signing in?", - "additional.help.text": "For additional help, contact {platformName} support at ", + "additional.help.text": "For additional help, contact {platformName} support at", "sign.in.text": "Sign in", "extend.field.errors": "{emailError} below.", "invalid.token.heading": "Invalid password reset link", @@ -53,9 +46,9 @@ "token.validation.internal.sever.error": "An error has occurred. Try refreshing the page, or check your internet connection.", "internal.server.error": "An error has occurred. Try refreshing the page, or check your internet connection.", "account.activation.error.message": "Something went wrong, please {supportLink} to resolve this issue.", - "login.inactive.user.error": "In order to sign in, you need to activate your account.{lineBreak}\n {lineBreak}We just sent an activation link to {email}. If you do not receive an email,\n check your spam folders or {supportLink}.", + "login.inactive.user.error": "In order to sign in, you need to activate your account.{lineBreak} {lineBreak}We just sent an activation link to {email}. If you do not receive an email, check your spam folders or {supportLink}.", "allowed.domain.login.error": "As {allowedDomain} user, You must login with your {allowedDomain} {tpaLink}.", - "login.incorrect.credentials.error.attempts.text.1": "The username, email or password you entered is incorrect. You have {remainingAttempts} more sign in\n attempts before your account is temporarily locked.", + "login.incorrect.credentials.error.attempts.text.1": "The username, email or password you entered is incorrect. You have {remainingAttempts} more sign in attempts before your account is temporarily locked.", "login.incorrect.credentials.error.attempts.text.2": "If you've forgotten your password, {resetLink}", "account.locked.out.message.2": "To be on the safe side, you can {resetLink} before trying again.", "login.incorrect.credentials.error.with.reset.link": "The username, email, or password you entered is incorrect. Please try again or {resetLink}.", @@ -113,8 +106,9 @@ "recommendation.page.title": "Recommendations | {siteName}", "recommendation.page.heading": "We have a few recommendations to get you started.", "recommendation.skip.button": "Skip for now", - "recommendation.option.trending": "Trending", + "recommendation.option.trending": "Trending Now", "recommendation.option.popular": "Most Popular", + "recommendation.option.recommended.for.you": "Recommended For You", "recommendation.product-card.pill-text.course": "Course", "recommendation.product-card.pill-text.professional-certificate": "Professional Certificate", "recommendation.product-card.pill-text.emeritus": "Offered on Emeritus", @@ -160,9 +154,6 @@ "terms.of.service": "Terms of Service", "registration.username.suggestion.label": "Suggested:", "did.you.mean.alert.text": "Did you mean", - "register.page.terms.of.service.and.honor.code": "By creating an account, you agree to the {tosAndHonorCode} and you acknowledge that {platformName} and each\n Member process your personal data in accordance with the {privacyPolicy}.", - "register.page.honor.code": "I agree to the {platformName} {tosAndHonorCode}", - "register.page.terms.of.service": "I agree to the {platformName} {termsOfService}", "sign.in": "Sign in", "reset.password.page.title": "Reset Password | {siteName}", "reset.password": "Reset password", @@ -176,5 +167,15 @@ "reset.server.rate.limit.error": "Too many requests.", "reset.password.success.heading": "Password reset complete.", "reset.password.success": "Your password has been reset. Sign in to your account.", - "rate.limit.error": "An error has occurred because of too many requests. Please try again after some time." + "rate.limit.error": "An error has occurred because of too many requests. Please try again after some time.", + "start.learning": "Start learning", + "with.site.name": "with {siteName}", + "your.career.turning.point": "Your career turning point", + "is.here": "is here.", + "welcome.to.platform": "Welcome to {siteName}, {username}!", + "complete.your.profile.1": "Complete", + "complete.your.profile.2": "your profile", + "register.page.terms.of.service.and.honor.code": "By creating an account, you agree to the {tosAndHonorCode} and you acknowledge that {platformName} and each Member process your personal data in accordance with the {privacyPolicy}.", + "register.page.honor.code": "I agree to the {platformName} {tosAndHonorCode}", + "register.page.terms.of.service": "I agree to the {platformName} {termsOfService}" } \ No newline at end of file diff --git a/src/i18n/messages/it.json b/src/i18n/messages/it.json index 5c0dfae32e..283d1cc286 100644 --- a/src/i18n/messages/it.json +++ b/src/i18n/messages/it.json @@ -1,11 +1,5 @@ { - "start.learning": "Start learning", - "with.site.name": "with {siteName}", - "your.career.turning.point": "Your career turning point", - "is.here": "is here.", - "welcome.to.platform": "Welcome to {siteName}, {username}!", - "complete.your.profile.1": "Complete", - "complete.your.profile.2": "your profile", + "error.notfound.message": "The page you're looking for is unavailable or there's an error in the URL. Please check the URL and try again.", "institution.login.page.sub.heading": "Choose your institution from the list below", "logistration.sign.in": "Sign in", "logistration.register": "Register", @@ -26,8 +20,7 @@ "registration.using.tpa.form.heading": "Finish creating your account", "zendesk.supportTitle": "edX Support", "zendesk.selectTicketForm": "Please choose your request type:", - "error.notfound.message": "The page you're looking for is unavailable or there's an error in the URL. Please check the URL and try again.", - "forgot.password.confirmation.message": "We sent an email to {email} with instructions to reset your password.\n If you do not receive a password reset message after 1 minute, verify that you entered\n the correct email address, or check your spam folder. If you need further assistance, {supportLink}.", + "forgot.password.confirmation.message": "We sent an email to {email} with instructions to reset your password. If you do not receive a password reset message after 1 minute, verify that you entered the correct email address, or check your spam folder. If you need further assistance, {supportLink}.", "forgot.password.page.title": "Forgot Password | {siteName}", "forgot.password.page.heading": "Reset password", "forgot.password.page.instructions": "Please enter your email address below and we will send you an email with instructions on how to reset your password.", @@ -42,7 +35,7 @@ "confirmation.message.title": "Check your email", "confirmation.support.link": "contact technical support", "need.help.sign.in.text": "Need help signing in?", - "additional.help.text": "For additional help, contact {platformName} support at ", + "additional.help.text": "For additional help, contact {platformName} support at", "sign.in.text": "Sign in", "extend.field.errors": "{emailError} below.", "invalid.token.heading": "Invalid password reset link", @@ -53,9 +46,9 @@ "token.validation.internal.sever.error": "An error has occurred. Try refreshing the page, or check your internet connection.", "internal.server.error": "An error has occurred. Try refreshing the page, or check your internet connection.", "account.activation.error.message": "Something went wrong, please {supportLink} to resolve this issue.", - "login.inactive.user.error": "In order to sign in, you need to activate your account.{lineBreak}\n {lineBreak}We just sent an activation link to {email}. If you do not receive an email,\n check your spam folders or {supportLink}.", + "login.inactive.user.error": "In order to sign in, you need to activate your account.{lineBreak} {lineBreak}We just sent an activation link to {email}. If you do not receive an email, check your spam folders or {supportLink}.", "allowed.domain.login.error": "As {allowedDomain} user, You must login with your {allowedDomain} {tpaLink}.", - "login.incorrect.credentials.error.attempts.text.1": "The username, email or password you entered is incorrect. You have {remainingAttempts} more sign in\n attempts before your account is temporarily locked.", + "login.incorrect.credentials.error.attempts.text.1": "The username, email or password you entered is incorrect. You have {remainingAttempts} more sign in attempts before your account is temporarily locked.", "login.incorrect.credentials.error.attempts.text.2": "If you've forgotten your password, {resetLink}", "account.locked.out.message.2": "To be on the safe side, you can {resetLink} before trying again.", "login.incorrect.credentials.error.with.reset.link": "The username, email, or password you entered is incorrect. Please try again or {resetLink}.", @@ -113,8 +106,9 @@ "recommendation.page.title": "Recommendations | {siteName}", "recommendation.page.heading": "We have a few recommendations to get you started.", "recommendation.skip.button": "Skip for now", - "recommendation.option.trending": "Trending", + "recommendation.option.trending": "Trending Now", "recommendation.option.popular": "Most Popular", + "recommendation.option.recommended.for.you": "Recommended For You", "recommendation.product-card.pill-text.course": "Course", "recommendation.product-card.pill-text.professional-certificate": "Professional Certificate", "recommendation.product-card.pill-text.emeritus": "Offered on Emeritus", @@ -160,9 +154,6 @@ "terms.of.service": "Terms of Service", "registration.username.suggestion.label": "Suggested:", "did.you.mean.alert.text": "Did you mean", - "register.page.terms.of.service.and.honor.code": "By creating an account, you agree to the {tosAndHonorCode} and you acknowledge that {platformName} and each\n Member process your personal data in accordance with the {privacyPolicy}.", - "register.page.honor.code": "I agree to the {platformName} {tosAndHonorCode}", - "register.page.terms.of.service": "I agree to the {platformName} {termsOfService}", "sign.in": "Sign in", "reset.password.page.title": "Reset Password | {siteName}", "reset.password": "Reset password", @@ -176,5 +167,15 @@ "reset.server.rate.limit.error": "Too many requests.", "reset.password.success.heading": "Password reset complete.", "reset.password.success": "Your password has been reset. Sign in to your account.", - "rate.limit.error": "An error has occurred because of too many requests. Please try again after some time." + "rate.limit.error": "An error has occurred because of too many requests. Please try again after some time.", + "start.learning": "Start learning", + "with.site.name": "with {siteName}", + "your.career.turning.point": "Your career turning point", + "is.here": "is here.", + "welcome.to.platform": "Welcome to {siteName}, {username}!", + "complete.your.profile.1": "Complete", + "complete.your.profile.2": "your profile", + "register.page.terms.of.service.and.honor.code": "By creating an account, you agree to the {tosAndHonorCode} and you acknowledge that {platformName} and each Member process your personal data in accordance with the {privacyPolicy}.", + "register.page.honor.code": "I agree to the {platformName} {tosAndHonorCode}", + "register.page.terms.of.service": "I agree to the {platformName} {termsOfService}" } \ No newline at end of file diff --git a/src/i18n/messages/it_IT.json b/src/i18n/messages/it_IT.json index 0e91e1b6d7..87c6b92054 100644 --- a/src/i18n/messages/it_IT.json +++ b/src/i18n/messages/it_IT.json @@ -1,11 +1,5 @@ { - "start.learning": "Inizia a imparare", - "with.site.name": "con {siteName}", - "your.career.turning.point": "Your career turning point", - "is.here": "is here.", - "welcome.to.platform": "Benvenuto in {siteName}, {username}!", - "complete.your.profile.1": "Completata", - "complete.your.profile.2": "Il tuo profilo", + "error.notfound.message": "La pagina che stai cercando non è disponibile o si è verificato un errore nell'URL. Controlla l'URL e riprova. ", "institution.login.page.sub.heading": "Scegli il tuo istituto dall'elenco sottostante", "logistration.sign.in": "Accedi", "logistration.register": "Registrazione", @@ -26,8 +20,7 @@ "registration.using.tpa.form.heading": "Completa la creazione del tuo account", "zendesk.supportTitle": "edX Support", "zendesk.selectTicketForm": "Please choose your request type:", - "error.notfound.message": "La pagina che stai cercando non è disponibile o si è verificato un errore nell'URL. Controlla l'URL e riprova. ", - "forgot.password.confirmation.message": "Abbiamo inviato un'email a {email} con le istruzioni per reimpostare la password. Se non ricevi un messaggio di reimpostazione della password dopo 1 minuto, verifica di aver inserito l'indirizzo e-mail corretto o controlla la cartella spam. Se hai bisogno di ulteriore assistenza, {supportLink}.", + "forgot.password.confirmation.message": "We sent an email to {email} with instructions to reset your password. If you do not receive a password reset message after 1 minute, verify that you entered the correct email address, or check your spam folder. If you need further assistance, {supportLink}.", "forgot.password.page.title": "Dimenticato la password | {siteName}", "forgot.password.page.heading": "Resetta la password", "forgot.password.page.instructions": "Inserisci il tuo indirizzo e-mail qui sotto e ti invieremo un'e-mail con le istruzioni su come reimpostare la tua password.", @@ -42,7 +35,7 @@ "confirmation.message.title": "Controlla la tua casella di posta", "confirmation.support.link": "contatta il supporto tecnico", "need.help.sign.in.text": "Hai bisogno di aiuto per l'accesso? ", - "additional.help.text": "Per ulteriore assistenza, contattare l'assistenza {platformName} all'indirizzo", + "additional.help.text": "For additional help, contact {platformName} support at", "sign.in.text": "Accedi", "extend.field.errors": "{emailError} di seguito.", "invalid.token.heading": "Link di ripristino della password non valido", @@ -53,9 +46,9 @@ "token.validation.internal.sever.error": "Si è verificato un errore. Prova ad aggiornare la pagina oppure verifica la connessione internet.", "internal.server.error": "Si è verificato un errore. Prova ad aggiornare la pagina oppure verifica la connessione internet.", "account.activation.error.message": "Si è verificato un errore, seleziona {supportLink} per risolvere il problema. ", - "login.inactive.user.error": "Per accedere, devi attivare il tuo account.{lineBreak} {lineBreak}Abbiamo appena inviato un link di attivazione a {email}. Se non ricevi un'email, controlla la cartella della posta indesiderata oppure seleziona {supportLink}.", + "login.inactive.user.error": "In order to sign in, you need to activate your account.{lineBreak} {lineBreak}We just sent an activation link to {email}. If you do not receive an email, check your spam folders or {supportLink}.", "allowed.domain.login.error": "As {allowedDomain} user, You must login with your {allowedDomain} {tpaLink}.", - "login.incorrect.credentials.error.attempts.text.1": "Il nome utente, l'e-mail o la password che hai inserito non sono corretti. Hai {remainingAttempts} più tentativi di accesso prima che il tuo account venga temporaneamente bloccato.", + "login.incorrect.credentials.error.attempts.text.1": "The username, email or password you entered is incorrect. You have {remainingAttempts} more sign in attempts before your account is temporarily locked.", "login.incorrect.credentials.error.attempts.text.2": "Se hai dimenticato la password, {resetLink}", "account.locked.out.message.2": "Per sicurezza, puoi {resetLink} prima di riprovare.", "login.incorrect.credentials.error.with.reset.link": "Il nome utente, l'e-mail o la password inseriti non sono corretti. Riprova o {resetLink}.", @@ -113,8 +106,9 @@ "recommendation.page.title": "Recommendations | {siteName}", "recommendation.page.heading": "We have a few recommendations to get you started.", "recommendation.skip.button": "Skip for now", - "recommendation.option.trending": "Trending", + "recommendation.option.trending": "Trending Now", "recommendation.option.popular": "Most Popular", + "recommendation.option.recommended.for.you": "Recommended For You", "recommendation.product-card.pill-text.course": "Course", "recommendation.product-card.pill-text.professional-certificate": "Professional Certificate", "recommendation.product-card.pill-text.emeritus": "Offered on Emeritus", @@ -160,9 +154,6 @@ "terms.of.service": "Termini di Servizio", "registration.username.suggestion.label": "Suggerito:", "did.you.mean.alert.text": "Intendevi", - "register.page.terms.of.service.and.honor.code": "Creando un account, accetti il {tosAndHonorCode} e riconosci che {platformName} e ciascun Membro trattano i tuoi dati personali in conformità con l' {privacyPolicy}.", - "register.page.honor.code": "Accetto {platformName} {tosAndHonorCode}", - "register.page.terms.of.service": "Accetto {platformName} {termsOfService}", "sign.in": "Accedi", "reset.password.page.title": "Ripristina password | {siteName}", "reset.password": "Resetta la password", @@ -176,5 +167,15 @@ "reset.server.rate.limit.error": "Troppe richieste.", "reset.password.success.heading": "Ripristino della password completato.", "reset.password.success": "La tua password è stata resettata. Accedi al tuo account.", - "rate.limit.error": "Si è verificato un errore dovuto alle troppe richieste. Prova di nuovo più tardi." + "rate.limit.error": "Si è verificato un errore dovuto alle troppe richieste. Prova di nuovo più tardi.", + "start.learning": "Inizia a imparare", + "with.site.name": "con {siteName}", + "your.career.turning.point": "Your career turning point", + "is.here": "is here.", + "welcome.to.platform": "Benvenuto in {siteName}, {username}!", + "complete.your.profile.1": "Completata", + "complete.your.profile.2": "Il tuo profilo", + "register.page.terms.of.service.and.honor.code": "By creating an account, you agree to the {tosAndHonorCode} and you acknowledge that {platformName} and each Member process your personal data in accordance with the {privacyPolicy}.", + "register.page.honor.code": "I agree to the {platformName} {tosAndHonorCode}", + "register.page.terms.of.service": "I agree to the {platformName} {termsOfService}" } \ No newline at end of file diff --git a/src/i18n/messages/pt.json b/src/i18n/messages/pt.json index 5c0dfae32e..283d1cc286 100644 --- a/src/i18n/messages/pt.json +++ b/src/i18n/messages/pt.json @@ -1,11 +1,5 @@ { - "start.learning": "Start learning", - "with.site.name": "with {siteName}", - "your.career.turning.point": "Your career turning point", - "is.here": "is here.", - "welcome.to.platform": "Welcome to {siteName}, {username}!", - "complete.your.profile.1": "Complete", - "complete.your.profile.2": "your profile", + "error.notfound.message": "The page you're looking for is unavailable or there's an error in the URL. Please check the URL and try again.", "institution.login.page.sub.heading": "Choose your institution from the list below", "logistration.sign.in": "Sign in", "logistration.register": "Register", @@ -26,8 +20,7 @@ "registration.using.tpa.form.heading": "Finish creating your account", "zendesk.supportTitle": "edX Support", "zendesk.selectTicketForm": "Please choose your request type:", - "error.notfound.message": "The page you're looking for is unavailable or there's an error in the URL. Please check the URL and try again.", - "forgot.password.confirmation.message": "We sent an email to {email} with instructions to reset your password.\n If you do not receive a password reset message after 1 minute, verify that you entered\n the correct email address, or check your spam folder. If you need further assistance, {supportLink}.", + "forgot.password.confirmation.message": "We sent an email to {email} with instructions to reset your password. If you do not receive a password reset message after 1 minute, verify that you entered the correct email address, or check your spam folder. If you need further assistance, {supportLink}.", "forgot.password.page.title": "Forgot Password | {siteName}", "forgot.password.page.heading": "Reset password", "forgot.password.page.instructions": "Please enter your email address below and we will send you an email with instructions on how to reset your password.", @@ -42,7 +35,7 @@ "confirmation.message.title": "Check your email", "confirmation.support.link": "contact technical support", "need.help.sign.in.text": "Need help signing in?", - "additional.help.text": "For additional help, contact {platformName} support at ", + "additional.help.text": "For additional help, contact {platformName} support at", "sign.in.text": "Sign in", "extend.field.errors": "{emailError} below.", "invalid.token.heading": "Invalid password reset link", @@ -53,9 +46,9 @@ "token.validation.internal.sever.error": "An error has occurred. Try refreshing the page, or check your internet connection.", "internal.server.error": "An error has occurred. Try refreshing the page, or check your internet connection.", "account.activation.error.message": "Something went wrong, please {supportLink} to resolve this issue.", - "login.inactive.user.error": "In order to sign in, you need to activate your account.{lineBreak}\n {lineBreak}We just sent an activation link to {email}. If you do not receive an email,\n check your spam folders or {supportLink}.", + "login.inactive.user.error": "In order to sign in, you need to activate your account.{lineBreak} {lineBreak}We just sent an activation link to {email}. If you do not receive an email, check your spam folders or {supportLink}.", "allowed.domain.login.error": "As {allowedDomain} user, You must login with your {allowedDomain} {tpaLink}.", - "login.incorrect.credentials.error.attempts.text.1": "The username, email or password you entered is incorrect. You have {remainingAttempts} more sign in\n attempts before your account is temporarily locked.", + "login.incorrect.credentials.error.attempts.text.1": "The username, email or password you entered is incorrect. You have {remainingAttempts} more sign in attempts before your account is temporarily locked.", "login.incorrect.credentials.error.attempts.text.2": "If you've forgotten your password, {resetLink}", "account.locked.out.message.2": "To be on the safe side, you can {resetLink} before trying again.", "login.incorrect.credentials.error.with.reset.link": "The username, email, or password you entered is incorrect. Please try again or {resetLink}.", @@ -113,8 +106,9 @@ "recommendation.page.title": "Recommendations | {siteName}", "recommendation.page.heading": "We have a few recommendations to get you started.", "recommendation.skip.button": "Skip for now", - "recommendation.option.trending": "Trending", + "recommendation.option.trending": "Trending Now", "recommendation.option.popular": "Most Popular", + "recommendation.option.recommended.for.you": "Recommended For You", "recommendation.product-card.pill-text.course": "Course", "recommendation.product-card.pill-text.professional-certificate": "Professional Certificate", "recommendation.product-card.pill-text.emeritus": "Offered on Emeritus", @@ -160,9 +154,6 @@ "terms.of.service": "Terms of Service", "registration.username.suggestion.label": "Suggested:", "did.you.mean.alert.text": "Did you mean", - "register.page.terms.of.service.and.honor.code": "By creating an account, you agree to the {tosAndHonorCode} and you acknowledge that {platformName} and each\n Member process your personal data in accordance with the {privacyPolicy}.", - "register.page.honor.code": "I agree to the {platformName} {tosAndHonorCode}", - "register.page.terms.of.service": "I agree to the {platformName} {termsOfService}", "sign.in": "Sign in", "reset.password.page.title": "Reset Password | {siteName}", "reset.password": "Reset password", @@ -176,5 +167,15 @@ "reset.server.rate.limit.error": "Too many requests.", "reset.password.success.heading": "Password reset complete.", "reset.password.success": "Your password has been reset. Sign in to your account.", - "rate.limit.error": "An error has occurred because of too many requests. Please try again after some time." + "rate.limit.error": "An error has occurred because of too many requests. Please try again after some time.", + "start.learning": "Start learning", + "with.site.name": "with {siteName}", + "your.career.turning.point": "Your career turning point", + "is.here": "is here.", + "welcome.to.platform": "Welcome to {siteName}, {username}!", + "complete.your.profile.1": "Complete", + "complete.your.profile.2": "your profile", + "register.page.terms.of.service.and.honor.code": "By creating an account, you agree to the {tosAndHonorCode} and you acknowledge that {platformName} and each Member process your personal data in accordance with the {privacyPolicy}.", + "register.page.honor.code": "I agree to the {platformName} {tosAndHonorCode}", + "register.page.terms.of.service": "I agree to the {platformName} {termsOfService}" } \ No newline at end of file diff --git a/src/i18n/messages/pt_PT.json b/src/i18n/messages/pt_PT.json index fb7cf9f1c0..32127edbbc 100644 --- a/src/i18n/messages/pt_PT.json +++ b/src/i18n/messages/pt_PT.json @@ -1,11 +1,5 @@ { - "start.learning": "Começar a aprender", - "with.site.name": "com {siteName}", - "your.career.turning.point": "Your career turning point", - "is.here": "is here.", - "welcome.to.platform": "Bem vindo a {siteName}, {username}!", - "complete.your.profile.1": "Concluído", - "complete.your.profile.2": "o seu perfil", + "error.notfound.message": "A página que procura não está disponível ou há um erro no URL. Por favor, verifique o URL e tente novamente.", "institution.login.page.sub.heading": "Escolha a sua instituição a partir da lista abaixo", "logistration.sign.in": "Iniciar sessão", "logistration.register": "Registe-se", @@ -26,8 +20,7 @@ "registration.using.tpa.form.heading": "Acabe de criar a sua conta", "zendesk.supportTitle": "Apoio edX", "zendesk.selectTicketForm": "Por favor, escolha o seu tipo de pedido:", - "error.notfound.message": "A página que procura não está disponível ou há um erro no URL. Por favor, verifique o URL e tente novamente.", - "forgot.password.confirmation.message": "Enviámos um email para {email} com instruções para redefinir a sua palavra-passe.\n Se não receber uma mensagem de redefinição de palavra-passe após 1 minuto, verifique se introduziu\n o endereço de correio electrónico correto, ou verifique a sua pasta de spam. Se precisar de mais assistência, {supportLink}.", + "forgot.password.confirmation.message": "We sent an email to {email} with instructions to reset your password. If you do not receive a password reset message after 1 minute, verify that you entered the correct email address, or check your spam folder. If you need further assistance, {supportLink}.", "forgot.password.page.title": "Esqueceu a Senha | {siteName}", "forgot.password.page.heading": "Redefinir palavra-passe", "forgot.password.page.instructions": "Por favor introduza o seu endereço de email abaixo e enviar-lhe-emos um email com instruções sobre como redefinir a sua palavra-passe.", @@ -42,7 +35,7 @@ "confirmation.message.title": "Verifique o seu email", "confirmation.support.link": "contacto o suporte técnico", "need.help.sign.in.text": "Precisa de ajuda para entrar?", - "additional.help.text": "Para ajuda adicional, contacte o apoio {platformName} em", + "additional.help.text": "For additional help, contact {platformName} support at", "sign.in.text": "Iniciar sessão", "extend.field.errors": "{emailError} abaixo.", "invalid.token.heading": "Link para Redefinir Palavra-passe inválido", @@ -53,9 +46,9 @@ "token.validation.internal.sever.error": "Ocorreu um erro. Tente actualizar a página, ou verifique a sua ligação à Internet.", "internal.server.error": "Ocorreu um erro. Tente actualizar a página, ou verifique a sua ligação à Internet.", "account.activation.error.message": "Alguma coisa correu mal, siga {supportLink} para resolver esta questão.", - "login.inactive.user.error": "Para iniciar sessão, precisa ativar a sua conta. {lineBreak}\n {lineBreak} Acabámos de enviar um link de ativação para {email}. Se não receber um e-mail,\n verifique as suas pastas de spam ou {supportLink}.", + "login.inactive.user.error": "In order to sign in, you need to activate your account.{lineBreak} {lineBreak}We just sent an activation link to {email}. If you do not receive an email, check your spam folders or {supportLink}.", "allowed.domain.login.error": "Como utilizador do {allowedDomain}, deve iniciar sessão com o seu {allowedDomain} {tpaLink}.", - "login.incorrect.credentials.error.attempts.text.1": "O nome de utilizador, email ou palavra-passe que introduziu está incorreto. Tem {remainingAttempts} mais tentativas\n de login antes da sua conta ser temporariamente bloqueada.", + "login.incorrect.credentials.error.attempts.text.1": "The username, email or password you entered is incorrect. You have {remainingAttempts} more sign in attempts before your account is temporarily locked.", "login.incorrect.credentials.error.attempts.text.2": "Se esqueceu a sua palavra-passe, {resetLink}", "account.locked.out.message.2": "Por precaução, pode {resetLink} antes de tentar novamente.", "login.incorrect.credentials.error.with.reset.link": "O nome de utilizador, email ou senha que introduziu está incorreto. Por favor, tente novamente ou {resetLink}.", @@ -113,8 +106,9 @@ "recommendation.page.title": "Recomendações | {siteName}", "recommendation.page.heading": "Temos algumas recomendações para o ajudar a começar.", "recommendation.skip.button": "Saltar por enquanto", - "recommendation.option.trending": "Trending", + "recommendation.option.trending": "Trending Now", "recommendation.option.popular": "Most Popular", + "recommendation.option.recommended.for.you": "Recommended For You", "recommendation.product-card.pill-text.course": "Course", "recommendation.product-card.pill-text.professional-certificate": "Professional Certificate", "recommendation.product-card.pill-text.emeritus": "Offered on Emeritus", @@ -160,9 +154,6 @@ "terms.of.service": "Termos do Serviço", "registration.username.suggestion.label": "Sugerido:", "did.you.mean.alert.text": "Quis dizer", - "register.page.terms.of.service.and.honor.code": "Ao criar uma conta, concorda com o {tosAndHonorCode} e reconhece que {platformName} e cada\n Membro processa os seus dados pessoais em conformidade com a {privacyPolicy}.", - "register.page.honor.code": "Concordo com a {tosAndHonorCode} {platformName}", - "register.page.terms.of.service": "Concordo com os {termsOfService} {platformName}", "sign.in": "Iniciar sessão", "reset.password.page.title": "Redefinir Palavra-passe | {siteName}", "reset.password": "Redefinir palavra-passe", @@ -176,5 +167,15 @@ "reset.server.rate.limit.error": "Demasiados pedidos.", "reset.password.success.heading": "Redefinição de palavra-passe concluída", "reset.password.success": "A sua palavra-passe foi redefinida. Inicie sessão na sua conta.", - "rate.limit.error": "Ocorreu um erro devido a demasiados pedidos. Por favor, tente novamente após algum tempo." + "rate.limit.error": "Ocorreu um erro devido a demasiados pedidos. Por favor, tente novamente após algum tempo.", + "start.learning": "Começar a aprender", + "with.site.name": "com {siteName}", + "your.career.turning.point": "Your career turning point", + "is.here": "is here.", + "welcome.to.platform": "Bem vindo a {siteName}, {username}!", + "complete.your.profile.1": "Concluído", + "complete.your.profile.2": "o seu perfil", + "register.page.terms.of.service.and.honor.code": "By creating an account, you agree to the {tosAndHonorCode} and you acknowledge that {platformName} and each Member process your personal data in accordance with the {privacyPolicy}.", + "register.page.honor.code": "I agree to the {platformName} {tosAndHonorCode}", + "register.page.terms.of.service": "I agree to the {platformName} {termsOfService}" } \ No newline at end of file diff --git a/src/i18n/messages/ru.json b/src/i18n/messages/ru.json index 5c0dfae32e..283d1cc286 100644 --- a/src/i18n/messages/ru.json +++ b/src/i18n/messages/ru.json @@ -1,11 +1,5 @@ { - "start.learning": "Start learning", - "with.site.name": "with {siteName}", - "your.career.turning.point": "Your career turning point", - "is.here": "is here.", - "welcome.to.platform": "Welcome to {siteName}, {username}!", - "complete.your.profile.1": "Complete", - "complete.your.profile.2": "your profile", + "error.notfound.message": "The page you're looking for is unavailable or there's an error in the URL. Please check the URL and try again.", "institution.login.page.sub.heading": "Choose your institution from the list below", "logistration.sign.in": "Sign in", "logistration.register": "Register", @@ -26,8 +20,7 @@ "registration.using.tpa.form.heading": "Finish creating your account", "zendesk.supportTitle": "edX Support", "zendesk.selectTicketForm": "Please choose your request type:", - "error.notfound.message": "The page you're looking for is unavailable or there's an error in the URL. Please check the URL and try again.", - "forgot.password.confirmation.message": "We sent an email to {email} with instructions to reset your password.\n If you do not receive a password reset message after 1 minute, verify that you entered\n the correct email address, or check your spam folder. If you need further assistance, {supportLink}.", + "forgot.password.confirmation.message": "We sent an email to {email} with instructions to reset your password. If you do not receive a password reset message after 1 minute, verify that you entered the correct email address, or check your spam folder. If you need further assistance, {supportLink}.", "forgot.password.page.title": "Forgot Password | {siteName}", "forgot.password.page.heading": "Reset password", "forgot.password.page.instructions": "Please enter your email address below and we will send you an email with instructions on how to reset your password.", @@ -42,7 +35,7 @@ "confirmation.message.title": "Check your email", "confirmation.support.link": "contact technical support", "need.help.sign.in.text": "Need help signing in?", - "additional.help.text": "For additional help, contact {platformName} support at ", + "additional.help.text": "For additional help, contact {platformName} support at", "sign.in.text": "Sign in", "extend.field.errors": "{emailError} below.", "invalid.token.heading": "Invalid password reset link", @@ -53,9 +46,9 @@ "token.validation.internal.sever.error": "An error has occurred. Try refreshing the page, or check your internet connection.", "internal.server.error": "An error has occurred. Try refreshing the page, or check your internet connection.", "account.activation.error.message": "Something went wrong, please {supportLink} to resolve this issue.", - "login.inactive.user.error": "In order to sign in, you need to activate your account.{lineBreak}\n {lineBreak}We just sent an activation link to {email}. If you do not receive an email,\n check your spam folders or {supportLink}.", + "login.inactive.user.error": "In order to sign in, you need to activate your account.{lineBreak} {lineBreak}We just sent an activation link to {email}. If you do not receive an email, check your spam folders or {supportLink}.", "allowed.domain.login.error": "As {allowedDomain} user, You must login with your {allowedDomain} {tpaLink}.", - "login.incorrect.credentials.error.attempts.text.1": "The username, email or password you entered is incorrect. You have {remainingAttempts} more sign in\n attempts before your account is temporarily locked.", + "login.incorrect.credentials.error.attempts.text.1": "The username, email or password you entered is incorrect. You have {remainingAttempts} more sign in attempts before your account is temporarily locked.", "login.incorrect.credentials.error.attempts.text.2": "If you've forgotten your password, {resetLink}", "account.locked.out.message.2": "To be on the safe side, you can {resetLink} before trying again.", "login.incorrect.credentials.error.with.reset.link": "The username, email, or password you entered is incorrect. Please try again or {resetLink}.", @@ -113,8 +106,9 @@ "recommendation.page.title": "Recommendations | {siteName}", "recommendation.page.heading": "We have a few recommendations to get you started.", "recommendation.skip.button": "Skip for now", - "recommendation.option.trending": "Trending", + "recommendation.option.trending": "Trending Now", "recommendation.option.popular": "Most Popular", + "recommendation.option.recommended.for.you": "Recommended For You", "recommendation.product-card.pill-text.course": "Course", "recommendation.product-card.pill-text.professional-certificate": "Professional Certificate", "recommendation.product-card.pill-text.emeritus": "Offered on Emeritus", @@ -160,9 +154,6 @@ "terms.of.service": "Terms of Service", "registration.username.suggestion.label": "Suggested:", "did.you.mean.alert.text": "Did you mean", - "register.page.terms.of.service.and.honor.code": "By creating an account, you agree to the {tosAndHonorCode} and you acknowledge that {platformName} and each\n Member process your personal data in accordance with the {privacyPolicy}.", - "register.page.honor.code": "I agree to the {platformName} {tosAndHonorCode}", - "register.page.terms.of.service": "I agree to the {platformName} {termsOfService}", "sign.in": "Sign in", "reset.password.page.title": "Reset Password | {siteName}", "reset.password": "Reset password", @@ -176,5 +167,15 @@ "reset.server.rate.limit.error": "Too many requests.", "reset.password.success.heading": "Password reset complete.", "reset.password.success": "Your password has been reset. Sign in to your account.", - "rate.limit.error": "An error has occurred because of too many requests. Please try again after some time." + "rate.limit.error": "An error has occurred because of too many requests. Please try again after some time.", + "start.learning": "Start learning", + "with.site.name": "with {siteName}", + "your.career.turning.point": "Your career turning point", + "is.here": "is here.", + "welcome.to.platform": "Welcome to {siteName}, {username}!", + "complete.your.profile.1": "Complete", + "complete.your.profile.2": "your profile", + "register.page.terms.of.service.and.honor.code": "By creating an account, you agree to the {tosAndHonorCode} and you acknowledge that {platformName} and each Member process your personal data in accordance with the {privacyPolicy}.", + "register.page.honor.code": "I agree to the {platformName} {tosAndHonorCode}", + "register.page.terms.of.service": "I agree to the {platformName} {termsOfService}" } \ No newline at end of file diff --git a/src/i18n/messages/uk.json b/src/i18n/messages/uk.json index 5c0dfae32e..283d1cc286 100644 --- a/src/i18n/messages/uk.json +++ b/src/i18n/messages/uk.json @@ -1,11 +1,5 @@ { - "start.learning": "Start learning", - "with.site.name": "with {siteName}", - "your.career.turning.point": "Your career turning point", - "is.here": "is here.", - "welcome.to.platform": "Welcome to {siteName}, {username}!", - "complete.your.profile.1": "Complete", - "complete.your.profile.2": "your profile", + "error.notfound.message": "The page you're looking for is unavailable or there's an error in the URL. Please check the URL and try again.", "institution.login.page.sub.heading": "Choose your institution from the list below", "logistration.sign.in": "Sign in", "logistration.register": "Register", @@ -26,8 +20,7 @@ "registration.using.tpa.form.heading": "Finish creating your account", "zendesk.supportTitle": "edX Support", "zendesk.selectTicketForm": "Please choose your request type:", - "error.notfound.message": "The page you're looking for is unavailable or there's an error in the URL. Please check the URL and try again.", - "forgot.password.confirmation.message": "We sent an email to {email} with instructions to reset your password.\n If you do not receive a password reset message after 1 minute, verify that you entered\n the correct email address, or check your spam folder. If you need further assistance, {supportLink}.", + "forgot.password.confirmation.message": "We sent an email to {email} with instructions to reset your password. If you do not receive a password reset message after 1 minute, verify that you entered the correct email address, or check your spam folder. If you need further assistance, {supportLink}.", "forgot.password.page.title": "Forgot Password | {siteName}", "forgot.password.page.heading": "Reset password", "forgot.password.page.instructions": "Please enter your email address below and we will send you an email with instructions on how to reset your password.", @@ -42,7 +35,7 @@ "confirmation.message.title": "Check your email", "confirmation.support.link": "contact technical support", "need.help.sign.in.text": "Need help signing in?", - "additional.help.text": "For additional help, contact {platformName} support at ", + "additional.help.text": "For additional help, contact {platformName} support at", "sign.in.text": "Sign in", "extend.field.errors": "{emailError} below.", "invalid.token.heading": "Invalid password reset link", @@ -53,9 +46,9 @@ "token.validation.internal.sever.error": "An error has occurred. Try refreshing the page, or check your internet connection.", "internal.server.error": "An error has occurred. Try refreshing the page, or check your internet connection.", "account.activation.error.message": "Something went wrong, please {supportLink} to resolve this issue.", - "login.inactive.user.error": "In order to sign in, you need to activate your account.{lineBreak}\n {lineBreak}We just sent an activation link to {email}. If you do not receive an email,\n check your spam folders or {supportLink}.", + "login.inactive.user.error": "In order to sign in, you need to activate your account.{lineBreak} {lineBreak}We just sent an activation link to {email}. If you do not receive an email, check your spam folders or {supportLink}.", "allowed.domain.login.error": "As {allowedDomain} user, You must login with your {allowedDomain} {tpaLink}.", - "login.incorrect.credentials.error.attempts.text.1": "The username, email or password you entered is incorrect. You have {remainingAttempts} more sign in\n attempts before your account is temporarily locked.", + "login.incorrect.credentials.error.attempts.text.1": "The username, email or password you entered is incorrect. You have {remainingAttempts} more sign in attempts before your account is temporarily locked.", "login.incorrect.credentials.error.attempts.text.2": "If you've forgotten your password, {resetLink}", "account.locked.out.message.2": "To be on the safe side, you can {resetLink} before trying again.", "login.incorrect.credentials.error.with.reset.link": "The username, email, or password you entered is incorrect. Please try again or {resetLink}.", @@ -113,8 +106,9 @@ "recommendation.page.title": "Recommendations | {siteName}", "recommendation.page.heading": "We have a few recommendations to get you started.", "recommendation.skip.button": "Skip for now", - "recommendation.option.trending": "Trending", + "recommendation.option.trending": "Trending Now", "recommendation.option.popular": "Most Popular", + "recommendation.option.recommended.for.you": "Recommended For You", "recommendation.product-card.pill-text.course": "Course", "recommendation.product-card.pill-text.professional-certificate": "Professional Certificate", "recommendation.product-card.pill-text.emeritus": "Offered on Emeritus", @@ -160,9 +154,6 @@ "terms.of.service": "Terms of Service", "registration.username.suggestion.label": "Suggested:", "did.you.mean.alert.text": "Did you mean", - "register.page.terms.of.service.and.honor.code": "By creating an account, you agree to the {tosAndHonorCode} and you acknowledge that {platformName} and each\n Member process your personal data in accordance with the {privacyPolicy}.", - "register.page.honor.code": "I agree to the {platformName} {tosAndHonorCode}", - "register.page.terms.of.service": "I agree to the {platformName} {termsOfService}", "sign.in": "Sign in", "reset.password.page.title": "Reset Password | {siteName}", "reset.password": "Reset password", @@ -176,5 +167,15 @@ "reset.server.rate.limit.error": "Too many requests.", "reset.password.success.heading": "Password reset complete.", "reset.password.success": "Your password has been reset. Sign in to your account.", - "rate.limit.error": "An error has occurred because of too many requests. Please try again after some time." + "rate.limit.error": "An error has occurred because of too many requests. Please try again after some time.", + "start.learning": "Start learning", + "with.site.name": "with {siteName}", + "your.career.turning.point": "Your career turning point", + "is.here": "is here.", + "welcome.to.platform": "Welcome to {siteName}, {username}!", + "complete.your.profile.1": "Complete", + "complete.your.profile.2": "your profile", + "register.page.terms.of.service.and.honor.code": "By creating an account, you agree to the {tosAndHonorCode} and you acknowledge that {platformName} and each Member process your personal data in accordance with the {privacyPolicy}.", + "register.page.honor.code": "I agree to the {platformName} {tosAndHonorCode}", + "register.page.terms.of.service": "I agree to the {platformName} {termsOfService}" } \ No newline at end of file diff --git a/src/i18n/messages/zh_CN.json b/src/i18n/messages/zh_CN.json index ea9d880698..301c665044 100644 --- a/src/i18n/messages/zh_CN.json +++ b/src/i18n/messages/zh_CN.json @@ -1,11 +1,5 @@ { - "start.learning": "开始学习", - "with.site.name": "{siteName}", - "your.career.turning.point": "Your career turning point", - "is.here": "is here.", - "welcome.to.platform": "欢迎来到{siteName},{username}!", - "complete.your.profile.1": "完成", - "complete.your.profile.2": "个人资料", + "error.notfound.message": "您访问的地址不存在或有误。请检查URL后重新尝试访问。", "institution.login.page.sub.heading": "从下面的列表中选择您的机构", "logistration.sign.in": "登录", "logistration.register": "注册", @@ -26,8 +20,7 @@ "registration.using.tpa.form.heading": "完成创建您的帐户", "zendesk.supportTitle": "edX Support", "zendesk.selectTicketForm": "Please choose your request type:", - "error.notfound.message": "您访问的地址不存在或有误。请检查URL后重新尝试访问。", - "forgot.password.confirmation.message": "我们向 {email} 发送了一封电子邮件,其中包含重置密码的说明。如果您在 1 分钟后没有收到密码重置消息,请确认您输入了正确的电子邮件地址,或者检查您的垃圾邮件文件夹。如果您需要进一步的帮助,点击{supportLink}。", + "forgot.password.confirmation.message": "We sent an email to {email} with instructions to reset your password. If you do not receive a password reset message after 1 minute, verify that you entered the correct email address, or check your spam folder. If you need further assistance, {supportLink}.", "forgot.password.page.title": "忘记密码 | {siteName}", "forgot.password.page.heading": "重置密码", "forgot.password.page.instructions": "请在下面输入您的电子邮件地址,我们将向您发送一封电子邮件,其中包含有关如何重置密码的说明。", @@ -42,7 +35,7 @@ "confirmation.message.title": "查收您的邮件", "confirmation.support.link": "联系技术支持", "need.help.sign.in.text": "需要帮助登录?", - "additional.help.text": "如需更多帮助,请通过以下方式联系 {platformName} 支持", + "additional.help.text": "For additional help, contact {platformName} support at", "sign.in.text": "登录", "extend.field.errors": "{emailError} 如下。", "invalid.token.heading": "密码重置链接无效", @@ -53,9 +46,9 @@ "token.validation.internal.sever.error": "发生了错误。尝试刷新页面,或检查您的互联网连接。", "internal.server.error": "发生了错误。尝试刷新页面,或检查您的互联网连接。", "account.activation.error.message": "出了点问题,请联系{supportLink}解决这个问题。", - "login.inactive.user.error": "若要登录,您需要激活您的帐户。{lineBreak} {lineBreak}我们刚刚向 {email} 发送了一个激活链接。如果您没有收到电子邮件,请检查您的垃圾邮件文件夹或 {supportLink}。", + "login.inactive.user.error": "In order to sign in, you need to activate your account.{lineBreak} {lineBreak}We just sent an activation link to {email}. If you do not receive an email, check your spam folders or {supportLink}.", "allowed.domain.login.error": "作为 {allowedDomain} 用户,您必须使用 {allowedDomain} {tpaLink} 登录。", - "login.incorrect.credentials.error.attempts.text.1": "您输入的用户名、电子邮件或密码不正确。在您的帐户被暂时锁定之前,您还有 {remainingAttempts} 次登录尝试。", + "login.incorrect.credentials.error.attempts.text.1": "The username, email or password you entered is incorrect. You have {remainingAttempts} more sign in attempts before your account is temporarily locked.", "login.incorrect.credentials.error.attempts.text.2": "如果您忘记了密码,{resetLink}", "account.locked.out.message.2": "为了安全起见,您可以先{resetLink}再试一次。", "login.incorrect.credentials.error.with.reset.link": "您输入的用户名、电子邮件或密码不正确。请重试或 {resetLink}。", @@ -113,10 +106,11 @@ "recommendation.page.title": "建议 | {siteName}", "recommendation.page.heading": "我们有一些建议可以帮助您入门。", "recommendation.skip.button": "暂时跳过", - "recommendation.option.trending": "Trending", + "recommendation.option.trending": "Trending Now", "recommendation.option.popular": "Most Popular", - "recommendation.product-card.pill-text.course": "Course", - "recommendation.product-card.pill-text.professional-certificate": "Professional Certificate", + "recommendation.option.recommended.for.you": "Recommended For You", + "recommendation.product-card.pill-text.course": "课程", + "recommendation.product-card.pill-text.professional-certificate": "专业证书", "recommendation.product-card.pill-text.emeritus": "Offered on Emeritus", "recommendation.product-card.pill-text.shorelight": "Offered through Shorelight", "recommendation.product-card.footer-text.number-of-courses": "{length} {label}", @@ -160,9 +154,6 @@ "terms.of.service": "服务条款", "registration.username.suggestion.label": "建议:", "did.you.mean.alert.text": "你的意思是", - "register.page.terms.of.service.and.honor.code": "创建帐户即表示您同意 {tosAndHonorCode} 并承认 {platformName} 和每位会员根据 {privacyPolicy} 处理您的个人数据。", - "register.page.honor.code": "我同意 {platformName} {tosAndHonorCode}", - "register.page.terms.of.service": "我同意接受 {platformName} {termsOfService}", "sign.in": "登录", "reset.password.page.title": "重设密码 | {siteName}", "reset.password": "重置密码", @@ -176,5 +167,15 @@ "reset.server.rate.limit.error": "请求过多。", "reset.password.success.heading": "密码重置完成。", "reset.password.success": "您的密码已重置。登录到您的帐户。", - "rate.limit.error": "由于请求过多而发生错误。请稍后重试。" + "rate.limit.error": "由于请求过多而发生错误。请稍后重试。", + "start.learning": "开始学习", + "with.site.name": "{siteName}", + "your.career.turning.point": "Your career turning point", + "is.here": "is here.", + "welcome.to.platform": "欢迎来到{siteName},{username}!", + "complete.your.profile.1": "完成", + "complete.your.profile.2": "个人资料", + "register.page.terms.of.service.and.honor.code": "By creating an account, you agree to the {tosAndHonorCode} and you acknowledge that {platformName} and each Member process your personal data in accordance with the {privacyPolicy}.", + "register.page.honor.code": "I agree to the {platformName} {tosAndHonorCode}", + "register.page.terms.of.service": "I agree to the {platformName} {termsOfService}" } \ No newline at end of file diff --git a/src/logistration/Logistration.jsx b/src/logistration/Logistration.jsx index 7c6d77ff0b..5091531855 100644 --- a/src/logistration/Logistration.jsx +++ b/src/logistration/Logistration.jsx @@ -39,6 +39,7 @@ const Logistration = (props) => { const [key, setKey] = useState(''); const navigate = useNavigate(); const disablePublicAccountCreation = getConfig().ALLOW_PUBLIC_ACCOUNT_CREATION === false; + const hideRegistrationLink = getConfig().SHOW_REGISTRATION_LINKS === false; useEffect(() => { const authService = getAuthService(); @@ -116,7 +117,7 @@ const Logistration = (props) => { ) - : (!isValidTpaHint() && ( + : (!isValidTpaHint() && !hideRegistrationLink && ( @@ -126,6 +127,11 @@ const Logistration = (props) => { )}
+ {!institutionLogin && !isValidTpaHint() && hideRegistrationLink && ( +

+ {formatMessage(messages[selectedPage === LOGIN_PAGE ? 'logistration.sign.in' : 'logistration.register'])} +

+ )} {selectedPage === LOGIN_PAGE ? : ( diff --git a/src/logistration/Logistration.test.jsx b/src/logistration/Logistration.test.jsx index 886ca53313..b63735f64c 100644 --- a/src/logistration/Logistration.test.jsx +++ b/src/logistration/Logistration.test.jsx @@ -12,7 +12,7 @@ import Logistration from './Logistration'; import { clearThirdPartyAuthContextErrorMessage } from '../common-components/data/actions'; import { RenderInstitutionButton } from '../common-components/InstitutionLogistration'; import { - COMPLETE_STATE, LOGIN_PAGE, + COMPLETE_STATE, LOGIN_PAGE, REGISTER_PAGE, } from '../data/constants'; import { backupRegistrationForm } from '../register/data/actions'; @@ -111,10 +111,31 @@ describe('Logistration', () => { expect(logistration.find('#main-content').find('LoginPage').exists()).toBeTruthy(); }); + it('should render login/register headings when show registration links is disabled', () => { + mergeConfig({ + SHOW_REGISTRATION_LINKS: false, + }); + + let props = { selectedPage: LOGIN_PAGE }; + let logistration = mount(reduxWrapper()); + + // verifying sign in heading + expect(logistration.find('#main-content').find('h3').text()).toEqual('Sign in'); + + // register page is still accessible when SHOW_REGISTRATION_LINKS is false + // but it needs to be accessed directly + props = { selectedPage: REGISTER_PAGE }; + logistration = mount(reduxWrapper()); + + // verifying register heading + expect(logistration.find('#main-content').find('h3').text()).toEqual('Register'); + }); + it('should render only login page when public account creation is disabled', () => { mergeConfig({ ALLOW_PUBLIC_ACCOUNT_CREATION: false, DISABLE_ENTERPRISE_LOGIN: 'true', + SHOW_REGISTRATION_LINKS: 'true', }); store = mockStore({ diff --git a/src/progressive-profiling/ProgressiveProfiling.jsx b/src/progressive-profiling/ProgressiveProfiling.jsx index 8b5878fe18..64af714e29 100644 --- a/src/progressive-profiling/ProgressiveProfiling.jsx +++ b/src/progressive-profiling/ProgressiveProfiling.jsx @@ -14,6 +14,7 @@ import { Alert, Form, Hyperlink, + Spinner, StatefulButton, } from '@edx/paragon'; import { Error } from '@edx/paragon/icons'; @@ -217,57 +218,63 @@ const ProgressiveProfiling = (props) => { /> )}
-
-

{formatMessage(messages['progressive.profiling.page.heading'])}

-
-
- {showError ? ( - - {formatMessage(messages['welcome.page.error.heading'])} -

{formatMessage(messages['welcome.page.error.message'])}

-
- ) : null} -
- {formFields} - {(getConfig().AUTHN_PROGRESSIVE_PROFILING_SUPPORT_LINK) && ( - - (sendTrackEvent('edx.bi.welcome.page.support.link.clicked'))} - > - {formatMessage(messages['optional.fields.information.link'])} - - - )} -
- e.preventDefault()} - /> - e.preventDefault()} - /> -
-
+ {registrationEmbedded && welcomePageContextApiStatus === PENDING_STATE ? ( + + ) : ( + <> +
+

{formatMessage(messages['progressive.profiling.page.heading'])}

+

+ {showError ? ( + + {formatMessage(messages['welcome.page.error.heading'])} +

{formatMessage(messages['welcome.page.error.message'])}

+
+ ) : null} +
+ {formFields} + {(getConfig().AUTHN_PROGRESSIVE_PROFILING_SUPPORT_LINK) && ( + + (sendTrackEvent('edx.bi.welcome.page.support.link.clicked'))} + > + {formatMessage(messages['optional.fields.information.link'])} + + + )} +
+ e.preventDefault()} + /> + e.preventDefault()} + /> +
+
+ + )} +
); diff --git a/src/progressive-profiling/tests/ProgressiveProfiling.test.jsx b/src/progressive-profiling/tests/ProgressiveProfiling.test.jsx index d49fcc294f..a29f112158 100644 --- a/src/progressive-profiling/tests/ProgressiveProfiling.test.jsx +++ b/src/progressive-profiling/tests/ProgressiveProfiling.test.jsx @@ -14,6 +14,7 @@ import { COMPLETE_STATE, DEFAULT_REDIRECT_URL, EMBEDDED, FAILURE_STATE, + PENDING_STATE, RECOMMENDATIONS, } from '../../data/constants'; import { saveUserProfile } from '../data/actions'; @@ -292,6 +293,28 @@ describe('ProgressiveProfilingTests', () => { expect(sendTrackEvent).toHaveBeenCalledWith('edx.bi.welcome.page.skip.link.clicked', { host }); }); + it('should show spinner while fetching the optional fields', () => { + delete window.location; + window.location = { + assign: jest.fn().mockImplementation((value) => { window.location.href = value; }), + href: getConfig().BASE_URL.concat(AUTHN_PROGRESSIVE_PROFILING), + search: `?host=${host}&variant=${EMBEDDED}`, + }; + + store = mockStore({ + ...initialState, + commonComponents: { + ...initialState.commonComponents, + thirdPartyAuthApiStatus: PENDING_STATE, + optionalFields, + }, + }); + + const progressiveProfilingPage = mount(reduxWrapper()); + + expect(progressiveProfilingPage.find('#tpa-spinner').exists()).toBeTruthy(); + }); + it('should set host property value to host where iframe is embedded for on ramp experience', () => { const expectedEventProperties = { isGenderSelected: false, diff --git a/src/register/RegistrationPage.test.jsx b/src/register/RegistrationPage.test.jsx index 6bc2ce5a89..bcc13521fd 100644 --- a/src/register/RegistrationPage.test.jsx +++ b/src/register/RegistrationPage.test.jsx @@ -11,19 +11,16 @@ import { mockNavigate, BrowserRouter as Router } from 'react-router-dom'; import renderer from 'react-test-renderer'; import configureStore from 'redux-mock-store'; -import RegistrationFailureMessage from './components/RegistrationFailure'; import { backupRegistrationFormBegin, clearRegistrationBackendError, registerNewUser, setUserPipelineDataLoaded, } from './data/actions'; -import { - FIELDS, FORBIDDEN_REQUEST, INTERNAL_SERVER_ERROR, TPA_AUTHENTICATION_FAILURE, TPA_SESSION_EXPIRED, -} from './data/constants'; +import { INTERNAL_SERVER_ERROR } from './data/constants'; import RegistrationPage from './RegistrationPage'; import { - AUTHN_PROGRESSIVE_PROFILING, COMPLETE_STATE, LOGIN_PAGE, PENDING_STATE, REGISTER_PAGE, + AUTHN_PROGRESSIVE_PROFILING, COMPLETE_STATE, PENDING_STATE, REGISTER_PAGE, } from '../data/constants'; jest.mock('@edx/frontend-platform/analytics', () => ({ @@ -36,7 +33,6 @@ jest.mock('@edx/frontend-platform/i18n', () => ({ })); const IntlRegistrationPage = injectIntl(RegistrationPage); -const IntlRegistrationFailure = injectIntl(RegistrationFailureMessage); const mockStore = configureStore(); jest.mock('react-router-dom', () => { @@ -95,7 +91,6 @@ describe('RegistrationPage', () => { currentProvider: null, finishAuthUrl: null, providers: [], - secondaryProviders: [], pipelineUserDetails: null, countryCode: null, }; @@ -152,14 +147,6 @@ describe('RegistrationPage', () => { } }; - const ssoProvider = { - id: 'oa2-apple-id', - name: 'Apple', - iconClass: 'apple', - iconImage: 'https://openedx.devstack.lms/logo.png', - loginUrl: '/auth/login/apple-id/?auth_entry=login&next=/dashboard', - }; - describe('Test Registration Page', () => { mergeConfig({ SHOW_CONFIGURABLE_EDX_FIELDS: true, @@ -173,10 +160,6 @@ describe('RegistrationPage', () => { country: 'Select your country or region of residence', }; - const secondaryProviders = { - id: 'saml-test', name: 'Test University', loginUrl: '/dummy-auth', registerUrl: '/dummy_auth', - }; - // ******** test registration form submission ******** it('should submit form for valid input', () => { @@ -213,7 +196,7 @@ describe('RegistrationPage', () => { email: 'john.doe@example.com', country: 'Pakistan', honor_code: true, - social_auth_provider: ssoProvider.name, + social_auth_provider: 'Apple', totalRegistrationTime: 0, }; @@ -223,7 +206,7 @@ describe('RegistrationPage', () => { ...initialState.commonComponents, thirdPartyAuthContext: { ...initialState.commonComponents.thirdPartyAuthContext, - currentProvider: ssoProvider.name, + currentProvider: 'Apple', }, }, }); @@ -341,81 +324,6 @@ describe('RegistrationPage', () => { expect(store.dispatch).toHaveBeenCalledWith(clearRegistrationBackendError('email')); }); - // ******** test alert messages ******** - - it('should match third party auth alert', () => { - store = mockStore({ - ...initialState, - commonComponents: { - ...initialState.commonComponents, - thirdPartyAuthContext: { - ...initialState.commonComponents.thirdPartyAuthContext, - currentProvider: 'Apple', - }, - }, - }); - - const expectedMessage = `${'You\'ve successfully signed into Apple! We just need a little more information before ' - + 'you start learning with '}${ getConfig().SITE_NAME }.`; - - const registrationPage = mount(routerWrapper(reduxWrapper())); - expect(registrationPage.find('#tpa-alert').find('p').text()).toEqual(expectedMessage); - }); - - it('should match internal server error message', () => { - const expectedMessage = 'We couldn\'t create your account.An error has occurred. Try refreshing the page, or check your internet connection.'; - props = { - errorCode: INTERNAL_SERVER_ERROR, - failureCount: 0, - }; - - const registrationPage = mount(reduxWrapper()); - expect(registrationPage.find('div.alert-heading').length).toEqual(1); - expect(registrationPage.find('div.alert').first().text()).toEqual(expectedMessage); - }); - - it('should match registration api rate limit error message', () => { - const expectedMessage = 'We couldn\'t create your account.Too many failed registration attempts. Try again later.'; - props = { - errorCode: FORBIDDEN_REQUEST, - failureCount: 0, - }; - - const registrationPage = mount(reduxWrapper()); - expect(registrationPage.find('div.alert-heading').length).toEqual(1); - expect(registrationPage.find('div.alert').first().text()).toEqual(expectedMessage); - }); - - it('should match tpa session expired error message', () => { - const expectedMessage = 'We couldn\'t create your account.Registration using Google has timed out.'; - props = { - context: { - provider: 'Google', - }, - errorCode: TPA_SESSION_EXPIRED, - failureCount: 0, - }; - - const registrationPage = mount(reduxWrapper()); - expect(registrationPage.find('div.alert-heading').length).toEqual(1); - expect(registrationPage.find('div.alert').first().text()).toEqual(expectedMessage); - }); - - it('should match tpa authentication failed error message', () => { - const expectedMessageSubstring = 'We are sorry, you are not authorized to access'; - props = { - context: { - provider: 'Google', - }, - errorCode: TPA_AUTHENTICATION_FAILURE, - failureCount: 0, - }; - - const registrationPage = mount(reduxWrapper()); - expect(registrationPage.find('div.alert-heading').length).toEqual(1); - expect(registrationPage.find('div.alert').first().text()).toContain(expectedMessageSubstring); - }); - // ******** test form buttons and fields ******** it('should match default button state', () => { @@ -451,58 +359,6 @@ describe('RegistrationPage', () => { }); }); - it('should show single sign on provider button', () => { - store = mockStore({ - ...initialState, - commonComponents: { - ...initialState.commonComponents, - thirdPartyAuthContext: { - ...initialState.commonComponents.thirdPartyAuthContext, - providers: [ssoProvider], - }, - }, - }); - - const registrationPage = mount(routerWrapper(reduxWrapper())); - expect(registrationPage.find(`button#${ssoProvider.id}`).length).toEqual(1); - }); - - it('should display institution register button', () => { - mergeConfig({ - DISABLE_ENTERPRISE_LOGIN: 'true', - }); - - store = mockStore({ - ...initialState, - commonComponents: { - ...initialState.commonComponents, - thirdPartyAuthContext: { - ...initialState.commonComponents.thirdPartyAuthContext, - secondaryProviders: [secondaryProviders], - }, - }, - }); - delete window.location; - window.location = { href: getConfig().BASE_URL }; - - const root = mount(routerWrapper(reduxWrapper())); - expect(root.text().includes('Institution/campus credentials')).toBe(true); - - mergeConfig({ - DISABLE_ENTERPRISE_LOGIN: '', - }); - }); - - it('should display InstitutionLogistration if insitutionLogin prop is true', () => { - props = { - ...props, - institutionLogin: true, - }; - - const registrationPage = mount(routerWrapper(reduxWrapper())); - expect(registrationPage.find('.institutions__heading').text()).toEqual('Register with institution/campus credentials'); - }); - it('should show button label based on cta query params value', () => { const buttonLabel = 'Register'; delete window.location; @@ -511,22 +367,6 @@ describe('RegistrationPage', () => { expect(registrationPage.find('button[type="submit"] span').first().text()).toEqual(buttonLabel); }); - it('should not display password field when current provider is present', () => { - store = mockStore({ - ...initialState, - commonComponents: { - ...initialState.commonComponents, - thirdPartyAuthContext: { - ...initialState.commonComponents.thirdPartyAuthContext, - currentProvider: ssoProvider.name, - }, - }, - }); - - const registrationPage = mount(routerWrapper(reduxWrapper())); - expect(registrationPage.find('input#password').length).toEqual(0); - }); - it('should check user retention cookie', () => { store = mockStore({ ...initialState, @@ -560,57 +400,6 @@ describe('RegistrationPage', () => { expect(window.location.href).toBe(dashboardURL); }); - it('should redirect to social auth provider url on SSO button click', () => { - const registerUrl = '/auth/login/apple-id/?auth_entry=register&next=/dashboard'; - store = mockStore({ - ...initialState, - commonComponents: { - ...initialState.commonComponents, - thirdPartyAuthContext: { - ...initialState.commonComponents.thirdPartyAuthContext, - providers: [{ - ...ssoProvider, - registerUrl, - }], - }, - }, - }); - - delete window.location; - window.location = { href: getConfig().BASE_URL }; - - const loginPage = mount(routerWrapper(reduxWrapper())); - - loginPage.find('button#oa2-apple-id').simulate('click'); - expect(window.location.href).toBe(getConfig().LMS_BASE_URL + registerUrl); - }); - - it('should redirect to finishAuthUrl upon successful registration via SSO', () => { - const authCompleteUrl = '/auth/complete/google-oauth2/'; - store = mockStore({ - ...initialState, - register: { - ...initialState.register, - registrationResult: { - success: true, - }, - }, - commonComponents: { - ...initialState.commonComponents, - thirdPartyAuthContext: { - ...initialState.commonComponents.thirdPartyAuthContext, - finishAuthUrl: authCompleteUrl, - }, - }, - }); - - delete window.location; - window.location = { href: getConfig().BASE_URL }; - - renderer.create(routerWrapper(reduxWrapper())); - expect(window.location.href).toBe(getConfig().LMS_BASE_URL + authCompleteUrl); - }); - it('should redirect to dashboard if features flags are configured but no optional fields are configured', () => { mergeConfig({ ENABLE_PROGRESSIVE_PROFILING_ON_AUTHN: true, @@ -672,112 +461,6 @@ describe('RegistrationPage', () => { expect(mockNavigate).toHaveBeenCalledWith(AUTHN_PROGRESSIVE_PROFILING); }); - // ******** test hinted third party auth ******** - - it('should render tpa button for tpa_hint id matching one of the primary providers', () => { - store = mockStore({ - ...initialState, - commonComponents: { - ...initialState.commonComponents, - thirdPartyAuthContext: { - ...initialState.commonComponents.thirdPartyAuthContext, - providers: [ssoProvider], - }, - thirdPartyAuthApiStatus: COMPLETE_STATE, - }, - }); - - delete window.location; - window.location = { href: getConfig().BASE_URL.concat(LOGIN_PAGE), search: `?next=/dashboard&tpa_hint=${ssoProvider.id}` }; - - const registrationPage = mount(routerWrapper(reduxWrapper())); - expect(registrationPage.find(`button#${ssoProvider.id}`).find('span').text()).toEqual(ssoProvider.name); - expect(registrationPage.find(`button#${ssoProvider.id}`).hasClass(`btn-tpa btn-${ssoProvider.id}`)).toEqual(true); - }); - - it('should display skeleton if tpa_hint is true and thirdPartyAuthContext is pending', () => { - store = mockStore({ - ...initialState, - commonComponents: { - ...initialState.commonComponents, - thirdPartyAuthApiStatus: PENDING_STATE, - }, - }); - - delete window.location; - window.location = { - href: getConfig().BASE_URL.concat(LOGIN_PAGE), - search: `?next=/dashboard&tpa_hint=${ssoProvider.id}`, - }; - - const registrationPage = mount(routerWrapper(reduxWrapper())); - expect(registrationPage.find('.react-loading-skeleton').exists()).toBeTruthy(); - }); - - it('should render icon if icon classes are missing in providers', () => { - ssoProvider.iconClass = null; - store = mockStore({ - ...initialState, - commonComponents: { - ...initialState.commonComponents, - thirdPartyAuthContext: { - ...initialState.commonComponents.thirdPartyAuthContext, - providers: [ssoProvider], - }, - thirdPartyAuthApiStatus: COMPLETE_STATE, - }, - }); - - delete window.location; - window.location = { href: getConfig().BASE_URL.concat(REGISTER_PAGE), search: `?next=/dashboard&tpa_hint=${ssoProvider.id}` }; - ssoProvider.iconImage = null; - - const registrationPage = mount(routerWrapper(reduxWrapper())); - expect(registrationPage.find(`button#${ssoProvider.id}`).find('div').find('span').hasClass('pgn__icon')).toEqual(true); - }); - - it('should render tpa button for tpa_hint id matching one of the secondary providers', () => { - secondaryProviders.skipHintedLogin = true; - store = mockStore({ - ...initialState, - commonComponents: { - ...initialState.commonComponents, - thirdPartyAuthContext: { - ...initialState.commonComponents.thirdPartyAuthContext, - secondaryProviders: [secondaryProviders], - }, - thirdPartyAuthApiStatus: COMPLETE_STATE, - }, - }); - - delete window.location; - window.location = { href: getConfig().BASE_URL.concat(REGISTER_PAGE), search: `?next=/dashboard&tpa_hint=${secondaryProviders.id}` }; - - mount(routerWrapper(reduxWrapper())); - expect(window.location.href).toEqual(getConfig().LMS_BASE_URL + secondaryProviders.registerUrl); - }); - - it('should render regular tpa button for invalid tpa_hint value', () => { - const expectedMessage = `${ssoProvider.name}`; - store = mockStore({ - ...initialState, - commonComponents: { - ...initialState.commonComponents, - thirdPartyAuthContext: { - ...initialState.commonComponents.thirdPartyAuthContext, - providers: [ssoProvider], - }, - thirdPartyAuthApiStatus: COMPLETE_STATE, - }, - }); - - delete window.location; - window.location = { href: getConfig().BASE_URL.concat(LOGIN_PAGE), search: '?next=/dashboard&tpa_hint=invalid' }; - - const registrationPage = mount(routerWrapper(reduxWrapper())); - expect(registrationPage.find(`button#${ssoProvider.id}`).find('span#provider-name').text()).toEqual(expectedMessage); - }); - // ******** miscellaneous tests ******** it('should backup the registration form state when shouldBackupState is true', () => { @@ -998,7 +681,6 @@ describe('RegistrationPage', () => { thirdPartyAuthApiStatus: COMPLETE_STATE, thirdPartyAuthContext: { ...initialState.commonComponents.thirdPartyAuthContext, - currentProvider: ssoProvider.name, pipelineUserDetails: { name: 'John Doe', username: 'john_doe', @@ -1046,7 +728,7 @@ describe('RegistrationPage', () => { thirdPartyAuthApiStatus: COMPLETE_STATE, thirdPartyAuthContext: { ...initialState.commonComponents.thirdPartyAuthContext, - currentProvider: ssoProvider.name, + currentProvider: 'Apple', pipelineUserDetails: { name: 'John Doe', username: 'john_doe', @@ -1068,163 +750,5 @@ describe('RegistrationPage', () => { totalRegistrationTime: 0, })); }); - - it('should display errorMessage if third party authentication fails', () => { - jest.spyOn(global.Date, 'now').mockImplementation(() => 0); - getLocale.mockImplementation(() => ('en-us')); - - store = mockStore({ - ...initialState, - register: { - ...initialState.register, - backendCountryCode: 'PK', - userPipelineDataLoaded: false, - }, - commonComponents: { - ...initialState.commonComponents, - thirdPartyAuthApiStatus: COMPLETE_STATE, - thirdPartyAuthContext: { - ...initialState.commonComponents.thirdPartyAuthContext, - currentProvider: null, - pipelineUserDetails: {}, - errorMessage: 'An error occurred', - }, - }, - }); - - store.dispatch = jest.fn(store.dispatch); - - const registrationPage = mount(routerWrapper(reduxWrapper())); - expect(registrationPage.find('div.alert-heading').length).toEqual(1); - expect(registrationPage.find('div.alert').first().text()).toContain('An error occurred'); - }); - }); - - describe('Test Configurable Fields', () => { - mergeConfig({ - ENABLE_DYNAMIC_REGISTRATION_FIELDS: true, - SHOW_CONFIGURABLE_EDX_FIELDS: true, - }); - - it('should render fields returned by backend', () => { - store = mockStore({ - ...initialState, - commonComponents: { - ...initialState.commonComponents, - fieldDescriptions: { - profession: { name: 'profession', type: 'text', label: 'Profession' }, - terms_of_service: { - name: FIELDS.TERMS_OF_SERVICE, - error_message: 'You must agree to the Terms and Service agreement of our site', - }, - }, - }, - }); - const registrationPage = mount(routerWrapper(reduxWrapper())); - expect(registrationPage.find('#profession').exists()).toBeTruthy(); - expect(registrationPage.find('#tos').exists()).toBeTruthy(); - }); - - it('should submit form with fields returned by backend in payload', () => { - getLocale.mockImplementation(() => ('en-us')); - jest.spyOn(global.Date, 'now').mockImplementation(() => 0); - store = mockStore({ - ...initialState, - commonComponents: { - ...initialState.commonComponents, - fieldDescriptions: { - profession: { name: 'profession', type: 'text', label: 'Profession' }, - }, - extendedProfile: ['profession'], - }, - }); - - const payload = { - name: 'John Doe', - username: 'john_doe', - email: 'john.doe@example.com', - password: 'password1', - country: 'Pakistan', - honor_code: true, - profession: 'Engineer', - totalRegistrationTime: 0, - }; - - store.dispatch = jest.fn(store.dispatch); - const registrationPage = mount(routerWrapper(reduxWrapper())); - - populateRequiredFields(registrationPage, payload); - registrationPage.find('input#profession').simulate('change', { target: { value: 'Engineer', name: 'profession' } }); - registrationPage.find('button.btn-brand').simulate('click'); - expect(store.dispatch).toHaveBeenCalledWith(registerNewUser({ ...payload, country: 'PK' })); - }); - - it('should show error messages for required fields on empty form submission', () => { - const professionError = 'Enter your profession'; - const countryError = 'Select your country or region of residence'; - const confirmEmailError = 'Enter your email'; - - store = mockStore({ - ...initialState, - commonComponents: { - ...initialState.commonComponents, - fieldDescriptions: { - profession: { - name: 'profession', type: 'text', label: 'Profession', error_message: professionError, - }, - confirm_email: { - name: 'confirm_email', type: 'text', label: 'Confirm Email', error_message: confirmEmailError, - }, - country: { name: 'country' }, - }, - }, - }); - - const registrationPage = mount(routerWrapper(reduxWrapper())); - registrationPage.find('button.btn-brand').simulate('click'); - - expect(registrationPage.find('#profession-error').last().text()).toEqual(professionError); - expect(registrationPage.find('div[feedback-for="country"]').text()).toEqual(countryError); - expect(registrationPage.find('#confirm_email-error').last().text()).toEqual(confirmEmailError); - }); - - it('should show error if email and confirm email fields do not match', () => { - store = mockStore({ - ...initialState, - commonComponents: { - ...initialState.commonComponents, - fieldDescriptions: { - confirm_email: { - name: 'confirm_email', type: 'text', label: 'Confirm Email', - }, - }, - }, - }); - const registrationPage = mount(routerWrapper(reduxWrapper())); - registrationPage.find('input#email').simulate('change', { target: { value: 'test1@gmail.com', name: 'email' } }); - registrationPage.find('input#confirm_email').simulate('blur', { target: { value: 'test2@gmail.com', name: 'confirm_email' } }); - expect(registrationPage.find('div#confirm_email-error').text()).toEqual('The email addresses do not match.'); - }); - - it('should run validations for configurable focused field on form submission', () => { - const professionError = 'Enter your profession'; - store = mockStore({ - ...initialState, - commonComponents: { - ...initialState.commonComponents, - fieldDescriptions: { - profession: { - name: 'profession', type: 'text', label: 'Profession', error_message: professionError, - }, - }, - }, - }); - - const registrationPage = mount(routerWrapper(reduxWrapper())); - registrationPage.find('input#profession').simulate('focus', { target: { value: '', name: 'profession' } }); - registrationPage.find('button.btn-brand').simulate('click'); - - expect(registrationPage.find('#profession-error').last().text()).toEqual(professionError); - }); }); }); diff --git a/src/register/components/ConfigurableRegistrationForm.test.jsx b/src/register/components/ConfigurableRegistrationForm.test.jsx index 282a25eb5b..eb6028f12b 100644 --- a/src/register/components/ConfigurableRegistrationForm.test.jsx +++ b/src/register/components/ConfigurableRegistrationForm.test.jsx @@ -10,7 +10,9 @@ import { BrowserRouter as Router } from 'react-router-dom'; import configureStore from 'redux-mock-store'; import ConfigurableRegistrationForm from './ConfigurableRegistrationForm'; +import { registerNewUser } from '../data/actions'; import { FIELDS } from '../data/constants'; +import RegistrationPage from '../RegistrationPage'; jest.mock('@edx/frontend-platform/analytics', () => ({ sendPageEvent: jest.fn(), @@ -22,6 +24,7 @@ jest.mock('@edx/frontend-platform/i18n', () => ({ })); const IntlConfigurableRegistrationForm = injectIntl(ConfigurableRegistrationForm); +const IntlRegistrationPage = injectIntl(RegistrationPage); const mockStore = configureStore(); jest.mock('react-router-dom', () => { @@ -113,6 +116,8 @@ describe('ConfigurableRegistrationForm', () => { setFormFields: jest.fn(), registrationEmbedded: false, autoSubmitRegistrationForm: false, + handleInstitutionLogin: jest.fn(), + institutionLogin: false, }; window.location = { search: '' }; getLocale.mockImplementationOnce(() => ('en-us')); @@ -122,6 +127,19 @@ describe('ConfigurableRegistrationForm', () => { jest.clearAllMocks(); }); + const populateRequiredFields = (registrationPage, payload, isThirdPartyAuth = false) => { + registrationPage.find('input#name').simulate('change', { target: { value: payload.name, name: 'name' } }); + registrationPage.find('input#username').simulate('change', { target: { value: payload.username, name: 'username' } }); + registrationPage.find('input#email').simulate('change', { target: { value: payload.email, name: 'email' } }); + + registrationPage.find('input[name="country"]').simulate('change', { target: { value: payload.country, name: 'country' } }); + registrationPage.find('input[name="country"]').simulate('blur', { target: { value: payload.country, name: 'country' } }); + + if (!isThirdPartyAuth) { + registrationPage.find('input#password').simulate('change', { target: { value: payload.password, name: 'password' } }); + } + }; + describe('Test Configurable Fields', () => { mergeConfig({ ENABLE_DYNAMIC_REGISTRATION_FIELDS: true, @@ -182,5 +200,128 @@ describe('ConfigurableRegistrationForm', () => { [FIELDS.TERMS_OF_SERVICE]: true, }); }); + + it('should render fields returned by backend', () => { + store = mockStore({ + ...initialState, + commonComponents: { + ...initialState.commonComponents, + fieldDescriptions: { + profession: { name: 'profession', type: 'text', label: 'Profession' }, + terms_of_service: { + name: FIELDS.TERMS_OF_SERVICE, + error_message: 'You must agree to the Terms and Service agreement of our site', + }, + }, + }, + }); + const registrationPage = mount(routerWrapper(reduxWrapper())); + expect(registrationPage.find('#profession').exists()).toBeTruthy(); + expect(registrationPage.find('#tos').exists()).toBeTruthy(); + }); + + it('should submit form with fields returned by backend in payload', () => { + mergeConfig({ + SHOW_CONFIGURABLE_EDX_FIELDS: true, + }); + getLocale.mockImplementation(() => ('en-us')); + jest.spyOn(global.Date, 'now').mockImplementation(() => 0); + store = mockStore({ + ...initialState, + commonComponents: { + ...initialState.commonComponents, + fieldDescriptions: { + profession: { name: 'profession', type: 'text', label: 'Profession' }, + }, + extendedProfile: ['profession'], + }, + }); + + const payload = { + name: 'John Doe', + username: 'john_doe', + email: 'john.doe@example.com', + password: 'password1', + country: 'Pakistan', + honor_code: true, + profession: 'Engineer', + totalRegistrationTime: 0, + }; + + store.dispatch = jest.fn(store.dispatch); + const registrationPage = mount(routerWrapper(reduxWrapper())); + + populateRequiredFields(registrationPage, payload); + registrationPage.find('input#profession').simulate('change', { target: { value: 'Engineer', name: 'profession' } }); + registrationPage.find('button.btn-brand').simulate('click'); + expect(store.dispatch).toHaveBeenCalledWith(registerNewUser({ ...payload, country: 'PK' })); + }); + + it('should show error messages for required fields on empty form submission', () => { + const professionError = 'Enter your profession'; + const countryError = 'Select your country or region of residence'; + const confirmEmailError = 'Enter your email'; + + store = mockStore({ + ...initialState, + commonComponents: { + ...initialState.commonComponents, + fieldDescriptions: { + profession: { + name: 'profession', type: 'text', label: 'Profession', error_message: professionError, + }, + confirm_email: { + name: 'confirm_email', type: 'text', label: 'Confirm Email', error_message: confirmEmailError, + }, + country: { name: 'country' }, + }, + }, + }); + + const registrationPage = mount(routerWrapper(reduxWrapper())); + registrationPage.find('button.btn-brand').simulate('click'); + + expect(registrationPage.find('#profession-error').last().text()).toEqual(professionError); + expect(registrationPage.find('div[feedback-for="country"]').text()).toEqual(countryError); + expect(registrationPage.find('#confirm_email-error').last().text()).toEqual(confirmEmailError); + }); + it('should show error if email and confirm email fields do not match', () => { + store = mockStore({ + ...initialState, + commonComponents: { + ...initialState.commonComponents, + fieldDescriptions: { + confirm_email: { + name: 'confirm_email', type: 'text', label: 'Confirm Email', + }, + }, + }, + }); + const registrationPage = mount(routerWrapper(reduxWrapper())); + registrationPage.find('input#email').simulate('change', { target: { value: 'test1@gmail.com', name: 'email' } }); + registrationPage.find('input#confirm_email').simulate('blur', { target: { value: 'test2@gmail.com', name: 'confirm_email' } }); + expect(registrationPage.find('div#confirm_email-error').text()).toEqual('The email addresses do not match.'); + }); + + it('should run validations for configurable focused field on form submission', () => { + const professionError = 'Enter your profession'; + store = mockStore({ + ...initialState, + commonComponents: { + ...initialState.commonComponents, + fieldDescriptions: { + profession: { + name: 'profession', type: 'text', label: 'Profession', error_message: professionError, + }, + }, + }, + }); + + const registrationPage = mount(routerWrapper(reduxWrapper())); + registrationPage.find('input#profession').simulate('focus', { target: { value: '', name: 'profession' } }); + registrationPage.find('button.btn-brand').simulate('click'); + + expect(registrationPage.find('#profession-error').last().text()).toEqual(professionError); + }); }); }); diff --git a/src/register/components/RegistrationFailure.test.jsx b/src/register/components/RegistrationFailure.test.jsx new file mode 100644 index 0000000000..cd8a512c05 --- /dev/null +++ b/src/register/components/RegistrationFailure.test.jsx @@ -0,0 +1,204 @@ +import React from 'react'; +import { Provider } from 'react-redux'; + +import { mergeConfig } from '@edx/frontend-platform'; +import { + configure, getLocale, injectIntl, IntlProvider, +} from '@edx/frontend-platform/i18n'; +import { mount } from 'enzyme'; +import { BrowserRouter as Router } from 'react-router-dom'; +import configureStore from 'redux-mock-store'; + +import RegistrationFailureMessage from './RegistrationFailure'; +import { + FORBIDDEN_REQUEST, INTERNAL_SERVER_ERROR, TPA_AUTHENTICATION_FAILURE, TPA_SESSION_EXPIRED, +} from '../data/constants'; +import RegistrationPage from '../RegistrationPage'; + +jest.mock('@edx/frontend-platform/analytics', () => ({ + sendPageEvent: jest.fn(), + sendTrackEvent: jest.fn(), +})); +jest.mock('@edx/frontend-platform/i18n', () => ({ + ...jest.requireActual('@edx/frontend-platform/i18n'), + getLocale: jest.fn(), +})); + +const IntlRegistrationPage = injectIntl(RegistrationPage); +const IntlRegistrationFailure = injectIntl(RegistrationFailureMessage); +const mockStore = configureStore(); + +jest.mock('react-router-dom', () => { + const mockNavigation = jest.fn(); + + // eslint-disable-next-line react/prop-types + const Navigate = ({ to }) => { + mockNavigation(to); + return
; + }; + + return { + ...jest.requireActual('react-router-dom'), + Navigate, + }; +}); + +describe('RegistrationFailure', () => { + mergeConfig({ + PRIVACY_POLICY: 'https://privacy-policy.com', + TOS_AND_HONOR_CODE: 'https://tos-and-honot-code.com', + USER_RETENTION_COOKIE_NAME: 'authn-returning-user', + }); + + let props = {}; + let store = {}; + const registrationFormData = { + configurableFormFields: { + marketingEmailsOptIn: true, + }, + formFields: { + name: '', email: '', username: '', password: '', + }, + emailSuggestion: { + suggestion: '', type: '', + }, + errors: { + name: '', email: '', username: '', password: '', + }, + }; + + const reduxWrapper = children => ( + + {children} + + ); + + const routerWrapper = children => ( + + {children} + + ); + + const thirdPartyAuthContext = { + currentProvider: null, + finishAuthUrl: null, + providers: [], + secondaryProviders: [], + pipelineUserDetails: null, + countryCode: null, + }; + + const initialState = { + register: { + registrationResult: { success: false, redirectUrl: '' }, + registrationError: {}, + registrationFormData, + usernameSuggestions: [], + }, + commonComponents: { + thirdPartyAuthApiStatus: null, + thirdPartyAuthContext, + fieldDescriptions: {}, + optionalFields: { + fields: {}, + extended_profile: [], + }, + }, + }; + + beforeEach(() => { + store = mockStore(initialState); + configure({ + loggingService: { logError: jest.fn() }, + config: { + ENVIRONMENT: 'production', + LANGUAGE_PREFERENCE_COOKIE_NAME: 'yum', + }, + messages: { 'es-419': {}, de: {}, 'en-us': {} }, + }); + props = { + handleInstitutionLogin: jest.fn(), + institutionLogin: false, + }; + window.location = { search: '' }; + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + describe('Test Registration Failure', () => { + getLocale.mockImplementation(() => ('en-us')); + + it('should match internal server error message', () => { + const expectedMessage = 'We couldn\'t create your account.An error has occurred. Try refreshing the page, or check your internet connection.'; + props = { + errorCode: INTERNAL_SERVER_ERROR, + failureCount: 0, + }; + + const registrationPage = mount(reduxWrapper()); + expect(registrationPage.find('div.alert-heading').length).toEqual(1); + expect(registrationPage.find('div.alert').first().text()).toEqual(expectedMessage); + }); + + it('should match registration api rate limit error message', () => { + const expectedMessage = 'We couldn\'t create your account.Too many failed registration attempts. Try again later.'; + props = { + errorCode: FORBIDDEN_REQUEST, + failureCount: 0, + }; + + const registrationPage = mount(reduxWrapper()); + expect(registrationPage.find('div.alert-heading').length).toEqual(1); + expect(registrationPage.find('div.alert').first().text()).toEqual(expectedMessage); + }); + + it('should match tpa session expired error message', () => { + const expectedMessage = 'We couldn\'t create your account.Registration using Google has timed out.'; + props = { + context: { + provider: 'Google', + }, + errorCode: TPA_SESSION_EXPIRED, + failureCount: 0, + }; + + const registrationPage = mount(reduxWrapper()); + expect(registrationPage.find('div.alert-heading').length).toEqual(1); + expect(registrationPage.find('div.alert').first().text()).toEqual(expectedMessage); + }); + + it('should match tpa authentication failed error message', () => { + const expectedMessageSubstring = 'We are sorry, you are not authorized to access'; + props = { + context: { + provider: 'Google', + }, + errorCode: TPA_AUTHENTICATION_FAILURE, + failureCount: 0, + }; + + const registrationPage = mount(reduxWrapper()); + expect(registrationPage.find('div.alert-heading').length).toEqual(1); + expect(registrationPage.find('div.alert').first().text()).toContain(expectedMessageSubstring); + }); + + it('should display error message based on the error code returned by API', () => { + store = mockStore({ + ...initialState, + register: { + ...initialState.register, + registrationError: { + errorCode: INTERNAL_SERVER_ERROR, + }, + }, + }); + + const registrationPage = mount(routerWrapper(reduxWrapper())).find('RegistrationPage'); + expect(registrationPage.find('div#validation-errors').first().text()).toContain( + 'An error has occurred. Try refreshing the page, or check your internet connection.', + ); + }); + }); +}); diff --git a/src/register/components/ThirdPartyAuth.test.jsx b/src/register/components/ThirdPartyAuth.test.jsx new file mode 100644 index 0000000000..fb434c9372 --- /dev/null +++ b/src/register/components/ThirdPartyAuth.test.jsx @@ -0,0 +1,411 @@ +import React from 'react'; +import { Provider } from 'react-redux'; + +import { getConfig, mergeConfig } from '@edx/frontend-platform'; +import { + configure, getLocale, injectIntl, IntlProvider, +} from '@edx/frontend-platform/i18n'; +import { mount } from 'enzyme'; +import { BrowserRouter as Router } from 'react-router-dom'; +import renderer from 'react-test-renderer'; +import configureStore from 'redux-mock-store'; + +import { + COMPLETE_STATE, LOGIN_PAGE, PENDING_STATE, REGISTER_PAGE, +} from '../../data/constants'; +import RegistrationPage from '../RegistrationPage'; + +jest.mock('@edx/frontend-platform/analytics', () => ({ + sendPageEvent: jest.fn(), + sendTrackEvent: jest.fn(), +})); +jest.mock('@edx/frontend-platform/i18n', () => ({ + ...jest.requireActual('@edx/frontend-platform/i18n'), + getLocale: jest.fn(), +})); + +const IntlRegistrationPage = injectIntl(RegistrationPage); +const mockStore = configureStore(); + +jest.mock('react-router-dom', () => { + const mockNavigation = jest.fn(); + + // eslint-disable-next-line react/prop-types + const Navigate = ({ to }) => { + mockNavigation(to); + return
; + }; + + return { + ...jest.requireActual('react-router-dom'), + Navigate, + mockNavigate: mockNavigation, + }; +}); + +describe('ThirdPartyAuth', () => { + mergeConfig({ + PRIVACY_POLICY: 'https://privacy-policy.com', + TOS_AND_HONOR_CODE: 'https://tos-and-honot-code.com', + USER_RETENTION_COOKIE_NAME: 'authn-returning-user', + }); + + let props = {}; + let store = {}; + const registrationFormData = { + configurableFormFields: { + marketingEmailsOptIn: true, + }, + formFields: { + name: '', email: '', username: '', password: '', + }, + emailSuggestion: { + suggestion: '', type: '', + }, + errors: { + name: '', email: '', username: '', password: '', + }, + }; + + const reduxWrapper = children => ( + + {children} + + ); + + const routerWrapper = children => ( + + {children} + + ); + + const thirdPartyAuthContext = { + currentProvider: null, + finishAuthUrl: null, + providers: [], + secondaryProviders: [], + pipelineUserDetails: null, + countryCode: null, + }; + + const initialState = { + register: { + registrationResult: { success: false, redirectUrl: '' }, + registrationError: {}, + registrationFormData, + usernameSuggestions: [], + }, + commonComponents: { + thirdPartyAuthApiStatus: null, + thirdPartyAuthContext, + fieldDescriptions: {}, + optionalFields: { + fields: {}, + extended_profile: [], + }, + }, + }; + + beforeEach(() => { + store = mockStore(initialState); + configure({ + loggingService: { logError: jest.fn() }, + config: { + ENVIRONMENT: 'production', + LANGUAGE_PREFERENCE_COOKIE_NAME: 'yum', + }, + messages: { 'es-419': {}, de: {}, 'en-us': {} }, + }); + props = { + handleInstitutionLogin: jest.fn(), + institutionLogin: false, + }; + window.location = { search: '' }; + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + const ssoProvider = { + id: 'oa2-apple-id', + name: 'Apple', + iconClass: 'apple', + iconImage: 'https://openedx.devstack.lms/logo.png', + loginUrl: '/auth/login/apple-id/?auth_entry=login&next=/dashboard', + }; + + describe('Test Third Party Auth', () => { + mergeConfig({ + SHOW_CONFIGURABLE_EDX_FIELDS: true, + }); + getLocale.mockImplementation(() => ('en-us')); + + const secondaryProviders = { + id: 'saml-test', name: 'Test University', loginUrl: '/dummy-auth', registerUrl: '/dummy_auth', + }; + + it('should not display password field when current provider is present', () => { + store = mockStore({ + ...initialState, + commonComponents: { + ...initialState.commonComponents, + thirdPartyAuthContext: { + ...initialState.commonComponents.thirdPartyAuthContext, + currentProvider: ssoProvider.name, + }, + }, + }); + + const registrationPage = mount(routerWrapper(reduxWrapper())); + expect(registrationPage.find('input#password').length).toEqual(0); + }); + + it('should render tpa button for tpa_hint id matching one of the primary providers', () => { + store = mockStore({ + ...initialState, + commonComponents: { + ...initialState.commonComponents, + thirdPartyAuthContext: { + ...initialState.commonComponents.thirdPartyAuthContext, + providers: [ssoProvider], + }, + thirdPartyAuthApiStatus: COMPLETE_STATE, + }, + }); + + delete window.location; + window.location = { href: getConfig().BASE_URL.concat(LOGIN_PAGE), search: `?next=/dashboard&tpa_hint=${ssoProvider.id}` }; + + const registrationPage = mount(routerWrapper(reduxWrapper())); + expect(registrationPage.find(`button#${ssoProvider.id}`).find('span').text()).toEqual(ssoProvider.name); + expect(registrationPage.find(`button#${ssoProvider.id}`).hasClass(`btn-tpa btn-${ssoProvider.id}`)).toEqual(true); + }); + + it('should display skeleton if tpa_hint is true and thirdPartyAuthContext is pending', () => { + store = mockStore({ + ...initialState, + commonComponents: { + ...initialState.commonComponents, + thirdPartyAuthApiStatus: PENDING_STATE, + }, + }); + + delete window.location; + window.location = { + href: getConfig().BASE_URL.concat(LOGIN_PAGE), + search: `?next=/dashboard&tpa_hint=${ssoProvider.id}`, + }; + + const registrationPage = mount(routerWrapper(reduxWrapper())); + expect(registrationPage.find('.react-loading-skeleton').exists()).toBeTruthy(); + }); + + it('should render icon if icon classes are missing in providers', () => { + ssoProvider.iconClass = null; + store = mockStore({ + ...initialState, + commonComponents: { + ...initialState.commonComponents, + thirdPartyAuthContext: { + ...initialState.commonComponents.thirdPartyAuthContext, + providers: [ssoProvider], + }, + thirdPartyAuthApiStatus: COMPLETE_STATE, + }, + }); + + delete window.location; + window.location = { href: getConfig().BASE_URL.concat(REGISTER_PAGE), search: `?next=/dashboard&tpa_hint=${ssoProvider.id}` }; + ssoProvider.iconImage = null; + + const registrationPage = mount(routerWrapper(reduxWrapper())); + expect(registrationPage.find(`button#${ssoProvider.id}`).find('div').find('span').hasClass('pgn__icon')).toEqual(true); + }); + + it('should render tpa button for tpa_hint id matching one of the secondary providers', () => { + secondaryProviders.skipHintedLogin = true; + store = mockStore({ + ...initialState, + commonComponents: { + ...initialState.commonComponents, + thirdPartyAuthContext: { + ...initialState.commonComponents.thirdPartyAuthContext, + secondaryProviders: [secondaryProviders], + }, + thirdPartyAuthApiStatus: COMPLETE_STATE, + }, + }); + + delete window.location; + window.location = { href: getConfig().BASE_URL.concat(REGISTER_PAGE), search: `?next=/dashboard&tpa_hint=${secondaryProviders.id}` }; + + mount(routerWrapper(reduxWrapper())); + expect(window.location.href).toEqual(getConfig().LMS_BASE_URL + secondaryProviders.registerUrl); + }); + + it('should render regular tpa button for invalid tpa_hint value', () => { + const expectedMessage = `${ssoProvider.name}`; + store = mockStore({ + ...initialState, + commonComponents: { + ...initialState.commonComponents, + thirdPartyAuthContext: { + ...initialState.commonComponents.thirdPartyAuthContext, + providers: [ssoProvider], + }, + thirdPartyAuthApiStatus: COMPLETE_STATE, + }, + }); + + delete window.location; + window.location = { href: getConfig().BASE_URL.concat(LOGIN_PAGE), search: '?next=/dashboard&tpa_hint=invalid' }; + + const registrationPage = mount(routerWrapper(reduxWrapper())); + expect(registrationPage.find(`button#${ssoProvider.id}`).find('span#provider-name').text()).toEqual(expectedMessage); + }); + + it('should show single sign on provider button', () => { + store = mockStore({ + ...initialState, + commonComponents: { + ...initialState.commonComponents, + thirdPartyAuthContext: { + ...initialState.commonComponents.thirdPartyAuthContext, + providers: [ssoProvider], + }, + }, + }); + + const registrationPage = mount(routerWrapper(reduxWrapper())); + expect(registrationPage.find(`button#${ssoProvider.id}`).length).toEqual(1); + }); + + it('should show single sign on provider button', () => { + store = mockStore({ + ...initialState, + commonComponents: { + ...initialState.commonComponents, + thirdPartyAuthContext: { + ...initialState.commonComponents.thirdPartyAuthContext, + providers: [ssoProvider], + }, + }, + }); + + const registrationPage = mount(routerWrapper(reduxWrapper())); + expect(registrationPage.find(`button#${ssoProvider.id}`).length).toEqual(1); + }); + + it('should display InstitutionLogistration if insitutionLogin prop is true', () => { + props = { + ...props, + institutionLogin: true, + }; + + const registrationPage = mount(routerWrapper(reduxWrapper())); + expect(registrationPage.find('.institutions__heading').text()).toEqual('Register with institution/campus credentials'); + }); + + it('should redirect to social auth provider url on SSO button click', () => { + const registerUrl = '/auth/login/apple-id/?auth_entry=register&next=/dashboard'; + store = mockStore({ + ...initialState, + commonComponents: { + ...initialState.commonComponents, + thirdPartyAuthContext: { + ...initialState.commonComponents.thirdPartyAuthContext, + providers: [{ + ...ssoProvider, + registerUrl, + }], + }, + }, + }); + + delete window.location; + window.location = { href: getConfig().BASE_URL }; + + const loginPage = mount(routerWrapper(reduxWrapper())); + + loginPage.find('button#oa2-apple-id').simulate('click'); + expect(window.location.href).toBe(getConfig().LMS_BASE_URL + registerUrl); + }); + + it('should redirect to finishAuthUrl upon successful registration via SSO', () => { + const authCompleteUrl = '/auth/complete/google-oauth2/'; + store = mockStore({ + ...initialState, + register: { + ...initialState.register, + registrationResult: { + success: true, + }, + }, + commonComponents: { + ...initialState.commonComponents, + thirdPartyAuthContext: { + ...initialState.commonComponents.thirdPartyAuthContext, + finishAuthUrl: authCompleteUrl, + }, + }, + }); + + delete window.location; + window.location = { href: getConfig().BASE_URL }; + + renderer.create(routerWrapper(reduxWrapper())); + expect(window.location.href).toBe(getConfig().LMS_BASE_URL + authCompleteUrl); + }); + + // ******** test alert messages ******** + + it('should match third party auth alert', () => { + store = mockStore({ + ...initialState, + commonComponents: { + ...initialState.commonComponents, + thirdPartyAuthContext: { + ...initialState.commonComponents.thirdPartyAuthContext, + currentProvider: 'Apple', + }, + }, + }); + + const expectedMessage = `${'You\'ve successfully signed into Apple! We just need a little more information before ' + + 'you start learning with '}${ getConfig().SITE_NAME }.`; + + const registrationPage = mount(routerWrapper(reduxWrapper())); + expect(registrationPage.find('#tpa-alert').find('p').text()).toEqual(expectedMessage); + }); + it('should display errorMessage if third party authentication fails', () => { + jest.spyOn(global.Date, 'now').mockImplementation(() => 0); + getLocale.mockImplementation(() => ('en-us')); + + store = mockStore({ + ...initialState, + register: { + ...initialState.register, + backendCountryCode: 'PK', + userPipelineDataLoaded: false, + }, + commonComponents: { + ...initialState.commonComponents, + thirdPartyAuthApiStatus: COMPLETE_STATE, + thirdPartyAuthContext: { + ...initialState.commonComponents.thirdPartyAuthContext, + currentProvider: null, + pipelineUserDetails: {}, + errorMessage: 'An error occurred', + }, + }, + }); + + store.dispatch = jest.fn(store.dispatch); + + const registrationPage = mount(routerWrapper(reduxWrapper())); + expect(registrationPage.find('div.alert-heading').length).toEqual(1); + expect(registrationPage.find('div.alert').first().text()).toContain('An error occurred'); + }); + }); +}); diff --git a/src/register/data/utils.js b/src/register/data/utils.js index 810360877d..ca060512be 100644 --- a/src/register/data/utils.js +++ b/src/register/data/utils.js @@ -1,4 +1,4 @@ -import { snakeCaseObject } from '@edx/frontend-platform'; +import { getConfig, snakeCaseObject } from '@edx/frontend-platform'; import { LETTER_REGEX, NUMBER_REGEX } from '../../data/constants'; import messages from '../messages'; @@ -44,11 +44,12 @@ export const isFormValid = ( } }); - if (!configurableFormFields?.country?.displayValue) { - fieldErrors.country = formatMessage(messages['empty.country.field.error']); - isValid = false; + if (getConfig().SHOW_CONFIGURABLE_EDX_FIELDS) { + if (!configurableFormFields?.country?.displayValue) { + fieldErrors.country = formatMessage(messages['empty.country.field.error']); + isValid = false; + } } - Object.keys(fieldDescriptions).forEach(key => { if (key === 'country' && !configurableFormFields.country.displayValue) { fieldErrors[key] = formatMessage(messages['empty.country.field.error']); diff --git a/src/sass/_base_component.scss b/src/sass/_base_component.scss index fe4b20619b..33ed4395c4 100644 --- a/src/sass/_base_component.scss +++ b/src/sass/_base_component.scss @@ -38,6 +38,11 @@ max-width: 320px; } +.main-heading { + position: relative; + z-index: 2; +} + .complete-your-profile { font-weight: 700; line-height: 1;