diff --git a/.env.build.example b/.env.build.example
index cae7cc9e9..8669d1f31 100644
--- a/.env.build.example
+++ b/.env.build.example
@@ -9,7 +9,7 @@ NODE_ENV=development
APP_STAGE=development
# The NRN preset used for the demo
-NRN_PRESET=v1-ssr-mst-aptd-gcms-lcz-sty
+NRN_PRESET=v1-hyb-mst-aptd-gcms-lcz-sty
# The customer that is being deployed
CUSTOMER_REF=customer1
diff --git a/.eslintrc.yml b/.eslintrc.yml
index 7b7e8a4da..7918d6d58 100644
--- a/.eslintrc.yml
+++ b/.eslintrc.yml
@@ -44,9 +44,7 @@ rules: # See https://eslint.org/docs/rules
strict: 'off'
no-console: 1 # Shouldn't use "console", but "logger" instead
allowArrowFunctions: 0
- no-unused-vars:
- - warn # Warn otherwise it false-positive with needed React imports
- - args: none # Allow to declare unused variables in function arguments, meant to be used later
+ no-unused-vars: 0 # Disabled, already handled by @typescript-eslint/no-unused-vars
import/prefer-default-export: 0 # When there is only a single export from a module, don't enforce a default export, but rather let developer choose what's best
no-else-return: 0 # Don't enforce, let developer choose. Sometimes we like to specifically use "return" for the sake of comprehensibility and avoid ambiguity
no-underscore-dangle: 0 # Allow _ before/after variables and functions, convention for something meant to be "private"
@@ -78,7 +76,7 @@ rules: # See https://eslint.org/docs/rules
react-hooks/exhaustive-deps: warn
react/jsx-no-target-blank: warn # Not using "noreferrer" is not a security risk, but "noopener" should always be used indeed
react/prop-types: warn # Should be handled with TS instead
- react/no-unescaped-entities: warn # Causes text mismatch when enabled
+ react/no-unescaped-entities: 0 # Causes text mismatch when enabled
jsx-a11y/anchor-is-valid: warn
linebreak-style:
- error
diff --git a/.github/workflows/deploy-zeit-production.yml b/.github/workflows/deploy-zeit-production.yml
index 8c8394eb8..351cade28 100644
--- a/.github/workflows/deploy-zeit-production.yml
+++ b/.github/workflows/deploy-zeit-production.yml
@@ -13,13 +13,13 @@ jobs:
# Configures the deployment environment, install dependencies (like node, npm, etc.) that are requirements for the upcoming jobs
# Ex: Necessary to run `yarn deploy`
setup-environment:
- name: Setup deployment environment (Ubuntu 18.04 - Node 10.x)
+ name: Setup deployment environment (Ubuntu 18.04 - Node 12.x)
runs-on: ubuntu-18.04
steps:
- name: Installing node.js
uses: actions/setup-node@v1 # Used to install node environment - XXX https://github.com/actions/setup-node
with:
- node-version: '10.x' # Use the same node.js version as the one Zeit's uses (currently node10.x)
+ node-version: '12.x' # Use the same node.js version as the one Zeit's uses (currently node12.x)
# Starts a Zeit deployment, using the production configuration file of the default institution
# The default institution is the one defined in the `now.json` file (which is a symlink to the actual file)
diff --git a/.github/workflows/deploy-zeit-staging.yml b/.github/workflows/deploy-zeit-staging.yml
index 2cecbe90b..7b01f4f5f 100644
--- a/.github/workflows/deploy-zeit-staging.yml
+++ b/.github/workflows/deploy-zeit-staging.yml
@@ -13,13 +13,13 @@ jobs:
# Configures the deployment environment, install dependencies (like node, npm, etc.) that are requirements for the upcoming jobs
# Ex: Necessary to run `yarn deploy`
setup-environment:
- name: Setup deployment environment (Ubuntu 18.04 - Node 10.x)
+ name: Setup deployment environment (Ubuntu 18.04 - Node 12.x)
runs-on: ubuntu-18.04
steps:
- name: Installing node.js
uses: actions/setup-node@v1 # Used to install node environment - XXX https://github.com/actions/setup-node
with:
- node-version: '10.x' # Use the same node.js version as the one Zeit's uses (currently node10.x)
+ node-version: '12.x' # Use the same node.js version as the one Zeit's uses (currently node12.x)
# Starts a Zeit deployment, using the staging configuration file of the default institution
# The default institution is the one defined in the `now.json` file (which is a symlink to the actual file)
@@ -46,13 +46,19 @@ jobs:
else
ZEIT_DEPLOYMENT_ALIAS=$(cat now.json | jq -r '.name')-${CURRENT_BRANCH##*/}
fi
-
- # Zeit alias only allows 53 characters in the domain name, so we only keep the first 46 characters (because Zeit needs 7 chars for ".now.sh" at the end of the domain name)
- # Also, in order to remove forbidden characters, we create a sequence from ascii numbers using ranges of numbers (we forbid characters by using `seq X Y` and we add others by using ';').
- # All special characters are converted to `-` (using `tr $0 $1` where $0 is replaced by $1), and only 0-9 and a-Z chars are kept intact.
- # We then use `awk` to convert "ascii numbers" back into actual characters.
- # You can find the numbers equivalence by tapping `man ascii` and look at the "decimal" set.
- ZEIT_DEPLOYMENT_ALIAS=$(echo $ZEIT_DEPLOYMENT_ALIAS | head -c 46 | tr "`(seq 0 47 ; seq 58 64 ; seq 91 96 && seq 123 127) | awk '{printf("%c",$1)}'`" -).now.sh
+
+ # Zeit alias only allows 53 characters in the domain name, so we only keep the first 45 (45 = 53 - 7 - 1) characters (because Zeit needs 7 chars for ".now.sh" at the end of the domain name, and count starts at 1, not 0)
+ # Also, in order to remove forbidden characters, we transform every characters which are not a "alnum" and \n or \r into '-'
+
+ ZEIT_DEPLOYMENT_ALIAS=$(echo $ZEIT_DEPLOYMENT_ALIAS | head -c 45 | tr -c '[:alnum:]\r\n' - | tr '[:upper:]' '[:lower:]')
+
+ # Recursively remove any trailing dash ('-')
+ while [[ "$ZEIT_DEPLOYMENT_ALIAS" == *- ]]
+ do
+ ZEIT_DEPLOYMENT_ALIAS=${ZEIT_DEPLOYMENT_ALIAS::-1}
+ done
+
+ ZEIT_DEPLOYMENT_ALIAS=$ZEIT_DEPLOYMENT_ALIAS.now.sh
echo "::set-env name=ZEIT_DEPLOYMENT_ALIAS::https://$ZEIT_DEPLOYMENT_ALIAS"
npx now alias $ZEIT_DEPLOYMENT_URL https://$ZEIT_DEPLOYMENT_ALIAS --token $ZEIT_TOKEN
diff --git a/.gitignore b/.gitignore
index 95f6f4fbe..e8620c4d1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -69,6 +69,7 @@ fabric.properties
*.iml
modules.xml
.idea/misc.xml
+.idea/codeStyles
*.ipr
vcs.xml
diff --git a/.nowignore b/.nowignore
index 4cbc376fd..bb18cd833 100644
--- a/.nowignore
+++ b/.nowignore
@@ -12,3 +12,7 @@ README.md
schema.graphql
yarn.lock
yarn-error.log
+
+# Avoid tests being deployed as Vercel Serverless Functions (increases bundle size, and count towards limits)
+src/pages/api/*.test.ts
+src/pages/api/**/*.test.ts
diff --git a/cypress/config-customer1.json b/cypress/config-customer1.json
index 76a1e8ac6..6d260d39d 100644
--- a/cypress/config-customer1.json
+++ b/cypress/config-customer1.json
@@ -1,5 +1,5 @@
{
- "baseUrl": "https://nrn-v1-ssr-mst-aptd-gcms-lcz-sty-c1.now.sh/",
+ "baseUrl": "https://nrn-v1-hyb-mst-aptd-gcms-lcz-sty-c1.now.sh/",
"projectId": "4dvdog",
"screenshotsFolder": "cypress/screenshots/customer1",
"videosFolder": "cypress/videos/customer1",
diff --git a/cypress/config-customer2.json b/cypress/config-customer2.json
index 069f85bb9..804b80d31 100644
--- a/cypress/config-customer2.json
+++ b/cypress/config-customer2.json
@@ -1,5 +1,5 @@
{
- "baseUrl": "https://nrn-v1-ssr-mst-aptd-gcms-lcz-sty-c2.now.sh/",
+ "baseUrl": "https://nrn-v1-hyb-mst-aptd-gcms-lcz-sty-c2.now.sh/",
"projectId": "4dvdog",
"screenshotsFolder": "cypress/screenshots/customer2",
"videosFolder": "cypress/videos/customer2",
diff --git a/cypress/integration/app/pages/index.js b/cypress/integration/app/pages/index.js
index b20f25b23..379819f75 100644
--- a/cypress/integration/app/pages/index.js
+++ b/cypress/integration/app/pages/index.js
@@ -23,14 +23,17 @@ describe('Index page', () => {
* Navbar section
*/
it('should have 5 links in the navigation bar', () => {
- cy.get('#nav a.nav-link').should('have.length', 5);
+ cy.get('#nav .navbar-nav > .nav-item').should('have.length', 5);
});
it('should have a link in the navbar that redirects to the examples page', () => {
- cy.url().should('eq', `${baseUrl}/`);
+ cy.url().should('eq', `${baseUrl}/en`);
cy.get('#nav-link-examples')
.should('have.text', 'Examples')
.click();
- cy.url().should('eq', `${baseUrl}/examples`);
+ cy.get('#nav-link-examples-static-i-18-n')
+ .should('have.text', 'Static i18n')
+ .click();
+ cy.url().should('eq', `${baseUrl}/en/examples/built-in-features/static-i18n`);
});
});
diff --git a/docs/.gitignore b/docs/.gitignore
new file mode 100644
index 000000000..45c150536
--- /dev/null
+++ b/docs/.gitignore
@@ -0,0 +1,3 @@
+_site
+.sass-cache
+.jekyll-metadata
diff --git a/docs/404.html b/docs/404.html
new file mode 100644
index 000000000..eeaa17753
--- /dev/null
+++ b/docs/404.html
@@ -0,0 +1,25 @@
+---
+layout: default
+nav_exclude: true
+---
+
+
+
+
+
+
+
+
+ {% include nav.html %}
+
+
+
+
+
+
+
+ {% unless page.url == "/" %}
+ {% if page.parent %}
+
+
+ {% if page.grand_parent %}
+ {{ page.grand_parent }}
+ {{ page.parent }}
+ {% else %}
+ {{ page.parent }}
+ {% endif %}
+ {{ page.title }}
+
+
+ {% endif %}
+ {% endunless %}
+
+ {% if site.heading_anchors != false %}
+ {% include vendor/anchor_headings.html html=content beforeHeading="true" anchorBody="
" anchorClass="anchor-heading" %}
+ {% else %}
+ {{ content }}
+ {% endif %}
+
+ {% if page.has_children == true and page.has_toc != false %}
+
+
Table of contents
+ {% assign children_list = site.pages | sort:"nav_order" %}
+
+ {% for child in children_list %}
+ {% if child.parent == page.title and child.title != page.title %}
+
+ {{ child.title }} {% if child.summary %} - {{ child.summary }}{% endif %}
+
+ {% endif %}
+ {% endfor %}
+
+ {% endif %}
+
+ {% if site.footer_content != nil %}
+
+
+ {% endif %}
+
+
+
+
+
+
+
+
diff --git a/docs/_sass/overrides.scss b/docs/_sass/overrides.scss
new file mode 100644
index 000000000..fbba33b73
--- /dev/null
+++ b/docs/_sass/overrides.scss
@@ -0,0 +1,33 @@
+// XXX Overrides CSS styles - See https://pmarsceill.github.io/just-the-docs/docs/customization/#override-styles
+
+blockquote {
+ border-left: #f4f1fa 1px solid;
+ padding-left: 25px;
+}
+
+.pagination-section {
+ display: flex;
+ justify-content: space-between;
+
+ &.space-even {
+ justify-content: space-evenly;
+ }
+}
+
+// Overrides https://github.com/jekyll/jemoji for better positioning alongside text
+img.emoji {
+ top: 5px;
+ position: relative;
+}
+
+h1 {
+ code {
+ font-size: 36px;
+ }
+}
+
+h2 {
+ code {
+ font-size: 24px;
+ }
+}
diff --git a/docs/changelog.md b/docs/changelog.md
new file mode 100644
index 000000000..73a07193f
--- /dev/null
+++ b/docs/changelog.md
@@ -0,0 +1,21 @@
+---
+layout: default
+title: CHANGELOG
+nav_order: 80
+---
+
+Changelog
+===
+
+
+- v1.0.0 - 2020-02-28
+ - Initial release, production-ready (doc to be improved)
+
+
+---
+
+
diff --git a/docs/contributing.md b/docs/contributing.md
new file mode 100644
index 000000000..9cb629a09
--- /dev/null
+++ b/docs/contributing.md
@@ -0,0 +1,75 @@
+---
+layout: default
+title: CONTRIBUTING
+nav_order: 90
+---
+
+# Contributing
+{: .no_toc }
+
+{% include page-toc.md %}
+
+---
+
+## Contributing about documentation
+
+Our documentation lives in the `docs/` folder. It is generated and hosted by Github Pages.
+
+Only the `master` branch generates the online documentation.
+
+It uses [Jekyll](https://jekyllrb.com/) behind the wheel, and [`just-the-docs`](https://pmarsceill.github.io/just-the-docs/) theme for Jekyll.
+
+---
+
+### Installing Jekyll locally
+
+In order to contribute to the docs, you may need to install Jekyll locally (especially for non-trivial changes).
+Jekyll needs Ruby binary.
+
+1. Install and configure Jekyll on your computer, follow [https://jekyllrb.com/docs/](https://jekyllrb.com/docs/)
+1. Once Jekyll is installed, you can install all Ruby gems using `yarn doc:gem:install`
+1. Once gems are installed, you can run the local Jekyll server by using `yarn doc:start` which will start the server at localhost:4000
+
+---
+
+### Configuring Jekyll properly
+
+Jekyll configuration uses 2 different files.
+- [`docs/_config.yml`](docs/_config.yml) used by Github Pages
+- [`docs/_config-development.yml`](docs/_config-development.yml) used by your local installation
+
+There are a few, but important differences between both. The custom configuration must be written at the top of each config file.
+The shared configuration must be written below.
+
+> **N.B**: If you add custom/shared configuration, don't forget update both config files, as needed.
+
+---
+
+### Reference
+
+Jekyll theme used: [`just-the-docs`](https://pmarsceill.github.io/just-the-docs/)
+
+#### How to build a custom TOC
+
+See [just-the-docs documentation](https://pmarsceill.github.io/just-the-docs/docs/navigation-structure/#in-page-navigation-with-table-of-contents)
+
+#### How to write comments in Markdown files
+
+```md
+[//]: # (Some markdown comment)
+```
+
+---
+
+### Known issues
+
+- Using `yarn doc:start` will rebuild the whole documentation but it's slower. Using `yarn doc:start:fast` won't rebuild the whole thing and it's faster.
+ If you're working on the navigation menu, be warned the fast mode won't apply changes and your menu links won't update.
+
+---
+
+
diff --git a/docs/favicon.ico b/docs/favicon.ico
new file mode 100644
index 000000000..8a258869e
Binary files /dev/null and b/docs/favicon.ico differ
diff --git a/docs/index.md b/docs/index.md
new file mode 100644
index 000000000..1fcd15110
--- /dev/null
+++ b/docs/index.md
@@ -0,0 +1,32 @@
+---
+layout: default
+title: Introduction
+nav_order: 10
+---
+
+# My GitHub Pages docs site
+
+Hello! Welcome to your docs site that comes built-in with NRN :smiley:
+
+Take a look at the [CONTRIBUTING](./contributing) section about how to install/run those docs locally.
+
+All the documentation you need about how to build your own docs site is available at [`just-the-docs`](https://pmarsceill.github.io/just-the-docs/).
+
+If you want to look at a more complex example, take a look at the [NRN docs source code](https://github.com/UnlyEd/next-right-now/tree/gh-pages)!
+
+One small difference though, NRN docs lives at the / folder, because it uses gh-pages, but the built-in docs that comes with a NRN preset are in the `docs/` folder instead.
+
+Using a `gh-pages` or `master` dedicated branch, or using your `master` branch `docs` folder really is up to you, you can choose what option you want on your GitHub Settings pages, in the **GitHub Pages** section.
+
+By default, GitHub won't use your `/docs` folder, until you manually configure it.
+
+> You can definitely leave this folder be for now on, and keep it around for a later use, or remove it altogether.
+> It's completely unrelated to the rest of this boilerplate and won't have any side effect.
+
+---
+
+
diff --git a/docs/sep-faq.md b/docs/sep-faq.md
new file mode 100644
index 000000000..f4dd0ced1
--- /dev/null
+++ b/docs/sep-faq.md
@@ -0,0 +1,5 @@
+---
+layout: default
+title: "-"
+nav_order: 61
+---
diff --git a/next.config.js b/next.config.js
index cdd89c1aa..68a27e520 100644
--- a/next.config.js
+++ b/next.config.js
@@ -1,11 +1,21 @@
const withSourceMaps = require('@zeit/next-source-maps')();
-const withCSS = require('@zeit/next-css'); // Allows to import ".css" files, like bootstrap.css
const packageJson = require('./package');
const date = new Date();
+const i18nConfig = require('./src/i18nConfig');
+const supportedLocales = i18nConfig.supportedLocales.map((supportedLocale) => {
+ return supportedLocale.name;
+});
+const noRedirectBlacklistedPaths = ['_next']; // Paths that mustn't have rewrite applied to them, to avoid the whole app to behave inconsistently
+const publicBasePaths = ['robots', 'static', 'favicon.ico']; // All items (folders, files) under /public directory should be added there, to avoid redirection when an asset isn't found
+const noRedirectBasePaths = [...supportedLocales, ...publicBasePaths, ...noRedirectBlacklistedPaths]; // Will disable url rewrite for those items (should contain all supported languages and all public base paths)
+const withBundleAnalyzer = require('@next/bundle-analyzer')({ // Run with "yarn next:bundle" - See https://www.npmjs.com/package/@next/bundle-analyzer
+ enabled: process.env.ANALYZE_BUNDLE === 'true',
+})
console.debug(`Building Next with NODE_ENV="${process.env.NODE_ENV}" APP_STAGE="${process.env.APP_STAGE}" for CUSTOMER_REF="${process.env.CUSTOMER_REF}"`);
-module.exports = withCSS(withSourceMaps({
+module.exports = withBundleAnalyzer(withSourceMaps({
+ // target: 'serverless', // Automatically enabled on Vercel, you may need to manually opt-in if you're not using Vercel - See https://nextjs.org/docs/api-reference/next.config.js/build-target#serverless-target
env: {
// XXX Duplication of the environment variables, this is only used locally (See https://github.com/zeit/next.js#build-time-configuration)
// while now.json:build:env will be used on the Now platform (See https://zeit.co/docs/v2/build-step/#providing-environment-variables)
@@ -26,12 +36,58 @@ module.exports = withCSS(withSourceMaps({
APP_VERSION: packageJson.version,
UNLY_SIMPLE_LOGGER_ENV: process.env.APP_STAGE, // Used by @unly/utils-simple-logger - Fix missing staging logs because it believes we're in production
},
+ experimental: {
+ redirects() {
+ const redirects = [
+ {
+ // Redirect root link with trailing slash to non-trailing slash, avoids 404 - See https://github.com/zeit/next.js/discussions/10651#discussioncomment-8270
+ source: '/:locale/',
+ destination: '/:locale',
+ permanent: process.env.APP_STAGE !== 'development', // Do not use permanent redirect locally to avoid browser caching when working on it
+ },
+ {
+ // Redirect link with trailing slash to non-trailing slash (any depth), avoids 404 - See https://github.com/zeit/next.js/discussions/10651#discussioncomment-8270
+ source: '/:locale/:path*/',
+ destination: '/:locale/:path*',
+ permanent: process.env.APP_STAGE !== 'development', // Do not use permanent redirect locally to avoid browser caching when working on it
+ },
+ ];
+
+ if (process.env.APP_STAGE === 'development') {
+ console.info('Using experimental redirects:', redirects);
+ }
+
+ return redirects;
+ },
+ rewrites() {
+ const rewrites = [
+ {
+ // XXX Doesn't work locally (maybe because of rewrites), but works online
+ source: '/',
+ destination: '/api/autoRedirectToLocalisedPage',
+ },
+ {
+ source: `/:locale((?!${noRedirectBasePaths.join('|')})[^/]+)(.*)`,
+ destination: '/api/autoRedirectToLocalisedPage',
+ },
+ ];
+
+ if (process.env.APP_STAGE === 'development') {
+ console.info('Using experimental rewrites:', rewrites);
+ }
+
+ return rewrites;
+ },
+ },
webpack: (config, { isServer, buildId }) => {
const APP_VERSION_RELEASE = `${packageJson.version}_${buildId}`;
-
- // Dynamically add some "env" variables that will be replaced during the build
- config.plugins[1].definitions['process.env.APP_RELEASE'] = JSON.stringify(buildId);
- config.plugins[1].definitions['process.env.APP_VERSION_RELEASE'] = JSON.stringify(APP_VERSION_RELEASE);
+ config.plugins.map((plugin, i) => {
+ if (plugin.definitions) { // If it has a "definitions" key, then we consider it's the DefinePlugin where ENV vars are stored
+ // Dynamically add some "env" variables that will be replaced during the build in "DefinePlugin"
+ plugin.definitions['process.env.APP_RELEASE'] = JSON.stringify(buildId);
+ plugin.definitions['process.env.APP_VERSION_RELEASE'] = JSON.stringify(APP_VERSION_RELEASE);
+ }
+ });
if (isServer) { // Trick to only log once
console.debug(`[webpack] Building release "${APP_VERSION_RELEASE}"`);
diff --git a/now.customer1.production.json b/now.customer1.production.json
index cfe62438f..751945996 100644
--- a/now.customer1.production.json
+++ b/now.customer1.production.json
@@ -1,17 +1,17 @@
{
"version": 2,
- "name": "nrn-v1-ssr-mst-aptd-gcms-lcz-sty-c1",
+ "name": "nrn-v1-hyb-mst-aptd-gcms-lcz-sty-c1",
"scope": "team_qnVfSEVc2WwmOE1OYhZr4VST",
"env": {},
"build": {
"env": {
"APP_STAGE": "production",
- "NRN_PRESET": "v1-ssr-mst-aptd-gcms-lcz-sty",
+ "NRN_PRESET": "v1-hyb-mst-aptd-gcms-lcz-sty",
"CUSTOMER_REF": "customer1",
"GRAPHQL_API_ENDPOINT": "https://api-euwest.graphcms.com/v1/ck73ixhlv09yt01dv2ga1bkbp/master",
"GRAPHQL_API_KEY": "@nrn-graphql-api-key",
"LOCIZE_PROJECT_ID": "@nrn-locize-project-id",
- "LOCIZE_API_KEY": "@nrn-locize-api-key",
+ "LOCIZE_API_KEY": "The Locize API Key shouldn't be used in production (see https://github.com/locize/i18next-locize-backend#backend-options) because it's related to development-only features, and it's sensitive.",
"AMPLITUDE_API_KEY": "@nrn-amplitude-api-key-production",
"SENTRY_DSN": "@nrn-sentry-dsn"
}
diff --git a/now.customer1.staging.json b/now.customer1.staging.json
index 6aafacc70..1b2697883 100644
--- a/now.customer1.staging.json
+++ b/now.customer1.staging.json
@@ -1,17 +1,17 @@
{
"version": 2,
- "name": "nrn-v1-ssr-mst-aptd-gcms-lcz-sty-c1",
+ "name": "nrn-v1-hyb-mst-aptd-gcms-lcz-sty-c1",
"scope": "team_qnVfSEVc2WwmOE1OYhZr4VST",
"env": {},
"build": {
"env": {
"APP_STAGE": "staging",
- "NRN_PRESET": "v1-ssr-mst-aptd-gcms-lcz-sty",
+ "NRN_PRESET": "v1-hyb-mst-aptd-gcms-lcz-sty",
"CUSTOMER_REF": "customer1",
"GRAPHQL_API_ENDPOINT": "https://api-euwest.graphcms.com/v1/ck73ixhlv09yt01dv2ga1bkbp/master",
"GRAPHQL_API_KEY": "@nrn-graphql-api-key",
"LOCIZE_PROJECT_ID": "@nrn-locize-project-id",
- "LOCIZE_API_KEY": "@nrn-locize-api-key",
+ "LOCIZE_API_KEY": "@nrn-locize-api-key-staging",
"AMPLITUDE_API_KEY": "@nrn-amplitude-api-key-staging",
"SENTRY_DSN": "@nrn-sentry-dsn"
}
diff --git a/now.customer2.production.json b/now.customer2.production.json
index bbb2a3b44..43ee285cd 100644
--- a/now.customer2.production.json
+++ b/now.customer2.production.json
@@ -1,17 +1,17 @@
{
"version": 2,
- "name": "nrn-v1-ssr-mst-aptd-gcms-lcz-sty-c2",
+ "name": "nrn-v1-hyb-mst-aptd-gcms-lcz-sty-c2",
"scope": "team_qnVfSEVc2WwmOE1OYhZr4VST",
"env": {},
"build": {
"env": {
"APP_STAGE": "production",
- "NRN_PRESET": "v1-ssr-mst-aptd-gcms-lcz-sty",
+ "NRN_PRESET": "v1-hyb-mst-aptd-gcms-lcz-sty",
"CUSTOMER_REF": "customer2",
"GRAPHQL_API_ENDPOINT": "https://api-euwest.graphcms.com/v1/ck73ixhlv09yt01dv2ga1bkbp/master",
"GRAPHQL_API_KEY": "@nrn-graphql-api-key",
"LOCIZE_PROJECT_ID": "@nrn-locize-project-id",
- "LOCIZE_API_KEY": "@nrn-locize-api-key",
+ "LOCIZE_API_KEY": "The Locize API Key shouldn't be used in production (see https://github.com/locize/i18next-locize-backend#backend-options) because it's related to development-only features, and it's sensitive.",
"AMPLITUDE_API_KEY": "@nrn-amplitude-api-key-production",
"SENTRY_DSN": "@nrn-sentry-dsn"
}
diff --git a/now.customer2.staging.json b/now.customer2.staging.json
index d5940d475..dbe16a6ad 100644
--- a/now.customer2.staging.json
+++ b/now.customer2.staging.json
@@ -1,17 +1,17 @@
{
"version": 2,
- "name": "nrn-v1-ssr-mst-aptd-gcms-lcz-sty-c2",
+ "name": "nrn-v1-hyb-mst-aptd-gcms-lcz-sty-c2",
"scope": "team_qnVfSEVc2WwmOE1OYhZr4VST",
"env": {},
"build": {
"env": {
"APP_STAGE": "staging",
- "NRN_PRESET": "v1-ssr-mst-aptd-gcms-lcz-sty",
+ "NRN_PRESET": "v1-hyb-mst-aptd-gcms-lcz-sty",
"CUSTOMER_REF": "customer2",
"GRAPHQL_API_ENDPOINT": "https://api-euwest.graphcms.com/v1/ck73ixhlv09yt01dv2ga1bkbp/master",
"GRAPHQL_API_KEY": "@nrn-graphql-api-key",
"LOCIZE_PROJECT_ID": "@nrn-locize-project-id",
- "LOCIZE_API_KEY": "@nrn-locize-api-key",
+ "LOCIZE_API_KEY": "@nrn-locize-api-key-staging",
"AMPLITUDE_API_KEY": "@nrn-amplitude-api-key-staging",
"SENTRY_DSN": "@nrn-sentry-dsn"
}
diff --git a/package.json b/package.json
index b160080eb..041a2afe6 100644
--- a/package.json
+++ b/package.json
@@ -6,7 +6,8 @@
"start": "now dev --listen 8888",
"build": "yarn test:once && next build",
"next": "next start",
- "svg": "npx svgr -d src/svg src/svg --ext tsx --template ./src/utils/svgTemplate.ts",
+ "next:bundle": "ANALYZE_BUNDLE=true yarn start",
+ "svg": "npx svgr -d src/svg src/svg --ext tsx --template src/utils/svg/svgTemplate.ts",
"deploy": "yarn deploy:customer1",
"deploy:all": "yarn deploy:customer1 && yarn deploy:customer2",
"deploy:all:production": "yarn deploy:customer1:production && yarn deploy:customer2:production",
@@ -50,25 +51,28 @@
},
"dependencies": {
"@amplitude/react-amplitude": "1.0.0",
- "@apollo/react-ssr": "3.1.4",
+ "@apollo/react-hooks": "3.1.5",
+ "@apollo/react-ssr": "3.1.5",
"@emotion/core": "10.0.28",
"@emotion/styled": "10.0.27",
"@fortawesome/fontawesome-svg-core": "1.2.28",
"@fortawesome/free-brands-svg-icons": "5.13.0",
+ "@fortawesome/free-regular-svg-icons": "5.13.0",
"@fortawesome/free-solid-svg-icons": "5.13.0",
"@fortawesome/react-fontawesome": "0.1.9",
- "@sentry/browser": "5.15.4",
- "@sentry/node": "5.15.4",
+ "@sentry/browser": "5.15.5",
+ "@sentry/node": "5.15.5",
+ "@types/lodash.filter": "4.6.6",
"@unly/universal-language-detector": "2.0.3",
"@unly/utils": "1.0.3",
"@unly/utils-simple-logger": "1.4.0",
- "amplitude-js": "5.10.0",
- "animate.css": "3.7.2",
- "apollo-boost": "0.4.7",
- "apollo-cache-inmemory": "1.6.5",
- "apollo-client": "2.6.8",
- "apollo-link-http": "1.5.16",
- "bootstrap": "4.4.1",
+ "amplitude-js": "6.2.0",
+ "animate.css": "4.1.0",
+ "apollo-boost": "0.4.9",
+ "apollo-cache-inmemory": "1.6.6",
+ "apollo-client": "2.6.10",
+ "apollo-link-http": "1.5.17",
+ "bootstrap": "4.5.0",
"classnames": "2.2.6",
"cookies": "0.8.0",
"css-to-react-native": "3.0.0",
@@ -76,33 +80,37 @@
"emotion-theming": "10.0.27",
"graphql": "15.0.0",
"graphql-tag": "2.10.3",
- "i18next": "19.3.4",
- "i18next-locize-backend": "3.1.1",
- "i18next-node-locize-backend": "3.1.0",
- "isomorphic-unfetch": "3.0.0",
+ "i18next": "19.4.4",
+ "i18next-locize-backend": "4.0.8",
"js-cookie": "2.2.1",
"json-stringify-safe": "5.0.1",
"locize-editor": "3.0.0",
- "locize-node-lastused": "2.0.0",
+ "locize-lastused": "3.0.4",
"lodash.clonedeep": "4.5.0",
+ "lodash.filter": "4.6.0",
"lodash.find": "4.6.0",
"lodash.get": "4.4.2",
"lodash.includes": "4.3.0",
"lodash.isarray": "4.0.0",
"lodash.isempty": "4.4.0",
"lodash.isplainobject": "4.0.6",
+ "lodash.kebabcase": "4.1.1",
"lodash.map": "4.6.0",
"lodash.remove": "4.7.0",
+ "lodash.size": "4.2.0",
+ "lodash.some": "4.6.0",
+ "lodash.startswith": "4.2.1",
"lodash.xorby": "4.7.0",
- "next": "9.3.4",
+ "next": "9.4.4",
"next-cookies": "2.0.3",
- "next-with-apollo": "5.0.0",
+ "next-with-apollo": "5.0.1",
"prop-types": "15.7.2",
"rc-tooltip": "4.0.3",
"react": "16.13.1",
- "react-apollo": "3.1.4",
+ "react-apollo": "3.1.5",
+ "react-code-blocks": "0.0.7",
"react-dom": "16.13.1",
- "react-i18next": "11.3.4",
+ "react-i18next": "11.4.0",
"react-style-proptype": "3.2.2",
"reactstrap": "8.4.1",
"recompose": "0.30.0",
@@ -110,12 +118,13 @@
"winston": "3.2.1"
},
"devDependencies": {
- "@now/node": "1.5.0",
- "@svgr/cli": "5.3.0",
- "@types/amplitude-js": "5.8.0",
+ "@next/bundle-analyzer": "9.4.1",
+ "@now/node": "1.6.1",
+ "@svgr/cli": "5.4.0",
+ "@types/amplitude-js": "5.11.0",
"@types/cookies": "0.7.4",
- "@types/jest": "25.1.5",
- "@types/js-cookie": "2.2.5",
+ "@types/jest": "25.2.2",
+ "@types/js-cookie": "2.2.6",
"@types/lodash.clonedeep": "4.5.6",
"@types/lodash.find": "4.6.6",
"@types/lodash.get": "4.4.6",
@@ -123,33 +132,39 @@
"@types/lodash.isarray": "4.0.6",
"@types/lodash.isempty": "4.4.6",
"@types/lodash.isplainobject": "4.0.6",
+ "@types/lodash.kebabcase": "4.1.6",
"@types/lodash.map": "4.6.13",
"@types/lodash.remove": "4.7.6",
+ "@types/lodash.size": "4.2.6",
+ "@types/lodash.some": "4.6.6",
+ "@types/lodash.startswith": "4.2.6",
"@types/lodash.xorby": "4.7.6",
- "@types/react": "16.9.32",
- "@types/webfontloader": "1.6.29",
- "@types/webpack-env": "1.15.1",
- "@typescript-eslint/eslint-plugin": "2.26.0",
- "@typescript-eslint/parser": "2.26.0",
- "@zeit/next-css": "1.0.1",
+ "@types/popper.js": "1.11.0",
+ "@types/react": "16.9.35",
+ "@types/reactstrap": "8.4.2",
+ "@types/webfontloader": "1.6.30",
+ "@types/webpack-env": "1.15.2",
+ "@typescript-eslint/eslint-plugin": "2.33.0",
+ "@typescript-eslint/parser": "2.33.0",
+ "@welldone-software/why-did-you-render": "4.2.2",
"@zeit/next-source-maps": "0.0.4-canary.1",
- "concurrently": "5.1.0",
+ "concurrently": "5.2.0",
"cross-env": "7.0.2",
- "cypress": "4.3.0",
- "del-cli": "3.0.0",
- "eslint": "6.8.0",
- "eslint-plugin-jest": "23.8.2",
+ "cypress": "4.5.0",
+ "del-cli": "3.0.1",
+ "eslint": "7.0.0",
+ "eslint-plugin-jest": "23.13.1",
"eslint-plugin-jsx-a11y": "6.2.3",
- "eslint-plugin-react": "7.19.0",
- "eslint-plugin-react-hooks": "3.0.0",
+ "eslint-plugin-react": "7.20.0",
+ "eslint-plugin-react-hooks": "4.0.2",
"eslint-watch": "6.0.1",
- "jest": "25.2.7",
+ "jest": "26.0.1",
"jest-extended": "0.11.5",
"node-mocks-http": "1.8.1",
"now": "17.1.1",
"react-test-renderer": "16.13.1",
- "ts-jest": "25.3.0",
- "typescript": "3.8.3",
+ "ts-jest": "26.0.0",
+ "typescript": "3.9.2",
"version-bump-prompt": "6.0.3"
}
}
diff --git a/public/static/CDN/detect-outdated-browser/outdated-browser-rework.min.js b/public/static/CDN/detect-outdated-browser/outdated-browser-rework.min.js
index c4b7db4e7..b82bbbb79 100644
--- a/public/static/CDN/detect-outdated-browser/outdated-browser-rework.min.js
+++ b/public/static/CDN/detect-outdated-browser/outdated-browser-rework.min.js
@@ -1,4 +1,6 @@
!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).outdatedBrowserRework=e()}}(function(){return function u(r,s,l){function n(i,e){if(!s[i]){if(!r[i]){var o="function"==typeof require&&require;if(!e&&o)return o(i,!0);if(d)return d(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var t=s[i]={exports:{}};r[i][0].call(t.exports,function(e){var o=r[i][1][e];return n(o||e)},t,t.exports,u,r,s,l)}return s[i].exports}for(var d="function"==typeof require&&require,e=0;e
"+f.update.web+''+f.callToAction+" ",googlePlay:""+f.update.googlePlay+''+f.callToAction+"
",appStore:""+f.update[u]+"
"}[u],v=f.outOfDate,k()&&f.unsupported&&(v=f.unsupported),''),c=document.getElementById("buttonCloseUpdateBrowser"),w=document.getElementById("buttonUpdateBrowser"),i.style.backgroundColor=t,i.style.color=r,i.children[0].children[0].style.color=r,i.children[0].children[1].style.color=r,w&&(w.style.color=r,w.style.borderColor&&(w.style.borderColor=r),w.onmouseover=function(){this.style.color=t,this.style.backgroundColor=r},w.onmouseout=function(){this.style.color=r,this.style.backgroundColor=t}),c.style.color=r,c.onmousedown=function(){return!(i.style.display="none")}}},o=window.onload;"function"!=typeof window.onload?window.onload=e:window.onload=function(){o&&o(),e()}}},{"./extend":1,"./languages.json":3,"ua-parser-js":4}],3:[function(e,o,i){o.exports={br:{outOfDate:"O seu navegador está desatualizado!",update:{web:"Atualize o seu navegador para ter uma melhor experiência e visualização deste site. ",googlePlay:"Please install Chrome from Google Play",appStore:"Please update iOS from the Settings App"},url:"https://browser-update.org/update-browser.html#br",callToAction:"Atualize o seu navegador agora",close:"Fechar"},ca:{outOfDate:"El vostre navegador no està actualitzat!",update:{web:"Actualitzeu el vostre navegador per veure correctament aquest lloc web. ",googlePlay:"Instal·leu Chrome des de Google Play",appStore:"Actualitzeu iOS des de l'aplicació Configuració"},url:"https://browser-update.org/update-browser.html#es",callToAction:"Actualitzar el meu navegador ara",close:"Tancar"},cn:{outOfDate:"您的浏览器已过时",update:{web:"要正常浏览本网站请升级您的浏览器。",googlePlay:"Please install Chrome from Google Play",appStore:"Please update iOS from the Settings App"},url:"https://browser-update.org/update-browser.html#cn",callToAction:"现在升级",close:"关闭"},cz:{outOfDate:"Váš prohlížeč je zastaralý!",update:{web:"Pro správné zobrazení těchto stránek aktualizujte svůj prohlížeč. ",googlePlay:"Nainstalujte si Chrome z Google Play",appStore:"Aktualizujte si systém iOS"},url:"https://browser-update.org/update-browser.html#cz",callToAction:"Aktualizovat nyní svůj prohlížeč",close:"Zavřít"},da:{outOfDate:"Din browser er forældet!",update:{web:"Opdatér din browser for at få vist denne hjemmeside korrekt. ",googlePlay:"Installér venligst Chrome fra Google Play",appStore:"Opdatér venligst iOS"},url:"https://browser-update.org/update-browser.html#da",callToAction:"Opdatér din browser nu",close:"Luk"},de:{outOfDate:"Ihr Browser ist veraltet!",update:{web:"Bitte aktualisieren Sie Ihren Browser, um diese Website korrekt darzustellen. ",googlePlay:"Please install Chrome from Google Play",appStore:"Please update iOS from the Settings App"},url:"https://browser-update.org/update-browser.html#de",callToAction:"Den Browser jetzt aktualisieren ",close:"Schließen"},ee:{outOfDate:"Sinu veebilehitseja on vananenud!",update:{web:"Palun uuenda oma veebilehitsejat, et näha lehekülge korrektselt. ",googlePlay:"Please install Chrome from Google Play",appStore:"Please update iOS from the Settings App"},url:"https://browser-update.org/update-browser.html#ee",callToAction:"Uuenda oma veebilehitsejat kohe",close:"Sulge"},en:{outOfDate:"Your browser is out-of-date!",update:{web:"Update your browser to view this website correctly. ",googlePlay:"Please install Chrome from Google Play",appStore:"Please update iOS from the Settings App"},url:"https://browser-update.org/update-browser.html#",callToAction:"Update my browser now",close:"Close"},es:{outOfDate:"¡Tu navegador está anticuado!",update:{web:"Actualiza tu navegador para ver esta página correctamente. ",googlePlay:"Please install Chrome from Google Play",appStore:"Please update iOS from the Settings App"},url:"https://browser-update.org/update-browser.html#es",callToAction:"Actualizar mi navegador ahora",close:"Cerrar"},fa:{rightToLeft:!0,outOfDate:"مرورگر شما منسوخ شده است!",update:{web:"جهت مشاهده صحیح این وبسایت، مرورگرتان را بروز رسانی نمایید. ",googlePlay:"Please install Chrome from Google Play",appStore:"Please update iOS from the Settings App"},url:"https://browser-update.org/update-browser.html#",callToAction:"همین حالا مرورگرم را بروز کن",close:"Close"},fi:{outOfDate:"Selaimesi on vanhentunut!",update:{web:"Lataa ajantasainen selain nähdäksesi tämän sivun oikein. ",googlePlay:"Asenna uusin Chrome Google Play -kaupasta",appStore:"Päivitä iOS puhelimesi asetuksista"},url:"https://browser-update.org/update-browser.html#fi",callToAction:"Päivitä selaimeni nyt ",close:"Sulje"},fr:{outOfDate:"Votre navigateur n'est plus compatible !",update:{web:"Mettez à jour votre navigateur pour afficher correctement ce site Web. ",googlePlay:"Merci d'installer Chrome depuis le Google Play Store",appStore:"Merci de mettre à jour iOS depuis l'application Réglages"},url:"https://browser-update.org/update-browser.html#fr",callToAction:"Mettre à jour maintenant ",close:"Fermer"},hu:{outOfDate:"A böngészője elavult!",update:{web:"Firssítse vagy cserélje le a böngészőjét. ",googlePlay:"Please install Chrome from Google Play",appStore:"Please update iOS from the Settings App"},url:"https://browser-update.org/update-browser.html#hu",callToAction:"A böngészőm frissítése ",close:"Close"},id:{outOfDate:"Browser yang Anda gunakan sudah ketinggalan zaman!",update:{web:"Perbaharuilah browser Anda agar bisa menjelajahi website ini dengan nyaman. ",googlePlay:"Please install Chrome from Google Play",appStore:"Please update iOS from the Settings App"},url:"https://browser-update.org/update-browser.html#",callToAction:"Perbaharui browser sekarang ",close:"Close"},it:{outOfDate:"Il tuo browser non è aggiornato!",update:{web:"Aggiornalo per vedere questo sito correttamente. ",googlePlay:"Please install Chrome from Google Play",appStore:"Please update iOS from the Settings App"},url:"https://browser-update.org/update-browser.html#it",callToAction:"Aggiorna ora",close:"Chiudi"},lt:{outOfDate:"Jūsų naršyklės versija yra pasenusi!",update:{web:"Atnaujinkite savo naršyklę, kad galėtumėte peržiūrėti šią svetainę tinkamai. ",googlePlay:"Please install Chrome from Google Play",appStore:"Please update iOS from the Settings App"},url:"https://browser-update.org/update-browser.html#",callToAction:"Atnaujinti naršyklę ",close:"Close"},nl:{outOfDate:"Je gebruikt een oude browser!",update:{web:"Update je browser om deze website correct te bekijken. ",googlePlay:"Please install Chrome from Google Play",appStore:"Please update iOS from the Settings App"},url:"https://browser-update.org/update-browser.html#nl",callToAction:"Update mijn browser nu ",close:"Sluiten"},pl:{outOfDate:"Twoja przeglądarka jest przestarzała!",update:{web:"Zaktualizuj swoją przeglądarkę, aby poprawnie wyświetlić tę stronę. ",googlePlay:"Please install Chrome from Google Play",appStore:"Please update iOS from the Settings App"},url:"https://browser-update.org/update-browser.html#pl",callToAction:"Zaktualizuj przeglądarkę już teraz",close:"Close"},pt:{outOfDate:"O seu browser está desatualizado!",update:{web:"Atualize o seu browser para ter uma melhor experiência e visualização deste site. ",googlePlay:"Please install Chrome from Google Play",appStore:"Please update iOS from the Settings App"},url:"https://browser-update.org/update-browser.html#pt",callToAction:"Atualize o seu browser agora",close:"Fechar"},ro:{outOfDate:"Browserul este învechit!",update:{web:"Actualizați browserul pentru a vizualiza corect acest site. ",googlePlay:"Please install Chrome from Google Play",appStore:"Please update iOS from the Settings App"},url:"https://browser-update.org/update-browser.html#",callToAction:"Actualizați browserul acum!",close:"Close"},ru:{outOfDate:"Ваш браузер устарел!",update:{web:"Обновите ваш браузер для правильного отображения этого сайта. ",googlePlay:"Please install Chrome from Google Play",appStore:"Please update iOS from the Settings App"},url:"https://browser-update.org/update-browser.html#ru",callToAction:"Обновить мой браузер ",close:"Закрыть"},si:{outOfDate:"Vaš brskalnik je zastarel!",update:{web:"Za pravilen prikaz spletne strani posodobite vaš brskalnik. ",googlePlay:"Please install Chrome from Google Play",appStore:"Please update iOS from the Settings App"},url:"https://browser-update.org/update-browser.html#si",callToAction:"Posodobi brskalnik ",close:"Zapri"},sv:{outOfDate:"Din webbläsare stödjs ej längre!",update:{web:"Uppdatera din webbläsare för att webbplatsen ska visas korrekt. ",googlePlay:"Please install Chrome from Google Play",appStore:"Please update iOS from the Settings App"},url:"https://browser-update.org/update-browser.html#",callToAction:"Uppdatera min webbläsare nu",close:"Stäng"},ua:{outOfDate:"Ваш браузер застарів!",update:{web:"Оновіть ваш браузер для правильного відображення цього сайта. ",googlePlay:"Please install Chrome from Google Play",appStore:"Please update iOS from the Settings App"},url:"https://browser-update.org/update-browser.html#ua",callToAction:"Оновити мій браузер ",close:"Закрити"}}},{}],4:[function(e,k,P){!function(t,p){"use strict";var c="function",e="undefined",o="model",i="name",a="type",r="vendor",s="version",l="architecture",n="console",d="mobile",u="tablet",w="smarttv",m="wearable",g={extend:function(e,o){var i={};for(var a in e)o[a]&&o[a].length%2==0?i[a]=o[a].concat(e[a]):i[a]=e[a];return i},has:function(e,o){return"string"==typeof e&&-1!==o.toLowerCase().indexOf(e.toLowerCase())},lowerize:function(e){return e.toLowerCase()},major:function(e){return"string"==typeof e?e.replace(/[^\d\.]/g,"").split(".")[0]:p},trim:function(e){return e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}},b={rgx:function(e,o){for(var i,a,t,r,s,l,n=0;n = (props): JSX.Element => {
+ return (
+
+ {`
+ This component is a template meant to be duplicated to quickly get started with new React components.
+
+ Feel free to adapt it at your convenience
+ `}
+
+ );
+};
+
+export default ComponentTemplate;
diff --git a/src/components/ErrorDebug.tsx b/src/components/ErrorDebug.tsx
deleted file mode 100644
index 0fba26507..000000000
--- a/src/components/ErrorDebug.tsx
+++ /dev/null
@@ -1,117 +0,0 @@
-import * as Sentry from '@sentry/node';
-import { isBrowser } from '@unly/utils';
-import { createLogger } from '@unly/utils-simple-logger';
-import * as React from 'react';
-import { Button } from 'reactstrap';
-
-const logger = createLogger({
- label: 'pages/error',
-});
-
-/**
- * We don't want to log errors when running in the browser in production environment.
- * In any other circumstances, we should log the debug message to help debug the issue. (dev, staging, and from prod server)
- *
- * @return {boolean}
- */
-export const shouldLog = (): boolean => {
- if (process.env.APP_STAGE === 'production') {
- return !isBrowser();
- } else {
- return true;
- }
-};
-
-const ErrorDebug = (props: Props): JSX.Element => {
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
- const { error, context }: Props = props;
- const { message, stack } = error;
-
- let stringifiedContext;
- try {
- stringifiedContext = JSON.stringify(context, null, 2);
- } catch (e) {
- stringifiedContext = null;
- }
-
- Sentry.configureScope((scope) => {
- scope.setExtra('context', stringifiedContext);
- });
- const errorEventId = Sentry.captureException(error);
-
- if (shouldLog()) {
- logger.error(message);
- logger.error(stack, 'stack');
- logger.error(stringifiedContext, 'context');
- }
-
- // @ts-ignore
- return (
- <>
-
- Service unavailable.
-
-
-
-
-
- // @ts-ignore XXX showReportDialog is not recognised but works fine due to the webpack trick that replaces @sentry/node
- Sentry.showReportDialog({ eventId: errorEventId })
- }
- >
- Send a report
-
-
-
- {
- window.location.reload(true);
- }}
- >
- Refresh the page
-
-
-
-
- {
- process.env.APP_STAGE !== 'production' && (
-
- Message :
- {message}
-
- Context :
- {stringifiedContext}
-
- Stack :
- {stack}
-
-
- )
- }
- >
- );
-};
-
-type Props = {
- error?: Error;
- context?: any; // eslint-disable-line @typescript-eslint/no-explicit-any
- t?: Function;
-}
-
-export default ErrorDebug;
diff --git a/src/components/Footer.tsx b/src/components/Footer.tsx
deleted file mode 100644
index 910683606..000000000
--- a/src/components/Footer.tsx
+++ /dev/null
@@ -1,181 +0,0 @@
-/** @jsx jsx */
-import { css, jsx } from '@emotion/core';
-import * as Sentry from '@sentry/node';
-import { isBrowser } from '@unly/utils';
-import Link from 'next/link';
-import React from 'react';
-import { useTranslation, withTranslation } from 'react-i18next';
-import { Button, Col, Row } from 'reactstrap';
-import { compose } from 'recompose';
-
-import EnglishFlag from '../components/svg/EnglishFlag';
-import FrenchFlag from '../components/svg/FrenchFlag';
-import { Customer } from '../types/data/Customer';
-import { Theme } from '../types/data/Theme';
-import { LANG_EN, LANG_FR } from '../utils/i18n';
-import { SIZE_XS } from '../utils/logo';
-import { getValue, getValueFallback } from '../utils/record';
-import UniversalCookiesManager from '../utils/UniversalCookiesManager';
-import GraphCMSAsset from './GraphCMSAsset';
-import Logo from './Logo';
-import Tooltip from './Tooltip';
-
-const fileLabel = 'components/Footer';
-
-const Footer: React.FunctionComponent = (props: Props) => {
- const {
- customer,
- theme,
- lang,
- } = props;
- const { t } = useTranslation();
- const logoSizesMultipliers = [
- {
- size: SIZE_XS,
- multiplier: 1, // We wanna keep the logos in the footer big and visible even on small devices, we've got enough space
- },
- ];
-
- Sentry.addBreadcrumb({ // See https://docs.sentry.io/enriching-error-data/breadcrumbs
- category: fileLabel,
- message: `Rendering footer (${isBrowser() ? 'browser' : 'server'})`,
- level: Sentry.Severity.Debug,
- });
-
- // Resolve values, handle multiple fallback levels
- const copyrightOwner = getValueFallback([
- { record: customer, key: 'label' },
- ]);
- const currentYear = (new Date()).getFullYear();
- return (
-
-
- );
-};
-
-type Props = {
- customer: Customer;
- theme: Theme;
- t: Function;
- lang: string;
-}
-
-export default compose(
- withTranslation(['common']),
-)(Footer);
diff --git a/src/components/Head.tsx b/src/components/Head.tsx
deleted file mode 100644
index db268be3c..000000000
--- a/src/components/Head.tsx
+++ /dev/null
@@ -1,105 +0,0 @@
-import { isBrowser } from '@unly/utils';
-import NextHead from 'next/head';
-import React from 'react';
-
-import { NRN_DEFAULT_SERVICE_LABEL } from '../constants';
-
-const defaultTitle = NRN_DEFAULT_SERVICE_LABEL;
-const defaultDescription = ''; // TODO
-const defaultOGURL = ''; // TODO
-const defaultOGImage = ''; // TODO
-const defaultFavicon = 'https://storage.googleapis.com/the-funding-place/assets/images/default_favicon.ico';
-
-/**
- * Custom Head component
- *
- * https://github.com/zeit/next.js#populating-head
- *
- * @param title
- * @param description
- * @param ogImage
- * @param url
- * @param favicon
- * @param lang
- * @constructor
- */
-const Head: React.FunctionComponent = (
- {
- title,
- description,
- ogImage,
- url,
- favicon,
- additionalContent,
- },
-): JSX.Element => {
- if (isBrowser()) {
- // eslint-disable-next-line @typescript-eslint/no-var-requires
- const WebFontLoader = require('webfontloader');
-
- // Load our fonts. Until they're loaded, their fallback fonts will be used
- // This fixed an issue when loading fonts from external sources that don't show the text until the font is loaded
- // With this, instead of not showing any text, it'll show the text using its fallback font, and then show the font once loaded
- // Note that we must load the font file synchronously to avoid a FOUT effect (see below)
- // XXX See https://www.npmjs.com/package/webfontloader#custom
- WebFontLoader.load({
- custom: {
- families: ['neuzeit-grotesk'],
- },
- });
- }
-
- return (
-
-
- {title || defaultTitle}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {/* Detect outdated browser and display a popup about how to upgrade to a more recent browser/version */}
- {/* XXX See public/static/CDN/README.md */}
-
-
-
- {
- additionalContent && (
- additionalContent
- )
- }
-
-
- );
-};
-
-type Props = {
- title?: string;
- description?: string;
- url?: string;
- ogImage?: string;
- favicon?: string;
- additionalContent?: React.ReactElement;
-}
-
-export default Head;
diff --git a/src/components/Layout.tsx b/src/components/Layout.tsx
deleted file mode 100644
index 9eb256be4..000000000
--- a/src/components/Layout.tsx
+++ /dev/null
@@ -1,436 +0,0 @@
-/** @jsx jsx */
-import { Amplitude } from '@amplitude/react-amplitude';
-import { QueryResult } from '@apollo/react-common';
-import { useQuery } from '@apollo/react-hooks';
-import { css, Global, jsx } from '@emotion/core';
-import * as Sentry from '@sentry/node';
-import { isBrowser } from '@unly/utils';
-import { createLogger } from '@unly/utils-simple-logger';
-import classnames from 'classnames';
-import { ThemeProvider } from 'emotion-theming';
-import get from 'lodash.get';
-// eslint-disable-next-line @typescript-eslint/no-unused-vars,no-unused-vars
-import React from 'react';
-import { useTranslation } from 'react-i18next';
-import { Button } from 'reactstrap';
-
-import { NRN_DEFAULT_FONT, NRN_DEFAULT_SECONDARY_COLOR, NRN_DEFAULT_THEME } from '../constants';
-import { LAYOUT_QUERY } from '../gql/common/layoutQuery';
-import ErrorPage from '../pages/_error';
-import { Customer } from '../types/data/Customer';
-import { Theme } from '../types/data/Theme';
-import { LayoutProps } from '../types/LayoutProps';
-import { getValue, STRATEGY_DO_NOTHING } from '../utils/record';
-import Footer from './Footer';
-import Loader from './Loader';
-import Nav from './Nav';
-
-const fileLabel = 'components/Layout';
-const logger = createLogger({
- label: fileLabel,
-});
-
-/**
- * Layout of the whole app. Acts as a wrapper that displays the whole thing (menus, page, etc.)
- *
- * @param {Props} props
- * @return {JSX.Element}
- * @constructor
- */
-const Layout: React.FunctionComponent = (props: Props): JSX.Element => {
- const {
- children,
- customerRef,
- gcmsLocales,
- router,
- lang,
- amplitudeInstance,
-
- // During SSR, we can't know if we're running within an iframe, so we consider we don't by default, and the frontend will rehydrate if needed
- isInIframe = false,
- }: Props = props;
- const { t, i18n } = useTranslation();
-
- Sentry.addBreadcrumb({ // See https://docs.sentry.io/enriching-error-data/breadcrumbs
- category: fileLabel,
- message: `Rendering layout (${isBrowser() ? 'browser' : 'server'})`,
- level: Sentry.Severity.Debug,
- });
-
- // In non-production stages, bind some utilities to the browser's DOM, for ease of quick testing
- if (isBrowser() && process.env.APP_STAGE !== 'production') {
- window['i18n'] = i18n;
- window['t'] = t;
- window['amplitudeInstance'] = amplitudeInstance;
- logger.info(`Utilities have been bound to the DOM for quick testing in non-production stages:
- - i18n
- - t
- - amplitudeInstance
- `);
- }
- const variables = {
- customerRef,
- };
- const queryOptions = {
- displayName: 'LAYOUT_QUERY',
- variables,
- context: {
- headers: {
- 'gcms-locale': gcmsLocales,
- },
- },
- };
-
- // eslint-disable-line prefer-const,@typescript-eslint/no-explicit-any
- const {
- data,
- loading,
- error,
- }: QueryResult<{
- customer: Customer;
- }> = useQuery(LAYOUT_QUERY, queryOptions);
- let errorEventId;
-
- if (error) {
- errorEventId = Sentry.captureException(new Error(get(error, 'message', 'No error message provided')));
- }
-
- if (loading) {
- return ;
- }
-
- const {
- customer,
- } = data || {}; // XXX Use empty object as fallback, to avoid app crash when destructuring
- if (process.env.APP_STAGE !== 'production') {
- console.log('data', data); // eslint-disable-line no-console
- }
-
- const theme: Theme = customer?.theme || {};
-
- // Apply default theming if not specified
- theme.primaryColor = getValue(theme, 'primaryColor', NRN_DEFAULT_THEME.primaryColor, STRATEGY_DO_NOTHING);
- logger.debug(JSON.stringify(theme, null, 2));
-
- return (
-
- {/* XXX Global styles that applies to all pages within this layout go there */}
- and behave identically
- }
-
- label {
- cursor: pointer;
- }
-
- button {
- cursor: pointer;
- outline: none !important; // Overrides bootstrap color around the button
-
- &.btn-primary {
- color: ${getValue(theme, `secondaryColor`, NRN_DEFAULT_SECONDARY_COLOR, STRATEGY_DO_NOTHING)};
- background-color: ${getValue(theme, `primaryAltColor`, getValue(theme, `primaryColor`), STRATEGY_DO_NOTHING)};
- border-color: ${getValue(theme, `primaryAltColor`, getValue(theme, `primaryColor`), STRATEGY_DO_NOTHING)};
-
- &:active, &:focus {
- box-shadow: 0 0 0 0.2rem ${getValue(theme, `primaryAltColor`, getValue(theme, `primaryColor`), STRATEGY_DO_NOTHING)};
- }
- }
-
- &.btn-outline-secondary {
- color: ${getValue(theme, `primaryAltColor`, getValue(theme, `primaryColor`), STRATEGY_DO_NOTHING)};
- background-color: ${getValue(theme, `secondaryColor`, NRN_DEFAULT_SECONDARY_COLOR, STRATEGY_DO_NOTHING)};
-
- &:active, &:focus {
- box-shadow: 0 0 0 0.2rem ${getValue(theme, `secondaryColor`, NRN_DEFAULT_SECONDARY_COLOR, STRATEGY_DO_NOTHING)};
- }
- }
-
- &.btn-primary, &.btn-outline-secondary {
- &:hover,
- &:active,
- &:focus {
- opacity: 0.8;
- }
- }
-
- &.disabled {
- cursor: not-allowed;
- }
- }
-
- .info-label {
- display: inline-block;
- border-radius: 60px;
- border: none;
- background-color: #C9D0F6;
- color: #0028FF;
- padding: 10px 15px 7px 14px;
- margin: 1px;
- }
-
- .select {
- // Overrides react select styles everywhere
- * {
- color: ${getValue(theme, `primaryColor`, NRN_DEFAULT_SECONDARY_COLOR, STRATEGY_DO_NOTHING)} !important;
- }
- }
-
- [class*="fa-"], [class*="fal-"], [class*="fas-"], [class*="far-"] {
- margin-right: 5px;
- }
-
- .animated {
- // Delay control (latency)
- &.delay-100ms {
- animation-delay: 0.1s;
- }
-
- &.delay-200ms {
- animation-delay: 0.2s;
- }
-
- &.delay-400ms {
- animation-delay: 0.4s;
- }
-
- &.delay-600ms {
- animation-delay: 0.6s;
- }
-
- // Duration control (speed)
- &.duration-100ms {
- animation-duration: 0.1s;
- }
-
- &.duration-200ms {
- animation-duration: 0.2s;
- }
-
- &.duration-300ms {
- animation-duration: 0.3s;
- }
-
- &.duration-400ms {
- animation-duration: 0.4s;
- }
-
- &.duration-600ms {
- animation-duration: 0.6s;
- }
-
- &.duration-3000ms {
- animation-duration: 3s;
- }
-
- &.duration-6000ms {
- animation-duration: 6s;
- }
- }
-
- .fade {
- opacity: 1 !important; // Overrides default bootstrap behaviour to avoid make-believe SSR doesn't work on the demo, when JS is disabled - See https://github.com/UnlyEd/next-right-now/issues/9
- }
- }
- `}
- >
-
-
- {/* See https://github.com/mikemaccana/outdated-browser-rework */}
-
-
- {
- !isInIframe && (
-
- )
- }
-
-
- {
- error ? (
- <>
-
-
-
-
Le service est momentanément indisponible
-
Erreur 500. Nos serveurs ont un coup de chaud.
-
-
-
-
- Essayez de recharger la page. Veuillez contacter notre support technique si le problème persiste.
-
-
- // @ts-ignore XXX showReportDialog is not recognised but works fine due to the webpack trick that replaces @sentry/node
- Sentry.showReportDialog({ eventId: errorEventId })
- }
- >
- Contacter le support technique
-
-
-
-
-
- >
- ) : (
- <>
- {/* Renders the current "page" in "pages/" */}
- {
- // Add additional data to every child (a child is a "page" here)
- // See https://medium.com/better-programming/passing-data-to-props-children-in-react-5399baea0356
- React.Children.map(children, (child) => {
- return React.cloneElement(child, {
- ...props,
- customer,
- });
- })
- }
- >
- )
- }
-
-
- {
- !isInIframe && (
-
- )
- }
-
-
- );
-};
-
-type Props = {
- children: React.ReactElement;
-} & LayoutProps;
-
-export default Layout;
diff --git a/src/components/Loader.tsx b/src/components/animations/Loader.tsx
similarity index 67%
rename from src/components/Loader.tsx
rename to src/components/animations/Loader.tsx
index e3f8a6a9b..dd7e905f6 100644
--- a/src/components/Loader.tsx
+++ b/src/components/animations/Loader.tsx
@@ -2,9 +2,11 @@
import { css, jsx } from '@emotion/core';
import React from 'react';
-import AnimatedLoader from '../components/svg/AnimatedLoader';
+import AnimatedLoader from '../svg/AnimatedLoader';
-const Loader: React.FunctionComponent = (props: Prop): JSX.Element => {
+type Props = {}
+
+const Loader: React.FunctionComponent = (props): JSX.Element => {
return (
= (props: Prop): JSX.Element => {
);
};
-type Prop = {}
-
export default Loader;
diff --git a/src/components/appBootstrap/BrowserPageBootstrap.tsx b/src/components/appBootstrap/BrowserPageBootstrap.tsx
new file mode 100644
index 000000000..a9355e7f0
--- /dev/null
+++ b/src/components/appBootstrap/BrowserPageBootstrap.tsx
@@ -0,0 +1,135 @@
+/** @jsx jsx */
+import { Amplitude, AmplitudeProvider } from '@amplitude/react-amplitude';
+import { jsx } from '@emotion/core';
+import * as Sentry from '@sentry/node';
+import { createLogger } from '@unly/utils-simple-logger';
+import React from 'react';
+
+import { useTranslation } from 'react-i18next';
+import { userSessionContext } from '../../stores/userSessionContext';
+import { MultiversalAppBootstrapPageProps } from '../../types/nextjs/MultiversalAppBootstrapPageProps';
+import { MultiversalAppBootstrapProps } from '../../types/nextjs/MultiversalAppBootstrapProps';
+import { MultiversalPageProps } from '../../types/pageProps/MultiversalPageProps';
+import { OnlyBrowserPageProps } from '../../types/pageProps/OnlyBrowserPageProps';
+import { UserSemiPersistentSession } from '../../types/UserSemiPersistentSession';
+import { getAmplitudeInstance } from '../../utils/analytics/amplitude';
+import UniversalCookiesManager from '../../utils/cookies/UniversalCookiesManager';
+import { getIframeReferrer, isRunningInIframe } from '../../utils/iframe';
+
+const fileLabel = 'components/appBootstrap/BrowserPageBootstrap';
+const logger = createLogger({
+ label: fileLabel,
+});
+
+export type BrowserPageBootstrapProps = MultiversalAppBootstrapProps
;
+
+/**
+ * Bootstraps the page, only when rendered on the browser
+ *
+ * @param props
+ */
+const BrowserPageBootstrap = (props: BrowserPageBootstrapProps): JSX.Element => {
+ const {
+ Component,
+ err,
+ router
+ } = props;
+ // When the page is served by the browser, some browser-only properties are available
+ const pageProps = props.pageProps as unknown as MultiversalPageProps;
+ const {
+ customerRef,
+ lang,
+ locale,
+ } = pageProps;
+ const { t, i18n } = useTranslation();
+ const isInIframe: boolean = isRunningInIframe();
+ const iframeReferrer: string = getIframeReferrer();
+ const cookiesManager: UniversalCookiesManager = new UniversalCookiesManager(); // On browser, we can access cookies directly (doesn't need req/res or page context)
+ const userSession: UserSemiPersistentSession = cookiesManager.getUserData();
+ const userId = userSession.id;
+ const injectedPageProps: MultiversalPageProps = {
+ ...props.pageProps,
+ isInIframe,
+ iframeReferrer,
+ cookiesManager,
+ userSession,
+ };
+
+ Sentry.addBreadcrumb({ // See https://docs.sentry.io/enriching-error-data/breadcrumbs
+ category: fileLabel,
+ message: `Rendering ${fileLabel}`,
+ level: Sentry.Severity.Debug,
+ });
+
+ const amplitudeInstance = getAmplitudeInstance({
+ customerRef,
+ iframeReferrer,
+ isInIframe,
+ lang,
+ locale,
+ userId,
+ });
+
+ // In non-production stages, bind some utilities to the browser's DOM, for ease of quick testing
+ if (process.env.APP_STAGE !== 'production') {
+ window['amplitudeInstance'] = amplitudeInstance;
+ window['i18n'] = i18n;
+ window['router'] = router;
+ window['t'] = t;
+ logger.info(`Utilities have been bound to the DOM for quick testing (only in non-production stages):
+ - amplitudeInstance
+ - i18n
+ - router
+ - t
+ `);
+ }
+
+ return (
+
+
+
+
+
+
+
+ );
+};
+
+export default BrowserPageBootstrap;
diff --git a/src/components/appBootstrap/MultiversalAppBootstrap.tsx b/src/components/appBootstrap/MultiversalAppBootstrap.tsx
new file mode 100644
index 000000000..fef4f3677
--- /dev/null
+++ b/src/components/appBootstrap/MultiversalAppBootstrap.tsx
@@ -0,0 +1,177 @@
+import * as Sentry from '@sentry/node';
+import { isBrowser } from '@unly/utils';
+import { createLogger } from '@unly/utils-simple-logger';
+import { ThemeProvider } from 'emotion-theming';
+import { i18n } from 'i18next';
+import isEmpty from 'lodash.isempty';
+import React, { useState } from 'react';
+import ErrorPage from '../../pages/_error';
+import customerContext from '../../stores/customerContext';
+import i18nContext from '../../stores/i18nContext';
+import { Theme } from '../../types/data/Theme';
+import { MultiversalAppBootstrapProps } from '../../types/nextjs/MultiversalAppBootstrapProps';
+import { MultiversalPageProps } from '../../types/pageProps/MultiversalPageProps';
+import { SSGPageProps } from '../../types/pageProps/SSGPageProps';
+import { SSRPageProps } from '../../types/pageProps/SSRPageProps';
+import { initCustomerTheme } from '../../utils/data/theme';
+import i18nextLocize from '../../utils/i18n/i18nextLocize';
+import Loader from '../animations/Loader';
+import DefaultErrorLayout from '../errors/DefaultErrorLayout';
+import BrowserPageBootstrap, { BrowserPageBootstrapProps } from './BrowserPageBootstrap';
+import ServerPageBootstrap, { ServerPageBootstrapProps } from './ServerPageBootstrap';
+import UniversalGlobalStyles from './UniversalGlobalStyles';
+
+const fileLabel = 'components/appBootstrap/MultiversalAppBootstrap';
+const logger = createLogger({
+ label: fileLabel,
+});
+
+export type Props = MultiversalAppBootstrapProps | MultiversalAppBootstrapProps;
+
+/**
+ * Bootstraps a page and renders it
+ *
+ * Basically does everything a Page component needs to be rendered.
+ * All behaviors defined here are applied across the whole application (they're common to all pages)
+ *
+ * @param props
+ */
+const MultiversalAppBootstrap: React.FunctionComponent = (props): JSX.Element => {
+ const {
+ pageProps,
+ router,
+ } = props;
+ // When using SSG with "fallback: true" and the page hasn't been generated yet then isSSGFallbackInitialBuild is true
+ const [isSSGFallbackInitialBuild] = useState(isEmpty(pageProps) && router?.isFallback === true);
+
+ Sentry.addBreadcrumb({ // See https://docs.sentry.io/enriching-error-data/breadcrumbs
+ category: fileLabel,
+ message: `Rendering ${fileLabel}`,
+ level: Sentry.Severity.Debug,
+ });
+
+ if (isBrowser() && process.env.APP_STAGE !== 'production') { // Avoids log clutter on server
+ console.debug('MultiversalAppBootstrap.props', props);
+ }
+
+ // Display a loader (we could use a skeleton too) when this happens, so that the user doesn't face a white page until the page is generated and displayed
+ if (isSSGFallbackInitialBuild && router.isFallback) { // When router.isFallback becomes "false", then it'll mean the page has been generated and rendered and we can display it, instead of the loader
+ return (
+
+ );
+ }
+
+ if (pageProps.isReadyToRender || pageProps.statusCode === 404) {
+ console.info('MultiversalAppBootstrap - App is ready, rendering...');
+ const {
+ customer,
+ i18nTranslations,
+ lang,
+ locale,
+ }: MultiversalPageProps = pageProps;
+
+ if (!customer || !i18nTranslations || !lang || !locale) {
+ // Unrecoverable error, we can't even display the layout because we don't have the minimal required information to properly do so
+ // This most likely means something went wrong, and we must display the error page in such case
+ if (!props.err) {
+ // If the error wasn't detected by Next, then we log it to Sentry to make sure we'll be notified
+
+ Sentry.withScope((scope): void => {
+ scope.setContext('props', props);
+ Sentry.captureMessage(`Unexpected fatal error happened, the app cannot render properly, fallback to the Error page. Check props.`, Sentry.Severity.Warning);
+ });
+
+ } else {
+ // If an error was detected by Next, then it means the current state is due to a top-level that was caught before
+ // We don't have anything to do, as it's automatically logged into Sentry
+ }
+
+ return (
+
+
+
+ );
+ }
+
+ const i18nextInstance: i18n = i18nextLocize(lang, i18nTranslations); // Apply i18next configuration with Locize backend
+ const theme: Theme = initCustomerTheme(customer);
+
+ /*
+ * We split the rendering between server and browser
+ * There are actually 3 rendering modes, each of them has its own set of limitations
+ * 1. SSR (doesn't have access to browser-related features (LocalStorage), but it does have access to request-related data (cookies, HTTP headers))
+ * 2. Server during SSG (doesn't have access to browser-related features (LocalStorage), nor to request-related data (cookies, localStorage, HTTP headers))
+ * 3. Static rendering (doesn't have access to server-related features (HTTP headers), but does have access to request-related data (cookie) and browser-related features (LocalStorage))
+ *
+ * What we do here, is to avoid rendering browser-related stuff if we're not running in a browser, because it cannot work properly.
+ * (e.g: Generating cookies will work, but they won't be stored on the end-user device, and it would create "Text content did not match" warnings, if generated from the server during SSG)
+ *
+ * So, the BrowserPageBootstrap does browser-related stuff and then call the PageBootstrap which takes care of stuff that is universal (identical between browser and server)
+ *
+ * XXX If you're concerned regarding React rehydration, read our talk with Josh, author of https://joshwcomeau.com/react/the-perils-of-rehydration/
+ * https://twitter.com/Vadorequest/status/1257658553361408002
+ *
+ * XXX There may be more rendering modes - See https://github.com/zeit/next.js/discussions/12558#discussioncomment-12303
+ */
+ let browserPageBootstrapProps: BrowserPageBootstrapProps;
+ let serverPageBootstrapProps: ServerPageBootstrapProps;
+
+ if (isBrowser()) {
+ browserPageBootstrapProps = {
+ ...props,
+ router,
+ pageProps: {
+ ...pageProps,
+ i18nextInstance,
+ isSSGFallbackInitialBuild: isSSGFallbackInitialBuild,
+ theme,
+ },
+ };
+ } else {
+ serverPageBootstrapProps = {
+ ...props,
+ router,
+ pageProps: {
+ ...pageProps,
+ i18nextInstance,
+ isSSGFallbackInitialBuild: isSSGFallbackInitialBuild,
+ theme,
+ },
+ };
+ }
+
+ return (
+
+
+ {/* XXX Global styles that applies to all pages go there */}
+
+
+
+ {
+ isBrowser() ? (
+
+ ) : (
+
+ )
+ }
+
+
+
+ );
+
+ } else {
+ // We wait for out props to contain "isReadyToRender: true", which means they've been set correctly by either getInitialProps/getStaticProps/getServerProps
+ // This helps avoid multiple useless renders (especially in development mode) and thus avoid noisy logs
+ // XXX I've recently tested without it and didn't notice any more logs than expected/usual. Maybe this was from a time where there were multiple full-renders? It may be removed if so (TODO later with proper testing)
+ console.info('MultiversalAppBootstrap - App is not ready yet, waiting for isReadyToRender');
+ return null;
+ }
+};
+
+export default MultiversalAppBootstrap;
diff --git a/src/components/appBootstrap/ServerPageBootstrap.tsx b/src/components/appBootstrap/ServerPageBootstrap.tsx
new file mode 100644
index 000000000..d7d40aadd
--- /dev/null
+++ b/src/components/appBootstrap/ServerPageBootstrap.tsx
@@ -0,0 +1,56 @@
+/** @jsx jsx */
+import { jsx } from '@emotion/core';
+import * as Sentry from '@sentry/node';
+import { createLogger } from '@unly/utils-simple-logger';
+import React from 'react';
+
+import { userSessionContext } from '../../stores/userSessionContext';
+import { MultiversalAppBootstrapPageProps } from '../../types/nextjs/MultiversalAppBootstrapPageProps';
+import { MultiversalAppBootstrapProps } from '../../types/nextjs/MultiversalAppBootstrapProps';
+import { MultiversalPageProps } from '../../types/pageProps/MultiversalPageProps';
+import { OnlyServerPageProps } from '../../types/pageProps/OnlyServerPageProps';
+
+const fileLabel = 'components/appBootstrap/ServerPageBootstrap';
+const logger = createLogger({
+ label: fileLabel,
+});
+
+export type ServerPageBootstrapProps = MultiversalAppBootstrapProps;
+
+/**
+ * Bootstraps the page, only when rendered on the browser
+ *
+ * @param props
+ */
+const ServerPageBootstrap = (props: ServerPageBootstrapProps): JSX.Element => {
+ const {
+ Component,
+ err,
+ } = props;
+ // When the page is served by the server, some server-only properties are available
+ const pageProps = props.pageProps as unknown as MultiversalPageProps;
+ const injectedPageProps: MultiversalPageProps = {
+ ...pageProps,
+ };
+ const {
+ userSession,
+ } = pageProps;
+
+ Sentry.addBreadcrumb({ // See https://docs.sentry.io/enriching-error-data/breadcrumbs
+ category: fileLabel,
+ message: `Rendering ${fileLabel}`,
+ level: Sentry.Severity.Debug,
+ });
+
+ return (
+
+
+
+ );
+};
+
+export default ServerPageBootstrap;
diff --git a/src/components/appBootstrap/UniversalGlobalStyles.tsx b/src/components/appBootstrap/UniversalGlobalStyles.tsx
new file mode 100644
index 000000000..b41fcc378
--- /dev/null
+++ b/src/components/appBootstrap/UniversalGlobalStyles.tsx
@@ -0,0 +1,264 @@
+/** @jsx jsx */
+import { css, Global, jsx } from '@emotion/core';
+
+import { NRN_DEFAULT_FONT, NRN_DEFAULT_SECONDARY_COLOR } from '../../constants';
+import { Theme } from '../../types/data/Theme';
+
+type Props = {
+ theme: Theme;
+}
+
+/**
+ * Those styles are applied
+ * - universally (browser + server)
+ * - globally (applied to all pages), through Layouts
+ *
+ * XXX Note that primaryColor, primaryAltColor and secondaryColor don't necessarily follow best practices regarding colors management.
+ * I personally recommend to take a look at https://material.io/design/color/the-color-system.html#color-theme-creation, those guidelines may fit your use-case
+ * Don't hesitate to share best practices around those, this does the job for simple use-cases
+ *
+ * @param props
+ */
+const UniversalGlobalStyles: React.FunctionComponent = (props): JSX.Element => {
+ const { theme } = props;
+ const { primaryColor } = theme;
+ const primaryAltColor = primaryColor; // Helper for "primary alternative color", for customers with 2 primary colors (currently unused)
+ const secondaryColor = NRN_DEFAULT_SECONDARY_COLOR;
+ const primaryFont = NRN_DEFAULT_FONT; // You could allow custom font per customer from Theme.font (that's what we do in our proprietary app)
+
+ return (
+ and behave identically
+ }
+
+ label {
+ cursor: pointer;
+ }
+
+ button {
+ cursor: pointer;
+ outline: none !important; // Overrides bootstrap color around the button
+
+ &.btn-primary {
+ color: ${secondaryColor};
+ background-color: ${primaryAltColor};
+ border-color: ${primaryAltColor};
+
+ &:active, &:focus {
+ box-shadow: 0 0 0 0.2rem ${primaryAltColor};
+ }
+ }
+
+ &.btn-outline-secondary {
+ color: ${primaryAltColor};
+ background-color: ${secondaryColor};
+
+ &:active, &:focus {
+ box-shadow: 0 0 0 0.2rem ${secondaryColor};
+ }
+ }
+
+ &.btn-primary, &.btn-outline-secondary {
+ &:hover,
+ &:active,
+ &:focus {
+ opacity: 0.8;
+ }
+ }
+
+ &.disabled {
+ cursor: not-allowed;
+ }
+ }
+
+ .info-label {
+ display: inline-block;
+ border-radius: 60px;
+ border: none;
+ background-color: #C9D0F6;
+ color: #0028FF;
+ padding: 10px 15px 7px 14px;
+ margin: 1px;
+ }
+
+ .select {
+ // Overrides react select styles everywhere
+ * {
+ color: ${primaryColor} !important;
+ }
+ }
+
+ [class*="fa-"], [class*="fal-"], [class*="fas-"], [class*="far-"] {
+ margin-right: 5px;
+ }
+
+ .animated {
+ // Delay control (latency)
+ &.delay-100ms {
+ animation-delay: 0.1s;
+ }
+
+ &.delay-200ms {
+ animation-delay: 0.2s;
+ }
+
+ &.delay-400ms {
+ animation-delay: 0.4s;
+ }
+
+ &.delay-600ms {
+ animation-delay: 0.6s;
+ }
+
+ // Duration control (speed)
+ &.duration-100ms {
+ animation-duration: 0.1s;
+ }
+
+ &.duration-200ms {
+ animation-duration: 0.2s;
+ }
+
+ &.duration-300ms {
+ animation-duration: 0.3s;
+ }
+
+ &.duration-400ms {
+ animation-duration: 0.4s;
+ }
+
+ &.duration-600ms {
+ animation-duration: 0.6s;
+ }
+
+ &.duration-3000ms {
+ animation-duration: 3s;
+ }
+
+ &.duration-6000ms {
+ animation-duration: 6s;
+ }
+ }
+
+ .fade {
+ opacity: 1 !important; // Overrides default bootstrap behaviour to avoid make-believe SSR doesn't work on the demo, when JS is disabled - See https://github.com/UnlyEd/next-right-now/issues/9
+ }
+ }
+ `}
+ />
+ );
+};
+
+export default UniversalGlobalStyles;
diff --git a/src/components/GraphCMSAsset.test.tsx b/src/components/assets/GraphCMSAsset.test.tsx
similarity index 97%
rename from src/components/GraphCMSAsset.test.tsx
rename to src/components/assets/GraphCMSAsset.test.tsx
index 38cb2002d..0344fd88a 100644
--- a/src/components/GraphCMSAsset.test.tsx
+++ b/src/components/assets/GraphCMSAsset.test.tsx
@@ -22,7 +22,7 @@ describe('GraphCMSAsset', () => {
expect(img.props.id).toEqual(id);
expect(img.props.src).toEqual(defaultLogoUrl);
expect(img.props.title).toEqual('');
- expect(img.props.alt).toEqual('');
+ expect(img.props.alt).toEqual(defaultLogoUrl);
expect(img.props.className).toEqual(`asset-${id}`);
expect(img.props.style).toEqual({});
expect(img).toMatchSnapshot();
@@ -175,7 +175,7 @@ describe('GraphCMSAsset', () => {
const img = renderer.toJSON();
expect(img.props.id).toEqual(id);
- expect(img.props.src).toEqual('https://media.graphcms.com/quality=value:100/output=format:png/resize=width:500,height:300/88YmsSFsSEGI9i0qcH0V');
+ expect(img.props.src).toEqual('https://media.graphcms.com/quality=value:100/resize=width:500,height:300/auto_image/88YmsSFsSEGI9i0qcH0V');
expect(img.props.title).toEqual(title);
expect(img.props.alt).toEqual(title);
expect(img.props.className).toEqual(`asset-${id} ${classes}`);
@@ -205,7 +205,7 @@ describe('GraphCMSAsset', () => {
const img = renderer.toJSON();
expect(img.props.id).toEqual(id);
- expect(img.props.src).toEqual('https://media.graphcms.com/quality=value:100/output=format:png/resize=width:500/88YmsSFsSEGI9i0qcH0V');
+ expect(img.props.src).toEqual('https://media.graphcms.com/quality=value:100/resize=width:500/auto_image/88YmsSFsSEGI9i0qcH0V');
expect(img.props.title).toEqual(title);
expect(img.props.alt).toEqual(title);
expect(img.props.className).toEqual(`asset-${id} ${classes}`);
@@ -238,7 +238,7 @@ describe('GraphCMSAsset', () => {
const img = renderer.toJSON();
expect(img.props.id).toEqual(id);
- expect(img.props.src).toEqual('https://media.graphcms.com/quality=value:100/output=format:png/resize=height:300/88YmsSFsSEGI9i0qcH0V');
+ expect(img.props.src).toEqual('https://media.graphcms.com/quality=value:100/resize=height:300/auto_image/88YmsSFsSEGI9i0qcH0V');
expect(img.props.title).toEqual(title);
expect(img.props.alt).toEqual(title);
expect(img.props.className).toEqual(`asset-${id} ${classes}`);
@@ -266,7 +266,7 @@ describe('GraphCMSAsset', () => {
expect(img.props.id).toEqual(id);
expect(img.props.src).toEqual(defaultLogoUrl);
expect(img.props.title).toEqual('');
- expect(img.props.alt).toEqual('');
+ expect(img.props.alt).toEqual(defaultLogoUrl);
expect(img.props.className).toEqual(`asset-${id}`);
expect(img.props.style).toEqual({});
expect(img.props).toMatchSnapshot();
diff --git a/src/components/GraphCMSAsset.tsx b/src/components/assets/GraphCMSAsset.tsx
similarity index 87%
rename from src/components/GraphCMSAsset.tsx
rename to src/components/assets/GraphCMSAsset.tsx
index 9ee02630c..ac0694178 100644
--- a/src/components/GraphCMSAsset.tsx
+++ b/src/components/assets/GraphCMSAsset.tsx
@@ -7,12 +7,12 @@ import PropTypes from 'prop-types';
import React from 'react';
import stylePropType from 'react-style-proptype';
-import GraphCMSAssetPropTypes from '../propTypes/GraphCMSAssetPropTypes';
-import GraphCMSAssetTransformationsPropTypes from '../propTypes/GraphCMSAssetTransformationsPropTypes';
-import { Asset } from '../types/data/Asset';
-import { AssetTransformations } from '../types/data/AssetTransformations';
-import { Link } from '../types/data/Link';
-import { cssToReactStyle } from '../utils/css';
+import GraphCMSAssetPropTypes from '../../propTypes/GraphCMSAssetPropTypes';
+import GraphCMSAssetTransformationsPropTypes from '../../propTypes/GraphCMSAssetTransformationsPropTypes';
+import { Asset } from '../../types/data/Asset';
+import { AssetTransformations } from '../../types/data/AssetTransformations';
+import { Link } from '../../types/data/Link';
+import { cssToReactStyle } from '../../utils/css';
const _defaultAsset = {
id: null,
@@ -38,7 +38,6 @@ const _defaultLink: Link = {
*
* @param props
* @return {null|*}
- * @constructor
*
* @see Transformations https://docs.graphcms.com/developers/assets/transformations/transforming-url-structure
*/
@@ -53,7 +52,7 @@ const GraphCMSAsset = (props: Props): JSX.Element => {
onClick = null,
linkOverride = {},
transformationsOverride = null,
- forcePNGOutput = true,
+ forcePNGOutput = false,
}: Props = props;
if (isEmpty(asset)) {
return null;
@@ -109,7 +108,9 @@ const GraphCMSAsset = (props: Props): JSX.Element => {
}
// Once all transformations have been resolved, update the asset url
- resolvedAssetProps.url = `${assetBaseUrl}${transformationsToApply}/${assetFileHandle}`;
+ // XXX Using "auto_image" will automatically select the image type (WebP, etc.) based on the browser (reduces size by 20-80%, compared to png)
+ // See https://www.filestack.com/docs/api/processing/#auto-image-conversion
+ resolvedAssetProps.url = `${assetBaseUrl}${transformationsToApply}/auto_image/${assetFileHandle}`;
}
}
@@ -120,7 +121,7 @@ const GraphCMSAsset = (props: Props): JSX.Element => {
id={id}
src={resolvedAssetProps.url}
title={resolvedAssetProps.title}
- alt={resolvedAssetProps.alt}
+ alt={resolvedAssetProps.alt || resolvedAssetProps.title || resolvedAssetProps.url}
className={classnames(`asset-${id}`, className, resolvedAssetProps.classes)}
style={deepmerge(style || {}, resolvedAssetProps.style || {})}
/>
@@ -137,7 +138,6 @@ const GraphCMSAsset = (props: Props): JSX.Element => {
target={resolvedLinkProps.target}
className={classnames(`asset-link-${id}`, resolvedLinkProps.classes, resolvedLinkProps.className)}
style={deepmerge(resolvedLinkProps.style || {}, resolvedLinkProps.style || {})}
- // @ts-ignore
onClick={onClick} // Support for usage within component (from Next.js)
>
@@ -177,7 +177,7 @@ type Props = {
override?: Asset;
className?: string;
style?: object;
- onClick?: Function;
+ onClick?: () => void;
linkOverride?: {
id?: string;
url?: string;
diff --git a/src/components/Logo.tsx b/src/components/assets/Logo.tsx
similarity index 84%
rename from src/components/Logo.tsx
rename to src/components/assets/Logo.tsx
index 9961bc885..4cf24ab48 100644
--- a/src/components/Logo.tsx
+++ b/src/components/assets/Logo.tsx
@@ -8,14 +8,27 @@ import PropTypes from 'prop-types';
// eslint-disable-next-line no-unused-vars,@typescript-eslint/no-unused-vars
import React from 'react';
import stylePropType from 'react-style-proptype';
-import compose from 'recompose/compose';
-import LogoPropTypes from '../propTypes/LogoPropTypes';
-import { Link } from '../types/data/Link';
-import { Logo as LogoType } from '../types/data/Logo';
+import LogoPropTypes from '../../propTypes/LogoPropTypes';
+import { Link } from '../../types/data/Link';
+import { Logo as LogoType } from '../../types/data/Logo';
import {
- DEFAULT_SIZES_MULTIPLIERS, generateSizes, resolveSize, SizeMultiplier, toPixels
-} from '../utils/logo';
+ DEFAULT_SIZES_MULTIPLIERS, generateSizes, resolveSize, SizeMultiplier, toPixels
+} from '../../utils/assets/logo';
+
+type Props = {
+ id: string;
+ logo: LogoType;
+ width?: number | string;
+ height?: number | string;
+ defaults?: LogoType;
+ override?: LogoType;
+ sizesMultipliers?: SizeMultiplier[];
+ className?: string;
+ style?: object;
+ link?: Link;
+ onClick?: () => void;
+}
/**
* Display a logo
@@ -77,10 +90,9 @@ const Logo = (props: Props): JSX.Element => {
id={id}
src={resolvedLogoProps.url}
title={resolvedLogoProps.title}
- alt={resolvedLogoProps.alt}
+ alt={resolvedLogoProps.alt || resolvedLogoProps.title || resolvedLogoProps.url}
className={classnames(`logo-${id}`, className, resolvedLogoProps.classes)}
style={deepmerge(style || {}, resolvedLogoProps.style || {})}
- // @ts-ignore
onClick={onClick}
/>
);
@@ -93,10 +105,10 @@ const Logo = (props: Props): JSX.Element => {
id={link.id}
href={resolvedLogoProps.link.url}
target={resolvedLogoProps.link.target}
+ rel={resolvedLogoProps.link.target === '_blank' ? 'noopener' : null}
className={classnames(resolvedLogoProps.link.classes, link.className)}
// @ts-ignore
style={deepmerge(resolvedLogoProps.link.style || {}, link.style || {})}
- // @ts-ignore
onClick={onClick}
>
@@ -129,19 +141,4 @@ Logo.propTypes = {
onClick: PropTypes.func, // Support for usage within component (from Next.js)
};
-type Props = {
- id: string;
- logo: LogoType;
- width: number | string;
- height: number | string;
- defaults: LogoType;
- override: LogoType;
- sizesMultipliers: SizeMultiplier[];
- className: string;
- style: object;
- link: Link;
- onClick: Function;
-}
-
-export default compose(
-)(Logo);
+export default Logo;
diff --git a/src/components/__snapshots__/GraphCMSAsset.test.tsx.snap b/src/components/assets/__snapshots__/GraphCMSAsset.test.tsx.snap
similarity index 93%
rename from src/components/__snapshots__/GraphCMSAsset.test.tsx.snap
rename to src/components/assets/__snapshots__/GraphCMSAsset.test.tsx.snap
index f3927a892..3856d6369 100644
--- a/src/components/__snapshots__/GraphCMSAsset.test.tsx.snap
+++ b/src/components/assets/__snapshots__/GraphCMSAsset.test.tsx.snap
@@ -2,7 +2,7 @@
exports[`GraphCMSAsset should properly render an asset from GraphCMS when the asset is used as an image ( ) when relying on default "logo" property, it should apply the internal default properties 1`] = `
) containing an image ( ) when relying on default "logo" property 1`] = `
Object {
- "alt": "",
+ "alt": "https://media.graphcms.com/88YmsSFsSEGI9i0qcH0V",
"className": "asset-test",
"id": "test",
"src": "https://media.graphcms.com/88YmsSFsSEGI9i0qcH0V",
@@ -137,7 +137,7 @@ exports[`GraphCMSAsset when the asset is used as a link() containing an image
target="_blank"
>
= (props) => {
+ const { products } = props;
+ const productsPublished = filter(products, { status: 'PUBLISHED' });
+ const productsDraft = filter(products, { status: 'DRAFT' });
+
+ return (
+ <>
+ Published products
+
+
+
+
+
+ Draft products
+
+
+ >
+ );
+};
+
+export default AllProducts;
diff --git a/src/components/data/Products.tsx b/src/components/data/Products.tsx
new file mode 100644
index 000000000..e2b302819
--- /dev/null
+++ b/src/components/data/Products.tsx
@@ -0,0 +1,71 @@
+/** @jsx jsx */
+import { css, jsx } from '@emotion/core';
+import map from 'lodash.map';
+import React from 'react';
+import { Container } from 'reactstrap';
+
+import { Asset } from '../../types/data/Asset';
+import { Product } from '../../types/data/Product';
+import GraphCMSAsset from '../assets/GraphCMSAsset';
+
+type Props = {
+ products: Product[];
+}
+
+const Products: React.FunctionComponent = (props) => {
+ const { products } = props;
+
+ return (
+
+ {
+ map(products, (product: Product) => {
+ return (
+
+ {
+ map(product.images, (image: Asset) => {
+ return (
+
+ );
+ })
+ }
+
+
+ {product?.title} - ${product?.price || 0}
+
+
+
+ {product?.description}
+
+
+ );
+ })
+ }
+
+ );
+};
+
+export default Products;
diff --git a/src/components/doc/BuiltInFeaturesSection.tsx b/src/components/doc/BuiltInFeaturesSection.tsx
new file mode 100644
index 000000000..8dfefa482
--- /dev/null
+++ b/src/components/doc/BuiltInFeaturesSection.tsx
@@ -0,0 +1,289 @@
+/** @jsx jsx */
+import { jsx } from '@emotion/core';
+import React from 'react';
+import { Button, Card, CardBody, CardSubtitle, CardText, CardTitle, Alert } from 'reactstrap';
+import I18nLink from '../i18n/I18nLink';
+import Cards from '../utils/Cards';
+import ExternalLink from '../utils/ExternalLink';
+import DocSection from './DocSection';
+
+type Props = {}
+
+/**
+ * Documentation section that showcases features that are built-in into NRN
+ *
+ * @param props
+ */
+const BuiltInFeaturesSection: React.FunctionComponent = (props): JSX.Element => {
+ return (
+
+ Built-in features
+
+
+
+
+ Hosting on Vercel vendor
+ “Deploy your app online in a breeze”
+
+
+
+ Learn more about the Vercel cloud platform
+
+
+ Learn how to configure and use Vercel
+
+
+ Learn why we chose Vercel
+
+
+
+
+
+
+
+
+ Stages & secrets
+ “How to deal with secrets, using Vercel vendor”
+
+
+
+ Learn more about the "env and stages" concept
+
+
+ Learn how to configure Vercel secrets, using the CLI
+
+
+ Learn more about their usage and differences
+
+
+
+
+
+
+
+
+ B2B MST
+ “Multi Single Tenancy for B2B businesses who need it”
+
+
+ MST
is similar to the monorepo
design, where the same source code can be used to deploy multiple instances.
+
+
+
+ Learn more about the "tenancy" concept and what MST
means
+
+
+
+
+
+
+
+
+ CI/CD
+ “Continuous Integrations and Continuous Deployments made free and easy, using Github Actions”
+
+
+
+ Learn more about the "CI/CD" concept
+
+
+ Learn how to setup CI/CD
+
+
+ See how to bypass automated CI/CD and deploy manually
+
+
+
+
+
+
+
+
+ Static i18n
+ “Content internationalisation using i18next and Locize vendor”
+
+
+
+ Learn more about the "i18n" concept
+
+
+ Learn how to use the "Locize" vendor
+
+
+ See usage examples
+
+
+
+
+
+
+
+
+ Monitoring
+ “Realtime app monitoring using Sentry vendor”
+
+
+
+ Learn more about the "Monitoring" concept
+
+
+ Learn how to use the "Sentry" vendor
+
+
+ See usage examples
+
+
+
+
+
+
+
+
+ GraphQL
+ “GraphQL API fetching using GraphCMS vendor and Apollo”
+
+
+
+ Learn more about the "GraphQL" concept
+
+
+ Learn how to use the "GraphCMS" vendor
+
+
+ See usage examples
+
+
+
+
+
+
+
+
+ CSS-in-JS
+ “Styling components with Emotion”
+
+
+
+ Learn how to use the "Emotion" library
+
+
+ See usage examples
+
+
+
+
+
+
+
+
+ Analytics
+ “Analytics using Amplitude vendor”
+
+
+
+ Learn more about the "Analytics" concept
+
+
+ Learn how to use the "Amplitude" vendor
+
+
+ See usage examples
+
+
+
+
+
+
+
+
+ Testing
+ “Unit tests using Jest and E2E tests using Cypress”
+
+
+
+ Learn more about the "Testing" concept
+
+
+ Learn how to use the "Cypress" library (E2E)
+
+
+
+
+
+
+
+
+ Icons
+ “Icons library using Font-Awesome”
+
+
+
+ See all available FA icons
+
+
+ See usage examples
+
+
+
+
+
+
+
+
+ CSS Animations
+ “Animations using Animate.css”
+
+
+
+ See all available animations
+
+
+ See usage examples
+
+
+
+
+
+
+
+
+ UI components library
+ “React components using Reactstrap and Bootstrap”
+
+
+
+ See all available Reactstrap components
+
+
+ See components examples
+
+
+
+
+
+
+
+
+ Docs site
+ “Dedicated GitHub pages website, using Jekyll”
+
+
+
+ Learn more about "GitHub pages"
+
+
+ Learn more about "just-the-docs" built-in template
+
+
+ Learn how to use it
+
+
+
+
+
+
+
+ );
+};
+
+export default BuiltInFeaturesSection;
diff --git a/src/components/doc/BuiltInFeaturesSidebar.tsx b/src/components/doc/BuiltInFeaturesSidebar.tsx
new file mode 100644
index 000000000..8d235aec2
--- /dev/null
+++ b/src/components/doc/BuiltInFeaturesSidebar.tsx
@@ -0,0 +1,112 @@
+/** @jsx jsx */
+import { jsx } from '@emotion/core';
+import map from 'lodash.map';
+import { NextRouter, useRouter } from 'next/router';
+import React from 'react';
+import { Nav, NavItem, NavLink } from 'reactstrap';
+import { SidebarLink } from '../../types/SidebarLink';
+import I18nLink from '../i18n/I18nLink';
+import { SidebarProps } from '../pageLayouts/DefaultLayout';
+import SidebarFooter from './SidebarFooter';
+
+type Props = SidebarProps;
+
+export const BUILT_IN_FEATURES_SIDEBAR_LINKS: SidebarLink[] = [
+ {
+ href: '/examples/built-in-features/hosting',
+ label: 'Hosting',
+ },
+ {
+ href: '/examples/built-in-features/stages-and-secrets',
+ label: 'Stages & secrets',
+ },
+ {
+ href: '/examples/built-in-features/manual-deployments',
+ label: 'CI/CD',
+ },
+ {
+ href: '/examples/built-in-features/static-i18n',
+ label: 'Static i18n',
+ },
+ {
+ href: '/examples/built-in-features/monitoring',
+ label: 'Monitoring',
+ },
+ {
+ href: '/examples/built-in-features/graphql',
+ label: 'GraphQL',
+ },
+ {
+ href: '/examples/built-in-features/css-in-js',
+ label: 'CSS-in-JS',
+ },
+ {
+ href: '/examples/built-in-features/analytics',
+ label: 'Analytics',
+ },
+ {
+ href: '/examples/built-in-features/icons',
+ label: 'Icons',
+ },
+ {
+ href: '/examples/built-in-features/animations',
+ label: 'CSS Animations',
+ },
+ {
+ href: '/examples/built-in-features/ui-components',
+ label: 'UI components library',
+ },
+ {
+ href: '/examples/built-in-features/docs-site',
+ label: 'Docs site',
+ },
+];
+
+/**
+ * Sidebar meant to be used on all pages related to the "Built-in features" section
+ *
+ * Display all BUILT_IN_FEATURES_SIDEBAR_LINKS towards pages related to this section
+ *
+ * @param props
+ */
+const BuiltInFeaturesSidebar: React.FunctionComponent = (props): JSX.Element => {
+ const { className } = props;
+ const router: NextRouter = useRouter();
+
+ return (
+
+
Built-in features
+
+
+ {
+ map(BUILT_IN_FEATURES_SIDEBAR_LINKS, (link: SidebarLink) => {
+ const { label, href } = link;
+
+ return (
+
+
+
+ {label}
+
+
+
+ );
+ })
+ }
+
+
+
+
+
+
+ );
+};
+
+export default BuiltInFeaturesSidebar;
diff --git a/src/components/doc/BuiltInUtilitiesSection.tsx b/src/components/doc/BuiltInUtilitiesSection.tsx
new file mode 100644
index 000000000..fa1de2e7b
--- /dev/null
+++ b/src/components/doc/BuiltInUtilitiesSection.tsx
@@ -0,0 +1,171 @@
+/** @jsx jsx */
+import { css, jsx } from '@emotion/core';
+import React from 'react';
+import { Alert, Button, Card, CardBody, CardSubtitle, CardText, CardTitle } from 'reactstrap';
+import I18nLink from '../i18n/I18nLink';
+import Cards from '../utils/Cards';
+import ExternalLink from '../utils/ExternalLink';
+import DocSection from './DocSection';
+
+type Props = {}
+
+/**
+ * Documentation section that showcases utilities that are built-in into NRN
+ *
+ * @param props
+ */
+const BuiltInUtilitiesSection: React.FunctionComponent = (props): JSX.Element => {
+ return (
+
+ Built-in utilities
+
+
+
+
+ I18nLink
component
+ “Help manage i18n links with breeze”
+
+
+
+ See usage examples
+
+
+
+
+
+
+
+
+ Hooks
+ “Helpful hooks”
+
+
+
+ See usage examples
+
+
+
+
+
+
+
+
+ HOCs
+ “Helpful high order components”
+
+
+
+ See usage examples
+
+
+
+
+
+
+
+
+ API
+ “API endpoints”
+
+
+
+ See usage examples
+
+
+
+
+
+
+
+
+ Errors handling
+ “Properly handling errors, to provide good UX and system observability”
+
+
+
+ See how errors are handled
+
+
+
+
+
+
+
+
+ Bundle analysis
+ “Know how big your bundle is”
+
+
+
+ See usage examples
+
+
+
+
+
+
+
+
+ SVG to React
+ “Convert your SVGs to React components using SVGR”
+
+
+
+ See usage examples
+
+
+
+
+
+
+
+
+ Security audit
+ “Run packages security audit using yarn”
+
+
+
+ See usage examples
+
+
+
+
+
+
+
+
+ Packages upgrade
+ “Visually upgrade your packages, with confidence”
+
+
+
+ See usage examples
+
+
+
+
+
+
+
+
+ Tracking useless re-renders
+ “Visualise useless re-renders that slow down your app”
+
+
+
+ Learn how to use the React Profiler
+
+
+ See usage examples
+
+
+
+
+
+
+
+
+ );
+};
+
+export default BuiltInUtilitiesSection;
diff --git a/src/components/doc/BuiltInUtilitiesSidebar.tsx b/src/components/doc/BuiltInUtilitiesSidebar.tsx
new file mode 100644
index 000000000..422bd2589
--- /dev/null
+++ b/src/components/doc/BuiltInUtilitiesSidebar.tsx
@@ -0,0 +1,99 @@
+/** @jsx jsx */
+import { jsx } from '@emotion/core';
+import map from 'lodash.map';
+import { NextRouter, useRouter } from 'next/router';
+import React from 'react';
+import { Nav, NavItem, NavLink } from 'reactstrap';
+import { SidebarLink } from '../../types/SidebarLink';
+import I18nLink from '../i18n/I18nLink';
+import { SidebarProps } from '../pageLayouts/DefaultLayout';
+import SidebarFooter from './SidebarFooter';
+
+type Props = SidebarProps;
+
+export const BUILT_IN_UTILITIES_SIDEBAR_LINKS: SidebarLink[] = [
+ {
+ href: '/examples/built-in-utilities/i18nLink-component',
+ label: 'I18nLink component',
+ },
+ {
+ href: '/examples/built-in-utilities/hooks',
+ label: 'Hooks',
+ },
+ {
+ href: '/examples/built-in-utilities/hocs',
+ label: 'HOCs',
+ },
+ {
+ href: '/examples/built-in-utilities/api',
+ label: 'API',
+ },
+ {
+ href: '/examples/built-in-utilities/errors-handling',
+ label: 'Errors handling',
+ },
+ {
+ href: '/examples/built-in-utilities/bundle-analysis',
+ label: 'Bundle analysis',
+ },
+ {
+ href: '/examples/built-in-utilities/svg-to-react',
+ label: 'SVG to React',
+ },
+ {
+ href: '/examples/built-in-utilities/security-audit',
+ label: 'Security audit',
+ },
+ {
+ href: '/examples/built-in-utilities/tracking-useless-re-renders',
+ label: 'Tracking useless re-renders',
+ },
+];
+
+/**
+ * Sidebar meant to be used on all pages related to the "Built-in utilities" section
+ *
+ * Display all BUILT_IN_FEATURES_SIDEBAR_LINKS towards pages related to this section
+ *
+ * @param props
+ */
+const BuiltInUtilitiesSidebar: React.FunctionComponent = (props): JSX.Element => {
+ const { className } = props;
+ const router: NextRouter = useRouter();
+
+ return (
+
+
Built-in utilities
+
+
+ {
+ map(BUILT_IN_UTILITIES_SIDEBAR_LINKS, (link: SidebarLink) => {
+ const { label, href } = link;
+
+ return (
+
+
+
+ {label}
+
+
+
+ );
+ })
+ }
+
+
+
+
+
+
+ );
+};
+
+export default BuiltInUtilitiesSidebar;
diff --git a/src/components/doc/DocPage.tsx b/src/components/doc/DocPage.tsx
new file mode 100644
index 000000000..b5df82005
--- /dev/null
+++ b/src/components/doc/DocPage.tsx
@@ -0,0 +1,40 @@
+/** @jsx jsx */
+import { css, jsx } from '@emotion/core';
+import React, { ReactNode } from 'react';
+
+type Props = {
+ children: ReactNode;
+}
+
+/**
+ * Documentation page
+ *
+ * Basically wraps the children in a white container
+ *
+ * @param props
+ */
+const DocPage: React.FunctionComponent = (props): JSX.Element => {
+ const { children } = props;
+
+ return (
+
+ {children}
+
+ );
+};
+
+export default DocPage;
diff --git a/src/components/doc/DocSection.tsx b/src/components/doc/DocSection.tsx
new file mode 100644
index 000000000..8e0a406af
--- /dev/null
+++ b/src/components/doc/DocSection.tsx
@@ -0,0 +1,28 @@
+/** @jsx jsx */
+import { css, jsx } from '@emotion/core';
+import React, { ReactNode } from 'react';
+
+type Props = {
+ children: ReactNode;
+}
+
+/**
+ * Section of documentation, meant to be used within a page to visually separate documentation sections
+ *
+ * @param props
+ */
+const DocSection: React.FunctionComponent = (props): JSX.Element => {
+ const { children } = props;
+
+ return (
+
+ {children}
+
+ );
+};
+
+export default DocSection;
diff --git a/src/components/doc/ExternalFeaturesSection.tsx b/src/components/doc/ExternalFeaturesSection.tsx
new file mode 100644
index 000000000..d7eaaa937
--- /dev/null
+++ b/src/components/doc/ExternalFeaturesSection.tsx
@@ -0,0 +1,50 @@
+/** @jsx jsx */
+import { css, jsx } from '@emotion/core';
+import React from 'react';
+import { Alert, Button, Card, CardBody, CardSubtitle, CardText, CardTitle } from 'reactstrap';
+import Cards from '../utils/Cards';
+import ExternalLink from '../utils/ExternalLink';
+import DocSection from './DocSection';
+
+type Props = {}
+
+/**
+ * Documentation section that showcases features that aren't directly related to NRN
+ *
+ * @param props
+ */
+const ExternalFeaturesSection: React.FunctionComponent = (props): JSX.Element => {
+ return (
+
+ External features
+
+
+ This section showcases features that aren't built-in within NRN.
+
+
+
+
+
+ Backoffice/Admin site
+ “Manage NRN content using NRN-Admin”
+
+
+ You have the ability to update this demo dynamic content using NRN-Admin.
+ It's basically an admin site (POC/experimental), for managing content, based on
+ react-admin
, built with NRN.
+
+
+
+
+ Go to NRN-Admin
+
+
+
+
+
+
+
+ );
+};
+
+export default ExternalFeaturesSection;
diff --git a/src/components/doc/IntroductionSection.tsx b/src/components/doc/IntroductionSection.tsx
new file mode 100644
index 000000000..15a04625e
--- /dev/null
+++ b/src/components/doc/IntroductionSection.tsx
@@ -0,0 +1,76 @@
+/** @jsx jsx */
+import { jsx } from '@emotion/core';
+import React from 'react';
+import { Alert, Jumbotron } from 'reactstrap';
+
+import I18nLink from '../i18n/I18nLink';
+import ExternalLink from '../utils/ExternalLink';
+import Text from '../utils/Text';
+
+type Props = {
+ // XXX Beware when passing down the "logEvent", because it'll use the props attached from the tag it comes from
+ // It's not an issue here, because we don't "supercharge" it with additional event/user properties
+ // But, if we had wanted to do so, we should have used a different component here, and supercharge its properties
+ logEvent: Function;
+}
+
+/**
+ * Introduction documentation section
+ *
+ * @param props
+ */
+const IntroductionSection: React.FunctionComponent = (props): JSX.Element => {
+ const { logEvent } = props;
+
+ return (
+
+ Next Right Now Demo
+
+ This demo uses the preset
+
+ {process.env.NRN_PRESET}
+
+
+
+ logEvent('open-what-is-preset-doc')}
+ >
+ What is a preset?
+
+ -
+ logEvent('open-see-all-presets-doc')}
+ >
+ See all presets
+
+
+
+
+
+ Next Right Now (NRN) is a flexible production-grade boilerplate featuring Next.js framework.
+ It can be used as a boilerplate to get started your own project, or as a learning resource.
+
+
+
+ General documentation about NRN is available at
+ https://unlyed.github.io/next-right-now/ .
+ The role of this demo is to showcase what's built-in within the selected preset only .
+
+
+
+ Please note that the documentation is hardcoded in English , so don't expect it to change when switching language.
+ Nav/Footer component are localised, as well as dynamic content and i18n examples.
+
+ You can switch locale from the footer or by clicking on{' '}
+ fr-FR or en-US .
+
+
+
+ );
+};
+
+export default IntroductionSection;
diff --git a/src/components/doc/NativeFeaturesSection.tsx b/src/components/doc/NativeFeaturesSection.tsx
new file mode 100644
index 000000000..3da4fa19b
--- /dev/null
+++ b/src/components/doc/NativeFeaturesSection.tsx
@@ -0,0 +1,223 @@
+/** @jsx jsx */
+import { jsx } from '@emotion/core';
+import React from 'react';
+import { Alert, Button, Card, CardBody, CardSubtitle, CardText, CardTitle } from 'reactstrap';
+import I18nLink from '../i18n/I18nLink';
+import Cards from '../utils/Cards';
+import ExternalLink from '../utils/ExternalLink';
+import DocSection from './DocSection';
+
+type Props = {}
+
+/**
+ * Documentation section that showcases native Next.js features
+ *
+ * @param props
+ */
+const NativeFeaturesSection: React.FunctionComponent = (props): JSX.Element => {
+ return (
+
+ Next.js native features
+
+
+ Only a small subset of Next.js features (rendering modes, mostly) is covered here.
+ Make sure to check the official documentation to learn more about it (routing, etc.)
+
+
+
+
+
+ SSR
+ “Server Side Rendering”
+
+
+ Next.js has always supported SSR, and it was the main way to render pages until
+ v9.3 came out .
+
+
+
+ SSR can be used either through
+
+ getInitialProps
+
+ or
+
+ getServerSideProps
+ .
+
+
+
+
+ Learn more about getServerSideProps
+
+
+ Example with getServerSideProps
+
+
+
+
+ We have decided not to use getInitialProps
, because even though it is not officially deprecated, {' '}
+ it is preferred to use getServerSideProps
whenever possible.
+
+ From experience , it is harder to use getInitialProps
because you have to make your code universal, {' '}
+ because it will be executed from the server (SSR) and the browser (CSR), and it usually leads to increased complexity and tougher bugs.
+
+
+
+
+
+
+
+ SSG
+ “Static Site Generation” / “Server-Side Generated”
+
+
+ Next.js supports SSG since v9.3 .
+ This is the officially recommended way to build apps since then.
+
+
+
+ We also strongly recommend using SSG, whenever possible.
+ SSG can only be used using getStaticProps
, NRN provides a getCommonStaticProps
helper
+ to configure common stuff between all SSG-based pages and reduce code duplication.
+
+
+
+
+ Learn more about getStaticProps
+
+
+ Example with getStaticProps
+
+
+
+
+ SSG can be used with different options, which are described below,{' '}
+ and provide much greater flexibility and business possibilities compared to the basic example above.
+
+
+
+
+
+
+
+ SSG, using fallback
option
+ “Pre-build only a subset of your pages, then build static pages on-demand”
+
+
+ Next.js supports SSG with fallback
since v9.3 .
+
+
+
+ You should use it if you only want/can pre-generate only part of your static pages at build time, and then build static pages on-demand upon request.
+ It's very interesting if you've got a ton of pages and want faster builds. This way, you can pre-build only the most used pages of your app, and build other pages on-demand if they ever get requested.
+
+
+
+
+ Learn more about getStaticProps
with fallback
option
+
+
+ Example with getStaticProps
and fallback
+
+
+
+
+
+
+
+
+ SSG, using revalidate
option (BETA)
+ “Automatically rebuild your pages when they get too old, to serve fresh content statically”
+
+
+ Next.js supports SSG with revalidate
since
+ v9.4 .
+
+
+
+ The revalidate
option is strongly related to the Incremental Static Regeneration concept.
+ Basically, it's the ability to regenerate parts of your apps based on your own business rules.
+ Currently, it only supports a time-based regeneration (similar to TTL), thus when your page is too old, it gets regenerated.
+
+
+
+
+ Learn more about getStaticProps
with revalidate
option
+
+
+ Example with getStaticProps
and revalidate
+
+
+
+
+ Be aware that this feature is still in beta (as of v9.4), and the prop name is unstable_revalidate
to make this obvious.
+ The RFC is still being discussed, don't hesitate to participate!
+ API-based regeneration (e.g: regenerate pages based on a CMS update) is still being discussed in the RFC.
+
+
+
+
+
+
+
+ TS
+ “TypeScript support and helpful tips”
+
+
+ Next.js supports TS natively out of the box.
+ But, there are special considerations to support TS for testing, code linting, etc.
+
+
+
+ TS is treated as first-class citizen, we do our best to make the TS experience as smooth and simple as possible.
+ We use TS a lot, and type everything. You could say NRN comes with an advanced TS usage.
+ This can be overwhelming for TS beginners, even though you shouldn't have anything to configure by yourself, you'll still need to understand the concepts and be aware of the features we use.
+
+
+
+ We strongly recommend you to take a look at the
+ React TypeScript Cheatsheets
+ , which is amazing for both beginners and experienced TS users.
+
+
+
+
+
+
+
+ New to Next.js?
+ “Step-by-step tutorial for beginners”
+
+
+ Quickly learn the basic concepts of a Next.js app, such as navigation, the different rendering modes, routing, API routes and deploying to Vercel.
+
+
+
+ We strongly recommend doing this tutorial if you're not familiar with Next.js, it'll help you get an overview of what the framework can help you achieve.
+
+
+
+ NRN is meant to help you, but basic Next.js knowledge will be necessary as we don't focus on the basics here but mostly on the difficult/advanced stuff.
+
+
+
+ Go to the tutorial .
+
+
+
+
+
+
+ );
+};
+
+export default NativeFeaturesSection;
diff --git a/src/components/doc/NativeFeaturesSidebar.tsx b/src/components/doc/NativeFeaturesSidebar.tsx
new file mode 100644
index 000000000..6a0887a09
--- /dev/null
+++ b/src/components/doc/NativeFeaturesSidebar.tsx
@@ -0,0 +1,82 @@
+/** @jsx jsx */
+import { jsx } from '@emotion/core';
+import map from 'lodash.map';
+import { NextRouter, useRouter } from 'next/router';
+import React from 'react';
+import { Nav, NavItem, NavLink } from 'reactstrap';
+import { SidebarLink } from '../../types/SidebarLink';
+import I18nLink from '../i18n/I18nLink';
+import { SidebarProps } from '../pageLayouts/DefaultLayout';
+import SidebarFooter from './SidebarFooter';
+
+type Props = SidebarProps;
+
+export const NATIVE_FEATURES_SIDEBAR_LINKS: SidebarLink[] = [
+ {
+ href: '/examples/native-features/example-with-ssr',
+ label: 'SSR (getServerSideProps)',
+ },
+ {
+ href: '/examples/native-features/example-with-ssg',
+ label: 'SSG',
+ },
+ {
+ href: '/examples/native-features/example-with-ssg-and-fallback/[albumId]',
+ label: 'SSG using fallback',
+ params: {
+ albumId: 1,
+ },
+ },
+ {
+ href: '/examples/native-features/example-with-ssg-and-revalidate',
+ label: 'SSG using revalidate',
+ },
+];
+
+/**
+ * Sidebar meant to be used on all pages related to the "Native features" section
+ *
+ * Display all NATIVE_FEATURES_SIDEBAR_LINKS towards pages related to this section
+ *
+ * @param props
+ */
+const NativeFeaturesSidebar: React.FunctionComponent = (props): JSX.Element => {
+ const { className } = props;
+ const router: NextRouter = useRouter();
+
+ return (
+
+
Native features
+
+
+ {
+ map(NATIVE_FEATURES_SIDEBAR_LINKS, (link: SidebarLink) => {
+ const { label, href, params = null } = link;
+
+ return (
+
+
+
+ {label}
+
+
+
+ );
+ })
+ }
+
+
+
+
+
+
+ );
+};
+
+export default NativeFeaturesSidebar;
diff --git a/src/components/doc/SidebarFooter.tsx b/src/components/doc/SidebarFooter.tsx
new file mode 100644
index 000000000..1ae9eb07f
--- /dev/null
+++ b/src/components/doc/SidebarFooter.tsx
@@ -0,0 +1,102 @@
+/** @jsx jsx */
+import { css, jsx } from '@emotion/core';
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
+import React from 'react';
+import { useTranslation } from 'react-i18next';
+import I18nLink from '../i18n/I18nLink';
+
+type Props = {
+ previousSectionHref?: string; // If not defined, then won't show the previous section link
+ nextSectionHref?: string; // If not defined, then won't show the next section link
+};
+
+const HomePageLink: React.FunctionComponent = () => {
+ const { t } = useTranslation();
+
+ return (
+
+
+ {t('nav.indexPage.link', 'Accueil')}
+
+ );
+};
+
+const NextSectionLink: React.FunctionComponent<{ nextSectionHref: string }> = (props) => {
+ const { nextSectionHref } = props;
+
+ return (
+
+
+ Next section
+
+ );
+};
+
+const PreviousSectionLink: React.FunctionComponent<{ previousSectionHref: string }> = (props) => {
+ const { previousSectionHref } = props;
+
+ return (
+
+
+ Previous section
+
+ );
+};
+
+/**
+ * Sidebar footer
+ *
+ * Displays a Home link shortcut, and an optional link to go to the next section
+ *
+ * @param props
+ */
+const SidebarFooter: React.FunctionComponent = (props): JSX.Element => {
+ const {
+ nextSectionHref,
+ previousSectionHref,
+ } = props;
+
+ return (
+
+ {
+ previousSectionHref && nextSectionHref && (
+ <>
+
+ {' - '}
+
+
+ >
+ )
+ }
+
+ {
+ !previousSectionHref && nextSectionHref && (
+ <>
+
+ {' - '}
+
+ >
+ )
+ }
+
+ {
+ previousSectionHref && !nextSectionHref && (
+ <>
+
+ {' - '}
+
+ >
+ )
+ }
+
+ );
+};
+
+export default SidebarFooter;
diff --git a/src/components/doc/SidebarToggle.tsx b/src/components/doc/SidebarToggle.tsx
new file mode 100644
index 000000000..20e5b2190
--- /dev/null
+++ b/src/components/doc/SidebarToggle.tsx
@@ -0,0 +1,59 @@
+/** @jsx jsx */
+import { css, jsx } from '@emotion/core';
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
+import React from 'react';
+
+type Props = {
+ isSidebarOpen: boolean;
+ setIsSidebarOpen: (boolean) => void;
+}
+
+/**
+ * Sidebar toggle "button"
+ *
+ * Toggles between open/close states
+ *
+ * @param props
+ */
+const SidebarToggle: React.FunctionComponent = (props): JSX.Element => {
+ const {
+ isSidebarOpen,
+ setIsSidebarOpen
+ } = props;
+
+ return (
+ setIsSidebarOpen(!isSidebarOpen)}
+ onKeyPress={(): void => setIsSidebarOpen(!isSidebarOpen)}
+ css={css`
+ .close-sidebar {
+ position: absolute;
+ padding: 10px;
+ right: 10px;
+ top: 10px;
+ }
+
+ .open-sidebar {
+ padding: 10px;
+ background-color: white;
+ }
+ `}
+ >
+ {
+ isSidebarOpen ? (
+
+
+
+ ) : (
+
+
+
+ )
+ }
+
+ );
+};
+
+export default SidebarToggle;
diff --git a/src/components/errors/DefaultErrorLayout.tsx b/src/components/errors/DefaultErrorLayout.tsx
new file mode 100644
index 000000000..283efb5d9
--- /dev/null
+++ b/src/components/errors/DefaultErrorLayout.tsx
@@ -0,0 +1,69 @@
+/** @jsx jsx */
+import { css, jsx } from '@emotion/core';
+import * as Sentry from '@sentry/node';
+import * as React from 'react';
+import { Button } from 'reactstrap';
+import ErrorDebug from './ErrorDebug';
+
+type Props = {
+ error: Error;
+ context?: any; // eslint-disable-line @typescript-eslint/no-explicit-any
+}
+
+/**
+ * Default error layout, used by DefaultLayout to display errors instead of the page's content, when an error is caught
+ *
+ * Displays a report dialog modal allowing end-users to provide a manual feedback about what happened.
+ * You may want to customise this component to display different error messages to the end users, based on statusCode or other information.
+ *
+ * @param props
+ */
+const DefaultErrorLayout = (props: Props): JSX.Element => {
+ const { error } = props;
+ const errorEventId = Sentry.captureException(error);
+
+ return (
+
+
+
Service currently unavailable
+
Error 500.
+
+
+
+
+ Try to refresh the page. Please contact our support below if the issue persists.
+
+
+ // @ts-ignore XXX showReportDialog is not recognised by TS (due to the webpack trick that replaces @sentry/node), but it works just fine
+ Sentry.showReportDialog({ eventId: errorEventId })
+ }
+ >
+ Contact support
+
+
+
+ {
+ process.env.APP_STAGE !== 'production' && (
+
+ )
+ }
+
+ );
+};
+
+export default DefaultErrorLayout;
diff --git a/src/components/errors/ErrorDebug.tsx b/src/components/errors/ErrorDebug.tsx
new file mode 100644
index 000000000..7a5fa67e5
--- /dev/null
+++ b/src/components/errors/ErrorDebug.tsx
@@ -0,0 +1,78 @@
+/** @jsx jsx */
+import { css, jsx } from '@emotion/core';
+import * as React from 'react';
+
+type Props = {
+ error?: Error;
+ context?: any; // eslint-disable-line @typescript-eslint/no-explicit-any
+}
+
+/**
+ * Displays a given error on screen
+ *
+ * Used by DefaultErrorLayout to display error debug info.
+ *
+ * @param props
+ */
+const ErrorDebug = (props: Props): JSX.Element => {
+ const { error, context }: Props = props;
+ const { message, stack } = error;
+
+ let stringifiedContext;
+ try {
+ stringifiedContext = JSON.stringify(context, null, 2);
+ } catch (e) {
+ stringifiedContext = null;
+ }
+
+ return (
+
+
+
+ The below "debug info" are only displayed on non-production stages.
+ Note that debug information about the error are also available on the server/browser console.
+
+
+
Debug information:
+
+
+ Error message :
+ {message}
+
+
+ {
+ context && (
+ <>
+ Error additional context :
+ {stringifiedContext}
+
+ >
+ )
+ }
+
+ Stack trace :
+ {stack}
+
+
+ );
+};
+
+export default ErrorDebug;
diff --git a/src/components/i18n/I18nLink.tsx b/src/components/i18n/I18nLink.tsx
new file mode 100644
index 000000000..bc8b9d924
--- /dev/null
+++ b/src/components/i18n/I18nLink.tsx
@@ -0,0 +1,97 @@
+import isEmpty from 'lodash.isempty';
+import map from 'lodash.map';
+import Link from 'next/link';
+import React, { ReactNode } from 'react';
+import useI18n, { I18n } from '../../hooks/useI18n';
+import { I18nRoute, resolveI18nRoute } from '../../utils/app/router';
+
+type Props = {
+ as?: string;
+ children: ReactNode;
+ href: string;
+ locale?: string; // The locale can be specified, but it'll fallback to the current locale if unspecified
+ params?: { [key: string]: string | number };
+ passHref?: boolean;
+ prefetch?: boolean;
+ replace?: boolean;
+ scroll?: boolean;
+ shallow?: boolean;
+ wrapChildrenAsLink?: boolean; // Helper to avoid writing redundant code
+}
+
+/**
+ * Wrapper around the native Next.js component. Handles localised links.
+ *
+ * Use the current active locale by default
+ *
+ * @example Recommended usage
+ * Homepage
+ *
+ * @example When specifying the locale to use (overrides default)
+ * Homepage in "fr-FR" locale
+ *
+ * @example The recommended usage is equivalent to this (wrapChildrenAsLink is true, by default)
+ * Homepage
+ *
+ * @example When using children that use a tag, you must set wrapChildrenAsLink to false to avoid using a link within a link
+ *
+ * Homepage
+ *
+ *
+ * @example When using route params (other than "locale")
+ *
+ * Go to product 5
+ *
+ *
+ * @param props
+ */
+const I18nLink: React.FunctionComponent = (props): JSX.Element => {
+ const { locale: currentLocale }: I18n = useI18n();
+ const {
+ as,
+ children,
+ href,
+ locale = currentLocale,
+ params,
+ passHref = true,
+ wrapChildrenAsLink = true,
+ ...rest // Should only contain valid next/Link props
+ } = props;
+ let {
+ i18nHref, // eslint-disable-line prefer-const
+ i18nAs,
+ }: I18nRoute = resolveI18nRoute({ as, href, locale });
+
+ if (!isEmpty(params)) {
+ // If any params are provided, replace their name by the provided value
+ map(params, (value: string, key: string | number) => {
+ i18nAs = i18nAs.replace(`[${key}]`, value);
+ });
+ }
+
+ return (
+
+ {
+ wrapChildrenAsLink ? (
+ // eslint-disable-next-line jsx-a11y/anchor-is-valid
+ {children}
+ ) : React.cloneElement(children as React.ReactElement)
+ }
+
+ );
+};
+
+export default I18nLink;
diff --git a/src/components/pageLayouts/DefaultLayout.tsx b/src/components/pageLayouts/DefaultLayout.tsx
new file mode 100644
index 000000000..e16fba704
--- /dev/null
+++ b/src/components/pageLayouts/DefaultLayout.tsx
@@ -0,0 +1,122 @@
+/** @jsx jsx */
+import { Amplitude, LogOnMount } from '@amplitude/react-amplitude';
+import { jsx } from '@emotion/core';
+import { createLogger } from '@unly/utils-simple-logger';
+import classnames from 'classnames';
+import React, { useState } from 'react';
+import ErrorPage from '../../pages/_error';
+import { SoftPageProps } from '../../types/pageProps/SoftPageProps';
+import Sentry from '../../utils/monitoring/sentry';
+import DefaultErrorLayout from '../errors/DefaultErrorLayout';
+import Footer from './Footer';
+import Head, { HeadProps } from './Head';
+import Nav from './Nav';
+import DefaultPageContainer from './DefaultPageContainer';
+
+const fileLabel = 'components/pageLayouts/DefaultLayout';
+const logger = createLogger({
+ label: fileLabel,
+});
+
+export type SidebarProps = {
+ className: string;
+}
+
+type Props = {
+ children: React.ReactNode;
+ headProps: HeadProps;
+ pageName: string;
+ Sidebar?: React.FunctionComponent;
+} & SoftPageProps;
+
+/**
+ * Handles the positioning of top-level elements within the page
+ *
+ * It does the following:
+ * - Adds a Nav/Footer component, and the dynamic Next.js "Page" component in between
+ * - Optionally, it can also display a left sidebar (i.e: used within examples sections)
+ * - Automatically track page views (Amplitude)
+ * - Handles errors by displaying the Error page, with the ability to contact technical support (which will send a Sentry User Feedback)
+ *
+ * @param props
+ */
+const DefaultLayout: React.FunctionComponent = (props): JSX.Element => {
+ const {
+ children,
+ error,
+ isInIframe = false, // Won't be defined server-side
+ headProps = {},
+ pageName,
+ Sidebar,
+ } = props;
+ const [isSidebarOpen, setIsSidebarOpen] = useState(true); // Todo make default value depend on viewport size
+
+ Sentry.addBreadcrumb({ // See https://docs.sentry.io/enriching-error-data/breadcrumbs
+ category: fileLabel,
+ message: `Rendering ${fileLabel} for page ${pageName}`,
+ level: Sentry.Severity.Debug,
+ });
+
+ return (
+ ({
+ ...inheritedProps,
+ page: {
+ ...inheritedProps.page,
+ name: pageName,
+ },
+ })}
+ >
+
+
+
+ {/* Loaded from components/Head - See https://github.com/mikemaccana/outdated-browser-rework */}
+
+
+ {
+ !isInIframe && (
+
+ )
+ }
+
+
+ {
+ // If an error happened, we display it instead of displaying the page
+ // We display a custom error instead of the native Next.js error by providing children (removing children will display the native Next.js error)
+ error ? (
+
+
+
+ ) : (
+
+ {children}
+
+ )
+ }
+
+
+ {
+ !isInIframe && (
+
+ )
+ }
+
+ );
+};
+
+export default DefaultLayout;
diff --git a/src/components/pageLayouts/DefaultPageContainer.tsx b/src/components/pageLayouts/DefaultPageContainer.tsx
new file mode 100644
index 000000000..36948c2ea
--- /dev/null
+++ b/src/components/pageLayouts/DefaultPageContainer.tsx
@@ -0,0 +1,155 @@
+/** @jsx jsx */
+import { css, jsx } from '@emotion/core';
+import classnames from 'classnames';
+import { useTheme } from 'emotion-theming';
+import React from 'react';
+import { Container } from 'reactstrap';
+import SidebarToggle from '../doc/SidebarToggle';
+import { SidebarProps } from './DefaultLayout';
+
+type Props = {
+ children: React.ReactNode;
+ isSidebarOpen: boolean;
+ setIsSidebarOpen: (boolean) => void;
+ Sidebar: React.FunctionComponent;
+}
+
+/**
+ * Handles the display of the Next.js Page component (as "children")
+ *
+ * It does the following:
+ * - Handles display of the optional Sidebar component
+ * - Handles visibility of the side bar based on its state (open/close)
+ * - handles top-level layout transformation related to the sidebar visibility
+ *
+ * @param props
+ */
+const DefaultPageContainer: React.FunctionComponent = (props): JSX.Element => {
+ const {
+ children,
+ isSidebarOpen,
+ setIsSidebarOpen,
+ Sidebar,
+ } = props;
+ const { primaryColor } = useTheme();
+
+ const sidebarWidth = 300;
+ const headingTopOffset = 50;
+ const spacingAroundContainers = 20;
+ const containerCss = css`
+ margin-top: ${headingTopOffset}px;
+ margin-bottom: ${headingTopOffset}px;
+ `;
+
+ if (typeof Sidebar === 'undefined') {
+ return (
+
+ {children}
+
+ );
+
+ } else {
+ return (
+ .sidebar-container {
+ position: fixed; // Sidebar follows scroll
+ z-index: 1;
+ overflow: auto;
+ width: ${sidebarWidth}px;
+ padding-top: ${headingTopOffset}px;
+ padding-bottom: 20px;
+ padding-left: ${spacingAroundContainers}px;
+ padding-right: ${spacingAroundContainers}px;
+ background-color: white;
+ border-radius: 5px;
+
+ // Display sidebar below page content on mobile
+ @media (max-width: 991.98px) {
+ position: relative;
+ width: 100vw;
+ }
+
+ .nav-item {
+ height: 25px;
+
+ &:hover {
+ opacity: 0.5;
+ }
+ }
+ }
+
+ > .content-container {
+ width: calc(100vw - ${spacingAroundContainers}px * 2 - ${sidebarWidth}px);
+ margin-left: calc(${spacingAroundContainers}px + ${sidebarWidth}px);
+ margin-right: ${spacingAroundContainers}px;
+
+ // Display sidebar below page content on mobile
+ @media (max-width: 991.98px) {
+ position: relative;
+ width: 100vw;
+ margin-left: 0; // Reset offset
+ }
+ }
+ }
+
+ &.sidebar-is-close {
+ > .sidebar-container {
+ position: fixed; // Sidebar follows scroll
+ z-index: 1;
+ }
+ }
+
+ .sidebar {
+ .nav-link {
+ color: black !important;
+
+ &.active {
+ color: ${primaryColor} !important;
+ }
+ }
+ }
+ `}
+ >
+
+ {
+ isSidebarOpen ? (
+ <>
+
+
+ >
+ ) : (
+
+ )
+ }
+
+
+
+ {children}
+
+
+ );
+ }
+};
+
+export default DefaultPageContainer;
diff --git a/src/components/pageLayouts/Footer.tsx b/src/components/pageLayouts/Footer.tsx
new file mode 100644
index 000000000..11014113a
--- /dev/null
+++ b/src/components/pageLayouts/Footer.tsx
@@ -0,0 +1,197 @@
+/** @jsx jsx */
+import { css, jsx } from '@emotion/core';
+import startsWith from 'lodash.startswith';
+import { NextRouter, useRouter } from 'next/router';
+import React from 'react';
+import { useTranslation } from 'react-i18next';
+import { Button, Col, Row } from 'reactstrap';
+import useI18n, { I18n } from '../../hooks/useI18n';
+import useUserSession, { UserSession } from '../../hooks/useUserSession';
+import customerContext, { CustomerContext } from '../../stores/customerContext';
+import { i18nRedirect } from '../../utils/app/router';
+import { SIZE_XS } from '../../utils/assets/logo';
+import { getValueFallback } from '../../utils/data/record';
+import { LANG_FR } from '../../utils/i18n/i18n';
+import GraphCMSAsset from '../assets/GraphCMSAsset';
+import Logo from '../assets/Logo';
+import I18nLink from '../i18n/I18nLink';
+import DisplayOnBrowserMount from '../rehydration/DisplayOnBrowserMount';
+import EnglishFlag from '../svg/EnglishFlag';
+import FrenchFlag from '../svg/FrenchFlag';
+import Tooltip from '../utils/Tooltip';
+
+type Props = {};
+
+const Footer: React.FunctionComponent = () => {
+ const { t } = useTranslation();
+ const router: NextRouter = useRouter();
+ const { deviceId }: UserSession = useUserSession();
+ const customer: CustomerContext = React.useContext(customerContext);
+ const { lang, locale }: I18n = useI18n();
+ const theme = customer.theme;
+ const { primaryColor, logo } = theme;
+ const logoSizesMultipliers = [
+ {
+ size: SIZE_XS,
+ multiplier: 1, // We wanna keep the logos in the footer big and visible even on small devices, we've got enough space
+ },
+ ];
+
+ // Resolve values, handle multiple fallback levels
+ const copyrightOwner = getValueFallback([
+ { record: customer, key: 'label' },
+ ]);
+ const currentYear = (new Date()).getFullYear();
+
+ return (
+
+ );
+};
+
+export default Footer;
diff --git a/src/components/pageLayouts/Head.tsx b/src/components/pageLayouts/Head.tsx
new file mode 100644
index 000000000..726441cd1
--- /dev/null
+++ b/src/components/pageLayouts/Head.tsx
@@ -0,0 +1,112 @@
+import { isBrowser } from '@unly/utils';
+import NextHead from 'next/head';
+import React from 'react';
+
+import { NRN_DEFAULT_SERVICE_LABEL } from '../../constants';
+import { I18nLocale } from '../../types/i18n/I18nLocale';
+import { SUPPORTED_LOCALES } from '../../utils/i18n/i18n';
+
+export type HeadProps = {
+ title?: string;
+ description?: string;
+ url?: string;
+ ogImage?: string;
+ favicon?: string;
+ additionalContent?: React.ReactElement;
+}
+
+/**
+ * Custom Head component
+ *
+ * https://github.com/zeit/next.js#populating-head
+ */
+const Head: React.FunctionComponent = (props): JSX.Element => {
+ const defaultDescription = 'Flexible production-grade boilerplate with Next.js 9, Zeit and TypeScript. Includes multiple opt-in presets using GraphQL, Analytics, CSS-in-JS, Monitoring, End-to-end testing, Internationalization, CI/CD and B2B multiple single-tenants (monorepo) support';
+ const defaultOGURL = 'https://github.com/UnlyEd/next-right-now';
+ const defaultOGImage = 'https://storage.googleapis.com/the-funding-place/assets/images/Logo_TFP_quadri_horizontal.svg';
+ const defaultFavicon = 'https://storage.googleapis.com/the-funding-place/assets/images/default_favicon.ico';
+
+ const {
+ title = NRN_DEFAULT_SERVICE_LABEL,
+ description = defaultDescription,
+ ogImage = defaultOGURL,
+ url = defaultOGImage,
+ favicon = defaultFavicon,
+ additionalContent,
+ } = props;
+
+ if (isBrowser()) {
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
+ const WebFontLoader = require('webfontloader');
+
+ // Load our fonts. Until they're loaded, fallback fonts will be used (configured in UniversalGlobalStyles)
+ // This fixed an issue when loading fonts from external sources that don't show the text until the font is loaded
+ // With this, instead of not showing any text, it'll show the text using its fallback font, and then show the font once loaded
+ // XXX See https://github.com/typekit/webfontloader#custom
+ WebFontLoader.load({
+ custom: {
+ families: ['neuzeit-grotesk'],
+ urls: ['/static/fonts/NeuzeitGrotesk/font.css']
+ },
+ });
+ }
+
+ return (
+
+
+ {title}
+
+
+
+
+
+
+
+ {
+ SUPPORTED_LOCALES.map((supportedLocale: I18nLocale) => {
+ // Google best practice for SEO https://webmasters.googleblog.com/2011/12/new-markup-for-multilingual-content.html
+ // Google accepts relative links for hreflang
+ // See https://stackoverflow.com/questions/28291574/are-relative-links-valid-in-link-rel-alternate-hreflang-tags
+ // See https://webmasters.googleblog.com/2013/04/5-common-mistakes-with-relcanonical.html
+ return (
+
+ );
+ })
+ }
+
+
+
+
+
+
+
+
+
+
+
+ {/* Detect outdated browser and display a popup about how to upgrade to a more recent browser/version */}
+ {/* XXX See public/static/CDN/README.md */}
+ {/*
+ XXX DISABLED because of https://github.com/mikemaccana/outdated-browser-rework/issues/57#issuecomment-620532590
+ TLDR; Display false-positive warnings on embedded browsers if they're too old and the user can't do anything about it (e.g: Facebook Chrome, Linkedin Chrome, etc.)
+ */}
+ {/**/}
+ {/* */}
+
+ {
+ additionalContent && (
+ additionalContent
+ )
+ }
+
+
+ );
+};
+
+export default Head;
diff --git a/src/components/Nav.tsx b/src/components/pageLayouts/Nav.tsx
similarity index 50%
rename from src/components/Nav.tsx
rename to src/components/pageLayouts/Nav.tsx
index 6085477bc..b7337f8c8 100644
--- a/src/components/Nav.tsx
+++ b/src/components/pageLayouts/Nav.tsx
@@ -2,52 +2,33 @@
import { Amplitude } from '@amplitude/react-amplitude';
import { css, jsx } from '@emotion/core';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
-import * as Sentry from '@sentry/node';
-import { isBrowser } from '@unly/utils';
-import Link from 'next/link';
-import { NextRouter } from 'next/router';
+import classnames from 'classnames';
+import map from 'lodash.map';
+import kebabCase from 'lodash.kebabcase';
+import { NextRouter, useRouter } from 'next/router';
import React from 'react';
-import { withTranslation } from 'react-i18next';
-import { Col, Nav as NavStrap, Navbar, NavItem, NavLink, Row } from 'reactstrap';
-import { compose } from 'recompose';
+import { useTranslation } from 'react-i18next';
+import { Col, DropdownItem, DropdownMenu, DropdownToggle, Nav as NavStrap, Navbar, NavItem, NavLink, Row, UncontrolledDropdown } from 'reactstrap';
+import useI18n, { I18n } from '../../hooks/useI18n';
+import customerContext, { CustomerContext } from '../../stores/customerContext';
+import { SidebarLink } from '../../types/SidebarLink';
+import { isActive, resolveI18nHomePage } from '../../utils/app/router';
+import GraphCMSAsset from '../assets/GraphCMSAsset';
+import { BUILT_IN_FEATURES_SIDEBAR_LINKS } from '../doc/BuiltInFeaturesSidebar';
+import { BUILT_IN_UTILITIES_SIDEBAR_LINKS } from '../doc/BuiltInUtilitiesSidebar';
+import I18nLink from '../i18n/I18nLink';
-import { Customer } from '../types/data/Customer';
-import { Theme } from '../types/data/Theme';
-import { getValue } from '../utils/record';
-import GraphCMSAsset from './GraphCMSAsset';
+type Props = {};
-const fileLabel = 'components/Nav';
-
-const isActive = (router, path): boolean => {
- const currentPaths = router.pathname.split('/');
-
- return currentPaths[currentPaths.length - 1] === path;
-};
-
-const Nav: React.FunctionComponent = (props: Props) => {
- const {
- customer, theme, router, t,
- } = props;
-
- Sentry.addBreadcrumb({ // See https://docs.sentry.io/enriching-error-data/breadcrumbs
- category: fileLabel,
- message: `Rendering top nav bar (${isBrowser() ? 'browser' : 'server'})`,
- level: Sentry.Severity.Debug,
- });
-
- // Resolve service logo
- const serviceLogo = customer?.theme?.logo;
+const Nav: React.FunctionComponent = () => {
+ const { t } = useTranslation();
+ const router: NextRouter = useRouter();
+ const { theme }: CustomerContext = React.useContext(customerContext);
+ const { locale }: I18n = useI18n();
+ const { primaryColor, logo } = theme;
return (
- ({
- ...inheritedProps,
- page: {
- ...inheritedProps.page,
- name: 'index',
- },
- })}
- >
+
{({ logEvent }): JSX.Element => (
= (props: Props) => {
.nav-link {
&.active {
font-weight: bold;
- color: ${getValue(theme, 'primaryColor')} !important;
+ color: ${primaryColor} !important;
+ }
+ }
+
+ .dropdown {
+ padding-top: 8px;
+ padding-bottom: 8px;
+ cursor: pointer;
+
+ .dropdown-toggle {
+ &.active {
+ color: ${primaryColor};
+ }
+ }
+
+ .dropdown-item {
+ max-height: 30px;
}
}
+
+ .dropdown-header,
+ .dropdown-divider {
+ cursor: initial;
+ }
`}
>
- child
- href={'/'}
- >
-
-
+
-
{t('nav.indexPage.link', 'Accueil')}
-
+
-
-
+
+
{t('nav.examplesPage.link', 'Exemples')}
-
-
+
+
+ Native features
+ {/**/}
+ {/* */}
+ {/* Native features*/}
+ {/* */}
+ {/* */}
+
+
+ Built-in features
+ {
+ map(BUILT_IN_FEATURES_SIDEBAR_LINKS, (link: SidebarLink) => {
+ const { label, href } = link;
+ return (
+
+
+
+ {label}
+
+
+
+ );
+ })
+ }
+
+
+ Built-in utilities
+ {
+ map(BUILT_IN_UTILITIES_SIDEBAR_LINKS, (link: SidebarLink) => {
+ const { label, href } = link;
+ return (
+
+
+
+ {label}
+
+
+
+ );
+ })
+ }
+
+
@@ -209,7 +241,7 @@ const Nav: React.FunctionComponent = (props: Props) => {
href={`https://nrn-admin.now.sh`}
target={'_blank'}
rel={'noopener'}
- onClick={() => {
+ onClick={(): void => {
logEvent('open-admin-site');
}}
title={'Edit dynamic content using GraphCMS and react-admin!'}
@@ -227,13 +259,4 @@ const Nav: React.FunctionComponent = (props: Props) => {
);
};
-type Props = {
- customer: Customer;
- theme: Theme;
- t: Function;
- router: NextRouter;
-}
-
-export default compose(
- withTranslation(['common']),
-)(Nav);
+export default Nav;
diff --git a/src/components/rehydration/DisplayOnBrowserMount.tsx b/src/components/rehydration/DisplayOnBrowserMount.tsx
new file mode 100644
index 000000000..35c202146
--- /dev/null
+++ b/src/components/rehydration/DisplayOnBrowserMount.tsx
@@ -0,0 +1,82 @@
+import some from 'lodash.some';
+import React, { DependencyList, useState } from 'react';
+
+type Props = {
+ children: React.ReactNode;
+ deps?: DependencyList;
+};
+
+/**
+ * Utility component to properly handle expected differences between server and browser rendering.
+ * Helps to avoid "Text content did not match" warnings, during React rehydration.
+ *
+ * Optionally accepts a "deps" array of dependencies.
+ * It can be used to optimize behaviour to support both SSG/SSR universally with a different behaviour based on the rendering mode.
+ * If any deps is provided, then it'll check if any is null-ish (undefined/null)
+ * If so, it will render "null" and trigger a re-render, because in such case we consider the deps aren't fulfilled
+ * If all deps are defined, then we render the children directly because we consider we don't need to wait (optimisation, no unnecessary re-render)
+ *
+ * @example If you want to display a cookie's value universally:
+ * - If you use SSR, you'll have access to the cookie's value from the server and want to render it immediately
+ * - If you use SSG, you won't have access to the cookie's value until the browser renders the page, so you want to render "null" and then trigger a re-render to display the actual value
+ *
+ *
+ * XXX Use this helper to avoid rendering small UI (presentational) components that depend on browser-related data (e.g: localStorage, cookie, session-related data, etc.)
+ * Do not use this helper to avoid rendering big react Providers, or components who define big part of your UI layout
+ *
+ * When a React app rehydrates, it assumes that the DOM structure will match.
+ * When the React app runs on the client for the first time, it builds up a mental picture of what the DOM should look like, by mounting all of your components.
+ * Then it squints at the DOM nodes already on the page, and tries to fit the two together.
+ * It's not playing the “spot-the-differences” game it does during a typical update, it's just trying to snap the two together, so that future updates will be handled correctly.
+ *
+ * If you render something different depending on whether you're on server or browser, you're hacking the system.
+ * Because you're rendering one thing on the server, but then telling React to expect something else on the client.
+ * And this is what causes "Text content did not match" react warning.
+ *
+ * To avoid this situation, we use "useEffect", which only fires after the component has mounted.
+ * Inside the "useEffect" call, we immediately trigger a re-render, setting hasMounted to true. When this value is true, the "real" content gets rendered.
+ * When the React app adapts the DOM during rehydration, useEffect hasn't been called yet, and so we're meeting React's expectation.
+ *
+ * This process is named "Two pass rendering":
+ * The first pass, at compile-time, produces all of the static non-personal content, and leaves holes where the dynamic content will go.
+ * Then, after the React app has mounted on the user's device, a second pass stamps in all the dynamic bits that depend on client state.
+ * The downside to two-pass rendering is that it can waitFor time-to-interactive.
+ *
+ * @param props
+ * @see https://joshwcomeau.com/react/the-perils-of-rehydration/#abstractions Strongly inspired by "ClientOnly" abstraction
+ * @see https://joshwcomeau.com/react/the-perils-of-rehydration/#two-pass-rendering Two pass rendering and performances implications
+ * @see https://twitter.com/Vadorequest/status/1257658553361408002 Discussion with Josh regarding advanced usage
+ */
+const DisplayOnBrowserMount: React.FunctionComponent = (props) => {
+ const {
+ children,
+ deps = [],
+ } = props;
+ // If any dep isn't defined, then it will render "null" first, and then trigger a re-render
+ const isAnyDepsNullish = deps.length ?
+ // If any deps was provided, check if any is null-ish
+ some(deps, (dependency: any): boolean => {
+ return dependency === null || typeof dependency === 'undefined';
+ })
+ // If no dep is provided, then it should render "null" first anyway, and then trigger a re-render
+ : true;
+ const [hasMounted, setHasMounted] = useState(!isAnyDepsNullish);
+
+ React.useEffect(() => {
+ if (isAnyDepsNullish) {
+ setHasMounted(true);
+ }
+ }, [isAnyDepsNullish]);
+
+ if (!hasMounted) {
+ return null;
+ }
+
+ return (
+ <>
+ {children}
+ >
+ );
+};
+
+export default DisplayOnBrowserMount;
diff --git a/src/components/svg/AnimatedLoader.tsx b/src/components/svg/AnimatedLoader.tsx
index 9fa6241ae..c83a68f76 100644
--- a/src/components/svg/AnimatedLoader.tsx
+++ b/src/components/svg/AnimatedLoader.tsx
@@ -10,7 +10,7 @@ const AnimatedLoader = props => {
}}
{...props}
>
-
+
);
diff --git a/src/components/svg/EnglishFlag.tsx b/src/components/svg/EnglishFlag.tsx
index 20d95c460..e2adc7f1c 100644
--- a/src/components/svg/EnglishFlag.tsx
+++ b/src/components/svg/EnglishFlag.tsx
@@ -1,7 +1,7 @@
import { css } from '@emotion/core';
import React from 'react';
-const SvgEnglishFlag = props => {
+const EnglishFlag = props => {
return (
{
};
type Props = {} & React.SVGProps;
-export default SvgEnglishFlag;
+export default EnglishFlag;
diff --git a/src/components/svg/FrenchFlag.tsx b/src/components/svg/FrenchFlag.tsx
index 0e1dd276a..4e22b7b86 100644
--- a/src/components/svg/FrenchFlag.tsx
+++ b/src/components/svg/FrenchFlag.tsx
@@ -1,6 +1,6 @@
import React from 'react';
-const SvgFrenchFlag = props => {
+const FrenchFlag = props => {
return (
{
);
};
-export default SvgFrenchFlag;
+export default FrenchFlag;
diff --git a/src/components/utils/Cards.tsx b/src/components/utils/Cards.tsx
new file mode 100644
index 000000000..f3108ca97
--- /dev/null
+++ b/src/components/utils/Cards.tsx
@@ -0,0 +1,63 @@
+/** @jsx jsx */
+import { css, jsx } from '@emotion/core';
+import React, { ReactNode } from 'react';
+import { CardDeck } from 'reactstrap';
+import classnames from 'classnames';
+
+type Props = {
+ children: ReactNode;
+ maxCards?: number; // Max cards per row
+}
+
+/**
+ * Wrapper for Reactstrap component, to display cards as a Deck and apply common styling on all cards
+ *
+ * @param props
+ */
+const Cards: React.FunctionComponent = (props): JSX.Element => {
+ const { children, maxCards = 3 } = props;
+
+ return (
+
+ {children}
+
+ );
+};
+
+export default Cards;
diff --git a/src/components/utils/Code.tsx b/src/components/utils/Code.tsx
new file mode 100644
index 000000000..fa3c6507f
--- /dev/null
+++ b/src/components/utils/Code.tsx
@@ -0,0 +1,37 @@
+/** @jsx jsx */
+import { jsx } from '@emotion/core';
+import React from 'react';
+import { CodeBlock, dracula } from 'react-code-blocks';
+
+type Props = {
+ codeBlockStyle?: object;
+ text: string;
+}
+
+const defaultCodeBlockStyle = {
+ textAlign: 'left',
+};
+
+/**
+ * Documentation page
+ *
+ * Basically wraps the children in a white container
+ *
+ * @param props
+ */
+const Code: React.FunctionComponent = (props): JSX.Element => {
+ const { codeBlockStyle, text } = props;
+
+ return (
+
+ );
+};
+
+export default Code;
diff --git a/src/components/utils/ExternalLink.tsx b/src/components/utils/ExternalLink.tsx
new file mode 100644
index 000000000..e6e9063ac
--- /dev/null
+++ b/src/components/utils/ExternalLink.tsx
@@ -0,0 +1,47 @@
+/** @jsx jsx */
+import { jsx } from '@emotion/core';
+import React from 'react';
+
+type Props = {
+ children: React.ReactNode;
+ className?: string;
+ href: string;
+ id?: string;
+ nofollow?: boolean;
+ noreferrer?: boolean;
+ onClick?: (any) => void;
+ prefix?: string;
+ suffix?: string;
+}
+
+/**
+ * Link that point to an external website
+ *
+ * Use sane default for proper SEO (noreferrer disabled by default), security (nofollow enabled by default) and display (prefix/suffix)
+ *
+ * @param props
+ */
+const ExternalLink: React.FunctionComponent = (props): JSX.Element => {
+ const {
+ children,
+ href,
+ nofollow = true,
+ noreferrer = false,
+ prefix = ' ', // Helper to avoid link to "stick" with text
+ suffix = ' ', // Helper to avoid link to "stick" with text
+ ...rest
+ } = props;
+
+ return (
+
+ {prefix}{children}{suffix}
+
+ );
+};
+
+export default ExternalLink;
diff --git a/src/components/utils/Text.tsx b/src/components/utils/Text.tsx
new file mode 100644
index 000000000..dff154f45
--- /dev/null
+++ b/src/components/utils/Text.tsx
@@ -0,0 +1,38 @@
+import React from 'react';
+
+type Props = {
+ children: string;
+ tag?: string | React.ReactType;
+}
+
+/**
+ * Automatically break lines for text
+ * Allow usage of HTML (but not React components)
+ *
+ * Avoids relying on for every line break
+ *
+ * @example
+ *
+ * {`
+ * First line
+ *
+ * Another line, which will respect line break
+ * `}
+ *
+ *
+ * @param props
+ */
+export const Text: React.FunctionComponent = (props) => {
+ const { children, tag: Wrapper = 'div' } = props;
+
+ return (
+
+ );
+};
+
+export default Text;
diff --git a/src/components/Tooltip.tsx b/src/components/utils/Tooltip.tsx
similarity index 77%
rename from src/components/Tooltip.tsx
rename to src/components/utils/Tooltip.tsx
index 65cf78fc6..8570d02b1 100644
--- a/src/components/Tooltip.tsx
+++ b/src/components/utils/Tooltip.tsx
@@ -3,6 +3,14 @@ import { jsx } from '@emotion/core';
import RCTooltip from 'rc-tooltip';
import React from 'react';
+type Props = {
+ children: React.ReactElement;
+ overlay: React.ReactElement;
+ trigger?: Array;
+ placement?: string;
+ visible?: boolean;
+}
+
/**
* Tooltip with sane defaults that improve usability and accessibility.
*
@@ -10,9 +18,8 @@ import React from 'react';
* XXX Feel free to add more API options, I've only added what seemed necessary but they support plenty more!
*
* @param {Props} props
- * @return {JSX.Element}
*/
-const Tooltip: React.FunctionComponent = (props: Props): JSX.Element => {
+const Tooltip: React.FunctionComponent = (props): JSX.Element => {
const {
children,
overlay,
@@ -23,8 +30,7 @@ const Tooltip: React.FunctionComponent = (props: Props): JSX.Element => {
return (
= (props: Props): JSX.Element => {
);
};
-type Props = {
- children: React.ReactElement;
- overlay: React.ReactElement;
- trigger?: Array;
- placement?: string;
- visible?: boolean;
-}
-
export default Tooltip;
diff --git a/src/gql/fragments/product.ts b/src/gql/fragments/product.ts
index 977cd2269..00eb74899 100644
--- a/src/gql/fragments/product.ts
+++ b/src/gql/fragments/product.ts
@@ -7,6 +7,7 @@ export const product = {
productFields: gql`
fragment productFields on Product {
id
+ status
title
description
images {
diff --git a/src/gql/pages/examples.ts b/src/gql/pages/examples.ts
deleted file mode 100644
index 8dad2dfe9..000000000
--- a/src/gql/pages/examples.ts
+++ /dev/null
@@ -1,24 +0,0 @@
-import gql from 'graphql-tag';
-
-import { asset } from '../fragments/asset';
-import { product } from '../fragments/product';
-import { theme } from '../fragments/theme';
-
-/**
- * Used for /examples page
- */
-export const EXAMPLES_PAGE_QUERY = gql`
- query INDEX_PAGE_QUERY($customerRef: String!){
- products(where: {
- status: PUBLISHED
- customer: {
- ref: $customerRef
- }
- }){
- ...productFields
- }
- }
- ${theme.themeFields}
- ${asset.assetFields}
- ${product.productFields}
-`;
diff --git a/src/gql/pages/examples/native-features/example-with-ssg.ts b/src/gql/pages/examples/native-features/example-with-ssg.ts
new file mode 100644
index 000000000..281b7b252
--- /dev/null
+++ b/src/gql/pages/examples/native-features/example-with-ssg.ts
@@ -0,0 +1,18 @@
+import gql from 'graphql-tag';
+import { product } from '../../../fragments/product';
+
+/**
+ * Used by /src/pages/[locale]/examples/native-features/example-with-ssg page
+ */
+export const EXAMPLE_WITH_SSG_QUERY = gql`
+ query EXAMPLE_WITH_SSG_QUERY($customerRef: String!){
+ products(where: {
+ customer: {
+ ref: $customerRef
+ }
+ }){
+ ...productFields
+ }
+ }
+ ${product.productFields}
+`;
diff --git a/src/gql/pages/examples/native-features/example-with-ssr.ts b/src/gql/pages/examples/native-features/example-with-ssr.ts
new file mode 100644
index 000000000..f3d700ddc
--- /dev/null
+++ b/src/gql/pages/examples/native-features/example-with-ssr.ts
@@ -0,0 +1,34 @@
+import gql from 'graphql-tag';
+
+import { asset } from '../../../fragments/asset';
+import { product } from '../../../fragments/product';
+import { theme } from '../../../fragments/theme';
+
+/**
+ * Used by /src/pages/[locale]/examples/native-features/example-with-ssr page
+ */
+export const EXAMPLE_WITH_SSR_QUERY = gql`
+ query EXAMPLE_WITH_SSR_QUERY($customerRef: String!){
+ customer(where: {
+ ref: $customerRef,
+ }){
+ id
+ label
+ theme {
+ ...themeFields
+ }
+ }
+ products(where: {
+ customer: {
+ ref: $customerRef
+ }
+ }
+ orderBy: status_DESC
+ ){
+ ...productFields
+ }
+ }
+ ${theme.themeFields}
+ ${asset.assetFields}
+ ${product.productFields}
+`;
diff --git a/src/gql/pages/terms.ts b/src/gql/pages/terms.ts
index 1b0488c51..3b8cf6d00 100644
--- a/src/gql/pages/terms.ts
+++ b/src/gql/pages/terms.ts
@@ -1,10 +1,7 @@
import gql from 'graphql-tag';
-import { asset } from '../fragments/asset';
-import { theme } from '../fragments/theme';
-
/**
- * Used for /terms page
+ * Used by /src/pages/[locale]/terms page
*/
export const TERMS_PAGE_QUERY = gql`
query TERMS_PAGE_QUERY($customerRef: String!){
@@ -18,5 +15,4 @@ export const TERMS_PAGE_QUERY = gql`
}
}
}
- ${theme.themeFields}
`;
diff --git a/src/hoc/withUniversalGraphQLDataLoader.ts b/src/hoc/withUniversalGraphQLDataLoader.ts
deleted file mode 100644
index 13d9dc3ec..000000000
--- a/src/hoc/withUniversalGraphQLDataLoader.ts
+++ /dev/null
@@ -1,41 +0,0 @@
-import { getDataFromTree } from '@apollo/react-ssr';
-import { InMemoryCache, NormalizedCacheObject } from 'apollo-cache-inmemory';
-import { ApolloClient } from 'apollo-client';
-import { createHttpLink } from 'apollo-link-http';
-import fetch from 'isomorphic-unfetch';
-import withApollo, { InitApolloOptions } from 'next-with-apollo';
-
-// XXX This config is used on the FRONTEND (from the browser) or on the BACKEND (server), depending on whether it's loaded from SSR or client-side
-const link = createHttpLink({
- fetch, // Switches between unfetch & node-fetch for client & server.
- uri: process.env.GRAPHQL_API_ENDPOINT,
-
- // Headers applied here will be applied for all requests
- // See the use of the "options" when running a graphQL query to specify options per-request at https://www.apollographql.com/docs/react/api/react-hooks/#options
- headers: {
- 'gcms-locale-no-default': false,
- 'authorization': `Bearer ${process.env.GRAPHQL_API_KEY}`,
- },
- credentials: 'same-origin', // XXX See https://www.apollographql.com/docs/react/recipes/authentication#cookie
-});
-
-/**
- * Export a HOC from next-with-apollo
- *
- * Universal, works both on client and server sides
- * Doesn't fetch any data by itself, but provides a client that allows to do it in children components
- *
- * @see https://www.npmjs.com/package/next-with-apollo
- */
-export default withApollo(
- ({ initialState }: InitApolloOptions) =>
- new ApolloClient({
- link: link,
-
- // XXX Very important to provide the initialState, otherwise the client will replay the query upon loading,
- // which is useless as the data were already fetched by the server (SSR)
- cache: new InMemoryCache().restore(initialState || {}), // rehydrate the cache using the initial data passed from the server
- }), {
- getDataFromTree,
- },
-);
diff --git a/src/hocs/withApollo.tsx b/src/hocs/withApollo.tsx
new file mode 100644
index 000000000..441afa5c4
--- /dev/null
+++ b/src/hocs/withApollo.tsx
@@ -0,0 +1,209 @@
+import { ApolloProvider } from '@apollo/react-hooks';
+import { NormalizedCacheObject } from 'apollo-cache-inmemory';
+import ApolloClient from 'apollo-client';
+import { NextPageContext } from 'next';
+import { WithApolloState } from 'next-with-apollo/lib/types';
+import App from 'next/app';
+import Head from 'next/head';
+import React, { ReactNode } from 'react';
+import createApolloClient from '../utils/gql/graphql';
+
+// XXX Inspired by https://github.com/zeit/next.js/blob/canary/examples/with-apollo/lib/apollo.js
+// On the client, we store the Apollo Client in the following variable.
+// This prevents the client from reinitializing between page transitions.
+let globalApolloClient: ApolloClient = null;
+
+type initOnContextProps = {
+ ctx: NextPageContext;
+ apolloClient?: ApolloClient;
+ apolloState?: WithApolloState;
+};
+
+/**
+ * Options of the withApollo HOC
+ */
+type withApolloOptions = {
+ useGetInitialProps?: boolean; // If set to true, will inject "getInitialProps" into the page and will use SSR mode
+}
+
+/**
+ * Injected by HOC "withApollo" into the page
+ */
+type PageProps = {
+ apolloState?: WithApolloState;
+ apolloClient?: ApolloClient;
+ isReadyToRender: boolean;
+};
+
+/**
+ * Installs the Apollo Client on NextPageContext or NextAppContext.
+ * Useful if you want to use apolloClient inside getStaticProps, getStaticPaths or getServerSideProps
+ *
+ * @param {NextPageContext | NextAppContext} ctx
+ */
+export const initOnContext = (ctx: initOnContextProps) => {
+ const inAppContext = Boolean(ctx.ctx);
+
+ // We consider installing `withApollo({ useGetInitialProps: true })` on global App level
+ // as antipattern since it disables project wide Automatic Static Optimization.
+ if (process.env.NODE_ENV === 'development') {
+ if (inAppContext) {
+ console.warn(
+ 'Warning: You have opted-out of Automatic Static Optimization due to `withApollo` in `pages/_app`.\n' +
+ 'Read more: https://err.sh/next.js/opt-out-auto-static-optimization\n',
+ );
+ }
+ }
+
+ // Initialize ApolloClient if not already done
+ const apolloClient = ctx.apolloClient || initApolloClient(ctx.apolloState || {}, inAppContext ? ctx.ctx : ctx as unknown as NextPageContext);
+
+ // We send the Apollo Client as a prop to the component to avoid calling initApollo() twice in the server.
+ // Otherwise, the component would have to call initApollo() again but this
+ // time without the context. Once that happens, the following code will make sure we send
+ // the prop as `null` to the browser.
+ // @ts-ignore XXX Ignored because it crashed when upgrading TypeScript from 3.8.3 to 3.9.2 (TODO is this method undefined and it wasn't detected before?)
+ apolloClient.toJSON = (): void => null;
+
+ // Add apolloClient to NextPageContext & NextAppContext.
+ // This allows us to consume the apolloClient inside our
+ // custom `getInitialProps({ apolloClient })`.
+ ctx.apolloClient = apolloClient;
+ if (inAppContext) {
+ // @ts-ignore
+ ctx.ctx.apolloClient = apolloClient;
+ }
+
+ return ctx;
+};
+
+/**
+ * Always creates a new apollo client on the server
+ * Creates or reuses apollo client in the browser.
+ * @param {NormalizedCacheObject} initialState
+ * @param {NextPageContext} ctx
+ */
+const initApolloClient = (initialState, ctx: NextPageContext): ApolloClient => {
+ // Make sure to create a new client for every server-side request so that data
+ // isn't shared between connections (which would be bad)
+ if (typeof window === 'undefined') {
+ return createApolloClient(initialState, ctx);
+ }
+
+ // Reuse client on the client-side
+ if (!globalApolloClient) {
+ globalApolloClient = createApolloClient(initialState, ctx);
+ }
+
+ return globalApolloClient;
+};
+
+/**
+ * Creates a withApollo HOC that provides the apolloContext to a next.js Page or AppTree.
+ *
+ * @param {Object} withApolloOptions
+ * @param {Boolean} [withApolloOptions.useGetInitialProps=false]
+ * @returns {(PageComponent: ReactNode) => ReactNode}
+ */
+export const withApollo = ({ useGetInitialProps = false }: withApolloOptions = {}) => (PageComponent) => {
+ const WithApollo = ({ apolloClient, apolloState, ...pageProps }: PageProps): ReactNode => {
+ let client: ApolloClient;
+ if (apolloClient) {
+ // Happens on: getDataFromTree & next.js ssr
+ client = apolloClient;
+ } else {
+ // Happens on: next.js csr
+ client = initApolloClient(apolloState, undefined);
+ }
+
+ return (
+
+
+
+ );
+ };
+
+ // Set the correct displayName in development
+ if (process.env.NODE_ENV !== 'production') {
+ const displayName =
+ PageComponent.displayName || PageComponent.name || 'Component';
+ WithApollo.displayName = `withApollo(${displayName})`;
+ }
+
+ // If we specifically want to use getInitialProps, or if the component already uses it
+ if (useGetInitialProps || PageComponent.getInitialProps) {
+ WithApollo.getInitialProps = async (ctx): Promise | null => {
+ const inAppContext = Boolean(ctx.ctx);
+ const { apolloClient } = initOnContext(ctx);
+
+ // Run wrapped getInitialProps methods
+ let pageProps = {};
+ if (PageComponent.getInitialProps) {
+ pageProps = await PageComponent.getInitialProps(ctx);
+ } else if (inAppContext) {
+ pageProps = await App.getInitialProps(ctx);
+ }
+
+ // Only on the server:
+ if (typeof window === 'undefined') {
+ const { AppTree } = ctx;
+ // When redirecting, the response is finished.
+ // No point in continuing to render
+ if (ctx.res && ctx.res.finished) {
+ return {
+ ...pageProps,
+ isReadyToRender: true,
+ };
+ }
+
+ // Only if dataFromTree is enabled
+ if (useGetInitialProps && AppTree) {
+ try {
+ // Import `@apollo/react-ssr` dynamically.
+ // We don't want to have this in our client bundle.
+ const { getDataFromTree } = await import('@apollo/react-ssr');
+
+ // Since AppComponents and PageComponents have different context types
+ // we need to modify their props a little.
+ let props;
+ if (inAppContext) {
+ props = { ...pageProps, apolloClient };
+ } else {
+ props = { pageProps: { ...pageProps, apolloClient } };
+ }
+
+ // Take the Next.js AppTree, determine which queries are needed to render,
+ // and fetch them. This method can be pretty slow since it renders
+ // your entire AppTree once for every query. Check out apollo fragments
+ // if you want to reduce the number of rerenders.
+ // https://www.apollographql.com/docs/react/data/fragments/
+ await getDataFromTree( );
+ } catch (error) {
+ // Prevent Apollo Client GraphQL errors from crashing SSR.
+ // Handle them in components via the data.error prop:
+ // https://www.apollographql.com/docs/react/api/react-apollo.html#graphql-query-data-error
+ console.error('Error while running `getDataFromTree`', error);
+ }
+
+ // getDataFromTree does not call componentWillUnmount
+ // head side effect therefore need to be cleared manually
+ Head.rewind();
+ }
+ }
+
+ return {
+ ...pageProps,
+ // Extract query data from the Apollo store
+ apolloState: apolloClient.cache.extract(),
+ // Provide the client for ssr. As soon as this payload
+ // gets JSON.stringified it will remove itself.
+ apolloClient: ctx.apolloClient,
+ isReadyToRender: true,
+ };
+ };
+ }
+
+ return WithApollo;
+};
+
+export default withApollo;
diff --git a/src/hocs/withHOCTemplate.tsx b/src/hocs/withHOCTemplate.tsx
new file mode 100644
index 000000000..0f923b820
--- /dev/null
+++ b/src/hocs/withHOCTemplate.tsx
@@ -0,0 +1,39 @@
+import React from 'react';
+import { wrapDisplayName } from 'recompose';
+
+// Props you want the resulting component to take (besides the props of the wrapped component)
+type ExternalProps = {}
+
+// Props the HOC adds to the wrapped component
+export type InjectedProps = {}
+
+// Options for the HOC factory that are not dependent on props values
+type Options = {}
+
+/**
+ * HOC template meant to be duplicated to build your custom HOC
+ * Use this as a utility to save yourself some time
+ *
+ * @see Inspired from https://gist.github.com/rosskevin/6c103846237ecbc77862ea0f3218187d
+ */
+const withHOCTemplate = ({}: Options = {}) => (
+ WrappedComponent: React.ComponentType,
+): React.ComponentClass => {
+ class WithHOCTemplate extends React.Component {
+ render(): JSX.Element {
+ console.log('WithHOCTemplate props', this.props);
+
+ return (
+
+ );
+ }
+ }
+
+ if (process.env.NODE_ENV !== 'production') {
+ (WithHOCTemplate as any).displayName = wrapDisplayName(WrappedComponent, 'withoutNoisySSG');
+ }
+
+ return WithHOCTemplate;
+};
+
+export default withHOCTemplate;
diff --git a/src/hooks/useHasMounted.tsx b/src/hooks/useHasMounted.tsx
new file mode 100644
index 000000000..2f7696643
--- /dev/null
+++ b/src/hooks/useHasMounted.tsx
@@ -0,0 +1,21 @@
+import React, { useState } from 'react';
+
+/**
+ * Utility hook to properly handle expected differences between server and browser rendering.
+ * Helps to avoid "Text content did not match" warnings, during React rehydration.
+ *
+ * Similar to "DisplayOnBrowserMount" component, but as a hook.
+ *
+ * @see https://joshwcomeau.com/react/the-perils-of-rehydration/#abstractions Strongly inspired from useHasMounted
+ */
+const useHasMounted = (): boolean => {
+ const [hasMounted, setHasMounted] = useState(false);
+
+ React.useEffect(() => {
+ setHasMounted(true);
+ }, []);
+
+ return hasMounted;
+};
+
+export default useHasMounted;
diff --git a/src/hooks/useI18n.tsx b/src/hooks/useI18n.tsx
new file mode 100644
index 000000000..f4d255b05
--- /dev/null
+++ b/src/hooks/useI18n.tsx
@@ -0,0 +1,20 @@
+import React from 'react';
+import i18nContext, { I18nContext } from '../stores/i18nContext';
+
+export type I18n = I18nContext
+
+/**
+ * Hook to access i18n/localisation data
+ *
+ * Uses i18nContext internally (provides an identical API)
+ *
+ * This hook should be used by components in favor of i18nContext directly,
+ * because it grants higher flexibility if you ever need to change the implementation (e.g: use something else than React.Context, like Redux/MobX)
+ *
+ * @see https://slides.com/djanoskova/react-context-api-create-a-reusable-snackbar#/11
+ */
+const useI18n = (): I18n => {
+ return React.useContext(i18nContext);
+};
+
+export default useI18n;
diff --git a/src/hooks/useUserSession.tsx b/src/hooks/useUserSession.tsx
new file mode 100644
index 000000000..734fb7115
--- /dev/null
+++ b/src/hooks/useUserSession.tsx
@@ -0,0 +1,20 @@
+import React from 'react';
+import userSessionContext, { UserSessionContext } from '../stores/userSessionContext';
+
+export type UserSession = UserSessionContext
+
+/**
+ * Hook to access the user session data
+ *
+ * Uses userSessionContext internally (provides an identical API)
+ *
+ * This hook should be used by components in favor of userSessionContext directly,
+ * because it grants higher flexibility if you ever need to change the implementation (e.g: use something else than React.Context, like Redux/MobX)
+ *
+ * @see https://slides.com/djanoskova/react-context-api-create-a-reusable-snackbar#/11
+ */
+const useUserSession = (): UserSession => {
+ return React.useContext(userSessionContext);
+};
+
+export default useUserSession;
diff --git a/src/i18nConfig.js b/src/i18nConfig.js
new file mode 100644
index 000000000..14a5e7058
--- /dev/null
+++ b/src/i18nConfig.js
@@ -0,0 +1,21 @@
+/*
+ XXX This file is loaded by "next.config.js" and cannot contain ES6+ code (import, etc.)
+ Note that any change should/must be followed by a server restart, because it's used in "next.config.js"
+ */
+
+const defaultLocale = 'en';
+const supportedLocales = [
+ { name: 'fr-FR', lang: 'fr' },
+ { name: 'fr', lang: 'fr' },
+ { name: 'en-US', lang: 'en' },
+ { name: 'en', lang: 'en' },
+];
+const supportedLanguages = supportedLocales.map((item) => {
+ return item.lang;
+});
+
+module.exports = {
+ defaultLocale: defaultLocale,
+ supportedLocales: supportedLocales,
+ supportedLanguages: [...new Set(supportedLanguages)], // Remove duplicates
+};
diff --git a/src/middlewares/localeMiddleware.ts b/src/middlewares/localeMiddleware.ts
new file mode 100644
index 000000000..5010651dd
--- /dev/null
+++ b/src/middlewares/localeMiddleware.ts
@@ -0,0 +1,67 @@
+import { createLogger } from '@unly/utils-simple-logger';
+import { supportedLocales } from '../i18nConfig';
+import { acceptLanguageHeaderLookup, DEFAULT_LOCALE } from '../utils/i18n/i18n';
+import redirect from '../utils/app/redirect';
+
+const fileLabel = 'utils/localeMiddleware';
+const logger = createLogger({ // eslint-disable-line no-unused-vars,@typescript-eslint/no-unused-vars
+ label: fileLabel,
+});
+
+/**
+ * Detects the browser locale and redirects to the requested page
+ * Only used when the locale isn't specified in the url (called through /api/autoRedirectToLocalisedPage)
+ *
+ * @example / => /fr
+ * @example /terms => /fr/terms
+ *
+ * @param req
+ * @param res
+ */
+export const localeMiddleware = (req, res): void => {
+ logger.debug('Detecting browser locale...');
+ const detections: string[] = acceptLanguageHeaderLookup(req) || [];
+ let localeFound; // Will contain the most preferred browser locale (e.g: fr-FR, fr, en-US, en, etc.)
+
+ if (detections && detections.length) {
+ detections.forEach((language) => {
+ if (localeFound || typeof language !== 'string') return;
+
+ const lookedUpLocale = supportedLocales.find(
+ (allowedLocale) => allowedLocale.name === language,
+ );
+
+ if (lookedUpLocale) {
+ localeFound = lookedUpLocale.lang;
+ }
+ });
+
+ logger.debug(`Locale resolved using browser headers: "${localeFound}", with browser locales: [${detections.join(', ')}]`);
+ } else {
+ logger.debug(`Couldn't detect any locales in "accept-language" header. (This will happens with robots, e.g: Cypress E2E)`);
+ }
+
+ if (!localeFound) {
+ localeFound = DEFAULT_LOCALE;
+ }
+
+ logger.debug(`Locale applied: "${localeFound}", for url "${req.url}"`);
+
+ const redirectStatusCode = 302;
+ let redirectTo: string;
+
+ if (req.url === '/' || req.url === '/api/autoRedirectToLocalisedPage') {
+ redirectTo = `/${localeFound}`;
+ } else if (req.url.charAt(0) === '/' && req.url.charAt(1) === '?') {
+ // XXX Other routes (e.g: "/fr/terms?utm=source", "/terms?utm=source") are properly handled (they don't need custom routing/rewrites)
+ redirectTo = `/${localeFound}${req.url.slice(1)}`;
+ } else {
+ redirectTo = `/${localeFound}${req.url}`;
+ }
+
+ logger.debug(`Redirecting to "${redirectTo}" ...`);
+
+ return redirect(res, redirectStatusCode, redirectTo);
+};
+
+export default localeMiddleware;
diff --git a/src/mocks/songs.ts b/src/mocks/songs.ts
new file mode 100644
index 000000000..ac11e1ea0
--- /dev/null
+++ b/src/mocks/songs.ts
@@ -0,0 +1,2232 @@
+// Cleaned from https://github.com/fivethirtyeight/data/blob/master/classic-rock/classic-rock-song-list.csv
+export default [
+ 'Caught Up in You',
+ 'Fantasy Girl',
+ 'Hold On Loosely',
+ 'Rockin\' Into the Night',
+ 'Art For Arts Sake',
+ 'Kryptonite',
+ 'Loser',
+ 'When I\'m Gone',
+ 'What\'s Up?',
+ 'Take On Me',
+ 'Baby, Please Don\'t Go',
+ 'Back In Black',
+ 'Big Gun',
+ 'CAN\'T STOP ROCK\'N\'ROLL',
+ 'Dirty Deeds Done Dirt Cheap',
+ 'For Those About To Rock',
+ 'Girls Got Rhythm',
+ 'Hard As A Rock',
+ 'Have a Drink On Me',
+ 'Hells Bells',
+ 'Highway To Hell',
+ 'It\'s A Long Way To The Top',
+ 'Jailbreak',
+ 'Let There Be Rock',
+ 'Let\'s Get It Up',
+ 'Live Wire',
+ 'Moneytalks',
+ 'Night Prowler',
+ 'Rock and Roll Ain\'t Noise Pollution',
+ 'Shoot To Thrill',
+ 'Shot Down In Flames',
+ 'Sin City',
+ 'T.N.T.',
+ 'Thunderstruck',
+ 'Touch Too Much',
+ 'What Do You Do For Money Honey',
+ 'Who Made Who',
+ 'Whole Lotta Rosie',
+ 'You Shook Me All Night Long',
+ 'How Long',
+ 'Dog On A Leash',
+ 'Angel',
+ 'Baby, Please Don\'t Go',
+ 'Back in the Saddle',
+ 'Big Ten Inch',
+ 'Come Together',
+ 'Crazy',
+ 'Cryin\'',
+ 'Draw The Line',
+ 'Dream On',
+ 'Dude (Looks Like a Lady)',
+ 'Jaded',
+ 'Janie\'s Got A Gun',
+ 'Kings and Queens',
+ 'Last Child',
+ 'Let the Music Do the Talking',
+ 'Livin\' On The Edge',
+ 'Love In An Elevator',
+ 'Mama Kin',
+ 'No More No More',
+ 'One Way Street',
+ 'Pink',
+ 'Rag Doll',
+ 'Same Old Song and Dance',
+ 'Seasons of Wither',
+ 'Sweet Emotion',
+ 'The Other Side',
+ 'Toys in the Attic',
+ 'Train Kept A-Rollin\'',
+ 'Walk This Way',
+ 'What It Takes',
+ 'You See Me Crying',
+ 'Hand In My Pocket',
+ 'You Oughta Know',
+ 'Black Velvet',
+ 'Fantasy',
+ 'BE MY LOVER',
+ 'Billion Dollar Babies',
+ 'Eighteen',
+ 'Elected',
+ 'House Of Fire',
+ 'I\'m Eighteen',
+ 'No More Mr. Nice Guy',
+ 'School\'s Out',
+ 'Under My Wheels',
+ 'Welcome To My Nightmare',
+ 'Down in a Hole',
+ 'Man In The Box',
+ 'No Excuses',
+ 'Rooster',
+ 'Them Bones',
+ 'Would?',
+ 'Ain\'t Wastin\' Time No More',
+ 'Blue Sky',
+ 'Good Clean Fun',
+ 'In Memory Of Elizabeth Reed',
+ 'Jessica',
+ 'Melissa',
+ 'Midnight Rider',
+ 'No One to Run With',
+ 'One Way Out',
+ 'Ramblin\' Man',
+ 'Southbound',
+ 'Statesboro Blues',
+ 'Whippin\' Post',
+ 'A Horse With No Name',
+ 'Sister Golden Hair',
+ 'Ventura Highway',
+ 'Don\'t Bring Me Down',
+ 'Don\'t Let Me Be Misunderstood',
+ 'Immigrant Song',
+ 'Roller',
+ 'Hold Your Head Up',
+ 'Coming into Los Angeles',
+ 'Wayside',
+ 'Heat of the Moment',
+ 'Only Time Will Tell',
+ 'So Into You',
+ 'Spooky',
+ 'Like a Stone',
+ 'Blondes In Black Cars',
+ 'Turn Up the Radio',
+ 'Rock And Roll Party In The Streets',
+ 'Let It Ride',
+ 'Roll On Down The Highway',
+ 'Takin\' Care Of Business',
+ 'You Ain\'t Seen Nothin\' Yet',
+ 'Bad Company',
+ 'Burnin\' Sky',
+ 'Can\'t Get Enough',
+ 'Feel Like Makin\' Love',
+ 'Gone Gone Gone',
+ 'Good Lovin\' Gone Bad',
+ 'Movin\' On',
+ 'Ready For Love',
+ 'Rock \'n\' Roll Fantasy',
+ 'Rock Steady',
+ 'Run With The Pack',
+ 'Seagull',
+ 'Shooting Star',
+ 'Silver, Blue And Gold',
+ 'When I See You Smile',
+ 'No Matter What',
+ 'Walks Like A Woman',
+ '(You Gotta) Fight for Your Right (To Party)',
+ 'No Sleep Till Brooklyn',
+ 'Loser',
+ 'In a Big Country',
+ 'Rock Around the Clock',
+ 'AIN\'T NO SUNSHINE',
+ 'Cradle of Love',
+ 'Dancing With Myself',
+ 'Eyes Without a Face',
+ 'Mony Mony',
+ 'Rebel Yell',
+ 'White Wedding',
+ 'Allentown',
+ 'Big Shot',
+ 'Captain Jack',
+ 'Don\'t Ask Me Why',
+ 'Goodnight Saigon',
+ 'It\'s Still Rock And Roll To Me',
+ 'Miami 2017 {seen The Lights Go Out On Broadway} (live 1',
+ 'Movin\' Out (Anthony\'s Song)',
+ 'My Life',
+ 'New York State Of Mind',
+ 'Only The Good Die Young',
+ 'Piano Man',
+ 'Prelude/angry Young Man',
+ 'Scenes From An Italian Restaurant',
+ 'SHE\'S ALWAYS A WOMAN',
+ 'Sometimes A Fantasy',
+ 'The Ballad Of Billy The Kid',
+ 'The Stranger',
+ 'You May Be Right',
+ 'Baby Come Back',
+ 'Everybody Wants You',
+ 'In the Dark',
+ 'Lonely Is the Night',
+ 'My Kinda Lover',
+ 'Rock Me Tonight',
+ 'She\'s a Runner',
+ 'The Stroke',
+ 'Children Of The Sun',
+ 'Fairies Wear Boots',
+ 'Heaven and Hell',
+ 'Iron Man',
+ 'N.i.b.',
+ 'Neon Knights',
+ 'Paranoid',
+ 'Sweet Leaf',
+ 'The Wizard',
+ 'War Pigs',
+ 'Highway Song',
+ 'Train, Train',
+ 'Can\'t Find My Way Home',
+ 'Presence of the Lord',
+ 'No Rain',
+ 'Presence of the Lord',
+ 'All the Small Things',
+ 'Call Me',
+ 'Heart of Glass',
+ 'One Way Or Another',
+ '(Don\'t Fear) The Reaper',
+ 'Bucks Boogie',
+ 'Burnin\' for You',
+ 'Godzilla',
+ 'I Love the Night',
+ 'Summertime Blues',
+ 'Song 2',
+ 'Just Like A Woman',
+ 'Knockin\' On Heaven\'s Door',
+ 'Like a Rolling Stone',
+ 'Positively 4th Street',
+ 'Subterranean Homesick Blues',
+ 'Tangled Up In Blue',
+ 'Exodus',
+ 'Jamming',
+ 'No Woman, No Cry',
+ 'One Love',
+ 'Stir It Up',
+ 'Three Little Birds',
+ 'Against The Wind',
+ 'Betty Lou\'s Gettin\' Out Tonigh',
+ 'Come to Poppa',
+ 'Feel Like a Number',
+ 'Fire Down Below',
+ 'Get Out of Denver',
+ 'Her Strut',
+ 'Hollywood Nights',
+ 'Horizontal Bop',
+ 'Katmandu',
+ 'Mainstreet',
+ 'Night Moves',
+ 'Old Time Rock & Roll',
+ 'Ramblin\' Gamblin\' Man',
+ 'Rock And Roll Never Forgets',
+ 'Roll Me Away',
+ 'Still the Same',
+ 'Sunspot Baby',
+ 'The Fire Down Below',
+ 'Travelin\' Man',
+ 'Turn On Your Love Light',
+ 'Turn The Page',
+ 'We\'ve Got Tonite',
+ 'You\'ll Accompany Me',
+ 'Hypnotized',
+ 'Bad Medicine',
+ 'Blaze of Glory',
+ 'Born To Be My Baby',
+ 'Lay Your Hands On Me',
+ 'Livin\' On A Prayer',
+ 'Raise Your Hands',
+ 'Runaway',
+ 'She Don\'t Know Me',
+ 'Wanted Dead or Alive',
+ 'You Give Love A Bad Name',
+ 'Wait For You',
+ 'Green Onions',
+ 'A Man I\'ll Never Be',
+ 'Amanda',
+ 'Cool The Engines',
+ 'Don\'t Look Back',
+ 'Feelin\' Satisfied',
+ 'Foreplay (Long Time)',
+ 'Hitch A Ride',
+ 'Let Me Take You Home Tonight',
+ 'More Than a Feeling',
+ 'Party',
+ 'Peace of Mind',
+ 'Rock & Roll Band',
+ 'Smokin\'',
+ 'Something About You',
+ 'The Journey/It\'s Easy',
+ 'Used To Bad News',
+ 'We\'re Ready',
+ 'Lido Shuffle',
+ 'Lowdown',
+ 'Tarkio Road',
+ 'The Way It Is',
+ 'Atlantic City',
+ 'Backstreets',
+ 'Badlands',
+ 'Blinded By the Light',
+ 'Born In the U.S.A.',
+ 'Born To Run',
+ 'Cover Me',
+ 'Dancing In the Dark',
+ 'Glory Days',
+ 'Growin\' Up',
+ 'Hungry Heart',
+ 'I\'m On Fire',
+ 'It\'s Hard to Be a Saint in the City',
+ 'Jersey Girl',
+ 'Jungleland',
+ 'Pink Cadillac',
+ 'Prove It All Night',
+ 'Racing in the Streets',
+ 'Rosalita (Come Out Tonight)',
+ 'She\'s The One',
+ 'Spirit In The Night',
+ 'Tenth Avenue Freeze-Out',
+ 'Thunder Road',
+ 'Cuts Like a Knife',
+ 'Heaven',
+ 'Run to You',
+ 'Somebody',
+ 'Summer Of \'69',
+ 'Sorry',
+ 'For What It\'s Worth',
+ 'Mr. Soul',
+ 'Rock & Roll Woman',
+ 'Comedown',
+ 'Machinehead',
+ 'Far Behind',
+ 'Goin\' up the Country',
+ 'On the Road Again',
+ 'IT\'S TOO LATE',
+ 'Oh Very Young',
+ 'WILD WORLD',
+ 'In America',
+ 'Long Haired Country Boy',
+ 'The Devil Went Down To Georgia',
+ 'The Legend Of Wooley Swamp',
+ 'The South\'s Gonna Do It Again',
+ 'Uneasy Rider',
+ 'Ain\'t That a Shame',
+ 'Dream Police',
+ 'I Want You to Want Me',
+ 'She\'s Tight',
+ 'Surrender',
+ 'Take Out The Gunman',
+ '25 Or 6 To 4',
+ 'Beginnings',
+ 'Feeling Stronger Every',
+ 'I\'m a Man',
+ 'JUST YOU AND ME',
+ 'Make Me Smile',
+ 'Questions 67 and 68',
+ 'Saturday In the Park',
+ 'South California Purples',
+ 'JOHNNY B. GOODE',
+ 'Coming Home',
+ 'Don\'t Know What You Got',
+ 'Gypsy Road',
+ 'Nobody\'s Fool',
+ 'Somebody Save Me',
+ 'Better Off Without You',
+ 'Born Too Late',
+ 'Cigarette',
+ 'Hey You',
+ 'Maybe',
+ 'Penny On The Floor',
+ 'The River',
+ 'December',
+ 'Shine',
+ 'The World I Know',
+ 'Hot Rod Lincoln',
+ 'Monkey Bars',
+ 'Mr. Jones',
+ 'Low',
+ 'Badge',
+ 'Born Under A Bad Sign',
+ 'Crossroads',
+ 'I\'m So Glad',
+ 'Sunshine of Your Love',
+ 'Tales Of Brave Ulysses',
+ 'White Room',
+ 'Higher',
+ 'My Sacrifice',
+ 'With Arms Wide Open',
+ 'Bad Moon Rising',
+ 'Born On the Bayou',
+ 'Commotion',
+ 'Down On the Corner',
+ 'Fortunate Son',
+ 'Green River',
+ 'Have You Ever Seen the Rain?',
+ 'I Heard It Through the Grapevine',
+ 'Lodi',
+ 'Lookin\' Out My Back Door',
+ 'Proud Mary',
+ 'Run Through the Jungle',
+ 'Suzie Q',
+ 'Sweet Hitch Hiker',
+ 'The Midnight Special',
+ 'Travelin\' Band',
+ 'Up Around the Bend',
+ 'Who\'ll Stop the Rain',
+ 'Fire Woman',
+ 'Helplessly Hoping',
+ 'Long Time Gone',
+ 'Southern Cross',
+ 'Suite: Judy Blue Eyes',
+ 'Carry On',
+ 'Ohio',
+ 'Woodstock',
+ '(I Just) Died in Your Arms',
+ 'High Enough',
+ 'I HEAR YOU KNOCKING',
+ 'Headkeeper',
+ 'Only You Know And I Know',
+ 'We Just Disagree',
+ 'Welcome To The Boomtown',
+ 'Changes',
+ 'China Girl',
+ 'Diamond Dogs',
+ 'Fame',
+ 'Fashion',
+ 'Friday on My Mind',
+ 'Golden Years',
+ 'Heroes',
+ 'Jean Genie',
+ 'Let\'s Dance',
+ 'Modern Love',
+ 'Panic in Detroit',
+ 'Rebel Rebel',
+ 'Space Oddity',
+ 'Starman',
+ 'Stay',
+ 'Suffragette City',
+ 'Young Americans',
+ 'Ziggy Stardust',
+ 'Rock On',
+ 'There\'s No Way Out Of Here',
+ 'There\'s No Way Out Of Here',
+ 'Frenchette',
+ 'California Girls',
+ 'Just A Gigolo / I Ain\'t Got Nobody',
+ 'Yankee Rose',
+ 'Burn',
+ 'Child In Time',
+ 'Highway Star',
+ 'Hush',
+ 'Kentucky Woman',
+ 'Knocking At Your Backdoo',
+ 'Lazy',
+ 'Perfect Strangers',
+ 'Smoke On The Water',
+ 'Space Truckin\'',
+ 'Woman From Tokyo',
+ 'Animal',
+ 'Armageddon It',
+ 'Bringin\' On The Heartbreak',
+ 'Foolin\'',
+ 'Hysteria',
+ 'Love Bites',
+ 'On Through The Night',
+ 'Photograph',
+ 'Pour Some Sugar On Me',
+ 'Rock of Ages',
+ 'Rock Rock',
+ 'Rocket',
+ 'Too Late for Love',
+ 'Enjoy the Silence',
+ 'Bell Bottom Blues',
+ 'Have You Ever Loved a Woman',
+ 'Layla',
+ 'Recognition',
+ 'ANGELOS',
+ 'Holy Diver',
+ 'Rainbow In the Dark',
+ 'The Last In Line',
+ 'Brothers In Arms',
+ 'Down To The Waterline',
+ 'Expresso Love',
+ 'Industrial Disease',
+ 'Lady Writer',
+ 'Money for Nothing',
+ 'Romeo And Juliet',
+ 'So Far Away',
+ 'Solid Rock',
+ 'Sultans of Swing',
+ 'Walk of Life',
+ 'Counting Blue Cars',
+ 'Drift Away',
+ 'Alone Again',
+ 'In My Dreams',
+ 'Into The Fire',
+ 'Heavy Metal',
+ 'All She Wants to Do Is Dance',
+ 'Dirty Laundry',
+ 'Sunset Grill',
+ 'The Boys Of Summer',
+ 'The Heart of the Matter',
+ 'The Last Worthless Evening',
+ 'American Pie',
+ 'Ah! Leah!',
+ 'Love Is Like A Rock',
+ 'Season of the Witch',
+ 'Sunshine Superman',
+ 'COVER OF THE ROLLING STONE',
+ 'Right Place Wrong Time',
+ 'Anything, Anything',
+ 'Hey, Hey (What Can I Do?)',
+ 'Rio',
+ 'Already Gone',
+ 'Desperado',
+ 'Heartache Tonight',
+ 'Hotel California',
+ 'I Can\'t Tell You Why',
+ 'In The City',
+ 'Life in the Fast Lane',
+ 'Lyin\' Eyes',
+ 'New Kid In Town',
+ 'One of These Nights',
+ 'Peaceful Easy Feeling',
+ 'Seven Bridges Road',
+ 'Take It Easy',
+ 'Take It to the Limit',
+ 'Tequila Sunrise',
+ 'The Best of My Love',
+ 'The Long Run',
+ 'Those Shoes',
+ 'Victim of Love',
+ 'Witchy Woman',
+ 'Baby Hold On',
+ 'Gimme Some Water',
+ 'Shakin\'',
+ 'Take Me Home Tonight',
+ 'Think I\'m In Love',
+ 'Two Tickets To Paradise',
+ 'Frankenstein',
+ 'Free Ride',
+ 'WAR',
+ 'CAN\'T GET IT OUT OF MY HEAD',
+ 'Do Ya',
+ 'Don\'t Bring Me Down',
+ 'Evil Woman',
+ 'Fire On High',
+ 'Livin\' Thing',
+ 'Roll Over Beethoven',
+ 'Strange Magic',
+ 'Sweet Talkin\' Woman',
+ 'Telephone Line',
+ 'Turn To Stone',
+ 'All The Girls Love Alice',
+ 'Bennie And The Jets',
+ 'Candle in the Wind',
+ 'Captain Fantastic',
+ 'Crocodile Rock',
+ 'DANIEL',
+ 'Don\'t Let The Sun Go Down On Me',
+ 'Funeral for a Friend (Love Lies Bleeding)',
+ 'Goodbye Yellow Brick Road',
+ 'Harmony',
+ 'Honky Cat',
+ 'Levon',
+ 'Madman Across The Water',
+ 'Rocket Man',
+ 'Saturday Night\'s Alright for Fighting',
+ 'Someone Saved My Life Tonight',
+ 'Take Me to the Pilot',
+ 'Teacher I Need You',
+ 'THE BITCH IS BACK',
+ 'Tiny Dancer',
+ 'Where To Now St. Peter',
+ 'Your Song',
+ 'Fooled around and Fell in Love',
+ 'Alison',
+ 'Pump It Up',
+ 'Veronica',
+ 'From the Beginning',
+ 'Hoedown',
+ 'Karn Evil 9',
+ 'Lucky Man',
+ 'Still You Turn Me On',
+ 'After Midnight',
+ 'Bad Love',
+ 'Call Me the Breeze',
+ 'Cocaine',
+ 'Don\'t Think Twice, It\'s Alright',
+ 'Forever Man',
+ 'I Can\'t Stand It',
+ 'I Shot The Sheriff',
+ 'I\'ve Got a Rock \'N\' Roll Heart',
+ 'It\'s In The Way That You Use It',
+ 'Knockin\' On Heaven\'s Door',
+ 'Lay Down Sally',
+ 'Layla',
+ 'Let It Grow',
+ 'Let It Rain',
+ 'Pretending',
+ 'She\'s Waiting',
+ 'Tears In Heaven',
+ 'The Core',
+ 'Willie and the Hand Jive',
+ 'Wonderful Tonight',
+ 'Cliffs Of Dover',
+ 'The Final Countdown',
+ 'Sweet Dreams (Are Made of This)',
+ 'Inside Out',
+ 'Santa Monica',
+ 'The Boys Are Back In Town',
+ 'What It\'s Like',
+ 'More Than Words',
+ 'Mutha (Don\'t Wanna Go To School Today)',
+ 'Ooh La La',
+ 'Stay With Me',
+ 'Epic',
+ 'House Of Pain',
+ 'All The Kings Horses',
+ 'Signs',
+ 'Blue Letter',
+ 'Don\'t Stop',
+ 'Dreams',
+ 'Go Your Own Way',
+ 'Gold Dust Woman',
+ 'Gypsy',
+ 'Hold Me',
+ 'Hypnotized',
+ 'I Don\'t Want To Know',
+ 'I\'m So Afraid',
+ 'Landslide',
+ 'Little Lies',
+ 'Monday Morning',
+ 'Never Going Back Again',
+ 'Oh Well',
+ 'Rhiannon',
+ 'Sara',
+ 'Say You Love Me',
+ 'Second Hand News',
+ 'Sentimental Lady',
+ 'The Chain',
+ 'Tusk',
+ 'World Turning',
+ 'You Make Loving Fun',
+ 'Hocus Pocus',
+ 'Dreamer',
+ 'Fool For The City',
+ 'I Just Want To Make Love To You',
+ 'Slow Ride',
+ 'All My Life',
+ 'Baker Street',
+ 'Best of You',
+ 'Everlong',
+ 'Learn To Fly',
+ 'Monkey Wrench',
+ 'My Hero',
+ 'The Pretender',
+ 'These Days',
+ 'Times Like These',
+ 'Blue Morning, Blue Day',
+ 'Cold As Ice',
+ 'Dirty White Boy',
+ 'Double Vision',
+ 'Feels Like the First Time',
+ 'Head Games',
+ 'Hot Blooded',
+ 'I Want to Know What Love Is',
+ 'Juke Box Hero',
+ 'Long, Long Way From Home',
+ 'Love Has Taken Its Toll',
+ 'Starrider',
+ 'That Was Yesterday',
+ 'Urgent',
+ 'Waiting for a Girl Like You',
+ 'Women',
+ 'Joe\'s Garage',
+ 'Peaches En Regalia',
+ 'All Right Now',
+ 'Hemorrhage',
+ 'Wishing Well',
+ 'Maggot Brain',
+ 'CARS',
+ 'Dream Weaver',
+ 'Love Is Alive',
+ 'A Trick of the Tail',
+ 'Abacab',
+ 'Behind The Lines',
+ 'Carpet Crawlers',
+ 'Follow You Follow Me',
+ 'Home by the Sea/Second Home by the Sea',
+ 'Just A Job To Do',
+ 'Land Of Confusion',
+ 'Mama',
+ 'Man On The Corner',
+ 'Misunderstanding',
+ 'No Reply At All',
+ 'That\'s All',
+ 'The Lamb Lies Down On Broadway',
+ 'Tonight Tonight (live)',
+ 'Turn It On Again',
+ 'Give Me Love',
+ 'GOT MY MIND SET ON YOU',
+ 'My Sweet Lord',
+ 'Bad to the Bone',
+ 'Delaware Slide',
+ 'Get A Haircut',
+ 'I Drink Alone',
+ 'It Wasn\'t Me',
+ 'Move It On Over',
+ 'One Bourbon, One Scotch, One Beer',
+ 'Who Do You Love',
+ 'Keep Your Hands To Yourself',
+ 'Baker Street',
+ 'Right Down the Line',
+ 'Found Out About You',
+ 'Hey Jealousy',
+ 'Smuggler\'s Blues',
+ 'You Belong to the City',
+ 'Marakesh Express',
+ 'Are You Receiving Me',
+ 'Radar Love',
+ 'Twilight Zone',
+ 'Sundown',
+ 'Soulshine',
+ 'Bad Time',
+ 'Closer To Home (I\'m Your Captain)',
+ 'Loco-Motion',
+ 'Shinin\' On',
+ 'Some Kind of Wonderful',
+ 'We\'re an American Band',
+ 'Alabama Getaway',
+ 'Black-Throated Wind',
+ 'Casey Jones',
+ 'CHINA TOWN SHUFFLE ',
+ 'Friend Of The Devil',
+ 'Hell in a Bucket',
+ 'Loser',
+ 'Me and Bobby McGee',
+ 'NOT FADEAWAY/GOING /AWAY',
+ 'Scarlet Begonias',
+ 'Shakedown Street',
+ 'Sugar Magnolia',
+ 'Touch of Grey',
+ 'Truckin\'',
+ 'Turn On Your Lovelight',
+ 'U.S. Blues',
+ 'Uncle John\'s Band',
+ 'Mista Bone',
+ 'Once Bitten, Twice Shy',
+ 'Rock Me',
+ 'Rollin\' Stoned',
+ 'Save Your Love',
+ 'Basket Case',
+ 'Boulevard Of Broken Dreams',
+ 'Brain Stew/Jaded',
+ 'Good Riddance (Time Of Your Life)',
+ 'Holiday (Live)',
+ 'Holiday / Boulevard of Broken Dreams',
+ 'Longview',
+ 'When I Come Around',
+ 'The Break Up Song',
+ 'I\'m No Angel',
+ 'Midnight Rider',
+ 'American Woman',
+ 'Friends Of Mine',
+ 'No Sugar Tonight / New Mother Nature',
+ 'No Time',
+ 'THESE EYES',
+ 'Civil War',
+ 'Don\'t Cry',
+ 'Knockin\' On Heaven\'s Door',
+ 'Live and Let Die',
+ 'Mr. Brownstone',
+ 'My Michelle',
+ 'November Rain',
+ 'Paradise City',
+ 'Patience',
+ 'Sweet Child O\' Mine',
+ 'Used To Love Her',
+ 'Welcome to the Jungle',
+ 'You Could Be Mine',
+ 'AS FAR AS YOU CAN SEE (AS MU',
+ 'Axel F Theme',
+ 'Cat\'s In The Cradle',
+ 'W*O*L*D*',
+ 'Jump into the Fire',
+ 'Never Been Any Reason',
+ 'All I Wanna Do Is Make Love to You',
+ 'Alone',
+ 'Barracuda',
+ 'Bebe le Strange',
+ 'Crazy On You',
+ 'Dog & Butterfly',
+ 'Dreamboat Annie',
+ 'Even It Up',
+ 'Heartless',
+ 'How Can I Refuse',
+ 'If Looks Could Kill',
+ 'Kick It Out',
+ 'Little Queen',
+ 'Love Alive',
+ 'Magic Man',
+ 'Mistral Wind',
+ 'Never',
+ 'Nothin\' at All',
+ 'Rock And Roll',
+ 'Stairway To Heaven',
+ 'Straight On',
+ 'Tell It Like It Is',
+ 'What About Love?',
+ 'Who Will You Run To',
+ 'House Of Living',
+ 'Sangre Por Sangre',
+ 'Grey Ghost',
+ 'Long Cool Woman',
+ 'New Girl Now',
+ 'ALL YOU ZOMBIES',
+ 'AND WE DANCED',
+ 'I Want A New Drug',
+ '30 Days In the Hole',
+ 'Lust for Life',
+ 'The Passenger',
+ 'Radioactive',
+ 'Devil Inside',
+ 'Need You Tonight',
+ 'New Sensation',
+ 'What You Need',
+ 'In A Gadda Da Vida',
+ 'Flight Of Icarus',
+ 'Run To The Hills',
+ 'The Number Of The Beast',
+ 'The Trooper',
+ 'Wasted Years',
+ 'Centerfold',
+ 'Freeze-frame',
+ 'Give It To Me',
+ 'Houseparty',
+ 'Looking For A Love',
+ 'Love Stinks',
+ 'Must of Got Lost',
+ 'Night Time',
+ 'Whammer Jammer',
+ 'Boulevard',
+ 'Doctor My Eyes',
+ 'Load Out/Stay',
+ 'Redneck Friend',
+ 'Running On Empty',
+ 'Somebody\'s Baby',
+ 'Take It Easy',
+ 'The Load-out/stay',
+ 'The Road and the Sky',
+ 'Funk #49',
+ 'Walk Away',
+ 'YOU\'VE GOT A FRIEND',
+ 'Been Caught Stealing',
+ 'Jane Says',
+ 'Get It While You Can',
+ 'Me and Bobby McGee',
+ 'Move Over',
+ 'Piece of My Heart',
+ 'Summertime',
+ 'Shakedown Cruise',
+ 'Thunder Island',
+ 'Freeway Jam',
+ 'Rice Pudding',
+ 'Somebody to Love',
+ 'White Rabbit',
+ 'Find Your Way Back',
+ 'Jane',
+ 'Ride the Tiger',
+ 'We Built This City',
+ 'Right Here Right Now',
+ 'Are You Gonna Be My Girl',
+ 'Cold Hard Bitch',
+ 'Aqualung',
+ 'Bungle In The Jungle',
+ 'Cross-eyed Mary',
+ 'Hymn 43',
+ 'Living In The Past',
+ 'Locomotive Breath',
+ 'Nothing Is Easy',
+ 'Teacher',
+ 'Thick As A Brick',
+ 'Too Old To Rock \'n\' Roll',
+ 'TIME IN A BOTTLE',
+ 'All Along the Watchtower',
+ 'Angel',
+ 'Are You Experienced?',
+ 'Crosstown Traffic',
+ 'Dolly Dagger',
+ 'Fire',
+ 'Foxey Lady',
+ 'Hey Joe',
+ 'If 6 Was 9',
+ 'Like a Rolling Stone',
+ 'Little Wing',
+ 'Manic Depression',
+ 'Purple Haze',
+ 'Red House',
+ 'Stone Free',
+ 'The Wind Cries Mary',
+ 'Third Stone From The Sun',
+ 'Voodoo Child (Slight Return)',
+ 'Margaritaville',
+ 'Son of a Son of a Sailor',
+ 'Why Don\'t We Get Drunk',
+ 'Bad Reputation',
+ 'Crimson And Clover',
+ 'I Hate Myself For Loving You',
+ 'I Love Rock \'n Roll',
+ 'Cry Me a River',
+ 'Feelin\' Alright',
+ 'The Letter',
+ 'With A Little Help From My Friends',
+ 'You Can Leave Your Hat On (Live)',
+ 'Is She Really Going Out With Him?',
+ 'Always With Me, Always With You',
+ 'Summer Song',
+ 'A Life Of Illusion',
+ 'All Night Long',
+ 'Analog Man',
+ 'Funk #49',
+ 'In the City',
+ 'Life\'s Been Good',
+ 'Ordinary Average Guy',
+ 'Rocky Mountain Way',
+ 'The Confessor',
+ 'Turn To Stone',
+ 'On the Dark Side',
+ 'Centerfield',
+ 'The Old Man Down The Road',
+ '#9 Dream',
+ 'Imagine',
+ 'Instant Karma',
+ 'Mind Games',
+ 'Watching the Wheels',
+ 'Woman',
+ 'Again Tonight',
+ 'Ain\'t Even Done With the Night',
+ 'Authority Song',
+ 'Check It Out',
+ 'Cherry Bomb',
+ 'Crumblin\' Down',
+ 'Hurts So Good',
+ 'I Need A Lover',
+ 'Jack & Diane',
+ 'Lonely Ol\' Night',
+ 'Paper in Fire',
+ 'Pink Houses',
+ 'R.O.C.K. In the U.S.A.',
+ 'Rain On The Scarecrow',
+ 'Small Town',
+ 'What If I Came Knocking',
+ 'Illegal Smile',
+ 'I CAN SEE CLEARLY NOW',
+ 'Brickyard Road',
+ 'Shanty',
+ 'Roadrunner',
+ 'Any Way You Want It',
+ 'City of the Angels',
+ 'Don\'t Stop Believin\'',
+ 'Escape',
+ 'Faithfully',
+ 'Feeling That Way',
+ 'Just the Same Way',
+ 'Lights',
+ 'Look Into The Future',
+ 'Lovin\', Touchin\' Squeezin\'',
+ 'Only the Young',
+ 'Open Arms',
+ 'Send Her My Love',
+ 'Separate Ways (Worlds Apart)',
+ 'Stone In Love',
+ 'Wheel in the Sky',
+ 'Who\'s Crying Now',
+ 'Breaking The Law',
+ 'Diamonds And Rust',
+ 'Electric Eye',
+ 'Heading Out To The Highway',
+ 'Hot Rockin\'',
+ 'Living After Midnight',
+ 'The Ripper',
+ 'Turbo Lover',
+ 'You\'ve Got Another Thing Comin\'',
+ 'Simple Man',
+ 'Carry On Wayward Son',
+ 'Dust In The Wind',
+ 'Play the Game Tonight',
+ 'Point of Know Return',
+ 'I\'m Alright',
+ 'Just Dropped In',
+ 'Blue On Black',
+ 'Somehow, Somewhere, Someway',
+ 'All Summer Long',
+ 'Cowboy',
+ 'Let\'s Ride',
+ 'If I Say',
+ 'Sex On Fire',
+ 'Use Somebody',
+ 'Beth',
+ 'Calling Dr. Love',
+ 'Christeen Sixteen',
+ 'Cold Gin',
+ 'Detroit Rock City',
+ 'Heaven\'s On Fire',
+ 'Lick It Up',
+ 'Rock And Roll All Nite',
+ 'Shout It out Loud',
+ 'Strutter',
+ 'Tears Are Falling',
+ 'Long Stick Goes Boom',
+ 'Screaming In The Night',
+ 'Stayed Awake All Night',
+ 'Sex Action',
+ 'Key To The Rhyme',
+ 'All My Love',
+ 'Babe I\'m Gonna Leave You',
+ 'Black Dog',
+ 'Black Mountain Side',
+ 'Bonzo\'s Montreaux',
+ 'Boogie With Stu',
+ 'Bring It On Home',
+ 'Bron-y-aur Stomp',
+ 'Celebration Day',
+ 'Communication Breakdown',
+ 'Custard Pie',
+ 'D\'Yer Mak\'er',
+ 'Dancing Days',
+ 'Darlene',
+ 'Dazed and Confused',
+ 'Down By The Seaside',
+ 'Fool In the Rain',
+ 'For Your Life',
+ 'Four Sticks',
+ 'Friends',
+ 'Gallows Pole',
+ 'Going to California',
+ 'Good Times Bad Times',
+ 'Hats Off To {roy} Harper',
+ 'Heartbreaker/living Loving Maid {she\'s Just A Woman}',
+ 'Hey Hey What Can I Do',
+ 'Hot Dog',
+ 'Houses of the Holy',
+ 'How Many More Times',
+ 'I Can\'t Quit You Baby',
+ 'Immigrant Song',
+ 'In My Time of Dying',
+ 'In the Evening',
+ 'In the Light',
+ 'Kashmir',
+ 'Living Loving Maid (She\'s Just a Woman)',
+ 'Misty Mountain Hop',
+ 'Moby Dick',
+ 'NIGHT FLIGHT',
+ 'No Quarter',
+ 'Nobody\'s Fault But Mine',
+ 'Out On The Tiles',
+ 'Over the Hills and Far Away',
+ 'Ramble On',
+ 'Rock and Roll',
+ 'Royal Orleans',
+ 'Since I\'ve Been Loving You',
+ 'South Bound Saurez',
+ 'Stairway to Heaven',
+ 'TANGERINE',
+ 'Ten Years Gone',
+ 'Thank You',
+ 'That\'s the Way',
+ 'The Battle Of Evermore',
+ 'The Crunge',
+ 'The Lemon Song',
+ 'The Ocean',
+ 'The Rain Song',
+ 'The Rover',
+ 'The Song Remains the Same',
+ 'THE WANTON SONG',
+ 'Trampled Under Foot',
+ 'Traveling Riverside Blues',
+ 'What Is and What Should Never Be',
+ 'When The Levee Breaks',
+ 'Whole Lotta Love',
+ 'You Shook Me',
+ 'Your Time Is Gonna Come',
+ 'Do You Know What I Mean',
+ 'Woman',
+ 'American Woman',
+ 'Are You Gonna Go My Way',
+ 'Fly Away',
+ 'Stranger In A Strange Land',
+ 'My Own Worst Enemy',
+ 'Close My Eyes Forever',
+ 'Kiss Me Deadly',
+ 'All That You Dream',
+ 'Dixie Chicken',
+ 'I Alone',
+ 'Lightning Crashes',
+ 'Cult Of Personality',
+ 'Bound for the Floor',
+ 'Conquistador',
+ 'Midnight Blue',
+ 'Sweet Jane (Live)',
+ 'Walk On The Wild Side',
+ 'Lovin\' Every Minute of It',
+ 'The Kid Is Hot Tonite',
+ 'Turn Me Loose',
+ 'Working for the Weekend',
+ 'Wicked Sensation',
+ 'Call Me the Breeze',
+ 'Dixie/Sweet Home Alabama',
+ 'Don\'t Ask Me No Questions',
+ 'Free Bird',
+ 'Gimme Back My Bullets',
+ 'Gimme Three Steps',
+ 'I Know a Little',
+ 'Saturday Night Special',
+ 'Simple Man',
+ 'Sweet Home Alabama',
+ 'That Smell',
+ 'The Ballad Of Curtis Loew',
+ 'Tuesday\'s Gone',
+ 'What\'s Your Name',
+ 'You Got That Right',
+ 'Merry-Go-Round',
+ 'Blinded by the Light',
+ 'Do Wah Diddy Diddy',
+ 'Sex and Candy',
+ 'Paradise By The Dashboard Light',
+ 'TWO OUT OF THREE AIN\'T BAD',
+ 'You Took The Words Right Out Of My Mouth',
+ 'I\'m the Only One',
+ 'Down Under',
+ 'Who Can It Be Now?',
+ 'Breadfan',
+ 'Enter Sandman',
+ 'Fade To Black',
+ 'For Whom The Bell Tolls',
+ 'Fuel',
+ 'Harvester Of Sorrow',
+ 'Hero of the Day',
+ 'Lords of Summer (First Pass Version)',
+ 'Master of Puppets',
+ 'No Leaf Clover',
+ 'Nothing Else Matters',
+ 'One',
+ 'Sad But True',
+ 'Seek & Destroy',
+ 'The Memory Remains',
+ 'The Unforgiven',
+ 'Turn The Page',
+ 'Until It Sleeps',
+ 'Wherever I May Roam',
+ 'Whiskey In The Jar',
+ 'Cruisin\'',
+ 'Drinkin\' in the Driveway',
+ 'He Can\'t Love You',
+ 'Let\'s Get the Show on the Road',
+ 'My Town',
+ 'Rosewood Bitters',
+ 'Strike up the Band',
+ 'Beds Are Burning',
+ 'Devil With the Blue Dress On',
+ 'I Melt With You',
+ 'Sugar Boogie',
+ 'Dreams I\'ll Never See',
+ 'Flirtin\' With Disaster',
+ 'What Do All The People Know',
+ 'Bad Motor Scooter',
+ 'Rock Candy',
+ 'Space Station #5',
+ 'Don\'t Go Away Mad (Just Go Away)',
+ 'Dr. Feelgood',
+ 'Girls, Girls, Girls',
+ 'Home Sweet Home',
+ 'Kickstart My Heart',
+ 'Looks That Kill',
+ 'Piece of Your Action',
+ 'Same Ol\' Situation',
+ 'Shout at the Devil',
+ 'Smokin\' in the Boys Room',
+ 'Wild Side',
+ 'All the Young Dudes',
+ 'Mississippi Queen',
+ 'Moon Rider',
+ 'Addicted To That Rush',
+ 'In the Summertime',
+ 'Hair Of The Dog',
+ 'Love Hurts',
+ 'Cinnamon Girl',
+ 'Down by the River',
+ 'Everybody Knows This Is Nowhere',
+ 'Heart of Gold',
+ 'Hey Hey, My My',
+ 'Like a Hurricane',
+ 'My My, Hey Hey',
+ 'Old Man',
+ 'Powderfinger',
+ 'Rockin\' In the Free World',
+ 'Southern Man',
+ 'Sugar Mountain',
+ 'The Needle and the Damage Done',
+ 'When You Dance I Can Really Love',
+ 'Show Me The Way',
+ 'How You Remind Me',
+ 'Photograph',
+ 'Rockstar',
+ 'Someday (Single Mix)',
+ '(You Can Still) Rock in America',
+ 'Don\'t Tell Me You Love Me',
+ 'Rumors In The Air',
+ 'Sister Christian',
+ 'When You Close Your Eyes',
+ 'About a Girl',
+ 'All Apologies',
+ 'Come As You Are',
+ 'Dumb',
+ 'In Bloom',
+ 'Lithium',
+ 'On a Plain',
+ 'Polly',
+ 'Smells Like Teen Spirit',
+ 'The Man Who Sold the World',
+ 'Spirit In The Sky',
+ 'This Is The Time',
+ 'Wonderwall',
+ 'STILL THE ONE',
+ '(Sittin\' On) The Dock of the Bay',
+ 'If You Wanna Get to Heaven',
+ 'Jackie Blue',
+ 'Bark At The Moon',
+ 'Changes',
+ 'Crazy Train',
+ 'Diary Of A Madman',
+ 'Flying High Again',
+ 'Goodbye To Romance',
+ 'I Don\'t Know',
+ 'Mama, I\'m Coming Home',
+ 'Mr. Crowley',
+ 'Mr. Tinkertrain',
+ 'No More Tears',
+ 'Over the Mountain',
+ 'Perry Mason',
+ 'Purple Haze',
+ 'Road To Nowhere',
+ 'Rocky Mountain Way',
+ 'See You on the Other Side',
+ 'Shot in the Dark',
+ 'Time After Time',
+ 'Fire and Ice',
+ 'Heartbreaker',
+ 'Hell Is for Children',
+ 'Hit Me With Your Best Shot',
+ 'Invincible',
+ 'Love Is A Battlefield',
+ 'Shadows Of The Night',
+ 'Treat Me Right',
+ 'We Belong',
+ 'You Better Run',
+ 'Boom Boom/',
+ 'Snortin Whiskey',
+ 'The Back Seat Of My Car',
+ 'Too Many People',
+ 'Uncle Albert/Admiral Halsey',
+ 'Another Day',
+ 'Band on the Run',
+ 'Birthday (Live)',
+ 'Coming Up',
+ 'Day Tripper',
+ 'Helen Wheels',
+ 'Hello Goodbye',
+ 'Helter Skelter',
+ 'Hey Jude (Live)',
+ 'Hi Hi Hi',
+ 'Jet',
+ 'Junior\'s Farm',
+ 'Let \'Em In',
+ 'Let Me Roll It',
+ 'Listen To What The Man Says',
+ 'Live and Let Die',
+ 'Maybe I\'m Amazed',
+ 'My Love',
+ 'Nineteen Hundred and Eighty Five',
+ 'Silly Love Songs',
+ 'Uncle Albert/Admiral Halsey',
+ 'Venus and Mars/Rock Show',
+ 'With a Little Luck',
+ '50 Ways to Leave Your Lover',
+ 'Kodachrome',
+ 'Loves Me Like a Rock',
+ 'Me And Julio Down By The Schoolyard',
+ 'You Can Call Me Al',
+ 'Alive',
+ 'Better Man',
+ 'Black',
+ 'Daughter',
+ 'Dissident',
+ 'Elderly Woman Behind the Counter in a Small Town',
+ 'Even Flow',
+ 'Jeremy',
+ 'Last Kiss',
+ 'Lightning Bolt',
+ 'Not for You',
+ 'Sirens',
+ 'Yellow Ledbetter',
+ 'GONNA GET YA',
+ 'Let My Love Open the Door',
+ 'Rough Boys',
+ 'Baby, I Love Your Way',
+ 'Do You Feel Like We Do',
+ 'Show Me the Way',
+ 'Something\'s Happening/',
+ 'Big Time',
+ 'Games Without Frontiers',
+ 'In Your Eyes',
+ 'Red Rain',
+ 'SHOCK THE MONKEY',
+ 'Sledgehammer',
+ 'Solsbury Hill',
+ 'Don\'t Lose My Number',
+ 'I Don\'t Care Anymore',
+ 'In the Air Tonight',
+ 'Another Brick In The Wall',
+ 'Another Brick in the Wall, Pt. 2',
+ 'Any Colour You Like',
+ 'Arnold Layne',
+ 'Astronomy Domine',
+ 'Brain Damage',
+ 'Brain Damage /Eclipse',
+ 'Breathe',
+ 'Careful With That Axe, Eugene',
+ 'Comfortably Numb',
+ 'Dogs',
+ 'Empty Spaces',
+ 'Empty Spaces/young Lust',
+ 'Fearless',
+ 'Goodbye Blue Sky',
+ 'Have a Cigar',
+ 'Hey You',
+ 'Keep Talking',
+ 'Learning to Fly',
+ 'Money',
+ 'Mother',
+ 'On The Turning Away',
+ 'One Of These Days',
+ 'One Slip',
+ 'Run Like Hell',
+ 'See Emily Play',
+ 'Set The Controls For The Heart Of The Sun',
+ 'Shine On You Crazy Diamond',
+ 'Speak to Me/Breathe',
+ 'Take It Back',
+ 'The Dogs Of War',
+ 'The Great Gig In the Sky',
+ 'The Happiest Days Of Our Lives/another Brick In The Wall',
+ 'Time',
+ 'Time/Gig in The Sky',
+ 'Us and Them',
+ 'Welcome To The Machine',
+ 'Wish You Were Here',
+ 'Young Lust',
+ 'Every Rose Has Its Thorn',
+ 'Look What The Cat Dragged In',
+ 'Nothin\' But A Good Time',
+ 'Something To Believe In',
+ 'Talk Dirty To Me',
+ 'A Salty Dog',
+ 'A Whiter Shade of Pale',
+ 'Blurry',
+ 'Amie',
+ 'Another One Bites the Dust',
+ 'Bicycle Race',
+ 'Bicycle Race/fat Bottomed Girls',
+ 'Bohemian Rhapsody',
+ 'Crazy Little Thing Called Love',
+ 'Don\'t Stop Me Now',
+ 'Fat Bottomed Girls',
+ 'It\'s Late',
+ 'Keep Yourself Alive',
+ 'Killer Queen',
+ 'One Vision',
+ 'Somebody To Love',
+ 'THESE ARE THE DAYS OF OUR LI',
+ 'Tie Your Mother Down',
+ 'Under Pressure',
+ 'We Are the Champions',
+ 'We Will Rock You',
+ 'We Will Rock You/We Are The Champions',
+ 'You\'re My Best Friend',
+ 'Under Pressure',
+ 'No One Knows',
+ 'Another Rainy Night',
+ 'Eyes Of A Stranger',
+ 'I Don\'t Believe In Love',
+ 'Jet City Woman',
+ 'Silent Lucidity',
+ 'Fresh Air',
+ 'Pride of Man',
+ 'Bang Your Head',
+ 'Cum On Feel the Noize',
+ 'Metal Health',
+ 'It\'s the End of the World As We Know It (And I Feel Fine)',
+ 'Losing My Religion',
+ 'Man On the Moon',
+ 'Orange Crush',
+ 'Stand',
+ 'The One I Love',
+ 'Man On The Silver Mountain',
+ 'Since You Been Gone',
+ 'Stone Cold',
+ 'Street Of Dreams',
+ 'Black Betty',
+ 'Back for More',
+ 'Round and Round',
+ 'Way Cool Jr.',
+ 'Breaking the Girl',
+ 'By the Way',
+ 'Californication',
+ 'Dani California',
+ 'Give It Away',
+ 'Scar Tissue',
+ 'Soul to Squeeze',
+ 'Under the Bridge',
+ 'Lunatic Fringe',
+ 'Back On The Road Again',
+ 'Don\'t Let Him Go',
+ 'Golden Country',
+ 'I Can\'t Fight This Feeling',
+ 'Keep On Loving You',
+ 'Keep Pushin\' 1977',
+ 'Like You Do',
+ 'Ridin\' the Storm Out',
+ 'Roll With the Changes',
+ 'Take It on the Run',
+ 'Time For Me To Fly',
+ 'Rock And Roll, Hoochie Koo',
+ 'Jessie\'s Girl',
+ 'Back Off Boogaloo',
+ 'Early 1970 [*]',
+ 'It Don\'t Come Easy',
+ 'No No Song',
+ 'Photograph',
+ 'Your\'re Sixteen',
+ 'Addicted to Love',
+ 'Bad Case Of Lovin\' You',
+ 'Simply Irresistible',
+ 'Big Log',
+ 'In The Mood',
+ 'Little By Little',
+ 'No Easy Way Out',
+ 'Bridge of Sighs',
+ 'Little Bit of Sympathy',
+ 'Too Rolling Stoned',
+ 'Oh, Well',
+ 'Tired Of Toein\' The Line',
+ 'Every Picture Tells A Story',
+ 'Hot Legs',
+ 'I Know I\'m Losing You',
+ 'Maggie May',
+ 'Reason to Believe',
+ 'Stay with Me',
+ 'The First Cut Is The Deepest',
+ 'Tonight\'s the Night (Gonna Be Alright)',
+ 'You Wear It Well',
+ 'You\'re In My Heart (The Final Acclaim)',
+ 'Free Me',
+ 'Had a Dream (Sleeping With the Enemy)',
+ 'The Logical Song',
+ '(I Can\'t Get No) Satisfaction',
+ '19th Nervous Breakdown',
+ 'Ain\'t Too Proud to Beg',
+ 'Almost Hear You Sigh',
+ 'Angie',
+ 'Beast Of Burden',
+ 'Bitch',
+ 'Brown Sugar',
+ 'Can\'t You Hear Me Knocking',
+ 'CAROL',
+ 'Da Da Doo Ron Ron',
+ 'Dance Little Sister',
+ 'Doo Doo Doo Doo Doo (Heartbreaker)',
+ 'Doom And Gloom',
+ 'Emotional Rescue',
+ 'Fortune Teller',
+ 'Get Off My Cloud',
+ 'Get Off Of My Cloud',
+ 'Gimme Shelter',
+ 'Hand of Fate',
+ 'Hang Fire',
+ 'Happy',
+ 'Heartbreaker',
+ 'Honky Tonk Women',
+ 'IT\'S ALL OVER NOW',
+ 'It\'s Only Rock \'n Roll',
+ 'Jumpin\' Jack Flash',
+ 'Just My Imagination',
+ 'Let It Bleed',
+ 'Let\'s Spend the Night Together',
+ 'Like A Rolling Stone',
+ 'Little Queenie',
+ 'Midnight Rambler',
+ 'Miss You',
+ 'Monkey Man',
+ 'Mother\'s Little Helper',
+ 'Paint It Black',
+ 'Shattered',
+ 'She\'s a Rainbow',
+ 'She\'s So Cold',
+ 'Start Me Up',
+ 'Street Fighting Man',
+ 'Sympathy For The Devil',
+ 'THE LAST TIME',
+ 'THE SPIDER AND THE FLY',
+ 'TIME IS ON MY SIDE',
+ 'Time Waits for No One',
+ 'Tumbling Dice',
+ 'Under My Thumb',
+ 'UNDERCOVER OF THE NIGHT',
+ 'Waiting on a Friend',
+ 'Wild Horses',
+ 'You Can\'t Always Get What You Want',
+ 'YOU GOT THE SILVER',
+ 'YOU GOTTA MOVE',
+ 'Bullfrog Blues',
+ 'Cry Sister',
+ '2112: Overture / The Temples of Syrinx (Chronicles Version)',
+ 'Closer to the Heart',
+ 'Entre Nous',
+ 'Finding My Way',
+ 'Fly By Night',
+ 'Freewill',
+ 'In The Mood',
+ 'Limelight',
+ 'New World Man',
+ 'Red Barchetta',
+ 'Show Don\'t Tell',
+ 'Subdivisions',
+ 'Summertime Blues',
+ 'Test For Echo',
+ 'The Spirit of Radio',
+ 'The Trees',
+ 'Time Stand Still (live)',
+ 'Tom Sawyer',
+ 'Working Man',
+ 'YYZ',
+ 'Voices',
+ 'On The Loose',
+ 'SOUL MAN',
+ 'Can\'t Get Loose',
+ 'Heavy Metal',
+ 'I Can\'t Drive 55',
+ 'I\'ll Fall In Love Again',
+ 'Plain Jane',
+ 'Red',
+ 'There\'s Only One Way to Rock',
+ 'Three Lock Box',
+ 'Trans Am (Highway Wonderland)',
+ 'Turn Up The Music 1977',
+ 'Black Magic Woman',
+ 'Europa',
+ 'Evil Ways',
+ 'Jingo',
+ 'No One to Depend On',
+ 'Oye Como Va',
+ 'Put Your Lights On (feat. Everlast)',
+ 'Smooth',
+ 'Soul Sacrifice',
+ 'Well All Right',
+ 'Winning',
+ 'The Warrior',
+ '3 Strange Days',
+ 'Big City Nights',
+ 'Blackout',
+ 'Don\'t Believe Her',
+ 'Holiday',
+ 'Loving You Sunday Morning',
+ 'No One Like You',
+ 'Rock You Like a Hurricane',
+ 'Still Loving You',
+ 'The Zoo',
+ 'Wind Of Change',
+ 'Remedy',
+ 'Words As Weapons',
+ 'God Save The Queen',
+ 'No Turning Back',
+ '45',
+ 'America',
+ 'Cecilia',
+ 'Mrs. Robinson',
+ 'The Sounds Of Silence',
+ 'Don\'t You',
+ '18 And Life',
+ 'I Remember You',
+ 'Youth Gone Wild',
+ 'Fly To The Angels',
+ 'All Star',
+ '1979',
+ 'Bullet With Butterfly Wings',
+ 'Landslide',
+ 'Today',
+ 'Driver\'s Seat',
+ 'Tainted Love',
+ 'Black Hole Sun',
+ 'Burden in My Hand',
+ 'Fell On Black Days',
+ 'Spoonman',
+ 'Havin\' A Party',
+ 'The Fever',
+ 'GIMME SOME LOVIN\'',
+ 'Two Princes',
+ 'Black Coffee In Bed',
+ 'Pulling Mussels',
+ 'Tempted',
+ 'It\'s Been Awhile',
+ 'My Demons',
+ 'Stuck In the Middle With You',
+ 'Black Cow',
+ 'Deacon Blues',
+ 'Dirty Work',
+ 'Do It Again',
+ 'Fm {no Static At All}',
+ 'Hey Nineteen',
+ 'Peg',
+ 'Reelin\' in the Years',
+ 'Rikki Don\'t Lose That Number',
+ 'Love the One You\'re With',
+ 'Treetop Flyer',
+ 'Born to Be Wild',
+ 'Magic Carpet Ride',
+ 'Copperhead Road',
+ 'Abracadabra',
+ 'Fly Like an Eagle',
+ 'Jet Airliner',
+ 'Jungle Love',
+ 'Living in the U.S.A.',
+ 'Mercury Blues',
+ 'Rock \'N Me',
+ 'Space Cowboy',
+ 'Swingtown',
+ 'Take the Money and Run',
+ 'The Joker',
+ 'The Stake',
+ 'Threshold/Jet Airliner',
+ 'True Fine Love',
+ 'Your Cash Ain\'t Nothin But Trash',
+ 'Oh Sherrie',
+ 'Back In the High Life Again',
+ 'Higher Love',
+ 'Roll With It',
+ 'While You See a Chance',
+ 'Love The One You\'Re With',
+ 'Edge of Seventeen',
+ 'Leather and Lace',
+ 'Stand Back',
+ 'Stop Draggin\' My Heart Around',
+ 'Stop Draggin\' My Heart Around',
+ 'Cold Shot',
+ 'Couldn\'t Stand the Weather',
+ 'Crossfire',
+ 'Life by the Drop',
+ 'Little Wing',
+ 'Look At Little Sister',
+ 'Pride And Joy',
+ 'Scuttle Buttin\'',
+ 'Superstition [Live]',
+ 'Taxman',
+ 'Texas Flood',
+ 'The House Is Rockin\'',
+ 'The Sky Is Crying',
+ 'Tightrope',
+ 'Voodoo Chile {slight Return}',
+ 'Superstition',
+ 'Fortress Around Your Heart',
+ 'If You Love Somebody Set Them Free',
+ 'Big Empty',
+ 'Creep',
+ 'Interstate Love Song',
+ 'Lady Picture Show',
+ 'Plush',
+ 'Sex Type Thing',
+ 'Trippin\' on a Hole in a Paper Heart',
+ 'Vasoline',
+ 'Rock This Town',
+ 'Stray Cat Strut',
+ 'To Hell With the Devil',
+ 'The Isle Of Debris',
+ 'Blue Collar Man',
+ 'Come Sail Away',
+ 'Crystal Ball',
+ 'Fooling Yourself',
+ 'Lady',
+ 'Light Up',
+ 'Lorelei',
+ 'Renegade',
+ 'Suite Madame Blue',
+ 'The Grand Illusion',
+ 'Too Much Time On My Hands',
+ 'What I Got',
+ 'Wrong Way',
+ 'Fly',
+ 'Green Eyed Lady',
+ 'Bloody Well Right',
+ 'Breakfast in America',
+ 'Dreamer',
+ 'Give a Little Bit',
+ 'Goodbye Stranger',
+ 'Take the Long Way Home',
+ 'The Logical Song',
+ 'Eye of the Tiger',
+ 'I Can\'t Hold Back',
+ 'Ballroom Blitz',
+ 'Fox On The Run',
+ 'Love Is Like Oxygen',
+ 'Bang a Gong (Get It On)',
+ 'Jeepster',
+ 'And She Was',
+ 'Burning Down the House',
+ 'Life During Wartime',
+ 'Once In A Lifetime',
+ 'Psycho Killer',
+ 'Road To Nowhere',
+ 'Stay Up Late',
+ 'Take Me To The River',
+ 'Wild Wild Life',
+ 'I\'m Leaving',
+ 'Everybody Wants to Rule the World',
+ 'Head Over Heels',
+ 'Shout',
+ 'Cat Scratch Fever',
+ 'Dog Eat Dog',
+ 'Free for All',
+ 'Great White Buffalo',
+ 'Stranglehold',
+ 'Wango Tango',
+ 'Hunger Strike',
+ 'I\'d Love To Change The World',
+ 'I\'m Goin\' Home',
+ 'Little Suzi',
+ 'Love Song',
+ 'Modern Day Cowboy',
+ 'Signs',
+ 'Breakdown',
+ 'Eye In the Sky',
+ 'Games People Play',
+ 'I Wouldn\'t Want to Be Like You',
+ 'Rain In the Summertime',
+ 'Journey to the Center of the Mind',
+ 'Don\'t Bring Me Down',
+ 'House Of The Rising Sun',
+ 'Monterey',
+ 'San Franciscan Nights',
+ 'Spill the Wine',
+ 'Love Shack',
+ 'Roam',
+ 'Back On My Feet Again',
+ 'Isn\'t It Time',
+ 'Chest Fever',
+ 'The Night They Drove Old Dixie Down',
+ 'The Weight',
+ 'Up On Cripple Creek',
+ 'Good Vibrations',
+ 'A Day In The Life',
+ 'A Hard Day\'s Night',
+ 'A Saturday Club Xmas/Crimble Medley',
+ 'Across The Universe',
+ 'All My Loving',
+ 'All You Need Is Love',
+ 'And Your Bird Can Sing',
+ 'ANYTIME AT ALL',
+ 'Baby You\'re A Rich Man',
+ 'Back In the U.S.S.R.',
+ 'BAD BOY',
+ 'BALLAD OF JOHN AND YOKO',
+ 'Birthday',
+ 'Blackbird',
+ 'Can\'t Buy Me Love',
+ 'Come Together',
+ 'Cry For A Shadow',
+ 'Day Tripper',
+ 'Dear Prudence',
+ 'Don\'t Let Me Down',
+ 'Drive My Car',
+ 'Eight Days A Week',
+ 'Eleanor Rigby',
+ 'Everybody\'s Got Something To Hide Except Me And My Monk',
+ 'Fixing A Hole',
+ 'From Me To You',
+ 'Get Back',
+ 'Getting Better',
+ 'GIRL',
+ 'Golden Slumbers',
+ 'Good Day Sunshine',
+ 'Got To Get You Into My Life',
+ 'Hello Goodbye',
+ 'Help!',
+ 'Helter Skelter',
+ 'Here Comes The Sun',
+ 'Hey Jude',
+ 'I Am the Walrus',
+ 'I Feel Fine',
+ 'I Saw Her Standing There',
+ 'I Want To Hold Your Hand',
+ 'I Want You (She\'s So Heavy)',
+ 'I\'ll Follow The Sun',
+ 'I\'m A Loser',
+ 'I\'m Down',
+ 'I\'ve Got A Feeling',
+ 'I\'ve Just Seen A Face',
+ 'IN MY LIFE',
+ 'IT WON\'T BE LONG',
+ 'Lady Madonna',
+ 'Let It Be',
+ 'LITTLE CHILD',
+ 'Love Me Do',
+ 'Lovely Rita',
+ 'Lucy In The Sky With Diamonds',
+ 'Magical Mystery Tour',
+ 'Maxwell\'s Silver Hammer',
+ 'Norwegian Wood',
+ 'NOWHERE MAN',
+ 'Ob-la-di, Ob-la-da',
+ 'OH DARLING',
+ 'P.s. I Love You',
+ 'Paperback Writer',
+ 'Penny Lane',
+ 'Please Please Me',
+ 'Reprise / Day in the Life',
+ 'Revolution',
+ 'ROCK AND ROLL MUSIC',
+ 'Rocky Raccoon',
+ 'Roll Over Beethoven',
+ 'Sgt. Pepper Inner Groove',
+ 'Sgt. Pepper\'s Lonely Hearts Club Band',
+ 'Sgt. Pepper\'s Lonely Hearts Club Band (Reprise)',
+ 'Sgt. Pepper/a Day In The Life',
+ 'Sgt. Pepper/with A Little Help From My Friends',
+ 'She Loves You',
+ 'SHE\'S A WOMAN',
+ 'She\'s Leaving Home',
+ 'Something',
+ 'Strawberry Fields Forever',
+ 'Sun King',
+ 'The Ballad Of John And Yoko',
+ 'THE CONTINUING STORY OF BUNG',
+ 'The Fool On The Hill',
+ 'The Long And Winding Road',
+ 'The Word',
+ 'Things We Said Today',
+ 'Ticket to Ride',
+ 'Twist and Shout',
+ 'Two Of Us',
+ 'We Can Work It Out',
+ 'When I\'m 64',
+ 'While My Guitar Gently Weeps',
+ 'Wild Honey Pie',
+ 'With a Little Help From My Friends',
+ 'Yellow Submarine',
+ 'Yesterday',
+ 'You Never Give Me Your Money',
+ 'You\'re Going To Lose That Girl',
+ 'YOUR MOTHER SHOULD KNOW',
+ 'A Conspiracy',
+ 'Gone',
+ 'Good Friday',
+ 'Goodbye Daughters of the Revolution',
+ 'Hard To Handle',
+ 'Hotel Illness',
+ 'Jealous Again',
+ 'Kickin\' My Heart Around',
+ 'Remedy',
+ 'She Talks To Angels',
+ 'Thorn In My Pride',
+ 'Twice As Hard',
+ 'Gold On The Ceiling',
+ 'Lonely Boy',
+ 'Soul Man',
+ 'Eight Miles High',
+ 'Bye Bye Love',
+ 'Candy-o',
+ 'Dangerious Type',
+ 'Drive',
+ 'Good Times Roll',
+ 'Hello Again',
+ 'It\'s All I Can Do',
+ 'Just What I Needed',
+ 'Let\'s Go',
+ 'Magic',
+ 'Moving In Stereo',
+ 'My Best Friend\'s Girl',
+ 'Shake It Up',
+ 'Since You\'re Gone',
+ 'Stereo/All Mixed Up',
+ 'Tonight She Comes',
+ 'You Might Think',
+ 'You\'re All I\'ve Got Tonight',
+ 'Clampdown',
+ 'I Fought The Law',
+ 'London Calling',
+ 'Rock The Casbah',
+ 'Should I Stay Or Should',
+ 'Train In Vain',
+ 'Fire Woman',
+ 'Another Park, Another Sunday',
+ 'Black Water',
+ 'China Grove',
+ 'It Keeps You Runnin\'',
+ 'Jesus Is Just Alright',
+ 'Listen To The Music',
+ 'Livin\' On the Fault Line',
+ 'Long Train Runnin\'',
+ 'Natural Thing',
+ 'Rockin\' Down The Highway',
+ 'South City Midnight Lady',
+ 'Take Me In Your Arms',
+ 'Takin\' It To The Streets',
+ 'UKIAH/THE CAPTAIN AND ME',
+ 'What a Fool Believes',
+ 'Wheels Of Fortune',
+ 'Back Door Man',
+ 'Break On Through',
+ 'Five To One',
+ 'Gloria',
+ 'Hello, I Love You',
+ 'L.A. Woman',
+ 'Light My Fire',
+ 'Love Her Madly',
+ 'Love Me Two Times',
+ 'Moonlight Drive',
+ 'Peace Frog',
+ 'People Are Strange',
+ 'Riders On The Storm',
+ 'Roadhouse Blues',
+ 'Soul Kitchen',
+ 'The Changeling',
+ 'The Crystal Ship',
+ 'Touch Me',
+ 'Twentieth Century Fox',
+ 'Waiting For The Sun',
+ 'When the Music\'s Over',
+ 'Tuff Enuff',
+ 'Radioactive',
+ 'One Thing Leads To Another',
+ 'Saved By Zero',
+ 'Iris',
+ 'Funk #49',
+ 'This Beat Goes on/Switching to Glide',
+ 'A Well Respected Man',
+ 'All Day And All Of The Night',
+ 'Apeman',
+ 'Come Dancing',
+ 'Destroyer',
+ 'Lola',
+ 'Sunny Afternoon',
+ 'Superman',
+ 'Tired of Waiting',
+ 'Victoria',
+ 'Waterloo Sunset',
+ 'You Really Got Me',
+ 'My Sharona',
+ 'Mrs. Robinson',
+ 'Summer In the City',
+ 'CALIFORNIA DREAMIN\'',
+ 'Can\'t You See',
+ 'HEARD IT IN A LOVE SONG',
+ 'Take The Highway',
+ 'Gypsy',
+ 'Question',
+ 'Ride My See Saw',
+ 'The Story In Your Eyes',
+ 'Your Wildest Dreams',
+ 'Life in the Fast Lane',
+ 'Come Out and Play',
+ 'Self Esteem',
+ 'The Kids Aren\'t Alright',
+ 'Your Love',
+ 'Green Grass & High Tides',
+ 'Can\'t Stand Losing You',
+ 'De Do Do Do, De Da Da Da',
+ 'Don\'t Stand So Close To Me',
+ 'Driven to Tears',
+ 'Every Breath You Take',
+ 'Every Little Thing She Does Is Magic',
+ 'Invisible Sun',
+ 'King Of Pain',
+ 'Message In A Bottle',
+ 'Roxanne',
+ 'So Lonely',
+ 'Spirits In The Material World',
+ 'Synchronicity II',
+ 'Walking On The Moon',
+ 'Wrapped Around Your Finger',
+ 'Some Like It Hot',
+ 'Back On The Chain Gang',
+ 'Brass In Pocket',
+ 'Don\'t Get Me Wrong',
+ 'Message of Love',
+ 'Middle Of The Road',
+ 'My City Was Gone',
+ 'Mystery Achievement',
+ 'TALK OF THE TOWN',
+ 'Blitzkrieg Bop',
+ 'Do You Remember Rock \'n\' Roll Radio',
+ 'I Wanna Be Sedated',
+ 'Rock \'n\' Roll High School',
+ 'Rockaway Beach',
+ 'Teenage Lobotomy',
+ 'TALKING IN YOUR SLEEP',
+ 'What I Like About You',
+ 'Itchycoo Park',
+ 'A Girl Like You',
+ 'I\'m A Man',
+ 'Dirty Water',
+ 'End of the Line',
+ 'Handle with Care',
+ 'Tweeter and the Monkey Man',
+ 'She\'s a Beauty',
+ 'Talk To Ya Later',
+ 'One Headlight',
+ 'Seven Nation Army',
+ '5:15',
+ 'ANOTHER TRICKY DAY',
+ 'Athena',
+ 'Baba O\'Reilly',
+ 'Bargain',
+ 'Behind Blue Eyes',
+ 'Eminence Front',
+ 'Getting In Tune',
+ 'Going Mobile',
+ 'Happy Jack',
+ 'I Can See For Miles',
+ 'I CAN\'T EXPLAIN',
+ 'I\'m Free',
+ 'Join Together',
+ 'Long Live Rock',
+ 'Love Reign O\'er Me',
+ 'Magic Bus',
+ 'My Generation',
+ 'Pinball Wizard',
+ 'Shakin\' All Over',
+ 'Squeeze Box',
+ 'Substitute',
+ 'Summertime Blues',
+ 'The Kids Are Alright',
+ 'The Real Me',
+ 'THE SEEKER',
+ 'THE SONG IS OVER',
+ 'We\'re Not Gonna Take It',
+ 'Who Are You',
+ 'Won\'t Get Fooled Again',
+ 'You Better You Bet',
+ 'Get Together',
+ 'Jailbreak',
+ 'The Boys Are Back In Town',
+ 'The Cowboy Song',
+ 'Semi-Charmed Life',
+ 'Something In the Air',
+ 'Bang the Drum All Day',
+ 'Hello It\'s Me',
+ 'I Saw the Light',
+ 'We Gotta Get You a Woman',
+ 'Life Is a Highway',
+ 'A Face In The Crowd',
+ 'A Woman In Love',
+ 'American Dream Plan B',
+ 'American Girl',
+ 'Breakdown',
+ 'Change of Heart',
+ 'Don\'t Come Around Here No More',
+ 'Don\'t Do Me Like That',
+ 'Even the Losers',
+ 'Fooled Again (I Don\'t Like It)',
+ 'Free Fallin\'',
+ 'Here Comes My Girl',
+ 'I Need to Know',
+ 'I Won\'t Back Down',
+ 'Into the Great Wide Open',
+ 'Jammin\' Me',
+ 'Learning To Fly',
+ 'Listen To Your Heart',
+ 'Mary Jane\'s Last Dance',
+ 'Refugee',
+ 'Runnin\' Down a Dream',
+ 'Stop Draggin\' My Heart Around',
+ 'The Waiting',
+ 'U Get Me High',
+ 'Yer So Bad',
+ 'You Don\'t Know How It Feels',
+ 'You Get Me High',
+ 'You Got Lucky',
+ 'You Wreck Me',
+ '867-5309 / Jenny',
+ 'If You Could Only See',
+ 'AFRICA',
+ 'Hold The Line',
+ 'Dear Mr. Fantasy',
+ 'Empty Pages',
+ 'Medicated Goo',
+ 'Medusa',
+ 'Fight The Good Fight',
+ 'Hold On',
+ 'I Can Survive',
+ 'Lay It On the Line',
+ 'Magic Power',
+ 'Happy Together',
+ 'I Wanna Rock',
+ 'We\'re Not Gonna Take It',
+ 'Angel Of Harlem',
+ 'Bad',
+ 'Beautiful Day',
+ 'Bullet the Blue Sky',
+ 'Desire',
+ 'Even Better Than the Real Thing',
+ 'I Still Haven\'t Found What I\'m Looking For',
+ 'I Will Follow',
+ 'MLK/Pride',
+ 'Mysterious Ways',
+ 'New Year\'s Day',
+ 'One',
+ 'Pride (In the Name of Love)',
+ 'Sunday Bloody Sunday',
+ 'Sweetest Thing',
+ 'Vertigo',
+ 'When Love Comes to Town',
+ 'Where the Streets Have No Name',
+ 'With Or Without You',
+ 'Red Red Wine',
+ 'Lights Out (Live)',
+ 'Too Hot To Handle',
+ 'Easy Livin\'',
+ 'Stealin\'',
+ 'The Wizard',
+ '(Oh) Pretty Woman',
+ '1984/jump',
+ 'Ain\'t Talkin\' \'bout Love',
+ 'And the Cradle Will Rock...',
+ 'Atomic Punk',
+ 'Beautiful Girls',
+ 'Best Of Both Worlds',
+ 'Black And Blue',
+ 'Dance the Night Away',
+ 'Dancing In the Street',
+ 'Dreams',
+ 'Drop Dead Legs',
+ 'Eruption - You Really Got Me',
+ 'Everybody Wants Some!!',
+ 'Feel Your Love Tonight',
+ 'Feels So Good',
+ 'Finish What Ya Started',
+ 'Hot for Teacher',
+ 'I\'ll Wait',
+ 'I\'m the One',
+ 'Ice Cream Man',
+ 'Intruder/ Pretty Woman',
+ 'Jamie\'s Cryin\'',
+ 'Jump',
+ 'Little Dreamer',
+ 'Little Guitars',
+ 'Love Walks In',
+ 'Mean Street',
+ 'Panama',
+ 'Poundcake',
+ 'PRETTY WOMAN',
+ 'Right Now',
+ 'Runaround',
+ 'Runnin\' with the Devil',
+ 'Somebody Get Me A Doctor',
+ 'Summer Nights',
+ 'Take Your Whiskey Home',
+ 'Top Jimmy',
+ 'Top of the World',
+ 'Unchained',
+ 'When It\'s Love',
+ 'Where Have All the Good Times Gone!',
+ 'Why Can\'t This Be Love',
+ 'You Really Got Me',
+ 'And It Stoned Me',
+ 'BLUE MONEY',
+ 'Brown Eyed Girl',
+ 'CRAZY LOVE',
+ 'Domino',
+ 'Gloria',
+ 'Into The Mystic',
+ 'Jackie Wilson Said',
+ 'Moondance',
+ 'Wild Night',
+ 'Blister In the Sun',
+ 'Edge of a Broken Heart',
+ 'Low Rider',
+ 'Spill the Wine',
+ 'The Cisco Kid',
+ 'Why Can\'t We Be Friends',
+ 'Cherry Pie',
+ 'Uncle Tom\'s Cabin',
+ 'Lawyers, Guns and Money',
+ 'Werewolves of London',
+ 'Buddy Holly',
+ 'Street Corner Serenade',
+ 'Wait',
+ 'Fool for Your Loving',
+ 'Here I Go Again',
+ 'Is This Love',
+ 'Slide It In',
+ 'Slow An\' Easy',
+ 'Still of the Night',
+ 'Who Are You?',
+ 'PLAY THAT FUNKY MUSIC',
+ 'Night Moves',
+ 'We\'ve Got Tonight',
+ 'Can\'t Get Enough',
+ 'Headed For A Heartbreak',
+ 'Seventeen',
+ 'Persephone',
+ 'Summertime Girls',
+ 'Changes',
+ 'I\'ve Seen All Good People',
+ 'It Can Happen',
+ 'Leave It',
+ 'Long Distance Runaround',
+ 'Owner of a Lonely Heart',
+ 'Roundabout',
+ 'Starship Trooper',
+ 'Wonderous Stories',
+ 'Yours Is No Disgrace',
+ 'Tell Me What You Want',
+ 'Who\'s Behind The Door',
+ 'Time of the Season',
+ 'A Fool for Your Stockings',
+ 'Arrested For Driving While Blind',
+ 'Beer Drinkers & Hell Raisers',
+ 'Cheap Sunglasses',
+ 'Gimme All Your Lovin',
+ 'Got Me Under Pressure',
+ 'Heard It On the X',
+ 'I Thank You',
+ 'I\'m Bad, I\'m Nationwide',
+ 'Jesus Just Left Chicago',
+ 'Just Got Paid',
+ 'La Grange',
+ 'Legs',
+ 'My Head\'s In Mississippi',
+ 'Party On The Patio',
+ 'Pearl Necklace',
+ 'Sharp Dressed Man',
+ 'She Loves My Automobile',
+ 'Tube Snake Boogie',
+ 'Tush',
+ 'TV Dinners',
+ 'WAITIN\' FOR THE BUS/JESUS JUST LEFT CHICAGO',
+];
diff --git a/src/pages/404.tsx b/src/pages/404.tsx
new file mode 100644
index 000000000..fcaca6412
--- /dev/null
+++ b/src/pages/404.tsx
@@ -0,0 +1,114 @@
+/** @jsx jsx */
+import { css, jsx } from '@emotion/core';
+import { createLogger } from '@unly/utils-simple-logger';
+import { GetStaticProps, NextPage } from 'next';
+import { NextRouter, useRouter } from 'next/router';
+// eslint-disable-next-line @typescript-eslint/no-unused-vars,no-unused-vars
+import React from 'react';
+import DefaultLayout from '../components/pageLayouts/DefaultLayout';
+import { StaticParams } from '../types/nextjs/StaticParams';
+import { SoftPageProps } from '../types/pageProps/SoftPageProps';
+import { SSGPageProps } from '../types/pageProps/SSGPageProps';
+import { DEFAULT_LOCALE, LANG_EN, LANG_FR } from '../utils/i18n/i18n';
+import { getCommonStaticProps } from '../utils/nextjs/SSG';
+
+const fileLabel = 'pages/404';
+const logger = createLogger({ // eslint-disable-line no-unused-vars,@typescript-eslint/no-unused-vars
+ label: fileLabel,
+});
+
+/**
+ * Only executed on the server side at build time.
+ *
+ * @return Props (as "SSGPageProps") that will be passed to the Page component, as props
+ *
+ * @see https://github.com/zeit/next.js/discussions/10949#discussioncomment-6884
+ * @see https://nextjs.org/docs/basic-features/data-fetching#getstaticprops-static-generation
+ */
+export const getStaticProps: GetStaticProps = getCommonStaticProps;
+
+/**
+ * SSG pages are first rendered by the server (during static bundling)
+ * Then, they're rendered by the client, and gain additional props (defined in OnlyBrowserPageProps)
+ * Because this last case is the most common (server bundle only happens during development stage), we consider it a default
+ * To represent this behaviour, we use the native Partial TS keyword to make all OnlyBrowserPageProps optional
+ *
+ * Beware props in OnlyBrowserPageProps are not available on the server
+ */
+type Props = {} & SoftPageProps;
+
+const Fr404 = (): JSX.Element => {
+ return (
+ <>
+ Page non trouvée
+
+
+ La page que vous recherchez n'existe pas
+
+ >
+ );
+};
+
+const En404 = (): JSX.Element => {
+ return (
+ <>
+ Page not found
+
+
+ The page you're looking for doesn't exist
+
+ >
+ );
+};
+
+/**
+ * "404 not found" page, doesn't support i18n
+ *
+ * Doesn't use "getStaticPaths" because it's not supported by Next.js "getStaticPaths can only be used with dynamic pages, not '/404'."
+ *
+ * XXX The "locale" cannot be resolved properly using SSG on 404 pages, because this file doesn't belong to the "/[locale]" folder and thus doesn't benefit from url rewriting
+ * Therefore, the page will be displayed based on the DEFAULT_LOCALE value and not on the actual end-user locale
+ *
+ * @param props
+ * @see https://nextjs.org/docs/advanced-features/custom-error-page#404-page
+ */
+const NotFound404Page: NextPage = (props): JSX.Element => {
+ const router: NextRouter = useRouter();
+ const locale = router?.asPath?.split('/')?.[1] || DEFAULT_LOCALE;
+ const lang: string = locale.split('-')?.[0];
+ let content: JSX.Element;
+
+ switch (lang) {
+ case LANG_FR:
+ content = ;
+ break;
+ case LANG_EN:
+ content = ;
+ break;
+ default:
+ content = ;
+ break;
+ }
+
+ // We can display a custom message based on the lang, but the other parts of the app won't be translated (nav, footer)
+ // Also, it has to be hardcoded, it cannot be stored on Locize, because we don't have access to translations from other languages
+ return (
+
+
+ {content}
+
+
+ );
+};
+
+export default NotFound404Page;
diff --git a/src/pages/README.md b/src/pages/README.md
new file mode 100644
index 000000000..1e4930770
--- /dev/null
+++ b/src/pages/README.md
@@ -0,0 +1,23 @@
+# Next.js pages
+
+[Official documentation](https://nextjs.org/docs/basic-features/pages)
+
+## Native optimisations
+
+Next.js automatically optimise the page client build based on whether they implement `getStaticProps` (SSG) or `getServerSideProps` (SSR).
+
+For instance, all code within `getStaticProps` and `getServerSideProps` is automatically stripped from the browser bundle.
+But, it's also the case for top-level `import` that are only used within those functions.
+
+### Visualise bundle optimisation
+
+[https://next-code-elimination.now.sh/](https://next-code-elimination.now.sh/) will help you visualise the difference between the code you write and what's actually bundled into the client.
+
+Example with:
+- [https://next-code-elimination.now.sh/s/hc9SWg_fj]([locale]/examples/pageTemplateSSG)
+- [https://next-code-elimination.now.sh/s/M0oIDdQJ2]([locale]/examples/pageTemplateSSR)
+- [https://next-code-elimination.now.sh/s/nejeyE9MH]([locale]/examples/native-features/example-with-ssg-and-fallback/[albumId])
+
+> You'll notice for both those files that server-side module imports such as `ApolloQueryResult` are completely stripped from the client-side build.
+>
+> Also, for `[albumId]`, relative imports such as `songs` are also automatically stripped!
diff --git a/src/pages/[locale]/examples/built-in-features/analytics.tsx b/src/pages/[locale]/examples/built-in-features/analytics.tsx
new file mode 100644
index 000000000..fec2e5014
--- /dev/null
+++ b/src/pages/[locale]/examples/built-in-features/analytics.tsx
@@ -0,0 +1,228 @@
+/** @jsx jsx */
+import { jsx } from '@emotion/core';
+import { createLogger } from '@unly/utils-simple-logger';
+import { GetStaticPaths, GetStaticProps, NextPage } from 'next';
+// eslint-disable-next-line @typescript-eslint/no-unused-vars,no-unused-vars
+import React from 'react';
+import { Alert } from 'reactstrap';
+import BuiltInFeaturesSidebar from '../../../../components/doc/BuiltInFeaturesSidebar';
+import DocPage from '../../../../components/doc/DocPage';
+import DefaultLayout from '../../../../components/pageLayouts/DefaultLayout';
+import Code from '../../../../components/utils/Code';
+import ExternalLink from '../../../../components/utils/ExternalLink';
+import withApollo from '../../../../hocs/withApollo';
+import { StaticParams } from '../../../../types/nextjs/StaticParams';
+import { OnlyBrowserPageProps } from '../../../../types/pageProps/OnlyBrowserPageProps';
+import { SSGPageProps } from '../../../../types/pageProps/SSGPageProps';
+import { getCommonStaticPaths, getCommonStaticProps } from '../../../../utils/nextjs/SSG';
+
+const fileLabel = 'pages/[locale]/examples/built-in-features/analytics';
+const logger = createLogger({ // eslint-disable-line no-unused-vars,@typescript-eslint/no-unused-vars
+ label: fileLabel,
+});
+
+/**
+ * Only executed on the server side at build time
+ * Necessary when a page has dynamic routes and uses "getStaticProps"
+ */
+export const getStaticPaths: GetStaticPaths = getCommonStaticPaths;
+
+/**
+ * Only executed on the server side at build time.
+ *
+ * @return Props (as "SSGPageProps") that will be passed to the Page component, as props
+ *
+ * @see https://github.com/zeit/next.js/discussions/10949#discussioncomment-6884
+ * @see https://nextjs.org/docs/basic-features/data-fetching#getstaticprops-static-generation
+ */
+export const getStaticProps: GetStaticProps = getCommonStaticProps;
+
+/**
+ * SSG pages are first rendered by the server (during static bundling)
+ * Then, they're rendered by the client, and gain additional props (defined in OnlyBrowserPageProps)
+ * Because this last case is the most common (server bundle only happens during development stage), we consider it a default
+ * To represent this behaviour, we use the native Partial TS keyword to make all OnlyBrowserPageProps optional
+ *
+ * Beware props in OnlyBrowserPageProps are not available on the server
+ */
+type Props = {} & SSGPageProps>;
+
+const ExampleAnalyticsPage: NextPage = (props): JSX.Element => {
+ return (
+
+
+ Analytics examples, using Amplitude vendor
+
+
+ Before investing time in Amplitude, make sure to check
+
+ their pricing and usage limits
+
+ .
+ Amplitude is great for getting started but if you need more than what the free plan offers, then you better make sure you can afford it.
+
+
+
+ Amplitude provides a React component
+ that makes it a breeze to work with, and we really love it.
+ It's much more comfortable from a developer standpoint that everything we've worked with by the past.
+
+ We only use Amplitude from the client, mostly because Amplitude didn't provide a nodejs compatible library until very recently.
+ Also, we prefer to perform all reporting on the client side, as it avoids issues with multiple events sent by mistake.
+
+
+
+ The app is configured in a way that all usual web-related analytics options are handled out the box.
+ It also comes with a shared configuration for all pages (see below) and user-session tracking.
+ Regarding GDPR concerns , the IP address is tracked, and a cookie is created on the device by default.
+
+
+
+
+
+ The below code is the shared configuration between all pages.
+ It initializes the whole thing, and automatically track app-wide data so that all event will contain those properties automatically.
+
+
+
+
+
+
+ // ... elsewhere
+
+ // See https://help.amplitude.com/hc/en-us/articles/115001361248#settings-configuration-options
+ amplitudeInstance.init(process.env.AMPLITUDE_API_KEY, null, {
+ userId,
+ logLevel: process.env.APP_STAGE === 'production' ? 'DISABLE' : 'WARN',
+ includeGclid: true,
+ includeReferrer: true, // See https://help.amplitude.com/hc/en-us/articles/215131888#track-referrers
+ includeUtm: true,
+ // @ts-ignore XXX onError should be allowed, see https://github.com/DefinitelyTyped/DefinitelyTyped/issues/42005
+ onError: (error): void => {
+ Sentry.captureException(error);
+ console.error(error); // eslint-disable-line no-console
+ },
+ });
+
+ amplitudeInstance.setVersionName(process.env.APP_VERSION); // e.g: 1.0.0
+
+ // We're only doing this when detecting a new session, as it won't be executed multiple times for the same session anyway, and it avoids noise
+ if (amplitudeInstance.isNewSession()) {
+ // Store whether the visitor originally came from an iframe (and from where)
+ const visitor: Identify = new amplitudeInstance.Identify();
+ // XXX Learn more about "setOnce" at https://github.com/amplitude/Amplitude-JavaScript/issues/223
+ visitor.setOnce('initial_lang', lang); // DA Helps figuring out if the initial language (auto-detected) is changed afterwards
+ visitor.setOnce('initial_locale', locale);
+ // DA This will help track down the users who discovered our platform because of an iframe
+ visitor.setOnce('initial_iframe', isInIframe);
+ visitor.setOnce('initial_iframeReferrer', iframeReferrer);
+
+ // XXX We set all "must-have" properties here (instead of doing it in the "AmplitudeProvider", as userProperties), because react-amplitude will send the next "page-displayed" event BEFORE sending the $identify event
+ visitor.setOnce('customer.ref', customerRef);
+ visitor.setOnce('lang', lang);
+ visitor.setOnce('locale', locale);
+ visitor.setOnce('iframe', isInIframe);
+ visitor.setOnce('iframeReferrer', iframeReferrer);
+
+ amplitudeInstance.identify(visitor); // Send the new identify event to amplitude (updates user's identity)
+ }
+ `}
+ />
+
+
+
+
+ Below is how we automatically track all page views (through the DefaultLayout
component):
+
+
+ ({
+ // All app-wide properties are inherited and overloaded to track additional properties
+ ...inheritedProps,
+ page: {
+ ...inheritedProps.page,
+ name: pageName,
+ },
+ })}
+ >
+ {/* The event is automatically sent upon component mount */}
+
+
+ `}
+ />
+
+
+
+
+ Below is how we log events upon user interaction (i.e: click)
+
+
+
+ {({ logEvent }): JSX.Element => (
+ {
+ logEvent('open-github-doc', {
+ additionalProps1: 'something', // It automatically inherits the analytic context and allows override/overload
+ }); // This will send the even to amplitude
+ }}
+ >
+
+ {t('nav.githubDocPage.link', 'Documentation')}
+
+ )}
+
+ `}
+ />
+
+
+
+ );
+};
+
+export default withApollo()(ExampleAnalyticsPage);
diff --git a/src/pages/[locale]/examples/built-in-features/animations.tsx b/src/pages/[locale]/examples/built-in-features/animations.tsx
new file mode 100644
index 000000000..525849d1c
--- /dev/null
+++ b/src/pages/[locale]/examples/built-in-features/animations.tsx
@@ -0,0 +1,106 @@
+/** @jsx jsx */
+import { jsx } from '@emotion/core';
+import { createLogger } from '@unly/utils-simple-logger';
+import { GetStaticPaths, GetStaticProps, NextPage } from 'next';
+// eslint-disable-next-line @typescript-eslint/no-unused-vars,no-unused-vars
+import React from 'react';
+import BuiltInFeaturesSidebar from '../../../../components/doc/BuiltInFeaturesSidebar';
+import DocPage from '../../../../components/doc/DocPage';
+import DefaultLayout from '../../../../components/pageLayouts/DefaultLayout';
+import AnimatedLoader from '../../../../components/svg/AnimatedLoader';
+import Code from '../../../../components/utils/Code';
+import ExternalLink from '../../../../components/utils/ExternalLink';
+import withApollo from '../../../../hocs/withApollo';
+import { StaticParams } from '../../../../types/nextjs/StaticParams';
+import { OnlyBrowserPageProps } from '../../../../types/pageProps/OnlyBrowserPageProps';
+import { SSGPageProps } from '../../../../types/pageProps/SSGPageProps';
+import { getCommonStaticPaths, getCommonStaticProps } from '../../../../utils/nextjs/SSG';
+
+const fileLabel = 'pages/[locale]/examples/built-in-features/animations';
+const logger = createLogger({ // eslint-disable-line no-unused-vars,@typescript-eslint/no-unused-vars
+ label: fileLabel,
+});
+
+/**
+ * Only executed on the server side at build time
+ * Necessary when a page has dynamic routes and uses "getStaticProps"
+ */
+export const getStaticPaths: GetStaticPaths = getCommonStaticPaths;
+
+/**
+ * Only executed on the server side at build time.
+ *
+ * @return Props (as "SSGPageProps") that will be passed to the Page component, as props
+ *
+ * @see https://github.com/zeit/next.js/discussions/10949#discussioncomment-6884
+ * @see https://nextjs.org/docs/basic-features/data-fetching#getstaticprops-static-generation
+ */
+export const getStaticProps: GetStaticProps = getCommonStaticProps;
+
+/**
+ * SSG pages are first rendered by the server (during static bundling)
+ * Then, they're rendered by the client, and gain additional props (defined in OnlyBrowserPageProps)
+ * Because this last case is the most common (server bundle only happens during development stage), we consider it a default
+ * To represent this behaviour, we use the native Partial TS keyword to make all OnlyBrowserPageProps optional
+ *
+ * Beware props in OnlyBrowserPageProps are not available on the server
+ */
+type Props = {} & SSGPageProps>;
+
+const ExampleAnimationPage: NextPage = (props): JSX.Element => {
+ return (
+
+
+ CSS animations examples, using Animate.css
+
+
+ We decided to use animate.css because it's very easy to get started with,
+ and very lightweight too.
+
+
+
+
+
+
+ {
+ return (
+
+
+
+
+ );
+ };
+
+
+ `}
+ />
+
+
+
+ );
+};
+
+export default withApollo()(ExampleAnimationPage);
diff --git a/src/pages/[locale]/examples/built-in-features/css-in-js.tsx b/src/pages/[locale]/examples/built-in-features/css-in-js.tsx
new file mode 100644
index 000000000..267d90e66
--- /dev/null
+++ b/src/pages/[locale]/examples/built-in-features/css-in-js.tsx
@@ -0,0 +1,147 @@
+/** @jsx jsx */
+import { jsx } from '@emotion/core';
+import { createLogger } from '@unly/utils-simple-logger';
+import { GetStaticPaths, GetStaticProps, NextPage } from 'next';
+// eslint-disable-next-line @typescript-eslint/no-unused-vars,no-unused-vars
+import React from 'react';
+import { Alert } from 'reactstrap';
+import BuiltInFeaturesSidebar from '../../../../components/doc/BuiltInFeaturesSidebar';
+import DocPage from '../../../../components/doc/DocPage';
+import DefaultLayout from '../../../../components/pageLayouts/DefaultLayout';
+import Code from '../../../../components/utils/Code';
+import ExternalLink from '../../../../components/utils/ExternalLink';
+import withApollo from '../../../../hocs/withApollo';
+import { StaticParams } from '../../../../types/nextjs/StaticParams';
+import { OnlyBrowserPageProps } from '../../../../types/pageProps/OnlyBrowserPageProps';
+import { SSGPageProps } from '../../../../types/pageProps/SSGPageProps';
+import { getCommonStaticPaths, getCommonStaticProps } from '../../../../utils/nextjs/SSG';
+
+const fileLabel = 'pages/[locale]/examples/built-in-features/css-in-js';
+const logger = createLogger({ // eslint-disable-line no-unused-vars,@typescript-eslint/no-unused-vars
+ label: fileLabel,
+});
+
+/**
+ * Only executed on the server side at build time
+ * Necessary when a page has dynamic routes and uses "getStaticProps"
+ */
+export const getStaticPaths: GetStaticPaths = getCommonStaticPaths;
+
+/**
+ * Only executed on the server side at build time.
+ *
+ * @return Props (as "SSGPageProps") that will be passed to the Page component, as props
+ *
+ * @see https://github.com/zeit/next.js/discussions/10949#discussioncomment-6884
+ * @see https://nextjs.org/docs/basic-features/data-fetching#getstaticprops-static-generation
+ */
+export const getStaticProps: GetStaticProps = getCommonStaticProps;
+
+/**
+ * SSG pages are first rendered by the server (during static bundling)
+ * Then, they're rendered by the client, and gain additional props (defined in OnlyBrowserPageProps)
+ * Because this last case is the most common (server bundle only happens during development stage), we consider it a default
+ * To represent this behaviour, we use the native Partial TS keyword to make all OnlyBrowserPageProps optional
+ *
+ * Beware props in OnlyBrowserPageProps are not available on the server
+ */
+type Props = {} & SSGPageProps>;
+
+const ExampleCssInJsPage: NextPage = (props): JSX.Element => {
+ return (
+
+
+ CSS-in-JS examples, using Emotion library
+
+
+ A lot of research has been done to select the most robust css-in-js library, and we eventually chose
+ Emotion .
+ After more than a year working with it at a production-grade level, we haven't noticed any drawbacks.
+
+ Emotion allows to use both the styled component
and JSX-like ways of writing your CSS styles, as showcased below.
+
+
+
+ Our personal preference is to use JSX-like way of writing styles, instead of the Styled Components approach.
+ We want to make it clear that such choice is personal, and we have selected on purpose Emotion, because it allows both.
+ In our opinion, the JSX way is better for iterating quickly when you don't know exactly the shape of your components.
+ The choice is yours, do as you like!
+
+
+
+ The below example uses the JSX way, with CSS written directly in the element.
+
+
+
+ Top-level content
+
+ Child content
+
+ `}
+ />
+
+
+
+
+ The below example uses the Styled Component way, with CSS written in a dedicated React Component.
+
+
+ {
+ const { onClick } = props;
+ return (
+
+
+
+
+ );
+};
+
+export default withApollo()(ExampleCssInJsPage);
diff --git a/src/pages/[locale]/examples/built-in-features/docs-site.tsx b/src/pages/[locale]/examples/built-in-features/docs-site.tsx
new file mode 100644
index 000000000..c99a1ab0c
--- /dev/null
+++ b/src/pages/[locale]/examples/built-in-features/docs-site.tsx
@@ -0,0 +1,88 @@
+/** @jsx jsx */
+import { jsx } from '@emotion/core';
+import { createLogger } from '@unly/utils-simple-logger';
+import { GetStaticPaths, GetStaticProps, NextPage } from 'next';
+// eslint-disable-next-line @typescript-eslint/no-unused-vars,no-unused-vars
+import React from 'react';
+import { Alert } from 'reactstrap';
+import BuiltInFeaturesSidebar from '../../../../components/doc/BuiltInFeaturesSidebar';
+import DocPage from '../../../../components/doc/DocPage';
+import DefaultLayout from '../../../../components/pageLayouts/DefaultLayout';
+import ExternalLink from '../../../../components/utils/ExternalLink';
+import withApollo from '../../../../hocs/withApollo';
+import { StaticParams } from '../../../../types/nextjs/StaticParams';
+import { OnlyBrowserPageProps } from '../../../../types/pageProps/OnlyBrowserPageProps';
+import { SSGPageProps } from '../../../../types/pageProps/SSGPageProps';
+import { getCommonStaticPaths, getCommonStaticProps } from '../../../../utils/nextjs/SSG';
+
+const fileLabel = 'pages/[locale]/examples/built-in-features/docs-site';
+const logger = createLogger({ // eslint-disable-line no-unused-vars,@typescript-eslint/no-unused-vars
+ label: fileLabel,
+});
+
+/**
+ * Only executed on the server side at build time
+ * Necessary when a page has dynamic routes and uses "getStaticProps"
+ */
+export const getStaticPaths: GetStaticPaths = getCommonStaticPaths;
+
+/**
+ * Only executed on the server side at build time.
+ *
+ * @return Props (as "SSGPageProps") that will be passed to the Page component, as props
+ *
+ * @see https://github.com/zeit/next.js/discussions/10949#discussioncomment-6884
+ * @see https://nextjs.org/docs/basic-features/data-fetching#getstaticprops-static-generation
+ */
+export const getStaticProps: GetStaticProps = getCommonStaticProps;
+
+/**
+ * SSG pages are first rendered by the server (during static bundling)
+ * Then, they're rendered by the client, and gain additional props (defined in OnlyBrowserPageProps)
+ * Because this last case is the most common (server bundle only happens during development stage), we consider it a default
+ * To represent this behaviour, we use the native Partial TS keyword to make all OnlyBrowserPageProps optional
+ *
+ * Beware props in OnlyBrowserPageProps are not available on the server
+ */
+type Props = {} & SSGPageProps>;
+
+const DocsSiteExamplePage: NextPage = (props): JSX.Element => {
+ return (
+
+
+ Docs site, using GitHub Pages
+
+
+ GitHub Pages is a great and simple way to host documentation about your app.
+ Whether it's meant for internal or public use, you can use GitHub Pages to host your documentation.
+ Note that you'll need to secure access accordingly if it's meant for a private use only.
+
+
+
+ NRN own documentation
+ uses GitHub Pages.
+ We love the result, but it wasn't that easy to setup, to be honest.
+
+ So, in order to help you get starter faster, we put together a very simple example, based on what we did for NRN own docs site.
+ We hope you love it.
+
+
+
+
+
+ You can follow NRN own docs installation guide to configure and run your own local install of Jekyll.
+
+
+
+
+ );
+};
+
+export default withApollo()(DocsSiteExamplePage);
diff --git a/src/pages/[locale]/examples/built-in-features/graphql.tsx b/src/pages/[locale]/examples/built-in-features/graphql.tsx
new file mode 100644
index 000000000..59f995f56
--- /dev/null
+++ b/src/pages/[locale]/examples/built-in-features/graphql.tsx
@@ -0,0 +1,150 @@
+/** @jsx jsx */
+import { jsx } from '@emotion/core';
+import { createLogger } from '@unly/utils-simple-logger';
+import { GetStaticPaths, GetStaticProps, NextPage } from 'next';
+// eslint-disable-next-line @typescript-eslint/no-unused-vars,no-unused-vars
+import React from 'react';
+import { Alert } from 'reactstrap';
+import BuiltInFeaturesSidebar from '../../../../components/doc/BuiltInFeaturesSidebar';
+import DocPage from '../../../../components/doc/DocPage';
+import DefaultLayout from '../../../../components/pageLayouts/DefaultLayout';
+import Code from '../../../../components/utils/Code';
+import withApollo from '../../../../hocs/withApollo';
+import { StaticParams } from '../../../../types/nextjs/StaticParams';
+import { OnlyBrowserPageProps } from '../../../../types/pageProps/OnlyBrowserPageProps';
+import { SSGPageProps } from '../../../../types/pageProps/SSGPageProps';
+import { getCommonStaticPaths, getCommonStaticProps } from '../../../../utils/nextjs/SSG';
+
+const fileLabel = 'pages/[locale]/examples/built-in-features/graphql';
+const logger = createLogger({ // eslint-disable-line no-unused-vars,@typescript-eslint/no-unused-vars
+ label: fileLabel,
+});
+
+/**
+ * Only executed on the server side at build time
+ * Necessary when a page has dynamic routes and uses "getStaticProps"
+ */
+export const getStaticPaths: GetStaticPaths = getCommonStaticPaths;
+
+/**
+ * Only executed on the server side at build time.
+ *
+ * @return Props (as "SSGPageProps") that will be passed to the Page component, as props
+ *
+ * @see https://github.com/zeit/next.js/discussions/10949#discussioncomment-6884
+ * @see https://nextjs.org/docs/basic-features/data-fetching#getstaticprops-static-generation
+ */
+export const getStaticProps: GetStaticProps = getCommonStaticProps;
+
+/**
+ * SSG pages are first rendered by the server (during static bundling)
+ * Then, they're rendered by the client, and gain additional props (defined in OnlyBrowserPageProps)
+ * Because this last case is the most common (server bundle only happens during development stage), we consider it a default
+ * To represent this behaviour, we use the native Partial TS keyword to make all OnlyBrowserPageProps optional
+ *
+ * Beware props in OnlyBrowserPageProps are not available on the server
+ */
+type Props = {} & SSGPageProps>;
+
+const ExampleGraphQLPage: NextPage = (props): JSX.Element => {
+ return (
+
+
+ GraphQL examples, using GraphCMS vendor
+
+
+ Fetching APIs works slightly differently depending on whether you use SSG or SSR.
+
+ When you're using SSG, all queries are executed from the server side, during build generation, on your computer or your CI server.
+ When using SSR, queries are executed on the fly, from the client or from the server depending on how the page is served (CSR vs SSR).
+
+ Therefore, you need to be careful about tokens and other credentials you might use.
+ And you also need to consider performances (e.g: running all queries at once)
+
+ The below examples will focus on SSG, because that's what we recommend to use. But know that you may use both.
+ Also, you might want to run GraphQL queries from the browser even when using SSG, it's also possible but we don't provide such example at this time.
+
+
+ = await apolloClient.query(queryOptions);
+
+ if (errors) {
+ console.error(errors);
+ throw new Error('Errors were detected in GraphQL query.');
+ }
+
+ const {
+ customer, // We extract the data
+ } = data || {}; // XXX Use empty object as fallback, to avoid app crash when destructuring, if no data is returned
+ `}
+ />
+
+
+ The above code is what we actually use in getCommonStaticProps
, to fetch data that are shared by all SSG pages.
+
+
+
+ And here is what out GQL query looks like:
+
+
+
+
+
+ All our pages fetch some data from GraphCMS, because we need those in shared components (i.e: Footer, Nav)
+
+
+
+
+ );
+};
+
+export default withApollo()(ExampleGraphQLPage);
diff --git a/src/pages/[locale]/examples/built-in-features/hosting.tsx b/src/pages/[locale]/examples/built-in-features/hosting.tsx
new file mode 100644
index 000000000..87715fc83
--- /dev/null
+++ b/src/pages/[locale]/examples/built-in-features/hosting.tsx
@@ -0,0 +1,92 @@
+/** @jsx jsx */
+import { jsx } from '@emotion/core';
+import { createLogger } from '@unly/utils-simple-logger';
+import { GetStaticPaths, GetStaticProps, NextPage } from 'next';
+// eslint-disable-next-line @typescript-eslint/no-unused-vars,no-unused-vars
+import React from 'react';
+import { Alert } from 'reactstrap';
+import BuiltInFeaturesSidebar from '../../../../components/doc/BuiltInFeaturesSidebar';
+import DocPage from '../../../../components/doc/DocPage';
+import DefaultLayout from '../../../../components/pageLayouts/DefaultLayout';
+import Code from '../../../../components/utils/Code';
+import ExternalLink from '../../../../components/utils/ExternalLink';
+import withApollo from '../../../../hocs/withApollo';
+import { StaticParams } from '../../../../types/nextjs/StaticParams';
+import { OnlyBrowserPageProps } from '../../../../types/pageProps/OnlyBrowserPageProps';
+import { SSGPageProps } from '../../../../types/pageProps/SSGPageProps';
+import { getCommonStaticPaths, getCommonStaticProps } from '../../../../utils/nextjs/SSG';
+
+const fileLabel = 'pages/[locale]/examples/built-in-features/hosting';
+const logger = createLogger({ // eslint-disable-line no-unused-vars,@typescript-eslint/no-unused-vars
+ label: fileLabel,
+});
+
+/**
+ * Only executed on the server side at build time
+ * Necessary when a page has dynamic routes and uses "getStaticProps"
+ */
+export const getStaticPaths: GetStaticPaths = getCommonStaticPaths;
+
+/**
+ * Only executed on the server side at build time.
+ *
+ * @return Props (as "SSGPageProps") that will be passed to the Page component, as props
+ *
+ * @see https://github.com/zeit/next.js/discussions/10949#discussioncomment-6884
+ * @see https://nextjs.org/docs/basic-features/data-fetching#getstaticprops-static-generation
+ */
+export const getStaticProps: GetStaticProps = getCommonStaticProps;
+
+/**
+ * SSG pages are first rendered by the server (during static bundling)
+ * Then, they're rendered by the client, and gain additional props (defined in OnlyBrowserPageProps)
+ * Because this last case is the most common (server bundle only happens during development stage), we consider it a default
+ * To represent this behaviour, we use the native Partial TS keyword to make all OnlyBrowserPageProps optional
+ *
+ * Beware props in OnlyBrowserPageProps are not available on the server
+ */
+type Props = {} & SSGPageProps>;
+
+const HostingPage: NextPage = (props): JSX.Element => {
+ return (
+
+
+ Hosting, using Vercel vendor
+
+
+ Vercel is the company that made the Next.js framework.
+ Therefore, they made
+ some handy optimisations .
+ Not only deploying using Vercel is very easy, it also brings some enhancements out of the box, compared to different hosting vendors.
+
+
+
+ Vercel is very great if you just want to play around and build a POC or demo.
+ It's also great for real business apps, but like any other vendor, it's up to you to check if they pricing fits your usage.
+
+
+
+
+
+ We are a bit wary about recent changes and decisions made by the Vercel team, in particular regarding their 2020 April Pricing changes, and
+ we led a discussion about it .
+
+ Currently, the most controversial decision they've made is about the 12-24 max serverless functions.
+ We suggest you
+ learn heavily about that
+ if you're considering Vercel.
+
+
+
+
+ );
+};
+
+export default withApollo()(HostingPage);
diff --git a/src/pages/[locale]/examples/built-in-features/icons.tsx b/src/pages/[locale]/examples/built-in-features/icons.tsx
new file mode 100644
index 000000000..7cdb7ee25
--- /dev/null
+++ b/src/pages/[locale]/examples/built-in-features/icons.tsx
@@ -0,0 +1,127 @@
+/** @jsx jsx */
+import { jsx } from '@emotion/core';
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
+import { createLogger } from '@unly/utils-simple-logger';
+import { GetStaticPaths, GetStaticProps, NextPage } from 'next';
+// eslint-disable-next-line @typescript-eslint/no-unused-vars,no-unused-vars
+import React from 'react';
+import { Alert } from 'reactstrap';
+import BuiltInFeaturesSidebar from '../../../../components/doc/BuiltInFeaturesSidebar';
+import DocPage from '../../../../components/doc/DocPage';
+import DefaultLayout from '../../../../components/pageLayouts/DefaultLayout';
+import Code from '../../../../components/utils/Code';
+import withApollo from '../../../../hocs/withApollo';
+import { StaticParams } from '../../../../types/nextjs/StaticParams';
+import { OnlyBrowserPageProps } from '../../../../types/pageProps/OnlyBrowserPageProps';
+import { SSGPageProps } from '../../../../types/pageProps/SSGPageProps';
+import { getCommonStaticPaths, getCommonStaticProps } from '../../../../utils/nextjs/SSG';
+
+const fileLabel = 'pages/[locale]/examples/built-in-features/icons';
+const logger = createLogger({ // eslint-disable-line no-unused-vars,@typescript-eslint/no-unused-vars
+ label: fileLabel,
+});
+
+/**
+ * Only executed on the server side at build time
+ * Necessary when a page has dynamic routes and uses "getStaticProps"
+ */
+export const getStaticPaths: GetStaticPaths = getCommonStaticPaths;
+
+/**
+ * Only executed on the server side at build time.
+ *
+ * @return Props (as "SSGPageProps") that will be passed to the Page component, as props
+ *
+ * @see https://github.com/zeit/next.js/discussions/10949#discussioncomment-6884
+ * @see https://nextjs.org/docs/basic-features/data-fetching#getstaticprops-static-generation
+ */
+export const getStaticProps: GetStaticProps = getCommonStaticProps;
+
+/**
+ * SSG pages are first rendered by the server (during static bundling)
+ * Then, they're rendered by the client, and gain additional props (defined in OnlyBrowserPageProps)
+ * Because this last case is the most common (server bundle only happens during development stage), we consider it a default
+ * To represent this behaviour, we use the native Partial TS keyword to make all OnlyBrowserPageProps optional
+ *
+ * Beware props in OnlyBrowserPageProps are not available on the server
+ */
+type Props = {} & SSGPageProps>;
+
+const ExampleIconsPage: NextPage = (props): JSX.Element => {
+ return (
+
+
+ Icons examples, using Font-Awesome
+
+
+ FA provides a free icons set, and paid ones. NRN only comes with the free set.
+ But it is completely possible to use a paid icon set, if you wish so (we do in our Enterprise apps).
+
+
+
+
+
+ In order to make FA icons usable in both server-side and client-side, you need to manually import those you want to use in the _app
component, as follow:
+
+
+
+
+
+
+
+ You can then use FA icons like this:
+
+
+
+
+
+
+
+ Using the below code:
+
+
+
// fab stands for FontAwesome "Brand"
+ // fas stands for FontAwesome "Solid"
+ `}
+ />
+
+
+
+
+ TypeScript support will guide you when writing{' '}
+
+ {` `}
+
, by telling you if the icon is valid.
+
+
+
+
+ );
+};
+
+export default withApollo()(ExampleIconsPage);
diff --git a/src/pages/[locale]/examples/built-in-features/index.tsx b/src/pages/[locale]/examples/built-in-features/index.tsx
new file mode 100644
index 000000000..06c6b6f9f
--- /dev/null
+++ b/src/pages/[locale]/examples/built-in-features/index.tsx
@@ -0,0 +1,11 @@
+import { GetStaticPaths, GetStaticProps } from 'next';
+
+import { StaticParams } from '../../../../types/nextjs/StaticParams';
+import { SSGPageProps } from '../../../../types/pageProps/SSGPageProps';
+import HostingPage, { getStaticPaths as getStaticPathsHomePage, getStaticProps as getStaticPropsHomePage } from './hosting';
+
+// XXX This page is an "alias"
+export const getStaticPaths: GetStaticPaths = getStaticPathsHomePage;
+export const getStaticProps: GetStaticProps = getStaticPropsHomePage;
+
+export default HostingPage;
diff --git a/src/pages/[locale]/examples/built-in-features/manual-deployments.tsx b/src/pages/[locale]/examples/built-in-features/manual-deployments.tsx
new file mode 100644
index 000000000..e6199ad39
--- /dev/null
+++ b/src/pages/[locale]/examples/built-in-features/manual-deployments.tsx
@@ -0,0 +1,110 @@
+/** @jsx jsx */
+import { jsx } from '@emotion/core';
+import { createLogger } from '@unly/utils-simple-logger';
+import { GetStaticPaths, GetStaticProps, NextPage } from 'next';
+// eslint-disable-next-line @typescript-eslint/no-unused-vars,no-unused-vars
+import React from 'react';
+import { Alert } from 'reactstrap';
+import BuiltInFeaturesSidebar from '../../../../components/doc/BuiltInFeaturesSidebar';
+import DocPage from '../../../../components/doc/DocPage';
+import DefaultLayout from '../../../../components/pageLayouts/DefaultLayout';
+import Code from '../../../../components/utils/Code';
+import withApollo from '../../../../hocs/withApollo';
+import { StaticParams } from '../../../../types/nextjs/StaticParams';
+import { OnlyBrowserPageProps } from '../../../../types/pageProps/OnlyBrowserPageProps';
+import { SSGPageProps } from '../../../../types/pageProps/SSGPageProps';
+import { getCommonStaticPaths, getCommonStaticProps } from '../../../../utils/nextjs/SSG';
+
+const fileLabel = 'pages/[locale]/examples/built-in-features/manual-deployments';
+const logger = createLogger({ // eslint-disable-line no-unused-vars,@typescript-eslint/no-unused-vars
+ label: fileLabel,
+});
+
+/**
+ * Only executed on the server side at build time
+ * Necessary when a page has dynamic routes and uses "getStaticProps"
+ */
+export const getStaticPaths: GetStaticPaths = getCommonStaticPaths;
+
+/**
+ * Only executed on the server side at build time.
+ *
+ * @return Props (as "SSGPageProps") that will be passed to the Page component, as props
+ *
+ * @see https://github.com/zeit/next.js/discussions/10949#discussioncomment-6884
+ * @see https://nextjs.org/docs/basic-features/data-fetching#getstaticprops-static-generation
+ */
+export const getStaticProps: GetStaticProps = getCommonStaticProps;
+
+/**
+ * SSG pages are first rendered by the server (during static bundling)
+ * Then, they're rendered by the client, and gain additional props (defined in OnlyBrowserPageProps)
+ * Because this last case is the most common (server bundle only happens during development stage), we consider it a default
+ * To represent this behaviour, we use the native Partial TS keyword to make all OnlyBrowserPageProps optional
+ *
+ * Beware props in OnlyBrowserPageProps are not available on the server
+ */
+type Props = {} & SSGPageProps>;
+
+const ManualDeploymentsPage: NextPage = (props): JSX.Element => {
+ return (
+
+
+ Manual-deployments examples, using the CLI
+
+
+ CI/CD is great, but sometimes you need to manually deploy stuff from your computer.
+ This happens especially when you need to deploy an old version of the software, or want to avoid CI/CD (it's faster).
+
+ Also, they're necessary when you're running a MST app (Multiple Single Tenants), and want to deploy a specific tenant's app.
+ For example, we use it with MST to deploy our customers to production, CI/CD being configured to automatically deploy our own internal demo only.
+
+ Eventually, there are many reasons manual deploys can be necessary.
+ We don't encourage you to use them as your default workflow, but it can be handy sometimes.
+
+
+
+ Manual deployments are triggered through yarn/npm scripts.
+ We have one command for each customer (when running MST app) and for each stage (staging, production).
+ We also have helper commands meant to deploy all customers (per stage, etc.), similar to bulk actions.
+
+
+
+
+
+
+ Those commands are meant to be manually executed on your computer, and will use your local files when doing so.
+
+
+
+ They're also used by CI/CD scripts.
+ Note that when deploying through CI/CD, the deployed customer depends on which file is targeted as symbolic link by the now.json
file.
+ Changing the symbolic link, or "hardcoding" the file will change which customer gets deployed by default.
+ You can also change the way CI/CD works and deploy all your customers at once every time, but we preferred to deploy one customer in particular (our own internal demo) by default, as we judged it was less risky in case anything goes wrong.
+
+
+
+ );
+};
+
+export default withApollo()(ManualDeploymentsPage);
diff --git a/src/pages/[locale]/examples/built-in-features/monitoring.tsx b/src/pages/[locale]/examples/built-in-features/monitoring.tsx
new file mode 100644
index 000000000..5788e8898
--- /dev/null
+++ b/src/pages/[locale]/examples/built-in-features/monitoring.tsx
@@ -0,0 +1,107 @@
+/** @jsx jsx */
+import { jsx } from '@emotion/core';
+import { createLogger } from '@unly/utils-simple-logger';
+import { GetStaticPaths, GetStaticProps, NextPage } from 'next';
+// eslint-disable-next-line @typescript-eslint/no-unused-vars,no-unused-vars
+import React from 'react';
+import { Alert } from 'reactstrap';
+import BuiltInFeaturesSidebar from '../../../../components/doc/BuiltInFeaturesSidebar';
+import DocPage from '../../../../components/doc/DocPage';
+import DefaultLayout from '../../../../components/pageLayouts/DefaultLayout';
+import ExternalLink from '../../../../components/utils/ExternalLink';
+import withApollo from '../../../../hocs/withApollo';
+import { StaticParams } from '../../../../types/nextjs/StaticParams';
+import { OnlyBrowserPageProps } from '../../../../types/pageProps/OnlyBrowserPageProps';
+import { SSGPageProps } from '../../../../types/pageProps/SSGPageProps';
+import { getCommonStaticPaths, getCommonStaticProps } from '../../../../utils/nextjs/SSG';
+
+const fileLabel = 'pages/[locale]/examples/built-in-features/monitoring';
+const logger = createLogger({ // eslint-disable-line no-unused-vars,@typescript-eslint/no-unused-vars
+ label: fileLabel,
+});
+
+/**
+ * Only executed on the server side at build time
+ * Necessary when a page has dynamic routes and uses "getStaticProps"
+ */
+export const getStaticPaths: GetStaticPaths = getCommonStaticPaths;
+
+/**
+ * Only executed on the server side at build time.
+ *
+ * @return Props (as "SSGPageProps") that will be passed to the Page component, as props
+ *
+ * @see https://github.com/zeit/next.js/discussions/10949#discussioncomment-6884
+ * @see https://nextjs.org/docs/basic-features/data-fetching#getstaticprops-static-generation
+ */
+export const getStaticProps: GetStaticProps = getCommonStaticProps;
+
+/**
+ * SSG pages are first rendered by the server (during static bundling)
+ * Then, they're rendered by the client, and gain additional props (defined in OnlyBrowserPageProps)
+ * Because this last case is the most common (server bundle only happens during development stage), we consider it a default
+ * To represent this behaviour, we use the native Partial TS keyword to make all OnlyBrowserPageProps optional
+ *
+ * Beware props in OnlyBrowserPageProps are not available on the server
+ */
+type Props = {} & SSGPageProps>;
+
+const ExampleMonitoringPage: NextPage = (props): JSX.Element => {
+ return (
+
+
+ Monitoring examples, using Sentry
+
+
+ Monitoring works universally, both on the browser and the server.
+ The errors and stacktrace will be slightly different.
+ Also, source maps support is built-in. Beware that it doesn't work during development .
+
+
+
+
+ Log runtime exception
+
+ {`
+ try {
+ throw new Error('test');
+ } catch(e) {
+ Sentry.captureException(e);
+ }
+ `}
+
+
+
+
+ Log message
+
+ {`
+ Sentry.captureMessage(warning, Sentry.Severity.Warning);
+ `}
+
+
+
+
+
+ Breadcrumbs
+
+ (tracing that is only used in case an error happens)
+
+
+ {`Sentry.addBreadcrumb({category: fileLabel, message: 'Rendering'})`}
+
+
+
+
+
+ );
+};
+
+export default withApollo()(ExampleMonitoringPage);
diff --git a/src/pages/[locale]/examples/built-in-features/stages-and-secrets.tsx b/src/pages/[locale]/examples/built-in-features/stages-and-secrets.tsx
new file mode 100644
index 000000000..c5649b944
--- /dev/null
+++ b/src/pages/[locale]/examples/built-in-features/stages-and-secrets.tsx
@@ -0,0 +1,112 @@
+/** @jsx jsx */
+import { jsx } from '@emotion/core';
+import { createLogger } from '@unly/utils-simple-logger';
+import { GetStaticPaths, GetStaticProps, NextPage } from 'next';
+// eslint-disable-next-line @typescript-eslint/no-unused-vars,no-unused-vars
+import React from 'react';
+import { Alert } from 'reactstrap';
+import BuiltInFeaturesSidebar from '../../../../components/doc/BuiltInFeaturesSidebar';
+import DocPage from '../../../../components/doc/DocPage';
+import DefaultLayout from '../../../../components/pageLayouts/DefaultLayout';
+import Code from '../../../../components/utils/Code';
+import ExternalLink from '../../../../components/utils/ExternalLink';
+import withApollo from '../../../../hocs/withApollo';
+import { StaticParams } from '../../../../types/nextjs/StaticParams';
+import { OnlyBrowserPageProps } from '../../../../types/pageProps/OnlyBrowserPageProps';
+import { SSGPageProps } from '../../../../types/pageProps/SSGPageProps';
+import { getCommonStaticPaths, getCommonStaticProps } from '../../../../utils/nextjs/SSG';
+
+const fileLabel = 'pages/[locale]/examples/built-in-features/stages-and-secrets';
+const logger = createLogger({ // eslint-disable-line no-unused-vars,@typescript-eslint/no-unused-vars
+ label: fileLabel,
+});
+
+/**
+ * Only executed on the server side at build time
+ * Necessary when a page has dynamic routes and uses "getStaticProps"
+ */
+export const getStaticPaths: GetStaticPaths = getCommonStaticPaths;
+
+/**
+ * Only executed on the server side at build time.
+ *
+ * @return Props (as "SSGPageProps") that will be passed to the Page component, as props
+ *
+ * @see https://github.com/zeit/next.js/discussions/10949#discussioncomment-6884
+ * @see https://nextjs.org/docs/basic-features/data-fetching#getstaticprops-static-generation
+ */
+export const getStaticProps: GetStaticProps = getCommonStaticProps;
+
+/**
+ * SSG pages are first rendered by the server (during static bundling)
+ * Then, they're rendered by the client, and gain additional props (defined in OnlyBrowserPageProps)
+ * Because this last case is the most common (server bundle only happens during development stage), we consider it a default
+ * To represent this behaviour, we use the native Partial TS keyword to make all OnlyBrowserPageProps optional
+ *
+ * Beware props in OnlyBrowserPageProps are not available on the server
+ */
+type Props = {} & SSGPageProps>;
+
+const StagesAndSecretsPage: NextPage = (props): JSX.Element => {
+ return (
+
+
+ Stages & secrets, using the best of both Next.js and Vercel vendor
+
+
+ Next.js doesn't come with a built-in stages configuration. It doesn't know about the concept of "stage".
+ But it does help you about handling ENV vars, and Vercel helps about handling secrets.
+ It's a bit complex to get it right though, and that's where NRN comes in, to help you configure this and keep it simple.
+
+ Secrets are
+ securely stored
+ on Vercel.
+
+
+
+ Our setup puts the best of Vercel and Next together, it works differently depending on the stage.
+
+
+
+ development
:
+ All your secrets and env vars are configured in the .env.build
file.
+ When you're working locally, you're working on one project at a time.
+ Thus, all the config is located in a single file.
+
+
+ staging
and development
stages:
+ Your env vars are configured in the now.*.json
files, per customer and per stage.
+ Env vars are basically hardcoded in those files, while secrets are referenced there, but nobody can read their value.
+
+
+
+ Overall, we made it easy to use: Just hardcode your non-sensitive env vars in
now.*.json
and store your sensitive secrets on Vercel, that's it.
+
+
+
+ Beware about the "environment variables"
term, which may mean something different whether you mean it locally, or on Vercel.
+
+ Before, only secrets
existed, but since now@18
they've introduced the concept of environment variables
.
+ It can be a bit hard to understand how the 2 should be used together.
+ Basically put, secrets
are global and shared across all projects, while env vars
are scoped by project.
+ There are other differences , though.
+
+
+
+ This new "environment variable" feature made things more complicated to comprehend, in our opinion.
+ Therefore, we recommend to use the term secrets
for everything that's securely stored on Vercel, and the term environment variables
for everything that's not securely stored (git tracked, readable from code files).
+
+
+
+
+ );
+};
+
+export default withApollo()(StagesAndSecretsPage);
diff --git a/src/pages/[locale]/examples/built-in-features/static-i18n.tsx b/src/pages/[locale]/examples/built-in-features/static-i18n.tsx
new file mode 100644
index 000000000..e1545e347
--- /dev/null
+++ b/src/pages/[locale]/examples/built-in-features/static-i18n.tsx
@@ -0,0 +1,183 @@
+/** @jsx jsx */
+import { css, jsx } from '@emotion/core';
+import { createLogger } from '@unly/utils-simple-logger';
+import { GetStaticPaths, GetStaticProps, NextPage } from 'next';
+// eslint-disable-next-line @typescript-eslint/no-unused-vars,no-unused-vars
+import React from 'react';
+import { Trans, useTranslation } from 'react-i18next';
+import { Alert, Container } from 'reactstrap';
+import uuid from 'uuid/v1';
+import DocPage from '../../../../components/doc/DocPage';
+import DefaultLayout from '../../../../components/pageLayouts/DefaultLayout';
+import DisplayOnBrowserMount from '../../../../components/rehydration/DisplayOnBrowserMount';
+import ExternalLink from '../../../../components/utils/ExternalLink';
+import withApollo from '../../../../hocs/withApollo';
+import { StaticParams } from '../../../../types/nextjs/StaticParams';
+import { OnlyBrowserPageProps } from '../../../../types/pageProps/OnlyBrowserPageProps';
+import { SSGPageProps } from '../../../../types/pageProps/SSGPageProps';
+import { getCommonStaticPaths, getCommonStaticProps } from '../../../../utils/nextjs/SSG';
+import BuiltInFeaturesSidebar from '../../../../components/doc/BuiltInFeaturesSidebar';
+
+const fileLabel = 'pages/[locale]/examples/built-in-features/static-i18n';
+const logger = createLogger({ // eslint-disable-line no-unused-vars,@typescript-eslint/no-unused-vars
+ label: fileLabel,
+});
+
+/**
+ * Only executed on the server side at build time
+ * Necessary when a page has dynamic routes and uses "getStaticProps"
+ */
+export const getStaticPaths: GetStaticPaths = getCommonStaticPaths;
+
+/**
+ * Only executed on the server side at build time.
+ *
+ * @return Props (as "SSGPageProps") that will be passed to the Page component, as props
+ *
+ * @see https://github.com/zeit/next.js/discussions/10949#discussioncomment-6884
+ * @see https://nextjs.org/docs/basic-features/data-fetching#getstaticprops-static-generation
+ */
+export const getStaticProps: GetStaticProps = getCommonStaticProps;
+
+/**
+ * SSG pages are first rendered by the server (during static bundling)
+ * Then, they're rendered by the client, and gain additional props (defined in OnlyBrowserPageProps)
+ * Because this last case is the most common (server bundle only happens during development stage), we consider it a default
+ * To represent this behaviour, we use the native Partial TS keyword to make all OnlyBrowserPageProps optional
+ *
+ * Beware props in OnlyBrowserPageProps are not available on the server
+ */
+type Props = {} & SSGPageProps>;
+
+const ExampleStaticI18nPage: NextPage = (props): JSX.Element => {
+ const { t } = useTranslation();
+
+ return (
+
+
+ Static i18n examples, using i18next and Locize vendor
+
+
+ i18n
refers to both static content and dynamic content , even though both are handled very differently.
+ Read more about the concept
+
+
+
+ This section only showcases i18n for static content (nav, footer, etc.).
+ Dynamic content (DB records) is managed through GraphCMS and is completely unrelated.
+
+
+ NRN provides built-in static i18n support, based on:
+
+
+ i18next
package : Core dependency
+
+
+ react-i18next
package : What we actually use in NRN, mostly throught the t
and Trans
component.
+
+
+ Locize vendor packages (paid) : Vendor meant to help with static content localisation.
+ Read our "How to use" and learn more about what benefits it brings
+
+
+
+
+
+ Each example below shows the rendered version and the associated code snippet.
+ The goal is to showcase real-world examples to help you get started faster and give a wider overview of what's possible.
+
+ Check the official documentation
+
+
+
+
+
+
+ {t('examples.i18n.simpleTranslation', 'Traduction simple')}
+ {'{t(\'examples.i18n.simpleTranslation\', \'Traduction simple\')}'}
+
+
+
+
+ {t('examples.i18n.pluralTranslation', 'Traduction avec gestion du pluriel', { count: 1 })}
+ {'{t(\'examples.i18n.pluralTranslation\', \'Traduction avec gestion du pluriel\', { count: 1 })}'}
+
+
+ {t('examples.i18n.pluralTranslation', 'Traduction avec gestion du pluriel', { count: 2 })}
+ {'{t(\'examples.i18n.pluralTranslation\', \'Traduction avec gestion du pluriel\', { count: 2 })}'}
+
+
+
+
+
+
+ Contenu dynamique : {{ uuid: uuid() }}
+
+
+
+ {'\n' +
+ ' Contenu dynamique : {{ uuid: uuid() }} \n' +
+ ' '}
+
+
+
+
+
+
+
+ Nous avons trouvé {{ count: 1 }} solution pour vous.
+
+
+
+ {'\n' +
+ ' Nous avons trouvé {{ count: 1 }} solution pour vous.\n' +
+ ' '}
+
+
+
+
+
+
+ Nous avons trouvé {{ count: 2 }} solution pour vous.
+
+
+
+ {'\n' +
+ ' Nous avons trouvé {{ count: 2 }} solution pour vous.\n' +
+ ' '}
+
+
+
+
+
+ );
+};
+
+export default withApollo()(ExampleStaticI18nPage);
diff --git a/src/pages/[locale]/examples/built-in-features/ui-components.tsx b/src/pages/[locale]/examples/built-in-features/ui-components.tsx
new file mode 100644
index 000000000..09776f569
--- /dev/null
+++ b/src/pages/[locale]/examples/built-in-features/ui-components.tsx
@@ -0,0 +1,140 @@
+/** @jsx jsx */
+import { jsx } from '@emotion/core';
+import { createLogger } from '@unly/utils-simple-logger';
+import { GetStaticPaths, GetStaticProps, NextPage } from 'next';
+// eslint-disable-next-line @typescript-eslint/no-unused-vars,no-unused-vars
+import React from 'react';
+import { Alert, Button } from 'reactstrap';
+import BuiltInFeaturesSidebar from '../../../../components/doc/BuiltInFeaturesSidebar';
+import DocPage from '../../../../components/doc/DocPage';
+import DefaultLayout from '../../../../components/pageLayouts/DefaultLayout';
+import Code from '../../../../components/utils/Code';
+import ExternalLink from '../../../../components/utils/ExternalLink';
+import withApollo from '../../../../hocs/withApollo';
+import { StaticParams } from '../../../../types/nextjs/StaticParams';
+import { OnlyBrowserPageProps } from '../../../../types/pageProps/OnlyBrowserPageProps';
+import { SSGPageProps } from '../../../../types/pageProps/SSGPageProps';
+import { getCommonStaticPaths, getCommonStaticProps } from '../../../../utils/nextjs/SSG';
+import Tooltip from '../../../../components/utils/Tooltip';
+
+const fileLabel = 'pages/[locale]/examples/built-in-features/ui-components';
+const logger = createLogger({ // eslint-disable-line no-unused-vars,@typescript-eslint/no-unused-vars
+ label: fileLabel,
+});
+
+/**
+ * Only executed on the server side at build time
+ * Necessary when a page has dynamic routes and uses "getStaticProps"
+ */
+export const getStaticPaths: GetStaticPaths = getCommonStaticPaths;
+
+/**
+ * Only executed on the server side at build time.
+ *
+ * @return Props (as "SSGPageProps") that will be passed to the Page component, as props
+ *
+ * @see https://github.com/zeit/next.js/discussions/10949#discussioncomment-6884
+ * @see https://nextjs.org/docs/basic-features/data-fetching#getstaticprops-static-generation
+ */
+export const getStaticProps: GetStaticProps = getCommonStaticProps;
+
+/**
+ * SSG pages are first rendered by the server (during static bundling)
+ * Then, they're rendered by the client, and gain additional props (defined in OnlyBrowserPageProps)
+ * Because this last case is the most common (server bundle only happens during development stage), we consider it a default
+ * To represent this behaviour, we use the native Partial TS keyword to make all OnlyBrowserPageProps optional
+ *
+ * Beware props in OnlyBrowserPageProps are not available on the server
+ */
+type Props = {} & SSGPageProps>;
+
+const ExampleUIComponentsPage: NextPage = (props): JSX.Element => {
+ return (
+
+
+ UI components examples, using Reactstrap and Bootstrap
+
+
+ Reactstrap
+ is based on
+ Bootstrap 4 .
+
+ It wasn't an easy choice to decide which UI library to use, there are so many out there.
+ Eventually, we chose Bootstrap because it's very famous and seems more supported than its counterparts.
+ Also, it relatively lightweight (~40kB).
+ Eventually, it really depends on what you want to use, and while NRN comes with built-in Reactstrap support, we encourage you to chose what fits your needs best.
+
+
+
+ We won't showcase Reactstrap usage here, because
+ the official website
+ does it already (even though many things are missing, and examples could be better overall)...
+
+
+
+
+
+ Below, we will showcase a few components built-in with NRN:
+
+
+ Tooltip
+
+
+ The native Reactstrap tooltip is disappointing. Not only it's hard to use, but it can also crash your whole app under particular circumstances.
+ To fix this, we built our own, which relies on rc-tooltip
.
+
+
+
+ Example:
+ This is a tooltip}
+ >
+ Hover/Click me
+
+
+ This is a tooltip}
+ >
+ Hover/Click me
+
+ `}
+ />
+
+
+
+
+
+ Example:
+ This is a tooltip}
+ placement={'right'}
+ >
+ Hover/Click me
+
+
+ This is a tooltip}
+ placement={'right'}
+ >
+ Hover/Click me
+
+ `}
+ />
+
+
+
+ );
+};
+
+export default withApollo()(ExampleUIComponentsPage);
diff --git a/src/pages/[locale]/examples/built-in-utilities/api.tsx b/src/pages/[locale]/examples/built-in-utilities/api.tsx
new file mode 100644
index 000000000..04e6e2a1e
--- /dev/null
+++ b/src/pages/[locale]/examples/built-in-utilities/api.tsx
@@ -0,0 +1,87 @@
+/** @jsx jsx */
+import { css, jsx } from '@emotion/core';
+import { createLogger } from '@unly/utils-simple-logger';
+import { GetStaticPaths, GetStaticProps, NextPage } from 'next';
+// eslint-disable-next-line @typescript-eslint/no-unused-vars,no-unused-vars
+import React from 'react';
+import BuiltInUtilitiesSidebar from '../../../../components/doc/BuiltInUtilitiesSidebar';
+import DocPage from '../../../../components/doc/DocPage';
+import DefaultLayout from '../../../../components/pageLayouts/DefaultLayout';
+import ExternalLink from '../../../../components/utils/ExternalLink';
+import withApollo from '../../../../hocs/withApollo';
+import { StaticParams } from '../../../../types/nextjs/StaticParams';
+import { OnlyBrowserPageProps } from '../../../../types/pageProps/OnlyBrowserPageProps';
+import { SSGPageProps } from '../../../../types/pageProps/SSGPageProps';
+import { getCommonStaticPaths, getCommonStaticProps } from '../../../../utils/nextjs/SSG';
+
+const fileLabel = 'pages/[locale]/examples/built-in-utilities/api';
+const logger = createLogger({ // eslint-disable-line no-unused-vars,@typescript-eslint/no-unused-vars
+ label: fileLabel,
+});
+
+/**
+ * Only executed on the server side at build time
+ * Necessary when a page has dynamic routes and uses "getStaticProps"
+ */
+export const getStaticPaths: GetStaticPaths = getCommonStaticPaths;
+
+/**
+ * Only executed on the server side at build time.
+ *
+ * @return Props (as "SSGPageProps") that will be passed to the Page component, as props
+ *
+ * @see https://github.com/zeit/next.js/discussions/10949#discussioncomment-6884
+ * @see https://nextjs.org/docs/basic-features/data-fetching#getstaticprops-static-generation
+ */
+export const getStaticProps: GetStaticProps = getCommonStaticProps;
+
+/**
+ * SSG pages are first rendered by the server (during static bundling)
+ * Then, they're rendered by the client, and gain additional props (defined in OnlyBrowserPageProps)
+ * Because this last case is the most common (server bundle only happens during development stage), we consider it a default
+ * To represent this behaviour, we use the native Partial TS keyword to make all OnlyBrowserPageProps optional
+ *
+ * Beware props in OnlyBrowserPageProps are not available on the server
+ */
+type Props = {} & SSGPageProps>;
+
+const ApiPage: NextPage = (props): JSX.Element => {
+ return (
+
+
+ Api examples
+
+
+ A few API endpoints are provided as utilities:
+
+
+ /api/status
: Meant to help you debug your app and check non-sensitive environment variables on staging/production stages.
+ It contains a few metadata that should help you manage your app (build time, stage, region, release, etc.)
+
+
+ /api/error
: Meant to help you test your server-side Sentry integration, will throw errors on purpose so you can check whether they're reporting into Sentry.
+
+
+ /api/autoRedirectToLocalisedPage
: Meant to detect the browser preferred locale (based on HTTP headers) and redirect to the localised version of the page.
+ It is used in Next.js experimental rewrites in next.config.js
to automatically redirect to this endpoint all requests that don't have a locale defined in the url.
+ For instance, going to /terms should redirect to the fr
or en
page, depending on your browser language preferences.
+
+
+
+
+
+ );
+};
+
+export default withApollo()(ApiPage);
diff --git a/src/pages/[locale]/examples/built-in-utilities/bundle-analysis.tsx b/src/pages/[locale]/examples/built-in-utilities/bundle-analysis.tsx
new file mode 100644
index 000000000..95ffcf0f6
--- /dev/null
+++ b/src/pages/[locale]/examples/built-in-utilities/bundle-analysis.tsx
@@ -0,0 +1,76 @@
+/** @jsx jsx */
+import { jsx } from '@emotion/core';
+import { createLogger } from '@unly/utils-simple-logger';
+import { GetStaticPaths, GetStaticProps, NextPage } from 'next';
+// eslint-disable-next-line @typescript-eslint/no-unused-vars,no-unused-vars
+import React from 'react';
+import BuiltInUtilitiesSidebar from '../../../../components/doc/BuiltInUtilitiesSidebar';
+import DocPage from '../../../../components/doc/DocPage';
+import DefaultLayout from '../../../../components/pageLayouts/DefaultLayout';
+import Code from '../../../../components/utils/Code';
+import withApollo from '../../../../hocs/withApollo';
+import { StaticParams } from '../../../../types/nextjs/StaticParams';
+import { OnlyBrowserPageProps } from '../../../../types/pageProps/OnlyBrowserPageProps';
+import { SSGPageProps } from '../../../../types/pageProps/SSGPageProps';
+import { getCommonStaticPaths, getCommonStaticProps } from '../../../../utils/nextjs/SSG';
+
+const fileLabel = 'pages/[locale]/examples/built-in-utilities/bundle-analysis';
+const logger = createLogger({ // eslint-disable-line no-unused-vars,@typescript-eslint/no-unused-vars
+ label: fileLabel,
+});
+
+/**
+ * Only executed on the server side at build time
+ * Necessary when a page has dynamic routes and uses "getStaticProps"
+ */
+export const getStaticPaths: GetStaticPaths = getCommonStaticPaths;
+
+/**
+ * Only executed on the server side at build time.
+ *
+ * @return Props (as "SSGPageProps") that will be passed to the Page component, as props
+ *
+ * @see https://github.com/zeit/next.js/discussions/10949#discussioncomment-6884
+ * @see https://nextjs.org/docs/basic-features/data-fetching#getstaticprops-static-generation
+ */
+export const getStaticProps: GetStaticProps = getCommonStaticProps;
+
+/**
+ * SSG pages are first rendered by the server (during static bundling)
+ * Then, they're rendered by the client, and gain additional props (defined in OnlyBrowserPageProps)
+ * Because this last case is the most common (server bundle only happens during development stage), we consider it a default
+ * To represent this behaviour, we use the native Partial TS keyword to make all OnlyBrowserPageProps optional
+ *
+ * Beware props in OnlyBrowserPageProps are not available on the server
+ */
+type Props = {} & SSGPageProps>;
+
+const AnalyseBundlePage: NextPage = (props): JSX.Element => {
+ return (
+
+
+ Bundle analysis examples
+
+
+ You're most likely concerned about how big your client-side bundle is, because it'll impact your end-users experience.
+ NRN provides a utility script, which will start the development server locally and open 2 browser tabs automatically.
+ One for the front-end bundle, and one for the back-end.
+
+
+
+
+
+
+ );
+};
+
+export default withApollo()(AnalyseBundlePage);
diff --git a/src/pages/[locale]/examples/built-in-utilities/errors-handling.tsx b/src/pages/[locale]/examples/built-in-utilities/errors-handling.tsx
new file mode 100644
index 000000000..0124313e5
--- /dev/null
+++ b/src/pages/[locale]/examples/built-in-utilities/errors-handling.tsx
@@ -0,0 +1,165 @@
+/** @jsx jsx */
+import { jsx, css } from '@emotion/core';
+import { createLogger } from '@unly/utils-simple-logger';
+import { GetStaticPaths, GetStaticProps, NextPage } from 'next';
+// eslint-disable-next-line @typescript-eslint/no-unused-vars,no-unused-vars
+import React from 'react';
+import { Alert } from 'reactstrap';
+import BuiltInUtilitiesSidebar from '../../../../components/doc/BuiltInUtilitiesSidebar';
+import DocPage from '../../../../components/doc/DocPage';
+import I18nLink from '../../../../components/i18n/I18nLink';
+import DefaultLayout from '../../../../components/pageLayouts/DefaultLayout';
+import Code from '../../../../components/utils/Code';
+import ExternalLink from '../../../../components/utils/ExternalLink';
+import withApollo from '../../../../hocs/withApollo';
+import { StaticParams } from '../../../../types/nextjs/StaticParams';
+import { OnlyBrowserPageProps } from '../../../../types/pageProps/OnlyBrowserPageProps';
+import { SSGPageProps } from '../../../../types/pageProps/SSGPageProps';
+import { getCommonStaticPaths, getCommonStaticProps } from '../../../../utils/nextjs/SSG';
+
+const fileLabel = 'pages/[locale]/examples/built-in-utilities/errors-handling';
+const logger = createLogger({ // eslint-disable-line no-unused-vars,@typescript-eslint/no-unused-vars
+ label: fileLabel,
+});
+
+/**
+ * Only executed on the server side at build time
+ * Necessary when a page has dynamic routes and uses "getStaticProps"
+ */
+export const getStaticPaths: GetStaticPaths = getCommonStaticPaths;
+
+/**
+ * Only executed on the server side at build time.
+ *
+ * @return Props (as "SSGPageProps") that will be passed to the Page component, as props
+ *
+ * @see https://github.com/zeit/next.js/discussions/10949#discussioncomment-6884
+ * @see https://nextjs.org/docs/basic-features/data-fetching#getstaticprops-static-generation
+ */
+export const getStaticProps: GetStaticProps = getCommonStaticProps;
+
+/**
+ * SSG pages are first rendered by the server (during static bundling)
+ * Then, they're rendered by the client, and gain additional props (defined in OnlyBrowserPageProps)
+ * Because this last case is the most common (server bundle only happens during development stage), we consider it a default
+ * To represent this behaviour, we use the native Partial TS keyword to make all OnlyBrowserPageProps optional
+ *
+ * Beware props in OnlyBrowserPageProps are not available on the server
+ */
+type Props = {} & SSGPageProps>;
+
+const ErrorsHandlingPage: NextPage = (props): JSX.Element => {
+ return (
+
+
+ Errors handling examples
+
+
+ It's interesting to know how your app will behave when unexpected things happen.
+ That's the point of the below examples, they're meant to showcase how the apps behaves in such situations.
+
+ Note that it's also interesting to experiment those behaviours in different environments, because they will differ.
+
+
+
+
+ 404 - Using CSR
+
+
+ This page doesn't exist and should display a 404 page.
+
+
+
+ Clicking on the link doesn't do anything, I don't know if it's meant to be a feature, but
+ this is probably a bug .
+
+
+
+ This is a client-side navigation (CSR)
+
+
+ This is a client-side navigation (CSR)
+ `}
+ />
+
+
+ 404 - Using full page reload
+
+
+ This page doesn't exist and should display a 404 page.
+
+
+
+ This is not CSR, it's not necessarily SSR either, it can be either static rendering or SSR.
+ This is a normal navigation
+
+
+ This is a normal navigation
+ `}
+ />
+
+
+
+
+ 500 - Top-level error
+
+
+ This page throws an error right from the Page component and should display a 500 page error without anything else (no footer/header).
+
+
+ = (props): JSX.Element => {
+ if (isBrowser()) {
+ // Only throw on browser, otherwise it fails when building the app on Vercel and deployment fails altogether
+ throw new Error('Top level 500 error example');
+ }
+
+ return (
+
+ Top-level 500 error example
+
+ );
+ };
+ `}
+ />
+
+
+
+ This is a client-side navigation (CSR)
+ This is a normal navigation
+
+
+
+
+
+ 500 - Interactive error
+
+ Go to interactive error page
+
+
+
+
+
+ );
+};
+
+export default withApollo()(ErrorsHandlingPage);
diff --git a/src/pages/[locale]/examples/built-in-utilities/hocs.tsx b/src/pages/[locale]/examples/built-in-utilities/hocs.tsx
new file mode 100644
index 000000000..88c6958ef
--- /dev/null
+++ b/src/pages/[locale]/examples/built-in-utilities/hocs.tsx
@@ -0,0 +1,108 @@
+/** @jsx jsx */
+import { css, jsx } from '@emotion/core';
+import { createLogger } from '@unly/utils-simple-logger';
+import { GetStaticPaths, GetStaticProps, NextPage } from 'next';
+// eslint-disable-next-line @typescript-eslint/no-unused-vars,no-unused-vars
+import React from 'react';
+import { Alert } from 'reactstrap';
+import BuiltInUtilitiesSidebar from '../../../../components/doc/BuiltInUtilitiesSidebar';
+import DocPage from '../../../../components/doc/DocPage';
+import DefaultLayout from '../../../../components/pageLayouts/DefaultLayout';
+import Code from '../../../../components/utils/Code';
+import withApollo from '../../../../hocs/withApollo';
+import { StaticParams } from '../../../../types/nextjs/StaticParams';
+import { OnlyBrowserPageProps } from '../../../../types/pageProps/OnlyBrowserPageProps';
+import { SSGPageProps } from '../../../../types/pageProps/SSGPageProps';
+import { getCommonStaticPaths, getCommonStaticProps } from '../../../../utils/nextjs/SSG';
+
+const fileLabel = 'pages/[locale]/examples/built-in-utilities/hocs';
+const logger = createLogger({ // eslint-disable-line no-unused-vars,@typescript-eslint/no-unused-vars
+ label: fileLabel,
+});
+
+/**
+ * Only executed on the server side at build time
+ * Necessary when a page has dynamic routes and uses "getStaticProps"
+ */
+export const getStaticPaths: GetStaticPaths = getCommonStaticPaths;
+
+/**
+ * Only executed on the server side at build time.
+ *
+ * @return Props (as "SSGPageProps") that will be passed to the Page component, as props
+ *
+ * @see https://github.com/zeit/next.js/discussions/10949#discussioncomment-6884
+ * @see https://nextjs.org/docs/basic-features/data-fetching#getstaticprops-static-generation
+ */
+export const getStaticProps: GetStaticProps = getCommonStaticProps;
+
+/**
+ * SSG pages are first rendered by the server (during static bundling)
+ * Then, they're rendered by the client, and gain additional props (defined in OnlyBrowserPageProps)
+ * Because this last case is the most common (server bundle only happens during development stage), we consider it a default
+ * To represent this behaviour, we use the native Partial TS keyword to make all OnlyBrowserPageProps optional
+ *
+ * Beware props in OnlyBrowserPageProps are not available on the server
+ */
+type Props = {} & SSGPageProps>;
+
+const HocsPage: NextPage = (props): JSX.Element => {
+ return (
+
+
+ HOCs examples
+
+
+ A few HOCs are provided as utilities:
+
+
+ withApollo
: Wraps a page into an ApolloProvider
and handles state rehydration between CSR navigation.
+ Can be used with any rendering mode (expect SSG by default).
+ Do not use getInitialProps
by default, only when useGetInitialProps: true
(meant for pages using getInitialProps
only).
+
+
+ withHOCTemplate
: Template for quickly getting started with a new HOC, meant as a utility. Feel free to customise it!
+
+
+
+
+ withApollo
+
+
+ This HOC is necessary for all pages in the demo, because all pages need data that are used by shared component (i.e: Nav, Footer).
+ If you don't need to fetch data from a data source, then you don't need to use it.
+
+
+
+
+
+
+
+ We don't actually use the useGetInitialProps
option anywhere in this demo, because we don't use getInitialProps
anymore.
+
+
+
+
+ );
+};
+
+export default withApollo()(HocsPage);
diff --git a/src/pages/[locale]/examples/built-in-utilities/hooks.tsx b/src/pages/[locale]/examples/built-in-utilities/hooks.tsx
new file mode 100644
index 000000000..2199477d7
--- /dev/null
+++ b/src/pages/[locale]/examples/built-in-utilities/hooks.tsx
@@ -0,0 +1,148 @@
+/** @jsx jsx */
+import { jsx, css } from '@emotion/core';
+import { createLogger } from '@unly/utils-simple-logger';
+import { GetStaticPaths, GetStaticProps, NextPage } from 'next';
+// eslint-disable-next-line @typescript-eslint/no-unused-vars,no-unused-vars
+import React from 'react';
+import { Alert } from 'reactstrap';
+import BuiltInUtilitiesSidebar from '../../../../components/doc/BuiltInUtilitiesSidebar';
+import DocPage from '../../../../components/doc/DocPage';
+import I18nLink from '../../../../components/i18n/I18nLink';
+import DefaultLayout from '../../../../components/pageLayouts/DefaultLayout';
+import Code from '../../../../components/utils/Code';
+import ExternalLink from '../../../../components/utils/ExternalLink';
+import withApollo from '../../../../hocs/withApollo';
+import { StaticParams } from '../../../../types/nextjs/StaticParams';
+import { OnlyBrowserPageProps } from '../../../../types/pageProps/OnlyBrowserPageProps';
+import { SSGPageProps } from '../../../../types/pageProps/SSGPageProps';
+import { getCommonStaticPaths, getCommonStaticProps } from '../../../../utils/nextjs/SSG';
+
+const fileLabel = 'pages/[locale]/examples/built-in-utilities/hooks';
+const logger = createLogger({ // eslint-disable-line no-unused-vars,@typescript-eslint/no-unused-vars
+ label: fileLabel,
+});
+
+/**
+ * Only executed on the server side at build time
+ * Necessary when a page has dynamic routes and uses "getStaticProps"
+ */
+export const getStaticPaths: GetStaticPaths = getCommonStaticPaths;
+
+/**
+ * Only executed on the server side at build time.
+ *
+ * @return Props (as "SSGPageProps") that will be passed to the Page component, as props
+ *
+ * @see https://github.com/zeit/next.js/discussions/10949#discussioncomment-6884
+ * @see https://nextjs.org/docs/basic-features/data-fetching#getstaticprops-static-generation
+ */
+export const getStaticProps: GetStaticProps = getCommonStaticProps;
+
+/**
+ * SSG pages are first rendered by the server (during static bundling)
+ * Then, they're rendered by the client, and gain additional props (defined in OnlyBrowserPageProps)
+ * Because this last case is the most common (server bundle only happens during development stage), we consider it a default
+ * To represent this behaviour, we use the native Partial TS keyword to make all OnlyBrowserPageProps optional
+ *
+ * Beware props in OnlyBrowserPageProps are not available on the server
+ */
+type Props = {} & SSGPageProps>;
+
+const HooksPage: NextPage = (props): JSX.Element => {
+ return (
+
+
+ Hooks examples
+
+
+ A few hooks are provided as utilities:
+
+
+ useHasMounted
: Hook to properly handle expected differences between server and browser rendering.
+ Helps to avoid "Text content did not match" warnings, during React rehydration.
+
+
+ useI18n
: Hook to access i18n/localisation data
+
+
+ useUserSession
: Hook to access the user session data
+
+
+
+
+ useHasMounted
+
+
+ This hook helps rendering content only when the component has mounted (client-side).
+ It's helpful when you want some part of your app to only render on the client.
+
+ We strongly recommend reading
+ The perils of rehydration
+ to familiarise yourself with this.
+
+
+ = (props): JSX.Element => {
+ const hasMounted = useHasMounted();
+ if (!hasMounted) {
+ // Returns null on server-side
+ // Returns null on client-side, until the component has mounted
+ return null;
+ }
+
+ // Do stuff that will be executed only on the client-side, after rehydration
+ return (...)
+ };
+
+ export default MyComponent;
+ `}
+ />
+
+
+
+ useI18n
+
+
+ This hook helps access i18n data in any functional component.
+
+
+
+
+
+
+ useUserSession
+
+
+ This hook helps access user data in any functional component.
+
+
+
+
+
+
+
+
+ );
+};
+
+export default withApollo()(HooksPage);
diff --git a/src/pages/[locale]/examples/built-in-utilities/i18nLink-component.tsx b/src/pages/[locale]/examples/built-in-utilities/i18nLink-component.tsx
new file mode 100644
index 000000000..a23041d3e
--- /dev/null
+++ b/src/pages/[locale]/examples/built-in-utilities/i18nLink-component.tsx
@@ -0,0 +1,101 @@
+/** @jsx jsx */
+import { jsx } from '@emotion/core';
+import { createLogger } from '@unly/utils-simple-logger';
+import { GetStaticPaths, GetStaticProps, NextPage } from 'next';
+// eslint-disable-next-line @typescript-eslint/no-unused-vars,no-unused-vars
+import React from 'react';
+import { Alert } from 'reactstrap';
+import BuiltInUtilitiesSidebar from '../../../../components/doc/BuiltInUtilitiesSidebar';
+import DocPage from '../../../../components/doc/DocPage';
+import I18nLink from '../../../../components/i18n/I18nLink';
+import DefaultLayout from '../../../../components/pageLayouts/DefaultLayout';
+import Code from '../../../../components/utils/Code';
+import withApollo from '../../../../hocs/withApollo';
+import { StaticParams } from '../../../../types/nextjs/StaticParams';
+import { OnlyBrowserPageProps } from '../../../../types/pageProps/OnlyBrowserPageProps';
+import { SSGPageProps } from '../../../../types/pageProps/SSGPageProps';
+import { getCommonStaticPaths, getCommonStaticProps } from '../../../../utils/nextjs/SSG';
+
+const fileLabel = 'pages/[locale]/examples/built-in-utilities/i18nLink-component';
+const logger = createLogger({ // eslint-disable-line no-unused-vars,@typescript-eslint/no-unused-vars
+ label: fileLabel,
+});
+
+/**
+ * Only executed on the server side at build time
+ * Necessary when a page has dynamic routes and uses "getStaticProps"
+ */
+export const getStaticPaths: GetStaticPaths = getCommonStaticPaths;
+
+/**
+ * Only executed on the server side at build time.
+ *
+ * @return Props (as "SSGPageProps") that will be passed to the Page component, as props
+ *
+ * @see https://github.com/zeit/next.js/discussions/10949#discussioncomment-6884
+ * @see https://nextjs.org/docs/basic-features/data-fetching#getstaticprops-static-generation
+ */
+export const getStaticProps: GetStaticProps = getCommonStaticProps;
+
+/**
+ * SSG pages are first rendered by the server (during static bundling)
+ * Then, they're rendered by the client, and gain additional props (defined in OnlyBrowserPageProps)
+ * Because this last case is the most common (server bundle only happens during development stage), we consider it a default
+ * To represent this behaviour, we use the native Partial TS keyword to make all OnlyBrowserPageProps optional
+ *
+ * Beware props in OnlyBrowserPageProps are not available on the server
+ */
+type Props = {} & SSGPageProps>;
+
+const ExampleI18nLinkComponentPage: NextPage = (props): JSX.Element => {
+ return (
+
+
+ I18nLink component examples
+
+
+ {` `}
component is based on Next.js native {` `}
component.
+ It's an utility that automatically handles localisation and acts as a wrapper for {` `}
.
+ If you'd use the {` `}
component, you'd have to provide which locale is the current locale, and build the link accordingly.
+ That's basically what {` `}
does.
+
+
+
+
+ This is a link going to the same page (keeps the current locale)
+
+
+ This is a link going to the same page (forces to switch to fr-FR
locale)
+
+
+ This is a link going to the same page (forces to switch to en-US
locale)
+
+
+
+
+ This is a link going to the same page (keeps the current locale)
+
+
+ This is a link going to the same page (forces to switch to fr-FR
locale)
+
+
+ This is a link going to the same page (forces to switch to en-US
locale)
+
+ `}
+ />
+
+
+
+ );
+};
+
+export default withApollo()(ExampleI18nLinkComponentPage);
diff --git a/src/pages/[locale]/examples/built-in-utilities/index.tsx b/src/pages/[locale]/examples/built-in-utilities/index.tsx
new file mode 100644
index 000000000..539120325
--- /dev/null
+++ b/src/pages/[locale]/examples/built-in-utilities/index.tsx
@@ -0,0 +1,11 @@
+import { GetStaticPaths, GetStaticProps } from 'next';
+
+import { StaticParams } from '../../../../types/nextjs/StaticParams';
+import { SSGPageProps } from '../../../../types/pageProps/SSGPageProps';
+import ExampleI18nLinkComponentPage, { getStaticPaths as getStaticPathsHomePage, getStaticProps as getStaticPropsHomePage } from './i18nLink-component';
+
+// XXX This page is an "alias"
+export const getStaticPaths: GetStaticPaths = getStaticPathsHomePage;
+export const getStaticProps: GetStaticProps = getStaticPropsHomePage;
+
+export default ExampleI18nLinkComponentPage;
diff --git a/src/pages/[locale]/examples/built-in-utilities/interactive-error.tsx b/src/pages/[locale]/examples/built-in-utilities/interactive-error.tsx
new file mode 100644
index 000000000..1da7b0500
--- /dev/null
+++ b/src/pages/[locale]/examples/built-in-utilities/interactive-error.tsx
@@ -0,0 +1,106 @@
+/** @jsx jsx */
+import { jsx } from '@emotion/core';
+import { createLogger } from '@unly/utils-simple-logger';
+import { GetStaticPaths, GetStaticProps, NextPage } from 'next';
+// eslint-disable-next-line @typescript-eslint/no-unused-vars,no-unused-vars
+import React, { useState } from 'react';
+import { Alert, Button } from 'reactstrap';
+import BuiltInUtilitiesSidebar from '../../../../components/doc/BuiltInUtilitiesSidebar';
+import DefaultLayout from '../../../../components/pageLayouts/DefaultLayout';
+import Code from '../../../../components/utils/Code';
+import withApollo from '../../../../hocs/withApollo';
+import { StaticParams } from '../../../../types/nextjs/StaticParams';
+import { OnlyBrowserPageProps } from '../../../../types/pageProps/OnlyBrowserPageProps';
+import { SSGPageProps } from '../../../../types/pageProps/SSGPageProps';
+import { getCommonStaticPaths, getCommonStaticProps } from '../../../../utils/nextjs/SSG';
+
+const fileLabel = 'pages/[locale]/examples/built-in-utilities/interactive-error';
+const logger = createLogger({ // eslint-disable-line no-unused-vars,@typescript-eslint/no-unused-vars
+ label: fileLabel,
+});
+
+/**
+ * Only executed on the server side at build time
+ * Necessary when a page has dynamic routes and uses "getStaticProps"
+ */
+export const getStaticPaths: GetStaticPaths = getCommonStaticPaths;
+
+/**
+ * Only executed on the server side at build time.
+ *
+ * @return Props (as "SSGPageProps") that will be passed to the Page component, as props
+ *
+ * @see https://github.com/zeit/next.js/discussions/10949#discussioncomment-6884
+ * @see https://nextjs.org/docs/basic-features/data-fetching#getstaticprops-static-generation
+ */
+export const getStaticProps: GetStaticProps = getCommonStaticProps;
+
+/**
+ * SSG pages are first rendered by the server (during static bundling)
+ * Then, they're rendered by the client, and gain additional props (defined in OnlyBrowserPageProps)
+ * Because this last case is the most common (server bundle only happens during development stage), we consider it a default
+ * To represent this behaviour, we use the native Partial TS keyword to make all OnlyBrowserPageProps optional
+ *
+ * Beware props in OnlyBrowserPageProps are not available on the server
+ */
+type Props = {} & SSGPageProps>;
+
+const InteractiveErrorPage: NextPage = (props): JSX.Element => {
+ const [isClicked, setIsClicked] = useState(false);
+
+ return (
+
+
+ Interactive error
+
+
+
+ This page throws an error once the button is clicked.
+
+
+
+ {
+ setIsClicked(true);
+ throw new Error('Page 500 error example');
+ }}
+ >
+ Will it crash the whole app?
+
+
+
+
+ {
+ isClicked && (
+
+ The error was automatically caught and stacktrace has been sent to Sentry.
+ The end-user won't know a fatal error happened on the background (look at the browser console).
+ But you might want to manually catch those errors and display a proper contextual error message instead of doing nothing.
+
+ )
+ }
+
+ {
+ setIsClicked(true);
+ throw new Error('Page 500 error example');
+ }}
+ >
+ Will it crash the whole app?
+
+ `}
+ />
+
+ );
+};
+
+export default withApollo()(InteractiveErrorPage);
diff --git a/src/pages/[locale]/examples/built-in-utilities/packages-upgrade.tsx b/src/pages/[locale]/examples/built-in-utilities/packages-upgrade.tsx
new file mode 100644
index 000000000..9ca42c2ab
--- /dev/null
+++ b/src/pages/[locale]/examples/built-in-utilities/packages-upgrade.tsx
@@ -0,0 +1,156 @@
+/** @jsx jsx */
+import { jsx } from '@emotion/core';
+import { createLogger } from '@unly/utils-simple-logger';
+import { GetStaticPaths, GetStaticProps, NextPage } from 'next';
+// eslint-disable-next-line @typescript-eslint/no-unused-vars,no-unused-vars
+import React from 'react';
+import BuiltInUtilitiesSidebar from '../../../../components/doc/BuiltInUtilitiesSidebar';
+import DocPage from '../../../../components/doc/DocPage';
+import DefaultLayout from '../../../../components/pageLayouts/DefaultLayout';
+import Code from '../../../../components/utils/Code';
+import ExternalLink from '../../../../components/utils/ExternalLink';
+import withApollo from '../../../../hocs/withApollo';
+import { StaticParams } from '../../../../types/nextjs/StaticParams';
+import { OnlyBrowserPageProps } from '../../../../types/pageProps/OnlyBrowserPageProps';
+import { SSGPageProps } from '../../../../types/pageProps/SSGPageProps';
+import { getCommonStaticPaths, getCommonStaticProps } from '../../../../utils/nextjs/SSG';
+import { Alert } from 'reactstrap';
+
+const fileLabel = 'pages/[locale]/examples/built-in-utilities/packages-upgrade';
+const logger = createLogger({ // eslint-disable-line no-unused-vars,@typescript-eslint/no-unused-vars
+ label: fileLabel,
+});
+
+/**
+ * Only executed on the server side at build time
+ * Necessary when a page has dynamic routes and uses "getStaticProps"
+ */
+export const getStaticPaths: GetStaticPaths = getCommonStaticPaths;
+
+/**
+ * Only executed on the server side at build time.
+ *
+ * @return Props (as "SSGPageProps") that will be passed to the Page component, as props
+ *
+ * @see https://github.com/zeit/next.js/discussions/10949#discussioncomment-6884
+ * @see https://nextjs.org/docs/basic-features/data-fetching#getstaticprops-static-generation
+ */
+export const getStaticProps: GetStaticProps = getCommonStaticProps;
+
+/**
+ * SSG pages are first rendered by the server (during static bundling)
+ * Then, they're rendered by the client, and gain additional props (defined in OnlyBrowserPageProps)
+ * Because this last case is the most common (server bundle only happens during development stage), we consider it a default
+ * To represent this behaviour, we use the native Partial TS keyword to make all OnlyBrowserPageProps optional
+ *
+ * Beware props in OnlyBrowserPageProps are not available on the server
+ */
+type Props = {} & SSGPageProps>;
+
+const PackagesUpgradePage: NextPage = (props): JSX.Element => {
+ return (
+
+
+ Packages upgrade examples
+
+
+ Upgrading packages is a necessary step in any non-trivial application.
+ And upgrading any package, even to a patch
version, can result in a completely broken app .
+
+
+
+ In order to reduce risks associated with packages, we've made some very opinionated decisions about how to handle our dependencies, by default.
+ Those decisions are based on years of experience with production systems, and are meant to avoid breaking production apps unexpectedly.
+
+ First of all, we only install fixed versions.
+ For example, "@amplitude/react-amplitude": "1.0.0"
, the "1.0.0"
is a fixed version, it won't change unless we manually/expressively do it.
+ We don't use any automation like "^1.0.0"
or ">1.0.0"
+
+ Also, we configured NPM/Yarn to
+ always install fixed versions by default
+ using npm config set save-exact true
+
+
+
+ Using only fixed versions ensures there won't be any packages difference between your development, staging and production environments.
+ This alone reduces the risks tremendously. Coupled with yarn.lock
file, it makes your deployments much safer.
+
+
+
+ In order to simplify packages upgrade, we provide a small utility tool (which is nothing more than an alias to a yarn
command that too few people know about).
+
+
+ " : Major Update backward-incompatible updates
+ "" : Minor Update backward-compatible features
+ "" : Patch Update backward-compatible bug fixes
+ ? Choose which packages to update. (Press to select, to toggle all, to invert selection)
+ devDependencies
+ name range from to url
+ ❯◯ @next/bundle-analyzer latest 9.4.1 ❯ 9.4.2 https://github.com/zeit/next.js#readme
+ ◯ @types/jest latest 25.2.2 ❯ 25.2.3 https://github.com/DefinitelyTyped/DefinitelyTyped.git
+ ◯ @types/webfontloader latest 1.6.30 ❯ 1.6.31 https://github.com/DefinitelyTyped/DefinitelyTyped.git
+ ◯ @typescript-eslint/eslint-plugin latest 2.33.0 ❯ 3.0.0 https://github.com/typescript-eslint/typescript-eslint#readme
+ ◯ @typescript-eslint/parser latest 2.33.0 ❯ 3.0.0 https://github.com/typescript-eslint/typescript-eslint#readme
+ ◯ cypress latest 4.5.0 ❯ 4.6.0 https://github.com/cypress-io/cypress
+ ◯ eslint latest 7.0.0 ❯ 7.1.0 https://eslint.org
+ ◯ now latest 17.1.1 ❯ 19.0.1 https://vercel.com
+ ◯ typescript latest 3.9.2 ❯ 3.9.3 https://www.typescriptlang.org/
+
+ dependencies
+ name range from to url
+ ◯ i18next-locize-backend latest 4.0.8 ❯ 4.0.9 https://github.com/locize/i18next-locize-backend
+ ◯ locize-lastused latest 3.0.4 ❯ 3.0.5 https://github.com/locize/locize-lastused
+ ◯ next latest 9.4.1 ❯ 9.4.2 https://nextjs.org
+ ◯ rc-tooltip latest 4.0.3 ❯ 4.2.0 http://github.com/react-component/tooltip
+ ◯ react-i18next latest 11.4.0 ❯ 11.5.0 https://github.com/i18next/react-i18next
+ `}
+ />
+
+
+
+ The main advantage of upgrading your packages this way is that it's interactive .
+ You can go through all packages using up/down keyboard arrows, and select those you want to update by pressing the space bar.
+
+
+
+ We strongly recommend to upgrade packages one by one , instead of multiple packages at once.
+ And then, commit each change independently, and push them independently too.
+ This alone, will save you tons of time if any package creates a regression, because even if you don't catch the regression immediately
+ (it may only affect part of your UI/workflow that isn't covered by any automated test).
+ Then you'll still have the ability to compared each deployment afterwards, and figure out when did the regression occur first, and thus know which package caused it.
+
+ Doing this will definitely save you hours of digging around compared to a easy massive upgrade of all deps at once.
+
+ To save up some time, we recommend grouping related packages upgrade together. For example, we usually upgrade all apollo-related packages at once.
+ Not only it reduces the amount of commits/pushes/deployments, but also it makes sense because sometimes those related package are meant to be updated together.
+ It's usually the case with eslint, react, typescript, etc. In the end, it's up to you to learn what feels right to group together.
+
+
+
+ It's exactly how we do it
+ and it has saved us quite a few hours.
+ If you look at the above PR, you'll notice we did some 31 commits to update 39 packages in total.
+ We ran into very tough bugs (crossed regression caused by 2 different packages, one of them through a patch
version upgrade)
+ and it would have been very hard (not to say impossible) to figure out the root cause if we had upgraded everything at once.
+
+
+
+
+ );
+};
+
+export default withApollo()(PackagesUpgradePage);
diff --git a/src/pages/[locale]/examples/built-in-utilities/security-audit.tsx b/src/pages/[locale]/examples/built-in-utilities/security-audit.tsx
new file mode 100644
index 000000000..39c1c8430
--- /dev/null
+++ b/src/pages/[locale]/examples/built-in-utilities/security-audit.tsx
@@ -0,0 +1,116 @@
+/** @jsx jsx */
+import { jsx } from '@emotion/core';
+import { createLogger } from '@unly/utils-simple-logger';
+import { GetStaticPaths, GetStaticProps, NextPage } from 'next';
+// eslint-disable-next-line @typescript-eslint/no-unused-vars,no-unused-vars
+import React from 'react';
+import BuiltInUtilitiesSidebar from '../../../../components/doc/BuiltInUtilitiesSidebar';
+import DocPage from '../../../../components/doc/DocPage';
+import DefaultLayout from '../../../../components/pageLayouts/DefaultLayout';
+import Code from '../../../../components/utils/Code';
+import withApollo from '../../../../hocs/withApollo';
+import { StaticParams } from '../../../../types/nextjs/StaticParams';
+import { OnlyBrowserPageProps } from '../../../../types/pageProps/OnlyBrowserPageProps';
+import { SSGPageProps } from '../../../../types/pageProps/SSGPageProps';
+import { getCommonStaticPaths, getCommonStaticProps } from '../../../../utils/nextjs/SSG';
+import { Alert } from 'reactstrap';
+
+const fileLabel = 'pages/[locale]/examples/built-in-utilities/security-audit';
+const logger = createLogger({ // eslint-disable-line no-unused-vars,@typescript-eslint/no-unused-vars
+ label: fileLabel,
+});
+
+/**
+ * Only executed on the server side at build time
+ * Necessary when a page has dynamic routes and uses "getStaticProps"
+ */
+export const getStaticPaths: GetStaticPaths = getCommonStaticPaths;
+
+/**
+ * Only executed on the server side at build time.
+ *
+ * @return Props (as "SSGPageProps") that will be passed to the Page component, as props
+ *
+ * @see https://github.com/zeit/next.js/discussions/10949#discussioncomment-6884
+ * @see https://nextjs.org/docs/basic-features/data-fetching#getstaticprops-static-generation
+ */
+export const getStaticProps: GetStaticProps = getCommonStaticProps;
+
+/**
+ * SSG pages are first rendered by the server (during static bundling)
+ * Then, they're rendered by the client, and gain additional props (defined in OnlyBrowserPageProps)
+ * Because this last case is the most common (server bundle only happens during development stage), we consider it a default
+ * To represent this behaviour, we use the native Partial TS keyword to make all OnlyBrowserPageProps optional
+ *
+ * Beware props in OnlyBrowserPageProps are not available on the server
+ */
+type Props = {} & SSGPageProps>;
+
+const SecurityAuditPage: NextPage = (props): JSX.Element => {
+ return (
+
+
+ Security audit examples
+
+
+ Security is a big thing, and quite a complicated topic.
+ It's very hard to keep track of node packages, because there is no tool that tells you "This is a real security risk for you and your users".
+ What most tools tell you, is that a package as a security issue, and it's up to you to define how critical it is .
+ Even specialised tools like Github alerts for vulnerable dependencies or Snyk mostly generate tons of false-positive warnings that are mostly a big waste of time.
+
+
+
+ This makes tracking security risks and issues a quite complicated topic, and we don't provide any good solution at the moment.
+
+
+ =13.1.2 <14.0.0 || >=15.0.1 <16.0.0 || >=18.1.2 │
+ ├───────────────┼──────────────────────────────────────────────────────────────┤
+ │ Dependency of │ concurrently │
+ ├───────────────┼──────────────────────────────────────────────────────────────┤
+ │ Path │ concurrently > yargs > yargs-parser │
+ ├───────────────┼──────────────────────────────────────────────────────────────┤
+ │ More info │ https://www.npmjs.com/advisories/1500 │
+ └───────────────┴──────────────────────────────────────────────────────────────┘
+ 283 vulnerabilities found - Packages audited: 1874
+ Severity: 283 Low
+ error Command failed with exit code 2.
+ `}
+ />
+
+
+ At the time of writing, NRN comes with about 300 vulnerabilities of Low
level.
+ That may sound like a lot, but you need to consider that most of those are due to small vulnerabilities that are only exploitable in a development environment.
+ The above warning, for example, is based on the concurrently
package, which is only used during development, when running the app in debug mode.
+
+
+
+ What we recommend is to ignore Low
level vulnerabilities, and rather focus on those that are more critical.
+ But even though, you'll notice most of them aren't real vulnerabilities. The real vulnerabilities are probably hidden behind all that noise.
+
+ If you know of a better way to manage security in your app, don't hesitate to open a Github issue/discussion about it!
+
+
+
+
+ );
+};
+
+export default withApollo()(SecurityAuditPage);
diff --git a/src/pages/[locale]/examples/built-in-utilities/svg-to-react.tsx b/src/pages/[locale]/examples/built-in-utilities/svg-to-react.tsx
new file mode 100644
index 000000000..aec2d1525
--- /dev/null
+++ b/src/pages/[locale]/examples/built-in-utilities/svg-to-react.tsx
@@ -0,0 +1,98 @@
+/** @jsx jsx */
+import { jsx } from '@emotion/core';
+import { createLogger } from '@unly/utils-simple-logger';
+import { GetStaticPaths, GetStaticProps, NextPage } from 'next';
+// eslint-disable-next-line @typescript-eslint/no-unused-vars,no-unused-vars
+import React from 'react';
+import BuiltInUtilitiesSidebar from '../../../../components/doc/BuiltInUtilitiesSidebar';
+import DocPage from '../../../../components/doc/DocPage';
+import DefaultLayout from '../../../../components/pageLayouts/DefaultLayout';
+import EnglishFlag from '../../../../components/svg/EnglishFlag';
+import FrenchFlag from '../../../../components/svg/FrenchFlag';
+import Code from '../../../../components/utils/Code';
+import ExternalLink from '../../../../components/utils/ExternalLink';
+import withApollo from '../../../../hocs/withApollo';
+import { StaticParams } from '../../../../types/nextjs/StaticParams';
+import { OnlyBrowserPageProps } from '../../../../types/pageProps/OnlyBrowserPageProps';
+import { SSGPageProps } from '../../../../types/pageProps/SSGPageProps';
+import { getCommonStaticPaths, getCommonStaticProps } from '../../../../utils/nextjs/SSG';
+import { Alert } from 'reactstrap';
+
+const fileLabel = 'pages/[locale]/examples/built-in-utilities/svg-to-react';
+const logger = createLogger({ // eslint-disable-line no-unused-vars,@typescript-eslint/no-unused-vars
+ label: fileLabel,
+});
+
+/**
+ * Only executed on the server side at build time
+ * Necessary when a page has dynamic routes and uses "getStaticProps"
+ */
+export const getStaticPaths: GetStaticPaths = getCommonStaticPaths;
+
+/**
+ * Only executed on the server side at build time.
+ *
+ * @return Props (as "SSGPageProps") that will be passed to the Page component, as props
+ *
+ * @see https://github.com/zeit/next.js/discussions/10949#discussioncomment-6884
+ * @see https://nextjs.org/docs/basic-features/data-fetching#getstaticprops-static-generation
+ */
+export const getStaticProps: GetStaticProps = getCommonStaticProps;
+
+/**
+ * SSG pages are first rendered by the server (during static bundling)
+ * Then, they're rendered by the client, and gain additional props (defined in OnlyBrowserPageProps)
+ * Because this last case is the most common (server bundle only happens during development stage), we consider it a default
+ * To represent this behaviour, we use the native Partial TS keyword to make all OnlyBrowserPageProps optional
+ *
+ * Beware props in OnlyBrowserPageProps are not available on the server
+ */
+type Props = {} & SSGPageProps>;
+
+const SvgToReactPage: NextPage = (props): JSX.Element => {
+ return (
+
+
+ SVG to react component examples
+
+
+ If you use SVGs, you may want to easily convert those as React components so that they're easier to work with (custom props, dynamic colors/size, etc.).
+ That's what we did with the country flags:
+
+
+
+ It'd be very easy to update those components to add some additional capabilities, such as resizing them through props, because they're React components.
+
+
+
+ Usually, our designer make SVGs on their own, and then they send them to us developers, and we have to integrate them within our app.
+ That can be tricky and a tiresome process. We use the awesome
+ SVGR library, which basically converts our SVG into React components.
+
+
+
+
+
+
+ Running this script will convert all .svg
files in the src/svg
folder.
+ Only SVGs are git tracked within this folder, because the generated React components are supposed to be temporary there.
+ They're meant to be copied/moved into the src/components
folder once they'eve been generated, and to be used/customised from there.
+
+ Personally, we like to move them to src/components/svg
, but feel free to do as you like.
+
+
+
+
+ );
+};
+
+export default withApollo()(SvgToReactPage);
diff --git a/src/pages/[locale]/examples/built-in-utilities/top-level-500-error.tsx b/src/pages/[locale]/examples/built-in-utilities/top-level-500-error.tsx
new file mode 100644
index 000000000..ce21e9955
--- /dev/null
+++ b/src/pages/[locale]/examples/built-in-utilities/top-level-500-error.tsx
@@ -0,0 +1,67 @@
+/** @jsx jsx */
+import { jsx } from '@emotion/core';
+import { isBrowser } from '@unly/utils';
+import { createLogger } from '@unly/utils-simple-logger';
+import { GetStaticPaths, GetStaticProps, NextPage } from 'next';
+// eslint-disable-next-line @typescript-eslint/no-unused-vars,no-unused-vars
+import React from 'react';
+import BuiltInUtilitiesSidebar from '../../../../components/doc/BuiltInUtilitiesSidebar';
+import DefaultLayout from '../../../../components/pageLayouts/DefaultLayout';
+import withApollo from '../../../../hocs/withApollo';
+import { StaticParams } from '../../../../types/nextjs/StaticParams';
+import { OnlyBrowserPageProps } from '../../../../types/pageProps/OnlyBrowserPageProps';
+import { SSGPageProps } from '../../../../types/pageProps/SSGPageProps';
+import { getCommonStaticPaths, getCommonStaticProps } from '../../../../utils/nextjs/SSG';
+
+const fileLabel = 'pages/[locale]/examples/built-in-utilities/top-level-500-error';
+const logger = createLogger({ // eslint-disable-line no-unused-vars,@typescript-eslint/no-unused-vars
+ label: fileLabel,
+});
+
+/**
+ * Only executed on the server side at build time
+ * Necessary when a page has dynamic routes and uses "getStaticProps"
+ */
+export const getStaticPaths: GetStaticPaths = getCommonStaticPaths;
+
+/**
+ * Only executed on the server side at build time.
+ *
+ * @return Props (as "SSGPageProps") that will be passed to the Page component, as props
+ *
+ * @see https://github.com/zeit/next.js/discussions/10949#discussioncomment-6884
+ * @see https://nextjs.org/docs/basic-features/data-fetching#getstaticprops-static-generation
+ */
+export const getStaticProps: GetStaticProps = getCommonStaticProps;
+
+/**
+ * SSG pages are first rendered by the server (during static bundling)
+ * Then, they're rendered by the client, and gain additional props (defined in OnlyBrowserPageProps)
+ * Because this last case is the most common (server bundle only happens during development stage), we consider it a default
+ * To represent this behaviour, we use the native Partial TS keyword to make all OnlyBrowserPageProps optional
+ *
+ * Beware props in OnlyBrowserPageProps are not available on the server
+ */
+type Props = {} & SSGPageProps>;
+
+const TopLevel500ErrorPage: NextPage = (props): JSX.Element => {
+ if (isBrowser()) {
+ // Only throw on browser, otherwise it fails when building the app on Vercel and deployment fails altogether
+ throw new Error('Top level 500 error example');
+ }
+
+ return (
+
+ Top-level 500 error example
+
+ );
+};
+
+export default withApollo()(TopLevel500ErrorPage);
diff --git a/src/pages/[locale]/examples/built-in-utilities/tracking-useless-re-renders.tsx b/src/pages/[locale]/examples/built-in-utilities/tracking-useless-re-renders.tsx
new file mode 100644
index 000000000..101b65c4a
--- /dev/null
+++ b/src/pages/[locale]/examples/built-in-utilities/tracking-useless-re-renders.tsx
@@ -0,0 +1,133 @@
+/** @jsx jsx */
+import { jsx } from '@emotion/core';
+import { createLogger } from '@unly/utils-simple-logger';
+import { GetStaticPaths, GetStaticProps, NextPage } from 'next';
+// eslint-disable-next-line @typescript-eslint/no-unused-vars,no-unused-vars
+import React from 'react';
+import { Alert, Button } from 'reactstrap';
+import BuiltInUtilitiesSidebar from '../../../../components/doc/BuiltInUtilitiesSidebar';
+import DocPage from '../../../../components/doc/DocPage';
+import I18nLink from '../../../../components/i18n/I18nLink';
+import DefaultLayout from '../../../../components/pageLayouts/DefaultLayout';
+import Code from '../../../../components/utils/Code';
+import ExternalLink from '../../../../components/utils/ExternalLink';
+import withApollo from '../../../../hocs/withApollo';
+import { StaticParams } from '../../../../types/nextjs/StaticParams';
+import { OnlyBrowserPageProps } from '../../../../types/pageProps/OnlyBrowserPageProps';
+import { SSGPageProps } from '../../../../types/pageProps/SSGPageProps';
+import { getCommonStaticPaths, getCommonStaticProps } from '../../../../utils/nextjs/SSG';
+
+const fileLabel = 'pages/[locale]/examples/built-in-utilities/tracking-useless-re-renders';
+const logger = createLogger({ // eslint-disable-line no-unused-vars,@typescript-eslint/no-unused-vars
+ label: fileLabel,
+});
+
+/**
+ * Only executed on the server side at build time
+ * Necessary when a page has dynamic routes and uses "getStaticProps"
+ */
+export const getStaticPaths: GetStaticPaths = getCommonStaticPaths;
+
+/**
+ * Only executed on the server side at build time.
+ *
+ * @return Props (as "SSGPageProps") that will be passed to the Page component, as props
+ *
+ * @see https://github.com/zeit/next.js/discussions/10949#discussioncomment-6884
+ * @see https://nextjs.org/docs/basic-features/data-fetching#getstaticprops-static-generation
+ */
+export const getStaticProps: GetStaticProps = getCommonStaticProps;
+
+/**
+ * SSG pages are first rendered by the server (during static bundling)
+ * Then, they're rendered by the client, and gain additional props (defined in OnlyBrowserPageProps)
+ * Because this last case is the most common (server bundle only happens during development stage), we consider it a default
+ * To represent this behaviour, we use the native Partial TS keyword to make all OnlyBrowserPageProps optional
+ *
+ * Beware props in OnlyBrowserPageProps are not available on the server
+ */
+type Props = {} & SSGPageProps>;
+
+const TrackingUselessReRendersPage: NextPage = (props): JSX.Element => {
+ return (
+
+
+ Tracking useless re-renders examples, using why-did-you-render
+
+
+ why-did-you-render is a library that's built-in and will warn you about useless React re-renderings.
+ It's enabled by default (only during development).
+
+
+
+ Let's take the below example with the Code
component.
+ This component uses the CodeBlock
and ReactAsyncHighlighter
components.
+ You may have noticed (if you've cloned NRN locally and played around) that there are a few warnings regarding ReactAsyncHighlighter
being re-rendered with Re-rendered although props and state objects are the same.
warning.
+ This warning is generated by why-did-you-render
and tells us something is wrong with the ReactAsyncHighlighter
component.
+ Unfortunately, because it's a nested dependency, it's quite hard for us to do anything to fix that, we can't do much rather than telling the maintainers about the issue.
+
+ What we can do, is to see how why-did-you-render
can help us with our own Code
component.
+
+
+
+ Refresh the page (CSR)
+
+
+
+ Clicking on the button above will generate a warning in the browser console (development env only)
+
+
+
+
+
+ `}
+ />
+
+
+
+
+ But, the below code wouldn't generate a warning
+
+
+
+ `}
+ />
+
+
+
+ Why is that?
+ The answer is simple, it's because codeBlockStyle takes an object as property, and this object is being redefined every time with a new reference.
+ Because the reference between the old render and the new render is different, React shallow comparison believes it's a different value, even though the value is actually the same.
+ This kind of mistakes are caught by why-did-you-render
and are visible in the console, so that it's easier to notice, and fix.
+ In the above case, what can be done to avoid such issue is to define the codeBlockStyle
value before (using const codeBlockStyle = ...
) so that the reference won't change.
+
+ And guess why we took this example?
+ Exactly, we actually made that exact mistake when writing NRN demo, and we thought that'd be a great example. (^_^)'
+
+
+
+
+ );
+};
+
+export default withApollo()(TrackingUselessReRendersPage);
diff --git a/src/pages/[locale]/examples/index.tsx b/src/pages/[locale]/examples/index.tsx
new file mode 100644
index 000000000..1b674a0a9
--- /dev/null
+++ b/src/pages/[locale]/examples/index.tsx
@@ -0,0 +1,196 @@
+/** @jsx jsx */
+import { Amplitude } from '@amplitude/react-amplitude';
+import { jsx } from '@emotion/core';
+import { createLogger } from '@unly/utils-simple-logger';
+import { GetStaticPaths, GetStaticProps, NextPage } from 'next';
+// eslint-disable-next-line @typescript-eslint/no-unused-vars,no-unused-vars
+import React from 'react';
+import BuiltInFeaturesSection from '../../../components/doc/BuiltInFeaturesSection';
+import BuiltInUtilitiesSection from '../../../components/doc/BuiltInUtilitiesSection';
+import IntroductionSection from '../../../components/doc/IntroductionSection';
+import NativeFeaturesSection from '../../../components/doc/NativeFeaturesSection';
+import DefaultLayout from '../../../components/pageLayouts/DefaultLayout';
+import withApollo from '../../../hocs/withApollo';
+import { StaticParams } from '../../../types/nextjs/StaticParams';
+import { OnlyBrowserPageProps } from '../../../types/pageProps/OnlyBrowserPageProps';
+import { SSGPageProps } from '../../../types/pageProps/SSGPageProps';
+import { getCommonStaticPaths, getCommonStaticProps } from '../../../utils/nextjs/SSG';
+import ExternalFeaturesSection from '../../../components/doc/ExternalFeaturesSection';
+
+const fileLabel = 'pages/[locale]/examples/index';
+const logger = createLogger({ // eslint-disable-line no-unused-vars,@typescript-eslint/no-unused-vars
+ label: fileLabel,
+});
+
+/**
+ * Only executed on the server side at build time
+ * Necessary when a page has dynamic routes and uses "getStaticProps"
+ */
+export const getStaticPaths: GetStaticPaths = getCommonStaticPaths;
+
+/**
+ * Only executed on the server side at build time.
+ *
+ * @return Props (as "SSGPageProps") that will be passed to the Page component, as props
+ *
+ * @see https://github.com/zeit/next.js/discussions/10949#discussioncomment-6884
+ * @see https://nextjs.org/docs/basic-features/data-fetching#getstaticprops-static-generation
+ */
+export const getStaticProps: GetStaticProps = getCommonStaticProps;
+
+/**
+ * SSG pages are first rendered by the server (during static bundling)
+ * Then, they're rendered by the client, and gain additional props (defined in OnlyBrowserPageProps)
+ * Because this last case is the most common (server bundle only happens during development stage), we consider it a default
+ * To represent this behaviour, we use the native Partial TS keyword to make all OnlyBrowserPageProps optional
+ *
+ * Beware props in OnlyBrowserPageProps are not available on the server
+ */
+type Props = {} & SSGPageProps>;
+
+const ExampleHomePage: NextPage = (props): JSX.Element => {
+ return (
+
+
+ {
+ ({ logEvent }): JSX.Element => {
+ return (
+ <>
+
+
+
+
+
+
+ >
+ //
+ //
+ //
+ //
+ //
Overview
+ // You can navigate between
/examples and{' '}
+ //
+ // /
+ // to see CSR in action.
+ // You can also disable JS on your browser to see how SSR works.
+ //
+ // If you want to know a bit more about what's running this demo beneath the surface, check out our
/api/status
endpoint!
+ //
+ //
+ //
+ //
Analytics overview
+ // For the purpose of this demo, we are tracking your analytics usage.
+ //
+ // For instance, we know if you've clicked on any link above. That's just basic analytics but it works out-of-the-box.
+ //
+ //
+ // You can use
+ //
Amplitude Instrumentation Explorer extension
+ // to see what analytic events are sent and what they contains exactly, it's very powerful!
+ //
+ // Every time you visit a page, analytics are automatically sent (similar to Google Analytics "pageviews").
+ //
+ //
+ //
+ //
GraphQL API overview
+ // We fetched our GraphQL endpoint to display proper theming.
+ // The colors that are used in this demo are defined within the GraphCMS "Customer" model.
+ //
+ //
+ //
+ //
Monitoring overview
+ // Any runtime error is configured to be sent to Sentry, which redirects it into our Slack channel.
+ // This allows us to be notified in real-time about anything that'd go wrong.
+ //
+ // You can test this behaviour by hitting
/api/error
our error endpoint. Don't worry, alerts have been disabled so you won't bother us for real ;)
+ //
+ //
+ //
+ //
I18n overview
+ // You can change the language by clicking on the footer flag icon below.
+ // Changing language refresh the whole page, because it was just simpler to do that instead of running the GraphQL query again.
+ // But you could implement it without refreshing the whole page if you wanted.
+ //
+ //
+ //
+ //
+ //
Examples
+ // Check out our
+ //
examples to learn more and see some code snippets!
+ //
+ //
+ //
+ //
Admin site
+ // Check out our
+ //
Admin site to edit the data that belong to the customer!
+ // Please do not use NSFW content or anything that is illegal as we don't enforce any rule. Everybody can change pics and text.
+ //
+ // The admin site is based on
+ //
react-admin .
+ // The source code
+ //
is available on GitHub as well.
+ // It also relies on
+ //
our open source data provider for react-admin, using GraphQL.
+ //
+ //
+ // All the admin site (AKA back-office) uses GraphQL schema definition to build the views and GQL queries/mutations. (but allow override for flexibility)
+ // It's a POC and could use the help of the community. I've started it to build our Back-office but found a better alternative in the meantime that better answers our needs:
+ //
Directus
+ // So, I won't likely bring NRN-Admin to a production-grade level, and it will likely stay in it's current state: a POC.
+ //
+ //
+ //
+ //
+ // Feel free to ask for more examples of what this demo can offer by creating an issue on Github! :)
+ // Feel free to make an improvement to this demo as well, though a PR. (if it's big, please let's discuss it first!)
+ //
+ //
+ //
+ //
+ //
+ );
+ }
+ }
+
+
+
+ );
+};
+
+export default withApollo()(ExampleHomePage);
diff --git a/src/pages/[locale]/examples/native-features/example-with-ssg-and-fallback/[albumId].tsx b/src/pages/[locale]/examples/native-features/example-with-ssg-and-fallback/[albumId].tsx
new file mode 100644
index 000000000..078d8f8bc
--- /dev/null
+++ b/src/pages/[locale]/examples/native-features/example-with-ssg-and-fallback/[albumId].tsx
@@ -0,0 +1,228 @@
+/** @jsx jsx */
+import { css, jsx } from '@emotion/core';
+import { createLogger } from '@unly/utils-simple-logger';
+import deepmerge from 'deepmerge';
+import map from 'lodash.map';
+import { GetStaticPaths, GetStaticProps, NextPage } from 'next';
+// eslint-disable-next-line @typescript-eslint/no-unused-vars,no-unused-vars
+import React from 'react';
+import { Alert, Button } from 'reactstrap';
+import NativeFeaturesSidebar from '../../../../../components/doc/NativeFeaturesSidebar';
+import I18nLink from '../../../../../components/i18n/I18nLink';
+import DefaultLayout from '../../../../../components/pageLayouts/DefaultLayout';
+import ExternalLink from '../../../../../components/utils/ExternalLink';
+import withApollo from '../../../../../hocs/withApollo';
+import songs from '../../../../../mocks/songs';
+import { StaticParams } from '../../../../../types/nextjs/StaticParams';
+import { StaticPath } from '../../../../../types/nextjs/StaticPath';
+import { StaticPathsOutput } from '../../../../../types/nextjs/StaticPathsOutput';
+import { StaticPropsInput } from '../../../../../types/nextjs/StaticPropsInput';
+import { StaticPropsOutput } from '../../../../../types/nextjs/StaticPropsOutput';
+import { OnlyBrowserPageProps } from '../../../../../types/pageProps/OnlyBrowserPageProps';
+import { SSGPageProps } from '../../../../../types/pageProps/SSGPageProps';
+import { getRandomInt } from '../../../../../utils/math/random';
+import { getCommonStaticPaths, getCommonStaticProps } from '../../../../../utils/nextjs/SSG';
+import waitFor from '../../../../../utils/timers/waitFor';
+
+const fileLabel = 'pages/[locale]/examples/native-features/example-with-ssg-and-fallback/[albumId]';
+const logger = createLogger({ // eslint-disable-line no-unused-vars,@typescript-eslint/no-unused-vars
+ label: fileLabel,
+});
+
+/**
+ * Only executed on the server side at build time
+ * Necessary when a page has dynamic routes and uses "getStaticProps"
+ */
+export const getStaticPaths: GetStaticPaths = async (): Promise => {
+ const commonStaticPaths: StaticPathsOutput = await getCommonStaticPaths();
+ const { paths } = commonStaticPaths;
+ const albumIdsToPreBuild = ['1']; // Only '/album-1-with-ssg-and-fallback' is generated at build time, other will be generated on-demand
+
+ map(albumIdsToPreBuild, (albumId: string): void => {
+ map(paths, (path: StaticPath) => {
+ path.params.albumId = albumId;
+ });
+ });
+
+ const staticPaths: StaticPathsOutput = {
+ ...commonStaticPaths,
+ fallback: true,
+ };
+
+ return staticPaths;
+};
+
+/**
+ * Only executed on the server side at build time.
+ *
+ * @return Props (as "SSGPageProps") that will be passed to the Page component, as props
+ *
+ * @see https://github.com/zeit/next.js/discussions/10949#discussioncomment-6884
+ * @see https://nextjs.org/docs/basic-features/data-fetching#getstaticprops-static-generation
+ */
+export const getStaticProps: GetStaticProps = async (props: StaticPropsInput): Promise => {
+ const commonStaticProps: StaticPropsOutput = await getCommonStaticProps(props);
+ const { params: { albumId } } = props;
+
+ // Simulate API call by awaiting
+ const awaitForMs = getRandomInt(1000, 4000);
+ await waitFor(awaitForMs);
+
+ let songId = parseInt(albumId);
+
+ if (songId > songs.length - 1) { // Handle overflow
+ songId = 0;
+ } else if (songId < 0) {
+ songId = 0;
+ }
+
+ // Simulates an API response
+ const album: Album = {
+ id: songId,
+ title: songs[songId],
+ awaitedForMs: awaitForMs,
+ };
+
+ const staticProps: StaticPropsOutput = deepmerge(commonStaticProps, {
+ props: {
+ album,
+ albumId,
+ },
+ });
+
+ return staticProps;
+};
+
+type Album = {
+ id: number;
+ title: string;
+ awaitedForMs: number;
+};
+
+/**
+ * SSG pages are first rendered by the server (during static bundling)
+ * Then, they're rendered by the client, and gain additional props (defined in OnlyBrowserPageProps)
+ * Because this last case is the most common (server bundle only happens during development stage), we consider it a default
+ * To represent this behaviour, we use the native Partial TS keyword to make all OnlyBrowserPageProps optional
+ *
+ * Beware props in OnlyBrowserPageProps are not available on the server
+ */
+type Props = {
+ albumId: string;
+ album: Album;
+} & SSGPageProps>;
+
+const ExampleWithSSGAndFallbackAlbumPage: NextPage = (props): JSX.Element => {
+ const { albumId, album, isSSGFallbackInitialBuild } = props;
+ const { id, title, awaitedForMs } = album;
+
+ return (
+
+ Example, using SSG with fallback option
+
+
+
+ This page will always be rendered statically, but the static bundle may be built either when deploying the website (AKA "pre-built"), or on-demand.
+
+ This example has been made such as the main page (at /1) is pre-built, while all other pages are built on-demand, dynamically.
+ Once the static page has been generated, it'll use the static version for all upcoming requests. Only the first user suffers from the waiting due to the build.
+ When the page hasn't been rendered before (no static build available), then we display the Loader
component so that the user can see something is happening instead of a white page.
+
+
+ {
+ isSSGFallbackInitialBuild ? (
+
+ This page has used fallback rendering (it hadn't been generated previously).
+
+ ) : (
+
+ This page has not used fallback rendering (it had been generated previously).
+
+ )
+ }
+
+
+
+ If you use the below "previous"/"next" button, it'll make you believe pages were pre-rendered, but it's not true.
+ Next is so smart that it optimize this kind of stuff, using the next/link
(or I18nLink
) component preload pages and build them before you click on them.
+ If you want to check for sure if a page has been pre-rendered, you better use the "next +2" link, which uses a a
which doesn't have such optimizations.
+
+
+
+
Album N°{albumId}
+
+ Title: {title}
+
+
+
+ {
+ id > 0 && (
+
+ Go to previous album
+
+ )
+ }
+
+
+ Go to next album
+
+
+
+
+
+ Go to next+2 album (opens new tab)
+
+
+
+
+ The request was slowed by {awaitedForMs}ms before being sent to the browser, to simulate a real API call.
+
+
+
+
+
+
+
+ In order to simplify things, NRN sets the isSSGFallbackInitialBuild
variable, available in all pages as props.
+
+
+
+ In development mode, it is not possible to simulate fallback
mode properly.
+ Each page refresh will completely refresh the page, any previous build will be ignored, and all page refresh will have isSSGFallbackInitialBuild: true
.
+
+
+
+
+ );
+};
+
+export default withApollo()(ExampleWithSSGAndFallbackAlbumPage);
diff --git a/src/pages/[locale]/examples/native-features/example-with-ssg-and-revalidate.tsx b/src/pages/[locale]/examples/native-features/example-with-ssg-and-revalidate.tsx
new file mode 100644
index 000000000..964e25e2e
--- /dev/null
+++ b/src/pages/[locale]/examples/native-features/example-with-ssg-and-revalidate.tsx
@@ -0,0 +1,166 @@
+/** @jsx jsx */
+import { jsx } from '@emotion/core';
+import { createLogger } from '@unly/utils-simple-logger';
+import { ApolloQueryResult } from 'apollo-client';
+import deepmerge from 'deepmerge';
+import size from 'lodash.size';
+import { GetStaticPaths, GetStaticProps, NextPage } from 'next';
+// eslint-disable-next-line @typescript-eslint/no-unused-vars,no-unused-vars
+import React from 'react';
+import { Alert, Container } from 'reactstrap';
+import AllProducts from '../../../../components/data/AllProducts';
+import NativeFeaturesSidebar from '../../../../components/doc/NativeFeaturesSidebar';
+import I18nLink from '../../../../components/i18n/I18nLink';
+import DefaultLayout from '../../../../components/pageLayouts/DefaultLayout';
+import DisplayOnBrowserMount from '../../../../components/rehydration/DisplayOnBrowserMount';
+import ExternalLink from '../../../../components/utils/ExternalLink';
+import { EXAMPLE_WITH_SSG_QUERY } from '../../../../gql/pages/examples/native-features/example-with-ssg';
+import withApollo from '../../../../hocs/withApollo';
+import useI18n, { I18n } from '../../../../hooks/useI18n';
+import { Product } from '../../../../types/data/Product';
+import { StaticParams } from '../../../../types/nextjs/StaticParams';
+import { StaticPropsInput } from '../../../../types/nextjs/StaticPropsInput';
+import { StaticPropsOutput } from '../../../../types/nextjs/StaticPropsOutput';
+import { OnlyBrowserPageProps } from '../../../../types/pageProps/OnlyBrowserPageProps';
+import { SSGPageProps } from '../../../../types/pageProps/SSGPageProps';
+import { createApolloClient } from '../../../../utils/gql/graphql';
+import { getCommonStaticPaths, getCommonStaticProps } from '../../../../utils/nextjs/SSG';
+import timeDifference from '../../../../utils/time/timeDifference';
+
+const fileLabel = 'pages/[locale]/examples/native-features/example-with-ssg-and-revalidate';
+const logger = createLogger({ // eslint-disable-line no-unused-vars,@typescript-eslint/no-unused-vars
+ label: fileLabel,
+});
+
+const regenerationDelay = 30; // Seconds
+
+/**
+ * Only executed on the server side at build time
+ * Necessary when a page has dynamic routes and uses "getStaticProps"
+ */
+export const getStaticPaths: GetStaticPaths = getCommonStaticPaths;
+
+/**
+ * Only executed on the server side at build time.
+ *
+ * @return Props (as "SSGPageProps") that will be passed to the Page component, as props
+ *
+ * @see https://github.com/zeit/next.js/discussions/10949#discussioncomment-6884
+ * @see https://nextjs.org/docs/basic-features/data-fetching#getstaticprops-static-generation
+ */
+export const getStaticProps: GetStaticProps = async (props: StaticPropsInput): Promise => {
+ const commonStaticProps: StaticPropsOutput = await getCommonStaticProps(props);
+ const { customerRef, gcmsLocales } = commonStaticProps.props;
+
+ const apolloClient = createApolloClient();
+ const variables = {
+ customerRef,
+ };
+ const queryOptions = {
+ displayName: 'EXAMPLE_WITH_SSG_QUERY',
+ query: EXAMPLE_WITH_SSG_QUERY,
+ variables,
+ context: {
+ headers: {
+ 'gcms-locale': gcmsLocales,
+ },
+ },
+ };
+
+ const {
+ data,
+ errors,
+ loading,
+ networkStatus,
+ stale,
+ }: ApolloQueryResult<{
+ products: Product[];
+ }> = await apolloClient.query(queryOptions);
+
+ if (errors) {
+ console.error(errors);
+ throw new Error('Errors were detected in GraphQL query.');
+ }
+
+ const {
+ products,
+ } = data || {}; // XXX Use empty object as fallback, to avoid app crash when destructuring, if no data is returned
+
+ return deepmerge(commonStaticProps, {
+ props: {
+ products, // XXX What's the best way to store page-specific variables coming from props? with "customer" it was different because it's injected in all pages
+ builtAt: new Date().toISOString(),
+ },
+ unstable_revalidate: regenerationDelay, // eslint-disable-line @typescript-eslint/camelcase
+ });
+};
+
+/**
+ * SSG pages are first rendered by the server (during static bundling)
+ * Then, they're rendered by the client, and gain additional props (defined in OnlyBrowserPageProps)
+ * Because this last case is the most common (server bundle only happens during development stage), we consider it a default
+ * To represent this behaviour, we use the native Partial TS keyword to make all OnlyBrowserPageProps optional
+ *
+ * Beware props in OnlyBrowserPageProps are not available on the server
+ */
+type Props = {
+ products: Product[];
+ builtAt: string;
+} & SSGPageProps>;
+
+const ProductsWithSSGPage: NextPage = (props): JSX.Element => {
+ const { products, builtAt } = props;
+ const { locale }: I18n = useI18n();
+
+ return (
+
+
+ Example, using SSG with revalidate option
+
+
+ This page will always be rendered statically, but the static bundle may be built either when deploying the website (AKA "pre-built"), or on-demand.
+
+ When it is built "on-demand", the existing static version gets displayed to the end-user immediately, and a rebuild is performed in the background.
+ The next user who load this page will get the newer static version.
+
+ The max age of this page has been set to {regenerationDelay} seconds.
+
+ By using incremental static regeneration, this page is kept up-to-date automatically, based on how often users open the page.
+ Of course, a few users will see outdated information, but it's not really an issue here.
+
+ If you use NRN Admin and update the products there,{' '}
+ then when you refresh the page (once the delay of {regenerationDelay} seconds has passed) then the whole page will be statically regenerated.
+ And then, you'll have to refresh once again to see the new static version.
+
+
+
+
+
+
+ The page was built at: {builtAt} ({timeDifference(new Date(), new Date(builtAt))})
+ {' - '}
+ Refresh
+
+
+
+
+ In development mode, it is not possible to simulate revalidate
mode properly.
+ Each page refresh will completely refresh the page, any previous build will be ignored, and builtAt
will be reset.
+
+
+
+
+
+ );
+};
+
+export default withApollo()(ProductsWithSSGPage);
diff --git a/src/pages/[locale]/examples/native-features/example-with-ssg.tsx b/src/pages/[locale]/examples/native-features/example-with-ssg.tsx
new file mode 100644
index 000000000..22bdd4563
--- /dev/null
+++ b/src/pages/[locale]/examples/native-features/example-with-ssg.tsx
@@ -0,0 +1,163 @@
+/** @jsx jsx */
+import { jsx } from '@emotion/core';
+import { createLogger } from '@unly/utils-simple-logger';
+import { ApolloQueryResult } from 'apollo-client';
+import deepmerge from 'deepmerge';
+import map from 'lodash.map';
+import size from 'lodash.size';
+import { GetStaticPaths, GetStaticProps, NextPage } from 'next';
+// eslint-disable-next-line @typescript-eslint/no-unused-vars,no-unused-vars
+import React from 'react';
+import { Alert, Container } from 'reactstrap';
+import AllProducts from '../../../../components/data/AllProducts';
+import NativeFeaturesSidebar from '../../../../components/doc/NativeFeaturesSidebar';
+import I18nLink from '../../../../components/i18n/I18nLink';
+import DefaultLayout from '../../../../components/pageLayouts/DefaultLayout';
+import ExternalLink from '../../../../components/utils/ExternalLink';
+import { EXAMPLE_WITH_SSG_QUERY } from '../../../../gql/pages/examples/native-features/example-with-ssg';
+import withApollo from '../../../../hocs/withApollo';
+import { Product } from '../../../../types/data/Product';
+import { I18nLocale } from '../../../../types/i18n/I18nLocale';
+import { StaticParams } from '../../../../types/nextjs/StaticParams';
+import { StaticPropsInput } from '../../../../types/nextjs/StaticPropsInput';
+import { StaticPropsOutput } from '../../../../types/nextjs/StaticPropsOutput';
+import { OnlyBrowserPageProps } from '../../../../types/pageProps/OnlyBrowserPageProps';
+import { SSGPageProps } from '../../../../types/pageProps/SSGPageProps';
+import { createApolloClient } from '../../../../utils/gql/graphql';
+import { SUPPORTED_LOCALES } from '../../../../utils/i18n/i18n';
+import { getCommonStaticPaths, getCommonStaticProps } from '../../../../utils/nextjs/SSG';
+
+const fileLabel = 'pages/[locale]/examples/native-features/example-with-ssg';
+const logger = createLogger({ // eslint-disable-line no-unused-vars,@typescript-eslint/no-unused-vars
+ label: fileLabel,
+});
+
+/**
+ * Only executed on the server side at build time
+ * Necessary when a page has dynamic routes and uses "getStaticProps"
+ */
+export const getStaticPaths: GetStaticPaths = getCommonStaticPaths;
+
+/**
+ * Only executed on the server side at build time.
+ *
+ * @return Props (as "SSGPageProps") that will be passed to the Page component, as props
+ *
+ * @see https://github.com/zeit/next.js/discussions/10949#discussioncomment-6884
+ * @see https://nextjs.org/docs/basic-features/data-fetching#getstaticprops-static-generation
+ */
+export const getStaticProps: GetStaticProps = async (props: StaticPropsInput): Promise => {
+ const commonStaticProps: StaticPropsOutput = await getCommonStaticProps(props);
+ const { customerRef, gcmsLocales } = commonStaticProps.props;
+
+ const apolloClient = createApolloClient();
+ const variables = {
+ customerRef,
+ };
+ const queryOptions = {
+ displayName: 'EXAMPLE_WITH_SSG_QUERY',
+ query: EXAMPLE_WITH_SSG_QUERY,
+ variables,
+ context: {
+ headers: {
+ 'gcms-locale': gcmsLocales,
+ },
+ },
+ };
+
+ const {
+ data,
+ errors,
+ loading,
+ networkStatus,
+ stale,
+ }: ApolloQueryResult<{
+ products: Product[];
+ }> = await apolloClient.query(queryOptions);
+
+ if (errors) {
+ console.error(errors);
+ throw new Error('Errors were detected in GraphQL query.');
+ }
+
+ const {
+ products,
+ } = data || {}; // XXX Use empty object as fallback, to avoid app crash when destructuring, if no data is returned
+
+ return deepmerge(commonStaticProps, {
+ props: {
+ products, // XXX What's the best way to store page-specific variables coming from props? with "customer" it was different because it's injected in all pages
+ },
+ });
+};
+
+/**
+ * SSG pages are first rendered by the server (during static bundling)
+ * Then, they're rendered by the client, and gain additional props (defined in OnlyBrowserPageProps)
+ * Because this last case is the most common (server bundle only happens during development stage), we consider it a default
+ * To represent this behaviour, we use the native Partial TS keyword to make all OnlyBrowserPageProps optional
+ *
+ * Beware props in OnlyBrowserPageProps are not available on the server
+ */
+type Props = {
+ products: Product[];
+} & SSGPageProps>;
+
+const ExampleWithSSGPage: NextPage = (props): JSX.Element => {
+ const { products } = props;
+
+ return (
+
+
+ Example, using SSG
+
+
+ This page uses static site generation (SSG) because it uses getStaticProps
+ (it also uses getStaticPaths
, because it's necessary for i18n support, to generate a different page, per available locale ).
+
+ Therefore, this page has been statically generated {size(SUPPORTED_LOCALES)} times, for:{' '}
+ {
+ map(SUPPORTED_LOCALES, (locale: I18nLocale, i) => {
+ return (
+
+ {locale.name}
+ {
+ i + 1 !== size(SUPPORTED_LOCALES) && (
+ <> | >
+ )
+ }
+
+ );
+ })
+ }
+
+
+ Learn more about the technical details
+
+ Each page refresh (either static or CSR) fetches the static bundle and displays products below.
+
+ If you use NRN Admin and update the products there,{' '}
+ then the products below will NOT be updated, because each page refresh will still fetch the static content, which was generated at build time.
+ Therefore, changes there won't be reflected here. (but they'll be reflected on the SSR version though )
+
+ N.B : During development, the static page is automatically rebuilt when refreshing, so the above behaviour is only valid in staging/production stages.
+
+
+
+
+
+
+
+ );
+};
+
+export default withApollo()(ExampleWithSSGPage);
diff --git a/src/pages/[locale]/examples/native-features/example-with-ssr.tsx b/src/pages/[locale]/examples/native-features/example-with-ssr.tsx
new file mode 100644
index 000000000..05d5fcc59
--- /dev/null
+++ b/src/pages/[locale]/examples/native-features/example-with-ssr.tsx
@@ -0,0 +1,222 @@
+/** @jsx jsx */
+import { jsx } from '@emotion/core';
+import { createLogger } from '@unly/utils-simple-logger';
+import { ApolloQueryResult } from 'apollo-client';
+import size from 'lodash.size';
+import { GetServerSideProps, NextPage } from 'next';
+// eslint-disable-next-line @typescript-eslint/no-unused-vars,no-unused-vars
+import React from 'react';
+import { Alert, Container } from 'reactstrap';
+import AllProducts from '../../../../components/data/AllProducts';
+import NativeFeaturesSidebar from '../../../../components/doc/NativeFeaturesSidebar';
+
+import DefaultLayout from '../../../../components/pageLayouts/DefaultLayout';
+import ExternalLink from '../../../../components/utils/ExternalLink';
+import { EXAMPLE_WITH_SSR_QUERY } from '../../../../gql/pages/examples/native-features/example-with-ssr';
+import withApollo from '../../../../hocs/withApollo';
+import { Customer } from '../../../../types/data/Customer';
+import { Product } from '../../../../types/data/Product';
+import { GetServerSidePropsContext } from '../../../../types/nextjs/GetServerSidePropsContext';
+import { OnlyBrowserPageProps } from '../../../../types/pageProps/OnlyBrowserPageProps';
+import { SSGPageProps } from '../../../../types/pageProps/SSGPageProps';
+import { SSRPageProps } from '../../../../types/pageProps/SSRPageProps';
+import { getCommonServerSideProps, GetCommonServerSidePropsResults } from '../../../../utils/nextjs/SSR';
+
+const fileLabel = 'pages/[locale]/examples/native-features/example-with-ssr';
+const logger = createLogger({ // eslint-disable-line no-unused-vars,@typescript-eslint/no-unused-vars
+ label: fileLabel,
+});
+
+/**
+ * Props that are only available for this page
+ */
+type CustomPageProps = {
+ [key: string]: any;
+ products: Product[];
+}
+
+type GetServerSidePageProps = CustomPageProps & SSRPageProps
+
+/**
+ * Fetches all products and customer in one single GQL query
+ *
+ * @param context
+ */
+export const getServerSideProps: GetServerSideProps = async (context: GetServerSidePropsContext): Promise<{ props: GetServerSidePageProps }> => {
+ const {
+ apolloClient,
+ layoutQueryOptions,
+ ...pageData
+ }: GetCommonServerSidePropsResults = await getCommonServerSideProps(context);
+ const queryOptions = { // Override query (keep existing variables and headers)
+ ...layoutQueryOptions,
+ displayName: 'EXAMPLE_WITH_SSR_QUERY',
+ query: EXAMPLE_WITH_SSR_QUERY,
+ };
+
+ const {
+ data,
+ errors,
+ loading,
+ networkStatus,
+ stale,
+ }: ApolloQueryResult<{
+ customer: Customer;
+ products: Product[];
+ }> = await apolloClient.query(queryOptions);
+
+ if (errors) {
+ // eslint-disable-next-line no-console
+ console.error(errors);
+ throw new Error('Errors were detected in GraphQL query.');
+ }
+
+ const {
+ customer,
+ products,
+ } = data || {}; // XXX Use empty object as fallback, to avoid app crash when destructuring, if no data is returned
+
+ return {
+ // Props returned here will be available as page properties (pageProps)
+ props: {
+ ...pageData,
+ apolloState: apolloClient.cache.extract(),
+ customer,
+ products,
+ },
+ };
+};
+
+/**
+ * SSR pages are first rendered by the server
+ * Then, they're rendered by the client, and gain additional props (defined in OnlyBrowserPageProps)
+ * Because this last case is the most common (server bundle only happens during development stage), we consider it a default
+ * To represent this behaviour, we use the native Partial TS keyword to make all OnlyBrowserPageProps optional
+ *
+ * Beware props in OnlyBrowserPageProps are not available on the server
+ */
+type Props = CustomPageProps & (SSRPageProps & SSGPageProps);
+
+const ProductsWithSSRPage: NextPage = (props): JSX.Element => {
+ const { products } = props;
+
+ return (
+
+
+ Example, using SSR
+
+
+ This page uses server side rendering (SSR) because it uses getServerSideProps
.
+
+ When this page is loaded through a client-side rendering (AKA "transition") (using next/link
or I18nLink
){' '}
+ then Next.js sends an API request to the server which runs the getServerSideProps
and returns the result as JSON.
+
+ Learn more about the technical details
+
+ Each page refresh (either SSR or CSR) queries the GraphQL API and displays products below.
+
+ If you use NRN Admin and update the products there,{' '}
+ then the products below will be updated immediately, because each page refresh will fetch the latest content.
+
+
+
+
+
+
+
+ );
+};
+
+// XXX For educational purposes - Equivalent to above "getServerSideProps"
+// Note that CSR fails with below code because we didn't check if req/res were available before usage (and I didn't fix it because switching to getServerSideProps looks cleaner and less tricky IMHO)
+// ProductsPage.getInitialProps = async (context: NextPageContext & { apolloClient: ApolloClient }): Promise => {
+// const {
+// apolloClient,
+// AppTree,
+// asPath,
+// err,
+// query,
+// pathname,
+// req,
+// res,
+// } = context;
+// const customerRef: string = process.env.CUSTOMER_REF;
+// const readonlyCookies: Cookies = NextCookies(context); // Parses Next.js cookies in a universal way (server + client)
+// const cookiesManager: UniversalCookiesManager = new UniversalCookiesManager(req, res);
+// const userSession: UserSemiPersistentSession = cookiesManager.getUserData();
+// const { headers }: IncomingMessage = req;
+// const publicHeaders = {
+// 'accept-language': get(headers, 'accept-language'),
+// 'user-agent': get(headers, 'user-agent'),
+// 'host': get(headers, 'host'),
+// };
+// const hasLocaleFromUrl = !!query?.locale;
+// const locale: string = hasLocaleFromUrl ? query?.locale as string : DEFAULT_LOCALE; // If the locale isn't found (e.g: 404 page)
+// const lang: string = locale.split('-')?.[0];
+// const bestCountryCodes: string[] = [lang, resolveFallbackLanguage(lang)];
+// const gcmsLocales: string = prepareGraphCMSLocaleHeader(bestCountryCodes);
+// const defaultLocales: I18nextResources = await fetchTranslations(lang); // Pre-fetches translations from Locize API
+// const variables = {
+// customerRef,
+// };
+// const queryOptions = {
+// displayName: 'EXAMPLE_WITH_SSR_QUERY',
+// query: EXAMPLE_WITH_SSR_QUERY,
+// variables,
+// context: {
+// headers: {
+// 'gcms-locale': gcmsLocales,
+// },
+// },
+// };
+//
+// const {
+// data,
+// errors,
+// loading,
+// networkStatus,
+// stale,
+// }: ApolloQueryResult<{
+// customer: Customer;
+// products: Product[];
+// }> = await apolloClient.query(queryOptions);
+//
+// if (errors) {
+// console.error(errors);
+// throw new Error('Errors were detected in GraphQL query.');
+// }
+//
+// const {
+// customer,
+// products,
+// } = data || {}; // XXX Use empty object as fallback, to avoid app crash when destructuring, if no data is returned
+//
+// return {
+// apolloState: apolloClient.cache.extract(),
+// bestCountryCodes,
+// customer,
+// customerRef,
+// defaultLocales,
+// headers: publicHeaders,
+// gcmsLocales,
+// hasLocaleFromUrl,
+// isReadyToRender: true,
+// isServerRendering: true,
+// lang,
+// locale,
+// products,
+// readonlyCookies,
+// userSession,
+// };
+// };
+
+export default withApollo()(ProductsWithSSRPage);
diff --git a/src/pages/[locale]/examples/native-features/index.tsx b/src/pages/[locale]/examples/native-features/index.tsx
new file mode 100644
index 000000000..af38429d8
--- /dev/null
+++ b/src/pages/[locale]/examples/native-features/index.tsx
@@ -0,0 +1,11 @@
+import { GetStaticPaths, GetStaticProps } from 'next';
+
+import { StaticParams } from '../../../../types/nextjs/StaticParams';
+import { SSGPageProps } from '../../../../types/pageProps/SSGPageProps';
+import ExampleWithSSGPage, { getStaticPaths as getStaticPathsHomePage, getStaticProps as getStaticPropsHomePage } from './example-with-ssg';
+
+// XXX This page is an "alias"
+export const getStaticPaths: GetStaticPaths = getStaticPathsHomePage;
+export const getStaticProps: GetStaticProps = getStaticPropsHomePage;
+
+export default ExampleWithSSGPage;
diff --git a/src/pages/[locale]/index.tsx b/src/pages/[locale]/index.tsx
new file mode 100644
index 000000000..900a59101
--- /dev/null
+++ b/src/pages/[locale]/index.tsx
@@ -0,0 +1,17 @@
+import { GetStaticPaths, GetStaticProps } from 'next';
+
+import { StaticParams } from '../../types/nextjs/StaticParams';
+import { SSGPageProps } from '../../types/pageProps/SSGPageProps';
+import DocsHomePage, { getStaticPaths as getStaticPathsHomePage, getStaticProps as getStaticPropsHomePage } from './examples/';
+
+/*
+ XXX This page is an "alias", it basically imports the whole /examples/index page and export it back
+ It's a trick that is similar to a "url rewrite", and allows 2 different urls to serve the exact same content, without code duplication
+ We use it so that you can build your own /index page while keeping the docs available for later use
+ Check out /pageTemplateSSG for getting started with your own index page and override this one
+ */
+
+export const getStaticPaths: GetStaticPaths = getStaticPathsHomePage;
+export const getStaticProps: GetStaticProps = getStaticPropsHomePage;
+
+export default DocsHomePage;
diff --git a/src/pages/[locale]/pageTemplateSSG.tsx b/src/pages/[locale]/pageTemplateSSG.tsx
new file mode 100644
index 000000000..9b2dd92b8
--- /dev/null
+++ b/src/pages/[locale]/pageTemplateSSG.tsx
@@ -0,0 +1,67 @@
+/** @jsx jsx */
+import { jsx } from '@emotion/core';
+import { createLogger } from '@unly/utils-simple-logger';
+import { GetStaticPaths, GetStaticProps, NextPage } from 'next';
+// eslint-disable-next-line @typescript-eslint/no-unused-vars,no-unused-vars
+import React from 'react';
+import DefaultLayout from '../../components/pageLayouts/DefaultLayout';
+import withApollo from '../../hocs/withApollo';
+import { StaticParams } from '../../types/nextjs/StaticParams';
+import { OnlyBrowserPageProps } from '../../types/pageProps/OnlyBrowserPageProps';
+import { SSGPageProps } from '../../types/pageProps/SSGPageProps';
+import { getCommonStaticPaths, getCommonStaticProps } from '../../utils/nextjs/SSG';
+
+const fileLabel = 'pages/[locale]/pageTemplateSSG';
+const logger = createLogger({ // eslint-disable-line no-unused-vars,@typescript-eslint/no-unused-vars
+ label: fileLabel,
+});
+
+/**
+ * Only executed on the server side at build time
+ * Necessary when a page has dynamic routes and uses "getStaticProps"
+ */
+export const getStaticPaths: GetStaticPaths = getCommonStaticPaths;
+
+/**
+ * Only executed on the server side at build time.
+ *
+ * @return Props (as "SSGPageProps") that will be passed to the Page component, as props
+ *
+ * @see https://github.com/zeit/next.js/discussions/10949#discussioncomment-6884
+ * @see https://nextjs.org/docs/basic-features/data-fetching#getstaticprops-static-generation
+ */
+export const getStaticProps: GetStaticProps = getCommonStaticProps;
+
+/**
+ * SSG pages are first rendered by the server (during static bundling)
+ * Then, they're rendered by the client, and gain additional props (defined in OnlyBrowserPageProps)
+ * Because this last case is the most common (server bundle only happens during development stage), we consider it a default
+ * To represent this behaviour, we use the native Partial TS keyword to make all OnlyBrowserPageProps optional
+ *
+ * Beware props in OnlyBrowserPageProps are not available on the server
+ */
+type Props = {} & SSGPageProps>;
+
+const PageTemplateSSG: NextPage = (props): JSX.Element => {
+ const { customer } = props;
+
+ return (
+
+
+ This page is a template meant to be duplicated to quickly get started with new Next.js SSG pages .
+ It gets common page properties from a default SSG build. Dynamic data (from GraphCMS) are accessible through props.customer
.
+
+
+ Customer label: {customer.label}
+
+
+ );
+};
+
+export default withApollo()(PageTemplateSSG);
diff --git a/src/pages/[locale]/pageTemplateSSR.tsx b/src/pages/[locale]/pageTemplateSSR.tsx
new file mode 100644
index 000000000..6c9befaab
--- /dev/null
+++ b/src/pages/[locale]/pageTemplateSSR.tsx
@@ -0,0 +1,112 @@
+/** @jsx jsx */
+import { jsx } from '@emotion/core';
+import { createLogger } from '@unly/utils-simple-logger';
+import { ApolloQueryResult } from 'apollo-client';
+import { GetServerSideProps, NextPage } from 'next';
+// eslint-disable-next-line @typescript-eslint/no-unused-vars,no-unused-vars
+import React from 'react';
+
+import DefaultLayout from '../../components/pageLayouts/DefaultLayout';
+import { LAYOUT_QUERY } from '../../gql/common/layoutQuery';
+import withApollo from '../../hocs/withApollo';
+import { Customer } from '../../types/data/Customer';
+import { GetServerSidePropsContext } from '../../types/nextjs/GetServerSidePropsContext';
+import { OnlyBrowserPageProps } from '../../types/pageProps/OnlyBrowserPageProps';
+import { SSGPageProps } from '../../types/pageProps/SSGPageProps';
+import { SSRPageProps } from '../../types/pageProps/SSRPageProps';
+import { getCommonServerSideProps, GetCommonServerSidePropsResults } from '../../utils/nextjs/SSR';
+
+const fileLabel = 'pages/[locale]/pageTemplateSSR';
+const logger = createLogger({ // eslint-disable-line no-unused-vars,@typescript-eslint/no-unused-vars
+ label: fileLabel,
+});
+
+/**
+ * Props that are only available for this page
+ */
+type CustomPageProps = {
+ [key: string]: any;
+}
+
+type GetServerSidePageProps = CustomPageProps & SSRPageProps
+
+/**
+ * XXX You should fetch everything you need in one single query, for performance reasons.
+ * It fetches customer data by default (through LAYOUT_QUERY), because those data are needed on all pages (displayed in footer/nav header).
+ *
+ * @param context
+ */
+export const getServerSideProps: GetServerSideProps = async (context: GetServerSidePropsContext): Promise<{ props: GetServerSidePageProps }> => {
+ const {
+ apolloClient,
+ layoutQueryOptions,
+ ...pageData
+ }: GetCommonServerSidePropsResults = await getCommonServerSideProps(context);
+ const queryOptions = { // Override query (keep existing variables and headers)
+ ...layoutQueryOptions,
+ displayName: 'LAYOUT_QUERY',
+ query: LAYOUT_QUERY,
+ };
+
+ const {
+ data,
+ errors,
+ }: ApolloQueryResult<{
+ customer: Customer;
+ }> = await apolloClient.query(queryOptions);
+
+ if (errors) {
+ // eslint-disable-next-line no-console
+ console.error(errors);
+ throw new Error('Errors were detected in GraphQL query.');
+ }
+
+ const {
+ customer,
+ } = data || {}; // XXX Use empty object as fallback, to avoid app crash when destructuring, if no data is returned
+
+ return {
+ // Props returned here will be available as page properties (pageProps)
+ props: {
+ ...pageData,
+ apolloState: apolloClient.cache.extract(),
+ customer,
+ },
+ };
+};
+
+/**
+ * SSR pages are first rendered by the server
+ * Then, they're rendered by the client, and gain additional props (defined in OnlyBrowserPageProps)
+ * Because this last case is the most common (server bundle only happens during development stage), we consider it a default
+ * To represent this behaviour, we use the native Partial TS keyword to make all OnlyBrowserPageProps optional
+ *
+ * Beware props in OnlyBrowserPageProps are not available on the server
+ */
+type Props = CustomPageProps & (SSRPageProps & SSGPageProps);
+
+const PageTemplateSSR: NextPage = (props): JSX.Element => {
+ const { customer } = props;
+
+ return (
+
+
+ This page is a template meant to be duplicated to quickly get started with new Next.js SSR pages .
+ It gets common page properties from a default SSR build. Dynamic data (from GraphCMS) are accessible through props.customer
.
+ In order to keep it simple, it fetches LAYOUT_QUERY
GraphQL query, which contains the above customer data.
+ Unlike SSG (where you can perform multiple GQL queries without performance concerns because they are executed at build time), SSR should rather only run one GQL query to optimise round trips network calls.
+
+
+ Customer label: {customer.label}
+
+
+ );
+};
+
+export default withApollo()(PageTemplateSSR);
diff --git a/src/pages/[locale]/terms.tsx b/src/pages/[locale]/terms.tsx
new file mode 100644
index 000000000..6954da762
--- /dev/null
+++ b/src/pages/[locale]/terms.tsx
@@ -0,0 +1,174 @@
+/** @jsx jsx */
+import { css, jsx } from '@emotion/core';
+import { createLogger } from '@unly/utils-simple-logger';
+import { ApolloQueryResult } from 'apollo-client';
+import deepmerge from 'deepmerge';
+import { GetStaticPaths, GetStaticProps, NextPage } from 'next';
+// eslint-disable-next-line @typescript-eslint/no-unused-vars,no-unused-vars
+import React from 'react';
+import { Container } from 'reactstrap';
+import DefaultLayout from '../../components/pageLayouts/DefaultLayout';
+import { TERMS_PAGE_QUERY } from '../../gql/pages/terms';
+import withApollo from '../../hocs/withApollo';
+import customerContext, { CustomerContext } from '../../stores/customerContext';
+import { Customer } from '../../types/data/Customer';
+import { StaticParams } from '../../types/nextjs/StaticParams';
+
+import { StaticPropsInput } from '../../types/nextjs/StaticPropsInput';
+import { StaticPropsOutput } from '../../types/nextjs/StaticPropsOutput';
+import { OnlyBrowserPageProps } from '../../types/pageProps/OnlyBrowserPageProps';
+import { SSGPageProps } from '../../types/pageProps/SSGPageProps';
+import { createApolloClient } from '../../utils/gql/graphql';
+import { replaceAllOccurrences } from '../../utils/js/string';
+import { getCommonStaticPaths, getCommonStaticProps } from '../../utils/nextjs/SSG';
+
+const fileLabel = 'pages/[locale]/terms';
+const logger = createLogger({ // eslint-disable-line no-unused-vars,@typescript-eslint/no-unused-vars
+ label: fileLabel,
+});
+
+/**
+ * Only executed on the server side at build time
+ * Necessary when a page has dynamic routes and uses "getStaticProps"
+ */
+export const getStaticPaths: GetStaticPaths = getCommonStaticPaths;
+
+/**
+ * Only executed on the server side at build time.
+ *
+ * @return Props (as "SSGPageProps") that will be passed to the Page component, as props
+ *
+ * @see https://github.com/zeit/next.js/discussions/10949#discussioncomment-6884
+ * @see https://nextjs.org/docs/basic-features/data-fetching#getstaticprops-static-generation
+ */
+export const getStaticProps: GetStaticProps = async (props: StaticPropsInput): Promise => {
+ const commonStaticProps: StaticPropsOutput = await getCommonStaticProps(props);
+ const { customerRef, gcmsLocales } = commonStaticProps.props;
+
+ const apolloClient = createApolloClient();
+ const variables = {
+ customerRef,
+ };
+ const queryOptions = {
+ displayName: 'TERMS_PAGE_QUERY',
+ query: TERMS_PAGE_QUERY,
+ variables,
+ context: {
+ headers: {
+ 'gcms-locale': gcmsLocales,
+ },
+ },
+ };
+
+ const {
+ data,
+ errors,
+ loading,
+ networkStatus,
+ stale,
+ }: ApolloQueryResult<{
+ customer: Customer;
+ }> = await apolloClient.query(queryOptions);
+
+ if (errors) {
+ console.error(errors);
+ throw new Error('Errors were detected in GraphQL query.');
+ }
+
+ const {
+ customer,
+ } = data || {}; // XXX Use empty object as fallback, to avoid app crash when destructuring, if no data is returned
+
+ return deepmerge(commonStaticProps, {
+ props: {
+ customer,
+ },
+ });
+};
+
+/**
+ * SSG pages are first rendered by the server (during static bundling)
+ * Then, they're rendered by the client, and gain additional props (defined in OnlyBrowserPageProps)
+ * Because this last case is the most common (server bundle only happens during development stage), we consider it a default
+ * To represent this behaviour, we use the native Partial TS keyword to make all OnlyBrowserPageProps optional
+ *
+ * Beware props in OnlyBrowserPageProps are not available on the server
+ */
+type Props = {} & SSGPageProps>;
+
+const TermsPage: NextPage = (props): JSX.Element => {
+ const customer: CustomerContext = React.useContext(customerContext);
+ const { theme: { primaryColor } } = customer;
+
+ return (
+
+
+
+
${customer?.label}`,
+ }),
+ }}
+ />
+
+
+
+
+
HTML source code (fetched from GraphQL API), as RichText
field:
+
+
+ {customer?.terms?.html}
+
+
+
+
+
+
+ );
+};
+
+export default withApollo()(TermsPage);
diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx
index 1dc51d01d..b4f357b2e 100644
--- a/src/pages/_app.tsx
+++ b/src/pages/_app.tsx
@@ -1,326 +1,160 @@
-import { Amplitude, AmplitudeProvider } from '@amplitude/react-amplitude';
-import { ApolloProvider } from '@apollo/react-hooks';
import { config, library } from '@fortawesome/fontawesome-svg-core';
import '@fortawesome/fontawesome-svg-core/styles.css';
import { faGithub } from '@fortawesome/free-brands-svg-icons';
-import { faBook, faBookReader, faHome, faUserCog } from '@fortawesome/free-solid-svg-icons';
-import * as Sentry from '@sentry/node';
-import universalLanguageDetect from '@unly/universal-language-detector';
-import { ERROR_LEVELS } from '@unly/universal-language-detector/lib/utils/error';
-import { isBrowser } from '@unly/utils';
-import { createLogger } from '@unly/utils-simple-logger';
-import { AmplitudeClient, Identify } from 'amplitude-js';
+import { faTimesCircle } from '@fortawesome/free-regular-svg-icons';
+import { faArrowCircleLeft, faArrowCircleRight, faBook, faBookReader, faCoffee, faHome, faUserCog } from '@fortawesome/free-solid-svg-icons';
import 'animate.css/animate.min.css'; // Loads animate.css CSS file. See https://github.com/daneden/animate.css
import 'bootstrap/dist/css/bootstrap.min.css'; // Loads bootstrap CSS file. See https://stackoverflow.com/a/50002905/2391795
-import { IncomingMessage } from 'http';
-import get from 'lodash.get';
-import { NextPageContext } from 'next';
-import NextCookies from 'next-cookies';
-import NextApp from 'next/app';
import 'rc-tooltip/assets/bootstrap.css';
-import React, { ErrorInfo } from 'react';
-
-import Layout from '../components/Layout';
-import withUniversalGraphQLDataLoader from '../hoc/withUniversalGraphQLDataLoader';
-import { AppInitialProps } from '../types/AppInitialProps';
-import { AppRenderProps } from '../types/AppRenderProps';
-import { Cookies } from '../types/Cookies';
-import { LayoutProps } from '../types/LayoutProps';
-import { PublicHeaders } from '../types/PublicHeaders';
-import { UserSemiPersistentSession } from '../types/UserSemiPersistentSession';
-import { prepareGraphCMSLocaleHeader } from '../utils/graphcms';
-import { LANG_EN, resolveFallbackLanguage, SUPPORTED_LANGUAGES } from '../utils/i18n'; // XXX Init Sentry
-import i18nextLocize, { fetchTranslations, I18nextResources } from '../utils/i18nextLocize';
-import { getIframeReferrer, isRunningInIframe } from '../utils/iframe';
-import '../utils/ignoreNoisyWarningsHacks'; // HACK
-import '../utils/sentry';
-import UniversalCookiesManager from '../utils/UniversalCookiesManager';
+import React from 'react';
+import uuid from 'uuid/v1'; // XXX Use v1 for uniqueness - See https://www.sohamkamani.com/blog/2016/10/05/uuid1-vs-uuid4/
+import MultiversalAppBootstrap from '../components/appBootstrap/MultiversalAppBootstrap';
+import { MultiversalAppBootstrapProps } from '../types/nextjs/MultiversalAppBootstrapProps';
+import { NextWebVitalsMetrics } from '../types/nextjs/NextWebVitalsMetrics';
+import { NextWebVitalsMetricsReport } from '../types/nextjs/NextWebVitalsMetricsReport';
+import { SSGPageProps } from '../types/pageProps/SSGPageProps';
+import { SSRPageProps } from '../types/pageProps/SSRPageProps';
+import { sendWebVitals } from '../utils/analytics/amplitude';
+import '../utils/app/ignoreNoisyWarningsHacks'; // HACK This ignore warnings and errors I personally find too noisy and useless
+import '../utils/monitoring/sentry';
// See https://github.com/FortAwesome/react-fontawesome#integrating-with-other-tools-and-frameworks
config.autoAddCss = false; // Tell Font Awesome to skip adding the CSS automatically since it's being imported above
library.add(
faGithub,
- faBook, faBookReader, faHome, faUserCog,
+ faArrowCircleLeft, faArrowCircleRight, faBook, faBookReader, faCoffee, faHome, faUserCog,
+ faTimesCircle,
);
-const fileLabel = 'pages/_app';
-const logger = createLogger({
- label: fileLabel,
-});
-
-class NRNApp extends NextApp {
- /**
- * Initialise the application
- *
- * XXX Executed both on server and client side, but with different props (req, res are undefined on the client-side)
- *
- * @param props
- * @see https://github.com/zeit/next.js/#fetching-data-and-component-lifecycle
- */
- static async getInitialProps(props: AppInitialProps): Promise
{
- const { ctx }: AppInitialProps = props;
- const { req, res }: NextPageContext = ctx;
- const readonlyCookies: Cookies = NextCookies(ctx); // Parses Next.js cookies in a universal way (server + client)
- const cookiesManager: UniversalCookiesManager = new UniversalCookiesManager(req, res);
- const userSession: UserSemiPersistentSession = cookiesManager.getUserData();
- const customerRef: string = process.env.CUSTOMER_REF;
- let publicHeaders: PublicHeaders = {};
-
- Sentry.configureScope((scope) => { // See https://www.npmjs.com/package/@sentry/node
- scope.setTag('customer', customerRef);
- scope.setTag('userId', userSession.id);
- scope.setContext('userSession', userSession);
- scope.setContext('cookies', readonlyCookies);
- });
-
- Sentry.addBreadcrumb({ // See https://docs.sentry.io/enriching-error-data/breadcrumbs
- category: fileLabel,
- message: `Preparing app (${isBrowser() ? 'browser' : 'server'})`,
- level: Sentry.Severity.Debug,
- });
-
- if (req) {
- const { headers }: IncomingMessage = req;
- publicHeaders = {
- 'accept-language': get(headers, 'accept-language'),
- 'user-agent': get(headers, 'user-agent'),
- 'host': get(headers, 'host'),
- };
-
- Sentry.configureScope((scope) => { // See https://www.npmjs.com/package/@sentry/node
- scope.setContext('headers', headers);
- });
- }
-
- // Resolves the lang, will first check in cookies, and then browser settings
- const lang: string = universalLanguageDetect({
- supportedLanguages: SUPPORTED_LANGUAGES, // Whitelist of supported languages, will be used to filter out languages that aren't supported
- fallbackLanguage: LANG_EN, // Fallback language in case the user's language cannot be resolved
- acceptLanguageHeader: get(req, 'headers.accept-language'), // Optional - Accept-language header will be used when resolving the language on the server side
- serverCookies: readonlyCookies, // Optional - Cookie "i18next" takes precedence over navigator configuration (ex: "i18next: fr"), will only be used on the server side
- errorHandler: (error: Error, level: ERROR_LEVELS, origin: string, context: object): void => {
- Sentry.withScope((scope): void => {
- scope.setExtra('level', level);
- scope.setExtra('origin', origin);
- scope.setContext('context', context);
- Sentry.captureException(error);
- });
- logger.error(error.message);
- },
- });
- const bestCountryCodes: string[] = [lang, resolveFallbackLanguage(lang)];
- const gcmsLocales: string = prepareGraphCMSLocaleHeader(bestCountryCodes);
- if (!customerRef) {
- throw Error(`Unable to resolve customerRef with "${customerRef}"`);
- }
-
- // Calls page's `getInitialProps` and fills `appProps.pageProps` - XXX See https://nextjs.org/docs#custom-app
- const appProps: AppRenderProps = await NextApp.getInitialProps(props);
- const defaultLocales: I18nextResources = await fetchTranslations(lang); // Pre-fetches translations from Locize API
-
- Sentry.configureScope((scope) => { // See https://www.npmjs.com/package/@sentry/node
- scope.setExtra('lang', lang);
- });
-
- appProps.pageProps = {
- ...appProps.pageProps,
- customerRef,
- headers: publicHeaders, // Publicly available headers - whitelist
- readonlyCookies,
- userSession,
- bestCountryCodes, // e.g: ['en', 'fr']
- gcmsLocales, // e.g: 'EN, FR' XXX MUST BE UPPERCASED - See https://docs.graphcms.com/docs/api/content-api/#passing-a-header-flag
- lang, // e.g: 'en'
- defaultLocales,
- isSSRReadyToRender: true,
- };
-
- return { ...appProps };
- }
-
- /**
- * Renders the whole application (providers, layout, etc.)
- *
- * XXX Executed both on server and client side
- * req, res are not accessible here
- *
- * @return {JSX.Element}
- */
- render(): JSX.Element {
- const {
- Component,
- pageProps,
- apollo,
- router,
- err,
- }: AppRenderProps = this.props;
-
- Sentry.configureScope((scope) => { // See https://www.npmjs.com/package/@sentry/node
- // Only track meaningful data from router, as it contains lots of noise
- scope.setContext('router', {
- route: router.route,
- pathname: router.pathname,
- query: router.query,
- asPath: router.asPath,
- });
- });
-
- Sentry.addBreadcrumb({ // See https://docs.sentry.io/enriching-error-data/breadcrumbs
- category: fileLabel,
- message: `Rendering app for Component "${get(Component, 'name', 'unknown')}" (${isBrowser() ? 'browser' : 'server'})`,
- level: Sentry.Severity.Debug,
- });
-
- const i18nextInstance = i18nextLocize(pageProps.lang, pageProps.defaultLocales); // Apply i18next configuration with Locize backend
-
- // Build initial layout properties, they may be enhanced later on depending on the runtime engine
- const layoutProps: LayoutProps = {
- ...pageProps,
- err,
- router,
- i18nextInstance,
- };
-
- // XXX For an unknown reason, we noticed 2 render() calls. (each render call starts a new graphql request, and it makes debugging harder)
- // The first one doesn't contain any data from the server (no data, almost nothing) and therefore result in errors along the react sub tree
- // The second contains the expected data
- // Due to this behaviour, an "isSSRReadyToRender" variable has been introduced, to make sure we only render the components when all the data have been provided
- if (layoutProps.isSSRReadyToRender) {
- /**
- * App rendered both on client or server (universal/isomorphic)
- *
- * @return {JSX.Element}
- * @constructor
- */
- const UniversalApp = (): JSX.Element => (
-
-
-
-
-
- );
-
- // On the browser, we render additional things, such as Amplitude (data analytics)
- if (isBrowser()) {
- const userId = get(layoutProps, 'userSession.id', 'NOT_SET');
- const isInIframe: boolean = isRunningInIframe();
- const iframeReferrer: string = getIframeReferrer();
-
- Sentry.configureScope((scope) => { // See https://www.npmjs.com/package/@sentry/node
- scope.setTag('iframe', `${isInIframe}`);
- scope.setExtra('iframe', isInIframe);
- scope.setExtra('iframeReferrer', iframeReferrer);
- });
-
- // XXX Amplitude is disabled on the server side, it's only used on the client side
- // (avoids double events + amplitude-js isn't server-side compatible anyway)
- const amplitude = require('amplitude-js'); // eslint-disable-line @typescript-eslint/no-var-requires
- const amplitudeInstance: AmplitudeClient = amplitude.getInstance();
-
- // https://help.amplitude.com/hc/en-us/articles/115001361248#settings-configuration-options
- amplitudeInstance.init(process.env.AMPLITUDE_API_KEY, null, {
- userId,
- logLevel: process.env.APP_STAGE === 'production' ? 'DISABLE' : 'WARN',
- includeGclid: true,
- includeReferrer: true, // https://help.amplitude.com/hc/en-us/articles/215131888#track-referrers
- includeUtm: true,
- // @ts-ignore XXX onError should be allowed, see https://github.com/DefinitelyTyped/DefinitelyTyped/issues/42005
- onError: (error): void => {
- Sentry.captureException(error);
- console.error(error); // eslint-disable-line no-console
- },
- });
-
- amplitudeInstance.setVersionName(process.env.APP_VERSION); // e.g: 1.0.0
-
- // Inject additional variables in the layout
- layoutProps.isInIframe = isInIframe;
- layoutProps.amplitudeInstance = amplitudeInstance;
-
- // We're only doing this when detecting a new session, as it won't be executed multiple times for the same session anyway, and it avoids noise
- if (amplitudeInstance.isNewSession()) {
- // Store whether the visitor originally came from an iframe (and from where)
- const visitor: Identify = new amplitudeInstance.Identify();
- // XXX See https://github.com/amplitude/Amplitude-JavaScript/issues/223
- visitor.setOnce('initial_lang', pageProps.lang); // DA Helps figuring out if the initial language (auto-detected) is changed afterwards
- // DA This will help track down the users who discovered our platform because of an iframe
- // @ts-ignore See https://github.com/DefinitelyTyped/DefinitelyTyped/issues/43598
- visitor.setOnce('initial_iframe', isInIframe);
- visitor.setOnce('initial_iframeReferrer', iframeReferrer);
-
- // XXX We must set all other "must-have" properties here (instead of below, as userProperties), because react-amplitude will send the next "page-displayed" event BEFORE sending the $identify event
- // Thus, it'd store the first event with an associated user who has not defined "customer.ref", "lang", etc... and that'd break our stats (following events would be correct, only the first event of a new user would be wrong)
- visitor.setOnce('customer.ref', layoutProps.customerRef);
- visitor.setOnce('lang', pageProps.lang);
- // @ts-ignore See https://github.com/DefinitelyTyped/DefinitelyTyped/issues/43598
- visitor.setOnce('iframe', isInIframe);
- visitor.setOnce('iframeReferrer', iframeReferrer);
-
- amplitudeInstance.identify(visitor); // Send the new identify event to amplitude (updates user's identity)
- }
+/**
+ * WDYR (why-did-you-render) helps locate unnecessary re-renders and fix them
+ * Applied in development environment, on the frontend only
+ *
+ * @see https://github.com/welldone-software/why-did-you-render
+ */
+if (typeof window !== 'undefined' && process.env.NODE_ENV === 'development') {
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
+ const whyDidYouRender = require('@welldone-software/why-did-you-render');
+ // eslint-disable-next-line no-console
+ console.debug('Applying whyDidYouRender, to help you locate unnecessary re-renders during development. See https://github.com/welldone-software/why-did-you-render');
+ whyDidYouRender(React, {
+ trackAllPureComponents: true,
+ trackHooks: true,
+ logOwnerReasons: true,
+ collapseGroups: true,
+ });
+}
- return (
-
-
-
-
-
- );
- } else {
- // On the server, we just render the universal app without additional stuff (for now)
- return (
-
- );
- }
- } else {
- return null;
- }
+/**
+ * "props.pageProps" will depend on whether the page is served by server or client, SSG or SSR
+ * (MultiversalAppBootstrapProps | MultiversalAppBootstrapProps) is basically a superset of AppProps (from 'next/app')
+ */
+type Props = MultiversalAppBootstrapProps | MultiversalAppBootstrapProps;
+
+/**
+ * This file is the entry point for all pages, it initialize all pages.
+ *
+ * It can be executed server side or browser side.
+ * It can be executed from a static build (SSG) or dynamically per request (SSR).
+ *
+ * We use "_app" to handle root errors and configure common behaviours and configurations across all pages. (it inits sentry, by importing our helper)
+ * Some of those behaviours/config are applied based on the runtime engine (browser vs server) and on the rendering mode (dynamic vs static)
+ *
+ * NRN Definitions:
+ * - Universal: A universal code (AKA isomorphic) runs anywhere (on both browsers and servers), it is compatible with both, but may behave slightly differently
+ * - Multiversal: A multiversal code is universal (runs anywhere) and also handles all rendering modes (dynamic and static)
+ * The concept of "Multiversal" has been invented by myself, because we lack proper definition for this kind of things (it's fairly new, feel free to propose better)
+ * It's very important for developers to know when a particular piece of code is gonna be executed (server? browser? static? dynamic request? etc.)
+ *
+ * Next.js provides huge capabilities, but with such comes complexity.
+ * You may have a hard time knowing for sure if a particular function will run identically on browser + server + statically + dynamically
+ * For instance, if you depend on cookies, then you'll have a different behaviour whether executing the code:
+ * - During the SSG rendering (server side, but no request and no access to user-data or request-data)
+ * - During a server side request (no access to browser data (localstorage, browser cookies)
+ * - During a client side request (no access to server data (server cookies, HTTP headers)
+ *
+ * XXX It's easy to get lost. The term of "Multiversal" is used to make it obvious that a particular piece of code runs in any situation.
+ *
+ * @see https://nextjs.org/docs/advanced-features/custom-app Custom _app
+ * @see https://nextjs.org/docs/basic-features/typescript#custom-app TypeScript for _app
+ * @see https://stackoverflow.com/a/43862885/2391795 Some "Universal" definition (feel free to disagree)
+ */
+
+/**
+ * Renders the whole page
+ * For the sake of readability/maintainability, we have decoupled what happens in the "render" to our "MultiversalAppBootstrap" component.
+ *
+ * All props returned by "getInitialProps", "getServerSideProps" or "getStaticProps" are available in "props.pageProps".
+ * The "Component" prop within "props.pageProps" contains the page that is being rendered.
+ *
+ * XXX Multiversal - Executed in any case
+ * req, res are NOT accessible here
+ *
+ * @return {JSX.Element}
+ */
+const MultiversalPageEntryPoint: React.FunctionComponent = (props): JSX.Element => {
+ return (
+
+ );
+};
+
+/**
+ * Global variable meant to keep all metrics together, until there are enough to send them in batch as a single report
+ */
+const globalWebVitalsMetric: NextWebVitalsMetricsReport = {
+ reportId: uuid(),
+ metrics: {},
+ reportedCount: 0,
+};
+
+/**
+ * Will be called once for every metric that has to be reported.
+ *
+ * There are, at minimum, 3 metrics being received (Next.js-hydration, FCP and TTFB)
+ * Then, 2 other metrics can be received optionally (FID, LCP)
+ *
+ * @param metrics
+ * @see https://web.dev/vitals/ Essential metrics for a healthy site
+ * @see https://nextjs.org/blog/next-9-4#integrated-web-vitals-reporting Initial release notes
+ */
+export function reportWebVitals(metrics: NextWebVitalsMetrics): void {
+ if (process.env.APP_STAGE !== 'production') {
+ console.debug(metrics);
}
- componentDidCatch(error: Error, errorInfo: ErrorInfo): void {
- Sentry.withScope((scope) => {
- Object.keys(errorInfo).forEach((key) => {
- scope.setExtra(key, errorInfo[key]);
- });
+ const { name } = metrics;
+ const count = globalWebVitalsMetric.reportedCount;
+ globalWebVitalsMetric.metrics[name] = metrics;
+ const keysLength = Object.keys(globalWebVitalsMetric.metrics).length;
- Sentry.captureException(error);
- });
+ // Temporise analytics API calls by waiting for at least 5 metrics to be received before sending the first report
+ // (because 3 metrics will be received upon initial page load, and then 2 more upon first click)
+ // Then, send report every 2 metrics (because each client-side redirection will generate 2 metrics)
+ if ((count === 0 && keysLength === 5) || (count > 0 && keysLength === 2)) {
+ sendWebVitals(globalWebVitalsMetric);
- // This is needed to render errors correctly in development / production
- super.componentDidCatch(error, errorInfo);
+ // Reset and prepare next metrics to be reported
+ globalWebVitalsMetric.metrics = {};
+ globalWebVitalsMetric.reportedCount++;
}
}
-// Wraps all components in the tree with the data provider
-export default withUniversalGraphQLDataLoader(NRNApp);
+/**
+ * XXX We have disabled the use of getInitialProps by default with NRN, because it's what's recommended since v9.3,
+ * feel free to use it if needed, but beware you'll opt-out of automated static optimization for all pages by doing so.
+ *
+ * By default, all pages will be served statically (using automated static optimization)
+ * If the page uses "getStaticProps", then it will use SSG. (a static build will be generated in production, in development it'll simulate a static build)
+ * If the page uses "getServerSideProps" or "getInitialProps", then it will use SSR. (your request will be served dynamically by a Serverless Function (AKA AWS Lambda))
+ *
+ * From the official doc:
+ * If you're using Next.js 9.3 or newer, we recommend that you use getStaticProps or getServerSideProps instead of getInitialProps.
+ * These new data fetching methods allow you to have a granular choice between static generation and server-side rendering.
+ *
+ * @see https://nextjs.org/docs/api-reference/data-fetching/getInitialProps Recommendations regarding "getInitialProps"
+ * @see https://nextjs.org/docs/basic-features/data-fetching#getstaticprops-static-generation "getStaticProps" doc
+ * @see https://nextjs.org/docs/basic-features/data-fetching#getserversideprops-server-side-rendering "getServerSideProps" doc
+ */
+// MultiversalPageEntryPoint.getInitialProps = async (props: AppInitialProps): Promise {}
+
+export default MultiversalPageEntryPoint;
diff --git a/src/pages/_document.tsx b/src/pages/_document.tsx
index a4537bbad..37f7d07a7 100644
--- a/src/pages/_document.tsx
+++ b/src/pages/_document.tsx
@@ -1,24 +1,29 @@
import * as Sentry from '@sentry/node';
-import universalLanguageDetect from '@unly/universal-language-detector';
-import { ERROR_LEVELS } from '@unly/universal-language-detector/lib/utils/error';
-import { isBrowser } from '@unly/utils';
import { createLogger } from '@unly/utils-simple-logger';
import classnames from 'classnames';
-import get from 'lodash.get';
-import { NextPageContext } from 'next';
-import NextCookies from 'next-cookies';
+import { DocumentInitialProps } from 'next/dist/next-server/lib/utils';
import Document, { DocumentContext, DocumentProps, Head, Main, NextScript } from 'next/document';
import React from 'react';
-
-import { Cookies } from '../types/Cookies';
-import { DocumentInitialProps } from '../types/DocumentInitialProps';
-import { LANG_EN, SUPPORTED_LANGUAGES } from '../utils/i18n';
+import { DEFAULT_LOCALE } from '../utils/i18n/i18n';
const fileLabel = 'pages/_document';
const logger = createLogger({
label: fileLabel,
});
+/**
+ * Additional props depending on our App
+ *
+ * Must be returned by getInitialProps and will be available in render function
+ */
+type Props = {
+ locale: string;
+ lang: string;
+}
+
+type DocumentGetInitialPropsOutput = Props & DocumentInitialProps
+type DocumentRenderProps = Props & DocumentProps
+
/**
* Send to Sentry all unhandled rejections.
*
@@ -46,52 +51,52 @@ process.on('uncaughtException', (e: Error): void => {
*
* See https://github.com/zeit/next.js/#custom-document
*/
-class NRNDocument extends Document {
- static async getInitialProps(ctx: DocumentContext): Promise {
- try {
- Sentry.addBreadcrumb({ // See https://docs.sentry.io/enriching-error-data/breadcrumbs
- category: fileLabel,
- message: `Preparing document (${isBrowser() ? 'browser' : 'server'})`,
- level: Sentry.Severity.Debug,
- });
-
- const initialProps: DocumentInitialProps = await Document.getInitialProps(ctx);
- const { req }: NextPageContext = ctx;
- const cookies: Cookies = NextCookies(ctx); // Parses Next.js cookies in a universal way (server + client)
- const lang: string = universalLanguageDetect({
- supportedLanguages: SUPPORTED_LANGUAGES, // Whitelist of supported languages, will be used to filter out languages that aren't supported
- fallbackLanguage: LANG_EN, // Fallback language in case the user's language cannot be resolved
- acceptLanguageHeader: get(req, 'headers.accept-language'), // Optional - Accept-language header will be used when resolving the language on the server side
- serverCookies: cookies, // Optional - Cookie "i18next" takes precedence over navigator configuration (ex: "i18next: fr"), will only be used on the server side
- errorHandler: (error: Error, level: ERROR_LEVELS, origin: string, context: object): void => {
- Sentry.withScope((scope): void => {
- scope.setExtra('level', level);
- scope.setExtra('origin', origin);
- scope.setContext('context', context);
- Sentry.captureException(error);
- });
- logger.error(error.message);
- },
- });
+class AppDocument extends Document {
+ static async getInitialProps(ctx: DocumentContext): Promise {
+ Sentry.addBreadcrumb({ // See https://docs.sentry.io/enriching-error-data/breadcrumbs
+ category: fileLabel,
+ message: `Rendering _document`,
+ level: Sentry.Severity.Debug,
+ });
- return { ...initialProps, lang };
- } catch (e) {
- // If an error happens, log it and then try to render the page again with minimal processing
- // This way, it'll render something on the client. (otherwise, it'd completely crash the server and render "Internal Server Error" on the client)
- Sentry.captureException(e);
+ const initialProps: DocumentInitialProps = await Document.getInitialProps(ctx);
+ const { query } = ctx;
+ const hasLocaleFromUrl = !!query?.locale;
+ const locale: string = hasLocaleFromUrl ? query?.locale as string : DEFAULT_LOCALE; // If the locale isn't found (e.g: 404 page)
+ const lang: string = locale.split('-')?.[0];
- const initialProps: DocumentInitialProps = await Document.getInitialProps(ctx);
- return { ...initialProps };
- }
+ return {
+ ...initialProps,
+ locale,
+ lang,
+ };
}
render(): JSX.Element {
- const { lang }: DocumentProps & { lang: string } = this.props;
+ const {
+ lang,
+ locale,
+ }: DocumentRenderProps = this.props;
return (
-
+
-
+
@@ -100,8 +105,4 @@ class NRNDocument extends Document {
}
}
-type Props = {
- lang: string;
-} & DocumentProps
-
-export default NRNDocument;
+export default AppDocument;
diff --git a/src/pages/_error.tsx b/src/pages/_error.tsx
index 60db352c8..a8d59ee71 100644
--- a/src/pages/_error.tsx
+++ b/src/pages/_error.tsx
@@ -1,41 +1,101 @@
import * as Sentry from '@sentry/node';
+import get from 'lodash.get';
import { NextPageContext } from 'next';
-import Error, { ErrorProps as NextErrorProps } from 'next/error';
+import NextError, { ErrorProps as NextErrorProps } from 'next/error';
import React from 'react';
-// XXX See https://github.com/zeit/next.js/blob/canary/examples/with-sentry-simple/pages/_error.js
-const NRNError = (props: NRNErrorProps): JSX.Element => {
- const { statusCode, isSSRReadyToRender, err, children = null } = props;
+export type ErrorPageProps = {
+ err: Error;
+ statusCode: number;
+ isReadyToRender: boolean;
+ children?: React.ReactElement;
+}
- if (!isSSRReadyToRender && err) {
- // getInitialProps is not called in case of
- // https://github.com/zeit/next.js/issues/8592. As a workaround, we pass
- // err via _app.js so it can be captured
+export type ErrorProps = {
+ isReadyToRender: boolean;
+} & NextErrorProps;
+
+/**
+ * We override the native Next.js _error page in order to handle more use-cases, and display errors using our own error layout.
+ *
+ * This implementation is backward-compatible with the native implementation.
+ * It'll capture all exception and forward them to Sentry.
+ * It'll rely on the native "next/error" UI implementation if none is provided.
+ *
+ * It is used by the the "src/components/pageLayouts/DefaultLayout.tsx" file, so that all page use our custom "DefaultErrorLayout" by default.
+ *
+ * @example With custom error
+ *
+ *
+ *
+ *
+ * @example With native error
+ *
+ *
+ * @param props
+ * @see https://github.com/zeit/next.js/blob/canary/examples/with-sentry-simple/pages/_error.js Inspiration about Sentry implementation
+ * @see https://github.com/zeit/next.js/discussions/12913 Discussion about hybrid SSG/SSR apps considerations
+ */
+const ErrorPage = (props: ErrorPageProps): JSX.Element => {
+ const { statusCode, isReadyToRender, err, children = null } = props;
+ if (process.env.APP_STAGE !== 'production') {
+ console.debug('ErrorPage - Unexpected error caught, it was captured and sent to Sentry. Error details:'); // eslint-disable-line no-console
+ console.error(err); // eslint-disable-line no-console
+ }
+
+ // TODO rename to "forceLogTopLevelError" = true and provide false in "DefaultErrorLayout"
+ if (!isReadyToRender && err) {
+ // XXX getInitialProps is not called for top-level errors - See https://github.com/zeit/next.js/issues/8592
+ // As a workaround, we pass err via _app and src/components/appBootstrap/MultiversalAppBootstrap.tsx so it can be captured
Sentry.captureException(err);
}
return (
<>
{
- // Render the children if provided, or return the native Error component from Next
+ // Render the children if provided, or return the native NextError component from Next
children ? (
children
) : (
-
+
)
}
>
);
};
-NRNError.getInitialProps = async (props: NextPageContext): Promise => {
+/**
+ * TODO Doc - Is this only called when the error happens server-side?
+ * What's the point of getInitialProps when using SSG or hybrid apps?
+ *
+ * @param props
+ */
+ErrorPage.getInitialProps = async (props: NextPageContext): Promise => {
const { res, err, asPath } = props;
- // @ts-ignore
- const errorInitialProps: ErrorProps = await Error.getInitialProps({ res, err });
+ const errorInitialProps: ErrorProps = await NextError.getInitialProps({ res, err } as NextPageContext) as ErrorProps;
+ if (process.env.APP_STAGE !== 'production') {
+ console.debug('ErrorPage.getInitialProps - Unexpected error caught, it was captured and sent to Sentry. Error details:', err);
+ }
// Workaround for https://github.com/zeit/next.js/issues/8592, mark when
// getInitialProps has run
- errorInitialProps.isSSRReadyToRender = true;
+ errorInitialProps.isReadyToRender = true;
if (res) {
// Running on the server, the response object is available.
@@ -43,10 +103,10 @@ NRNError.getInitialProps = async (props: NextPageContext): Promise =
// Next.js will pass an err on the server if a page's `getInitialProps`
// threw or returned a Promise that rejected
- if (res.statusCode === 404) {
- // Opinionated: do not record an exception in Sentry for 404
- return { statusCode: 404, isSSRReadyToRender: true };
- }
+ // XXX Opinionated: Record an exception in Sentry for 404, if you don't want this then uncomment the below code
+ // if (res.statusCode === 404) {
+ // return { statusCode: 404, isReadyToRender: true };
+ // }
if (err) {
Sentry.captureException(err);
@@ -74,22 +134,10 @@ NRNError.getInitialProps = async (props: NextPageContext): Promise =
// information about what the error might be. This is unexpected and may
// indicate a bug introduced in Next.js, so record it in Sentry
Sentry.captureException(
- // @ts-ignore
new Error(`_error.js getInitialProps missing data at path: ${asPath}`),
);
return errorInitialProps;
};
-export declare type NRNErrorProps = {
- err: Error;
- statusCode: number;
- isSSRReadyToRender: boolean;
- children?: React.ReactElement;
-}
-
-export declare type ErrorProps = {
- isSSRReadyToRender: boolean;
-} & NextErrorProps;
-
-export default NRNError;
+export default ErrorPage;
diff --git a/src/pages/api/autoRedirectToLocalisedPage.ts b/src/pages/api/autoRedirectToLocalisedPage.ts
new file mode 100644
index 000000000..c48ef51b7
--- /dev/null
+++ b/src/pages/api/autoRedirectToLocalisedPage.ts
@@ -0,0 +1,4 @@
+import localeMiddleware from '../../middlewares/localeMiddleware';
+
+export default (req, res): void => localeMiddleware(req, res);
+
diff --git a/src/pages/api/error.test.ts b/src/pages/api/error.test.ts
index eff4da1c6..46a1a8455 100644
--- a/src/pages/api/error.test.ts
+++ b/src/pages/api/error.test.ts
@@ -1,12 +1,12 @@
import { NowRequest, NowResponse } from '@now/node/dist';
-import { mockRequest, mockResponse } from '../../utils/tests-mocks';
+import { mockRequest, mockResponse } from '../../utils/testing/tests-mocks';
import error from './error';
describe('error', () => {
beforeEach(() => {
// Silent console log (used by logger.warn)
- // @ts-ignore
+ // @ts-expect-error
global.console = { warn: jest.fn(), log: jest.fn() };
});
@@ -15,7 +15,6 @@ describe('error', () => {
});
test('should return expected variables', async () => {
- // @ts-ignore
const req: NowRequest = mockRequest({}, {});
const res: NowResponse = mockResponse();
await error(req, res);
diff --git a/src/pages/api/error.ts b/src/pages/api/error.ts
index 15d3fd166..8baa7f02f 100644
--- a/src/pages/api/error.ts
+++ b/src/pages/api/error.ts
@@ -1,7 +1,7 @@
import { NowRequest, NowResponse } from '@now/node';
import { createLogger } from '@unly/utils-simple-logger';
-import Sentry, { configureReq } from '../../utils/sentry';
+import Sentry, { configureReq } from '../../utils/monitoring/sentry';
const fileLabel = 'api/error';
const logger = createLogger({
diff --git a/src/pages/api/status.test.ts b/src/pages/api/status.test.ts
index 81573d9b1..83981610c 100644
--- a/src/pages/api/status.test.ts
+++ b/src/pages/api/status.test.ts
@@ -1,6 +1,6 @@
import { NowRequest, NowResponse } from '@now/node/dist';
-import { mockRequest, mockResponse } from '../../utils/tests-mocks';
+import { mockRequest, mockResponse } from '../../utils/testing/tests-mocks';
import status from './status';
describe('status', () => {
@@ -9,8 +9,7 @@ describe('status', () => {
});
test('should return expected variables', async () => {
- // @ts-ignore
- const req: NowRequest = mockRequest({}, {param1: 'test-sentry-reporting-context'});
+ const req: NowRequest = mockRequest({}, { param1: 'test-sentry-reporting-context' });
const res: NowResponse = mockResponse();
await status(req, res);
diff --git a/src/pages/api/status.ts b/src/pages/api/status.ts
index 10ee191dc..d42795c7d 100644
--- a/src/pages/api/status.ts
+++ b/src/pages/api/status.ts
@@ -1,7 +1,7 @@
import { NowRequest, NowResponse } from '@now/node';
import { createLogger } from '@unly/utils-simple-logger';
-import Sentry, { configureReq } from '../../utils/sentry';
+import Sentry, { configureReq } from '../../utils/monitoring/sentry';
const fileLabel = 'api/status';
const logger = createLogger({
@@ -13,6 +13,8 @@ export const status = async (req: NowRequest, res: NowResponse): Promise =
configureReq(req);
res.json({
+ version: process.env.APP_VERSION,
+ release: process.env.APP_VERSION_RELEASE,
nodejs: process.version,
nodejsAWS: process.env.AWS_EXECUTION_ENV,
regionNOW: process.env.NOW_REGION,
@@ -21,6 +23,7 @@ export const status = async (req: NowRequest, res: NowResponse): Promise =
memory: process.env.AWS_LAMBDA_FUNCTION_MEMORY_SIZE,
environment: process.env.NODE_ENV,
stage: process.env.APP_STAGE,
+ preset: process.env.NRN_PRESET,
buildTime: process.env.BUILD_TIME,
buildTimestamp: process.env.BUILD_TIMESTAMP,
customer: process.env.CUSTOMER_REF,
diff --git a/src/pages/examples.tsx b/src/pages/examples.tsx
deleted file mode 100644
index 3913a68cc..000000000
--- a/src/pages/examples.tsx
+++ /dev/null
@@ -1,336 +0,0 @@
-/** @jsx jsx */
-import { Amplitude, LogOnMount } from '@amplitude/react-amplitude';
-import { QueryResult } from '@apollo/react-common';
-import { useQuery } from '@apollo/react-hooks';
-import { css, jsx } from '@emotion/core';
-import * as Sentry from '@sentry/node';
-import { isBrowser } from '@unly/utils';
-import { createLogger } from '@unly/utils-simple-logger';
-import map from 'lodash.map';
-import { NextPage } from 'next';
-// eslint-disable-next-line @typescript-eslint/no-unused-vars,no-unused-vars
-import React from 'react';
-import { Trans, useTranslation, UseTranslationResponse } from 'react-i18next';
-import { Alert, Container } from 'reactstrap';
-import uuid from 'uuid/v1';
-import ErrorDebug from '../components/ErrorDebug';
-import GraphCMSAsset from '../components/GraphCMSAsset';
-
-import Head from '../components/Head';
-import Loader from '../components/Loader';
-import { EXAMPLES_PAGE_QUERY } from '../gql/pages/examples';
-import { Asset } from '../types/data/Asset';
-import { Customer } from '../types/data/Customer';
-import { Product } from '../types/data/Product';
-import { PageProps } from '../types/PageProps';
-
-const fileLabel = 'pages/examples';
-const logger = createLogger({ // eslint-disable-line no-unused-vars,@typescript-eslint/no-unused-vars
- label: fileLabel,
-});
-
-const Examples: NextPage = (props: PageProps): JSX.Element => {
- const {
- customerRef,
- gcmsLocales,
- }: PageProps = props;
- const { t }: UseTranslationResponse = useTranslation();
-
- Sentry.addBreadcrumb({ // See https://docs.sentry.io/enriching-error-data/breadcrumbs
- category: fileLabel,
- message: `Rendering examples page (${isBrowser() ? 'browser' : 'server'})`,
- level: Sentry.Severity.Debug,
- });
-
- const variables = {
- customerRef,
- };
- const queryOptions = {
- displayName: 'EXAMPLES_PAGE_QUERY',
- variables,
- context: {
- headers: {
- 'gcms-locale': gcmsLocales,
- },
- },
- };
- const {
- data,
- loading,
- error,
- }: QueryResult<{
- customer: Customer;
- products: Product[];
- }> = useQuery(EXAMPLES_PAGE_QUERY, queryOptions);
-
- if (loading) {
- return ;
- }
-
- if (error) {
- return ;
- }
-
- const {
- customer,
- products,
- } = data || {}; // XXX Use empty object as fallback, to avoid app crash when destructuring
- if (process.env.APP_STAGE !== 'production') {
- console.log('data', data); // eslint-disable-line no-console
- }
-
- return (
- ({
- ...inheritedProps,
- page: {
- ...inheritedProps.page,
- name: 'examples',
- },
- })}
- >
- {({ logEvent }): JSX.Element => (
- <>
-
-
-
- Examples
-
-
-
-
-
-
-
-
-
GraphQL & GraphCMS universal examples
-
Fetching products from GraphCMS API
-
- The below products are fetched from GraphCMS API, using GraphQL and Apollo.
- We don't do anything fancy with them, it's just a simple example of data fetching and displaying.
- Note that the GraphQL API can be auto-completed on the IDE, that's quite useful.
- We also split our .gql
files into reusable fragments to avoid duplicating code.
- We use a custom component GraphCMSAsset
to display images.
-
-
- {
- map(products, (product: Product) => {
- return (
-
- {
- map(product.images, (image: Asset) => {
- return (
-
- );
- })
- }
-
-
- {product?.title} - ${product?.price || 0}
-
-
-
- {product?.description}
-
-
- );
- })
- }
-
-
-
-
-
-
-
Monitoring universal examples
-
- Log runtime exception
-
- {`try{throw new Error('test')}catch(e){Sentry.captureException(e)}`}
-
-
-
-
- Log message
-
- {`Sentry.captureMessage(warning, Sentry.Severity.Warning);`}
-
-
-
-
- Severity examples
-
Severity.Fatal
-
Severity.Error
-
Severity.Warning
-
Severity.Log
-
Severity.Info
-
Severity.Debug
-
Severity.Critical
-
-
-
-
- Breadcrumbs documentation
-
-
- {`Sentry.addBreadcrumb({category: fileLabel, message: 'Rendering'})`}
-
-
-
-
-
-
-
I18n universal examples (using Locize 3rd party vendor)
-
-
- Each example shows the rendered version and its code snippet.
- The goal is to showcase real-world examples to help you get started faster and give a wider overview of what's possible.
-
- Check the official documentation
-
-
-
-
-
-
- {t('examples.i18n.simpleTranslation', 'Traduction simple')}
- {'{t(\'examples.i18n.simpleTranslation\', \'Traduction simple\')}'}
-
-
-
-
- {t('examples.i18n.pluralTranslation', 'Traduction avec gestion du pluriel', { count: 1 })}
- {'{t(\'examples.i18n.pluralTranslation\', \'Traduction avec gestion du pluriel\', { count: 1 })}'}
-
-
- {t('examples.i18n.pluralTranslation', 'Traduction avec gestion du pluriel', { count: 2 })}
- {'{t(\'examples.i18n.pluralTranslation\', \'Traduction avec gestion du pluriel\', { count: 2 })}'}
-
-
-
-
-
- Contenu dynamique : {{ uuid: uuid() }}
-
-
-
- {'\n' +
- ' Contenu dynamique : {{ uuid: uuid() }} \n' +
- ' '}
-
-
-
-
-
-
- Nous avons trouvé {{ count: 1 }} solution pour vous.
-
-
-
- {'\n' +
- ' Nous avons trouvé {{ count: 1 }} solution pour vous.\n' +
- ' '}
-
-
-
-
- Nous avons trouvé {{ count: 2 }} solution pour vous.
-
-
-
- {'\n' +
- ' Nous avons trouvé {{ count: 2 }} solution pour vous.\n' +
- ' '}
-
-
-
-
-
- >
- )}
-
- );
-
-};
-
-export default Examples;
diff --git a/src/pages/index.tsx b/src/pages/index.tsx
deleted file mode 100644
index 816d776a9..000000000
--- a/src/pages/index.tsx
+++ /dev/null
@@ -1,199 +0,0 @@
-/** @jsx jsx */
-import { Amplitude, LogOnMount } from '@amplitude/react-amplitude';
-import { css, jsx } from '@emotion/core';
-import * as Sentry from '@sentry/node';
-import { isBrowser } from '@unly/utils';
-import { createLogger } from '@unly/utils-simple-logger';
-import { NextPage } from 'next';
-import Link from 'next/link';
-// eslint-disable-next-line @typescript-eslint/no-unused-vars,no-unused-vars
-import React from 'react';
-import { Alert, Container } from 'reactstrap';
-import Head from '../components/Head';
-import { PageProps } from '../types/PageProps';
-
-const fileLabel = 'pages/index';
-const logger = createLogger({ // eslint-disable-line no-unused-vars,@typescript-eslint/no-unused-vars
- label: fileLabel,
-});
-
-const Home: NextPage = (props: PageProps): JSX.Element => {
- Sentry.addBreadcrumb({ // See https://docs.sentry.io/enriching-error-data/breadcrumbs
- category: fileLabel,
- message: `Rendering index page (${isBrowser() ? 'browser' : 'server'})`,
- level: Sentry.Severity.Debug,
- });
-
- return (
- ({
- ...inheritedProps,
- page: {
- ...inheritedProps.page,
- name: 'index',
- },
- })}
- >
- {({ logEvent }): JSX.Element => (
- <>
-
-
-
- Next Right Now Demo
-
-
-
- The purpose of this demo is to showcase what features are built-in within the selected preset.
- Please note that the documentation is hardcoded in English, so don't expect it to change when switching language.
-
-
-
-
- This demo uses the preset {process.env.NRN_PRESET}
- {
- logEvent('open-what-is-preset-doc');
- }}
- >
- What's a preset?
-
- -
- {
- logEvent('open-see-all-presets-doc');
- }}
- >
- See all presets
-
-
-
-
-
-
-
Overview
- You can navigate between
/examples and
/ to see CSR in action.
- You can also disable JS on your browser to see how SSR works.
-
- If you want to know a bit more about what's running this demo beneath the surface, check out our
/api/status
endpoint!
-
-
-
-
Analytics overview
- For the purpose of this demo, we are tracking your analytics usage.
-
- For instance, we know if you've clicked on any link above. That's just basic analytics but it works out-of-the-box.
-
-
- You can use
-
Amplitude Instrumentation Explorer extension
- to see what analytic events are sent and what they contains exactly, it's very powerful!
-
- Every time you visit a page, analytics are automatically sent (similar to Google Analytics "pageviews").
-
-
-
-
GraphQL API overview
- We fetched our GraphQL endpoint to display proper theming.
- The colors that are used in this demo are defined within the GraphCMS "Customer" model.
-
-
-
-
Monitoring overview
- Any runtime error is configured to be sent to Sentry, which redirects it into our Slack channel.
- This allows us to be notified in real-time about anything that'd go wrong.
-
- You can test this behaviour by hitting
/api/error
our error endpoint. Don't worry, alerts have been disabled so you won't bother us for real ;)
-
-
-
-
I18n overview
- You can change the language by clicking on the footer flag icon below.
- Changing language refresh the whole page, because it was just simpler to do that instead of running the GraphQL query again.
- But you could implement it without refreshing the whole page if you wanted.
-
-
-
-
-
Examples
- Check out our
examples to learn more and see some code snippets!
-
-
-
-
Admin site
- Check out our
-
Admin site to edit the data that belong to the customer!
- Please do not use NSFW content or anything that is illegal as we don't enforce any rule. Everybody can change pics and text.
-
- The admin site is based on
react-admin .
- The source code
-
is available on GitHub as well.
- It also relies on
-
our open source data provider for react-admin, using GraphQL.
-
-
- All the admin site (AKA back-office) uses GraphQL schema definition to build the views and GQL queries/mutations. (but allow override for flexibility)
- It's a POC and could use the help of the community. I've started it to build our Back-office but found a better alternative in the meantime that better answers our needs:
-
Directus
- So, I won't likely bring NRN-Admin to a production-grade level, and it will likely stay in it's current state: a POC.
-
-
-
-
- Feel free to ask for more examples of what this demo can offer by creating an issue on Github! :)
- Feel free to make an improvement to this demo as well, though a PR. (if it's big, please let's discuss it first!)
-
-
-
-
-
- >
- )}
-
- );
-
-};
-
-export default Home;
diff --git a/src/pages/terms.tsx b/src/pages/terms.tsx
deleted file mode 100644
index 4ed53476c..000000000
--- a/src/pages/terms.tsx
+++ /dev/null
@@ -1,164 +0,0 @@
-/** @jsx jsx */
-import { Amplitude, LogOnMount } from '@amplitude/react-amplitude';
-import { QueryResult } from '@apollo/react-common';
-import { useQuery } from '@apollo/react-hooks';
-import { css, jsx } from '@emotion/core';
-import * as Sentry from '@sentry/node';
-import { isBrowser } from '@unly/utils';
-import { createLogger } from '@unly/utils-simple-logger';
-import { useTheme } from 'emotion-theming';
-import { NextPage } from 'next';
-// eslint-disable-next-line @typescript-eslint/no-unused-vars,no-unused-vars
-import React from 'react';
-import { useTranslation, UseTranslationResponse } from 'react-i18next';
-
-import ErrorDebug from '../components/ErrorDebug';
-import Head from '../components/Head';
-import Loader from '../components/Loader';
-import { TERMS_PAGE_QUERY } from '../gql/pages/terms';
-import { Customer } from '../types/data/Customer';
-import { Theme } from '../types/data/Theme';
-import { PageProps } from '../types/PageProps';
-import { replaceAllOccurrences } from '../utils/string';
-
-const fileLabel = 'pages/terms';
-const logger = createLogger({ // eslint-disable-line no-unused-vars,@typescript-eslint/no-unused-vars
- label: fileLabel,
-});
-
-const Terms: NextPage = (props: PageProps): JSX.Element => {
- const {
- customerRef,
- gcmsLocales,
- }: PageProps = props;
- const { t }: UseTranslationResponse = useTranslation();
- const theme: Theme = useTheme();
- const { primaryColor } = theme;
-
- Sentry.addBreadcrumb({ // See https://docs.sentry.io/enriching-error-data/breadcrumbs
- category: fileLabel,
- message: `Rendering terms page (${isBrowser() ? 'browser' : 'server'})`,
- level: Sentry.Severity.Debug,
- });
-
- const variables = {
- customerRef,
- };
- const queryOptions = {
- displayName: 'TERMS_PAGE_QUERY',
- variables,
- context: {
- headers: {
- 'gcms-locale': gcmsLocales,
- },
- },
- };
- const {
- data,
- loading,
- error,
- }: QueryResult<{
- customer: Customer;
- }> = useQuery(TERMS_PAGE_QUERY, queryOptions);
-
- if (loading) {
- return ;
- }
-
- if (error) {
- return ;
- }
-
- const {
- customer,
- } = data || {}; // XXX Use empty object as fallback, to avoid app crash when destructuring
- if (process.env.APP_STAGE !== 'production') {
- console.log('data', data); // eslint-disable-line no-console
- }
-
- return (
- ({
- ...inheritedProps,
- page: {
- ...inheritedProps.page,
- name: 'terms',
- },
- })}
- >
- {({ logEvent }): JSX.Element => (
- <>
-
-
-
-
${customer?.label}`,
- }),
- }}
- />
-
-
-
-
-
HTML source code (fetched from GraphQL API), as RichText
field:
-
-
- {customer?.terms?.html}
-
-
-
-
-
- >
- )}
-
- );
-
-};
-
-export default Terms;
diff --git a/src/propTypes/README.md b/src/propTypes/README.md
new file mode 100644
index 000000000..dad96e5d2
--- /dev/null
+++ b/src/propTypes/README.md
@@ -0,0 +1,16 @@
+# Proptypes (AKA "types of properties")
+
+> TLDR; Our decision is to prefer **TypeScript** over _PropTypes_.
+
+Prop types "_conflicts_" with TypeScript types because:
+- They **duplicate** information in a non-trivial way, you can't just copy/paste propTypes into TS types and converting them manually requires time
+- PropTypes run at **runtime**, unlike TS types which run at **compile time**
+ - Typescript is useful when you are writing code: it will warn you if you pass an argument of the wrong type to your React components, give you autocomplete for function calls, etc.
+ - PropTypes are useful when you test how the components interact with external data, for example when you load JSON from an API.
+ PropTypes will help you debug (when in React's Development mode) why your component is failing by printing helpful messages like:
+ > Warning: Failed prop type: Invalid prop `id` of type `number` supplied to `Table`, expected `string`
+
+We decided not to use PropTypes mostly because of the additional work which doesn't seem worth it.
+There are a few PropTypes being used, but they come from a time when we weren't using TS.
+
+Feel free to use both if you'd like to.
diff --git a/src/propTypes/UrlPropTypes.ts b/src/propTypes/UrlPropTypes.ts
deleted file mode 100644
index 54d19ae77..000000000
--- a/src/propTypes/UrlPropTypes.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-import PropTypes from 'prop-types';
-
-/**
- * "url" is automatically provided by the framework Next.js to all main Pages
- * It contains meta information, such as the query variables
- */
-export default {
- asPath: PropTypes.string.isRequired,
- pathname: PropTypes.string.isRequired,
- query: PropTypes.shape({
- schoolPath: PropTypes.string,
- }).isRequired,
-};
diff --git a/src/stores/customerContext.tsx b/src/stores/customerContext.tsx
new file mode 100644
index 000000000..118f8f08c
--- /dev/null
+++ b/src/stores/customerContext.tsx
@@ -0,0 +1,18 @@
+import React from 'react';
+import { Customer } from '../types/data/Customer';
+
+export type CustomerContext = Customer;
+
+/**
+ * Uses native React Context API
+ *
+ * @example Usage
+ * import customerContext from './src/stores/customerContext';
+ * const { locale, lang }: CustomerContext = React.useContext(customerContext);
+ *
+ * @see https://reactjs.org/docs/context.html
+ * @see https://medium.com/better-programming/react-hooks-usecontext-30eb560999f for useContext hook example (open in anonymous browser #paywall)
+ */
+export const customerContext = React.createContext
(null);
+
+export default customerContext;
diff --git a/src/stores/i18nContext.tsx b/src/stores/i18nContext.tsx
new file mode 100644
index 000000000..9cf4cb100
--- /dev/null
+++ b/src/stores/i18nContext.tsx
@@ -0,0 +1,20 @@
+import React from 'react';
+
+export type I18nContext = {
+ locale: string; // e.g: fr, fr-FR, en, en-US, en-GB
+ lang: string; // e.g: fr, en
+}
+
+/**
+ * Uses native React Context API
+ *
+ * @example Usage
+ * import i18nContext from './src/stores/i18nContext';
+ * const { locale, lang }: I18nContext = React.useContext(i18nContext);
+ *
+ * @see https://reactjs.org/docs/context.html
+ * @see https://medium.com/better-programming/react-hooks-usecontext-30eb560999f for useContext hook example (open in anonymous browser #paywall)
+ */
+export const i18nContext = React.createContext(null);
+
+export default i18nContext;
diff --git a/src/stores/userSessionContext.tsx b/src/stores/userSessionContext.tsx
new file mode 100644
index 000000000..8f6be878e
--- /dev/null
+++ b/src/stores/userSessionContext.tsx
@@ -0,0 +1,31 @@
+import React from 'react';
+import { UserSemiPersistentSession } from '../types/UserSemiPersistentSession';
+
+/**
+ * The UserSessionContext contains all UserSemiPersistentSession properties
+ *
+ * XXX "Partial" copies all properties from UserSemiPersistentSession and make them all optional
+ *
+ * @see https://stackoverflow.com/a/40076355/2391795
+ * @see https://github.com/Microsoft/TypeScript/blob/ee25cdecbca49b2b5a290ecd65224f425b1d6a9c/lib/lib.es5.d.ts#L1354
+ */
+export type UserSessionContext = Partial
+
+const initialContext = {};
+
+/**
+ * The userSession is empty by default and will only be filled on the browser,
+ * because it relies on data from cookies that are stored on the end user's browser
+ *
+ * Uses native React Context API, meant to be used from hooks only, not by functional components
+ *
+ * @example Usage
+ * import userSessionContext from './src/stores/userSessionContext';
+ * const { userSession }: UserSessionContext = React.useContext(userSessionContext);
+ *
+ * @see https://reactjs.org/docs/context.html
+ * @see https://medium.com/better-programming/react-hooks-usecontext-30eb560999f for useContext hook example (open in anonymous browser #paywall)
+ */
+export const userSessionContext = React.createContext(initialContext);
+
+export default userSessionContext;
diff --git a/src/types/AppPageProps.ts b/src/types/AppPageProps.ts
deleted file mode 100644
index 328e75282..000000000
--- a/src/types/AppPageProps.ts
+++ /dev/null
@@ -1,24 +0,0 @@
-import { I18nextResources } from '../utils/i18nextLocize';
-import { Cookies } from './Cookies';
-import { PublicHeaders } from './PublicHeaders';
-import { UserSemiPersistentSession } from './UserSemiPersistentSession';
-
-/**
- * Page props provided universally to the main app render function by the main app getInitialProps function
- *
- * The exact same properties are provided, whether during a server or client rendering
- *
- * @see _app:getInitialProps - Returns it (consumed by the "render" function)
- * @see _app:render - Use it (as its "pageProps" property)
- */
-export declare type AppPageProps = {
- customerRef: string;
- headers: PublicHeaders; // Headers made public to the client-side
- readonlyCookies: Cookies; // Cookies retrieved using https://www.npmjs.com/package/next-cookies - Aren't really readonly but don't provide any setter
- userSession: UserSemiPersistentSession;
- bestCountryCodes: string[];
- gcmsLocales: string;
- lang: string;
- defaultLocales: I18nextResources;
- isSSRReadyToRender: boolean;
-};
diff --git a/src/types/AppRenderProps.ts b/src/types/AppRenderProps.ts
deleted file mode 100644
index 2be12a731..000000000
--- a/src/types/AppRenderProps.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-import { NormalizedCacheObject } from 'apollo-cache-inmemory';
-import ApolloClient from 'apollo-client';
-import { WithApolloState } from 'next-with-apollo/lib/types';
-import { NextRouter } from 'next/router';
-import { AppPageProps } from './AppPageProps';
-
-/**
- * Props that are returned by the main getInitialProps and then provided to the render function of the application
- *
- * The props that are being returned by getInitialProps are enhanced by the Next.js framework
- * Also, our HOC apply at the same moment and enhance even more the properties that the render function will receive
- *
- * @see _app:getInitialProps - Returns it (only pageProps)
- * @see _app:render - Use it (has access to all props)
- */
-export declare type AppRenderProps = {
- pageProps: AppPageProps;
- err?: Error; // Only defined if there was an error
-
- // XXX Props that are somehow injected by the Next.js framework between _app:getInitialProps and _app:render
- // They're marked as optional because they aren't defined in _app:getInitialProps but will be defined in _app:render
- Component?: Function; // eslint-disable-line @typescript-eslint/no-explicit-any
- router?: NextRouter;
-
- // Injected by HOC "withUniversalGraphQLDataLoader"
- apolloState?: WithApolloState;
- apollo?: ApolloClient;
-};
diff --git a/src/types/DocumentInitialProps.ts b/src/types/DocumentInitialProps.ts
deleted file mode 100644
index f26c47e3a..000000000
--- a/src/types/DocumentInitialProps.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-import { DocumentInitialProps as NextDocumentInitialProps } from 'next/dist/next-server/lib/utils';
-
-export interface DocumentInitialProps extends NextDocumentInitialProps {
- lang?: string;
-}
diff --git a/src/types/LayoutProps.ts b/src/types/LayoutProps.ts
deleted file mode 100644
index 5f7584357..000000000
--- a/src/types/LayoutProps.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-import { AmplitudeClient } from 'amplitude-js';
-import { i18n } from 'i18next';
-import { NextRouter } from 'next/router';
-import { AppPageProps } from './AppPageProps';
-
-/**
- * Properties that are provided to the Layout component
- *
- * Some properties will be undefined depending on the runtime engine
- * Extracted outside of the Layout for reusability, as there may be several layouts in the app
- */
-export declare type LayoutProps = {
- router: NextRouter;
- i18nextInstance: i18n;
- err?: Error; // Only defined if there was an error
-
- // Only available on the client side
- isInIframe?: boolean;
- amplitudeInstance?: AmplitudeClient;
-} & AppPageProps;
diff --git a/src/types/PageProps.ts b/src/types/PageProps.ts
deleted file mode 100644
index 43b52f111..000000000
--- a/src/types/PageProps.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-import { Customer } from './data/Customer';
-import { LayoutProps } from './LayoutProps';
-
-/**
- * Properties that are available by any Next.js page
- *
- * The layout properties (LayoutProps) are enhanced by the Layout
- */
-export declare type PageProps = {
- customer: Customer;
-} & LayoutProps;
diff --git a/src/types/SidebarLink.ts b/src/types/SidebarLink.ts
new file mode 100644
index 000000000..ca84d9658
--- /dev/null
+++ b/src/types/SidebarLink.ts
@@ -0,0 +1,8 @@
+/**
+ * Shape of a link used in a sidebar
+ */
+export type SidebarLink = {
+ href: string;
+ label: string;
+ params?: { [key: string]: string | number }
+}
diff --git a/src/types/gql/ApolloQueryOptions.ts b/src/types/gql/ApolloQueryOptions.ts
new file mode 100644
index 000000000..0da569d68
--- /dev/null
+++ b/src/types/gql/ApolloQueryOptions.ts
@@ -0,0 +1,5 @@
+import { QueryOptions } from 'apollo-client';
+
+export type ApolloQueryOptions = QueryOptions & {
+ displayName: string; // Missing in official definition
+}
diff --git a/src/types/i18n/I18nLocale.ts b/src/types/i18n/I18nLocale.ts
new file mode 100644
index 000000000..011e4683f
--- /dev/null
+++ b/src/types/i18n/I18nLocale.ts
@@ -0,0 +1,19 @@
+/**
+ * Localisation naming is quite tricky. Some people refer to "locale" as "language", other as "country/regional locale", other need additional variants.
+ *
+ * A locale is composed of:
+ * - A language code
+ * - Country/Region code (optional)
+ * - Variant code (optional)
+ *
+ * We tried to keep it simple by using a "name", which represents whatever you want to represent.
+ * In our case, we allow/use both language-based (i.e: fr) and country-based (i.e: fr-FR)
+ * We believe it's the most common way to get started with localisation
+ * (and if you just need the language, you can just remove country-based locales in ../i18nConfig.js)
+ *
+ * @see i18nConfig.js Application locales configuration
+ */
+export type I18nLocale = {
+ lang: string; // Locale language (e.g: fr)
+ name: string; // Locale name (e.g: fr-FR)
+}
diff --git a/src/types/AppInitialProps.ts b/src/types/nextjs/AppInitialProps.ts
similarity index 77%
rename from src/types/AppInitialProps.ts
rename to src/types/nextjs/AppInitialProps.ts
index 16df327bb..a9705150d 100644
--- a/src/types/AppInitialProps.ts
+++ b/src/types/nextjs/AppInitialProps.ts
@@ -5,6 +5,7 @@ import { AppTreeType } from 'next/dist/next-server/lib/utils';
* Props that are provided to the _app:getInitialProps method
*
* Those props are provided by Next.js framework, and we have no control over it
+ * XXX This isn't used at this time, it's only useful if you intend to use _app.getInitialProps
*/
export interface AppInitialProps extends AppContext {
AppTree: AppTreeType;
diff --git a/src/types/nextjs/GetServerSidePropsContext.ts b/src/types/nextjs/GetServerSidePropsContext.ts
new file mode 100644
index 000000000..1a040659b
--- /dev/null
+++ b/src/types/nextjs/GetServerSidePropsContext.ts
@@ -0,0 +1,17 @@
+import { IncomingMessage, ServerResponse } from 'http';
+import { ParsedUrlQuery } from 'querystring';
+
+/**
+ * Context type used by "getServerSideProps"
+ *
+ * @see https://nextjs.org/docs/basic-features/data-fetching#getserversideprops-server-side-rendering
+ * @see node_modules/next/types/index.d.ts
+ */
+export declare type GetServerSidePropsContext = {
+ req: IncomingMessage;
+ res: ServerResponse;
+ params?: Q;
+ query: ParsedUrlQuery;
+ preview?: boolean;
+ previewData?: any;
+} & E;
diff --git a/src/types/nextjs/GetStaticPropsContext.ts b/src/types/nextjs/GetStaticPropsContext.ts
new file mode 100644
index 000000000..d2730de52
--- /dev/null
+++ b/src/types/nextjs/GetStaticPropsContext.ts
@@ -0,0 +1,13 @@
+import { ParsedUrlQuery } from 'querystring';
+
+/**
+ * Context type used by "getStaticProps"
+ *
+ * @see https://nextjs.org/docs/basic-features/data-fetching#getstaticprops-static-generation
+ * @see node_modules/next/types/index.d.ts
+ */
+export declare type GetStaticPropsContext = {
+ params?: Q
+ preview?: boolean
+ previewData?: any
+};
diff --git a/src/types/nextjs/MultiversalAppBootstrapPageProps.ts b/src/types/nextjs/MultiversalAppBootstrapPageProps.ts
new file mode 100644
index 000000000..f6f374735
--- /dev/null
+++ b/src/types/nextjs/MultiversalAppBootstrapPageProps.ts
@@ -0,0 +1,11 @@
+import { i18n } from 'i18next';
+import { Theme } from '../data/Theme';
+
+/**
+ * Additional props that are injected by MultiversalAppBootstrap to all pages
+ */
+export type MultiversalAppBootstrapPageProps = {
+ i18nextInstance: i18n;
+ isSSGFallbackInitialBuild: boolean; // When true, means the app is loading a SSG page, with fallback mode enabled, and this page hasn't been built before
+ theme: Theme;
+}
diff --git a/src/types/nextjs/MultiversalAppBootstrapProps.ts b/src/types/nextjs/MultiversalAppBootstrapProps.ts
new file mode 100644
index 000000000..e0d131179
--- /dev/null
+++ b/src/types/nextjs/MultiversalAppBootstrapProps.ts
@@ -0,0 +1,21 @@
+import { NextComponentType, NextPageContext } from 'next';
+import { NextRouter } from 'next/router';
+import { MultiversalPageProps } from '../pageProps/MultiversalPageProps';
+
+/**
+ * Props that are provided to the render function of the application (in _app)
+ * Those props can be consolidated by either getInitialProps, getServerProps or getStaticProps, depending on the page and its configuration
+ *
+ * @see MultiversalAppBootstrap for usage
+ */
+export declare type MultiversalAppBootstrapProps = {
+ Component?: NextComponentType; // Page component, not provided if pageProps.statusCode is 3xx or 4xx
+ err?: Error; // Only defined if there was an error
+ pageProps?: PP; // Props forwarded to the Page component
+ router?: NextRouter;
+
+ // XXX Next.js internals (unstable API) - See https://github.com/zeit/next.js/discussions/12558#discussioncomment-9177
+ __N_SSG?: boolean; // Stands for "server-side generated" or "static site generation", indicates the page was generated through getStaticProps
+ __N_SSR?: boolean; // Stands for "server-side rendering", indicates the page was generated through getServerSideProps
+ __N_SSP?: boolean; // Stands for "server-side props"
+};
diff --git a/src/types/nextjs/NextWebVitalsMetrics.ts b/src/types/nextjs/NextWebVitalsMetrics.ts
new file mode 100644
index 000000000..a8a6a822d
--- /dev/null
+++ b/src/types/nextjs/NextWebVitalsMetrics.ts
@@ -0,0 +1,15 @@
+/**
+ * Web vitals provided to _app.reportWebVitals by Core Web Vitals plugin developed by Google Chrome team.
+ *
+ * It's the core runtime of what Google LightHouse is build atop.
+ *
+ * @see https://web.dev/vitals/ Essential metrics for a healthy site
+ * @see https://nextjs.org/blog/next-9-4#integrated-web-vitals-reporting
+ */
+export type NextWebVitalsMetrics = {
+ id: string;
+ label: string;
+ name: string;
+ startTime: number;
+ value: number;
+}
diff --git a/src/types/nextjs/NextWebVitalsMetricsReport.ts b/src/types/nextjs/NextWebVitalsMetricsReport.ts
new file mode 100644
index 000000000..a65d8beb6
--- /dev/null
+++ b/src/types/nextjs/NextWebVitalsMetricsReport.ts
@@ -0,0 +1,23 @@
+import { NextWebVitalsMetrics } from './NextWebVitalsMetrics';
+
+/**
+ * Group all vital metrics together, using their own "name" property as key.
+ *
+ * Meant to help regroup multiple reports together to send them all at once, to reduce API calls.
+ *
+ * @see https://web.dev/vitals/ Essential metrics for a healthy site
+ * @see https://nextjs.org/blog/next-9-4#integrated-web-vitals-reporting
+ */
+export type NextWebVitalsMetricsReport = {
+ reportedCount: number; // Number of times a report has been sent, kinda help to trace how long a same client-side session was
+ reportId: string; // ID of the "report", helps grouping reports with different data but same reportId together when analysing data
+ metrics: {
+ FCP?: NextWebVitalsMetrics; // First contentful paint, triggers on page load
+ FID?: NextWebVitalsMetrics; // First input delay, trigger on first end-user interaction (click)
+ LCP?: NextWebVitalsMetrics; // Largest contentful paint, triggers on first end-user interaction (sometimes doesn't trigger)
+ 'Next.js-hydration'?: NextWebVitalsMetrics; // Triggers on page load
+ 'Next.js-render'?: NextWebVitalsMetrics; // Triggers on client-side redirection ( )
+ 'Next.js-route-change-to-render'?: NextWebVitalsMetrics; // Triggers on client-side redirection ( )
+ TTFB?: NextWebVitalsMetrics; // Time to first byte, triggers on page load
+ }
+}
diff --git a/src/types/nextjs/StaticParams.ts b/src/types/nextjs/StaticParams.ts
new file mode 100644
index 000000000..f5052e7d6
--- /dev/null
+++ b/src/types/nextjs/StaticParams.ts
@@ -0,0 +1,11 @@
+/**
+ * Static params provided to getStaticProps and getStaticPaths for static pages (using SSG)
+ *
+ * Those params come from the route (url) being used
+ *
+ * @see next.config.js "experimental.redirects" section for url params
+ */
+export type StaticParams = {
+ albumId?: string; // Used by album-[albumId]-with-ssg-and-fallback page
+ locale?: string; // The first path of the url is the "locale"
+};
diff --git a/src/types/nextjs/StaticPath.ts b/src/types/nextjs/StaticPath.ts
new file mode 100644
index 000000000..bb3ee67fc
--- /dev/null
+++ b/src/types/nextjs/StaticPath.ts
@@ -0,0 +1,5 @@
+import { StaticParams } from './StaticParams';
+
+export type StaticPath = {
+ params: StaticParams;
+}
diff --git a/src/types/nextjs/StaticPathsOutput.ts b/src/types/nextjs/StaticPathsOutput.ts
new file mode 100644
index 000000000..89eb695b9
--- /dev/null
+++ b/src/types/nextjs/StaticPathsOutput.ts
@@ -0,0 +1,11 @@
+import { StaticParams } from './StaticParams';
+
+/**
+ * @see https://nextjs.org/docs/basic-features/data-fetching#getstaticpaths-static-generation
+ */
+export type StaticPathsOutput = {
+ fallback: boolean; // See https://nextjs.org/docs/basic-features/data-fetching#the-fallback-key-required
+ paths: (string | {
+ params: StaticParams;
+ })[];
+}
diff --git a/src/types/nextjs/StaticPropsInput.ts b/src/types/nextjs/StaticPropsInput.ts
new file mode 100644
index 000000000..cfd6304e9
--- /dev/null
+++ b/src/types/nextjs/StaticPropsInput.ts
@@ -0,0 +1,10 @@
+import { StaticParams } from './StaticParams';
+
+/**
+ * Static props given as inputs for getStaticProps
+ */
+export type StaticPropsInput = {
+ params?: StaticParams;
+ preview?: boolean;
+ previewData?: any; // eslint-disable-line @typescript-eslint/no-explicit-any
+}
diff --git a/src/types/nextjs/StaticPropsOutput.ts b/src/types/nextjs/StaticPropsOutput.ts
new file mode 100644
index 000000000..e5dff54d4
--- /dev/null
+++ b/src/types/nextjs/StaticPropsOutput.ts
@@ -0,0 +1,9 @@
+import { SSGPageProps } from '../pageProps/SSGPageProps';
+
+/**
+ * Static props returned as outputs for getStaticProps (yielded result)
+ */
+export type StaticPropsOutput = {
+ props: SSGPageProps;
+ unstable_revalidate?: number | boolean;
+}
diff --git a/src/types/pageProps/MultiversalPageProps.ts b/src/types/pageProps/MultiversalPageProps.ts
new file mode 100644
index 000000000..6eb76855b
--- /dev/null
+++ b/src/types/pageProps/MultiversalPageProps.ts
@@ -0,0 +1,25 @@
+import { NormalizedCacheObject } from 'apollo-cache-inmemory';
+import { I18nextResources } from '../../utils/i18n/i18nextLocize';
+import { Customer } from '../data/Customer';
+
+/**
+ * Page properties available on all pages, whether they're rendered statically, dynamically, from the server or the client
+ *
+ * Multiversal page props are listed in MultiversalPageProps
+ * Server-side page props are listed in SSRPageProps
+ * Client-side page props are listed in SSGPageProps
+ */
+export declare type MultiversalPageProps = {
+ apolloState: NormalizedCacheObject;
+ bestCountryCodes: string[];
+ customer: Customer;
+ customerRef: string;
+ error?: Error; // Only defined if there was an error
+ gcmsLocales: string;
+ hasLocaleFromUrl: boolean;
+ i18nTranslations: I18nextResources;
+ isReadyToRender: boolean;
+ lang: string;
+ locale: string;
+ statusCode?: number; // Provided by Next.js framework, sometimes
+} & E;
diff --git a/src/types/pageProps/OnlyBrowserPageProps.ts b/src/types/pageProps/OnlyBrowserPageProps.ts
new file mode 100644
index 000000000..4a2b8194e
--- /dev/null
+++ b/src/types/pageProps/OnlyBrowserPageProps.ts
@@ -0,0 +1,12 @@
+import UniversalCookiesManager from '../../utils/cookies/UniversalCookiesManager';
+import { UserSemiPersistentSession } from '../UserSemiPersistentSession';
+
+/**
+ * Props only available on the browser side, for all pages
+ */
+export type OnlyBrowserPageProps = {
+ cookiesManager: UniversalCookiesManager;
+ iframeReferrer: string;
+ isInIframe: boolean;
+ userSession: UserSemiPersistentSession; // User session (from browser cookies)
+};
diff --git a/src/types/pageProps/OnlyServerPageProps.ts b/src/types/pageProps/OnlyServerPageProps.ts
new file mode 100644
index 000000000..f1b5c90d1
--- /dev/null
+++ b/src/types/pageProps/OnlyServerPageProps.ts
@@ -0,0 +1,12 @@
+import { Cookies } from '../Cookies';
+import { UserSemiPersistentSession } from '../UserSemiPersistentSession';
+import { PublicHeaders } from './PublicHeaders';
+
+/**
+ * Props only available on the server side, for all pages
+ */
+export type OnlyServerPageProps = {
+ headers: PublicHeaders; // Headers made public to the client-side
+ readonlyCookies: Cookies; // Cookies retrieved using https://www.npmjs.com/package/next-cookies - Aren't really readonly but don't provide any setter
+ userSession: UserSemiPersistentSession; // User session (from server cookies)
+};
diff --git a/src/types/PublicHeaders.ts b/src/types/pageProps/PublicHeaders.ts
similarity index 100%
rename from src/types/PublicHeaders.ts
rename to src/types/pageProps/PublicHeaders.ts
diff --git a/src/types/pageProps/SSGPageProps.ts b/src/types/pageProps/SSGPageProps.ts
new file mode 100644
index 000000000..5fa0aae73
--- /dev/null
+++ b/src/types/pageProps/SSGPageProps.ts
@@ -0,0 +1,19 @@
+import { MultiversalAppBootstrapPageProps } from '../nextjs/MultiversalAppBootstrapPageProps';
+import { MultiversalPageProps } from './MultiversalPageProps';
+
+/**
+ * Static properties returned by getStaticProps for static pages (using SSG)
+ * Mind that those properties are generated from the server, when building the static bundle
+ *
+ * Multiversal page props are listed in MultiversalPageProps
+ * Server-side page props are listed in SSRPageProps
+ * Client-side page props are listed in SSGPageProps
+ *
+ * XXX SSGPageProps doesn't extend from OnlyBrowserPageProps (like SSRPageProps does with OnlyServerPageProps) because SSG properties are actually generated by the server and don't have access to browser variables
+ */
+export type SSGPageProps = {
+ // Props that are specific to SSG
+ isStaticRendering: boolean;
+} & MultiversalPageProps // Generic props that are provided immediately, no matter what
+ & Partial // Pages served by SSG eventually benefit from props injected by the MultiversalAppBootstrap component
+ & E;
diff --git a/src/types/pageProps/SSRPageProps.ts b/src/types/pageProps/SSRPageProps.ts
new file mode 100644
index 000000000..acc028575
--- /dev/null
+++ b/src/types/pageProps/SSRPageProps.ts
@@ -0,0 +1,18 @@
+import { MultiversalAppBootstrapPageProps } from '../nextjs/MultiversalAppBootstrapPageProps';
+import { MultiversalPageProps } from './MultiversalPageProps';
+import { OnlyServerPageProps } from './OnlyServerPageProps';
+
+/**
+ * Dynamic (server) properties returned by getInitialProps or getServerProps for server-side rendered pages (using SSR)
+ * Mind that those properties are generated by the server, for each request
+ *
+ * Multiversal page props are listed in MultiversalPageProps
+ * Server-side page props are listed in SSRPageProps
+ * Client-side page props are listed in SSGPageProps
+ */
+export type SSRPageProps = {
+ // Props that are specific to SSR
+ isServerRendering: boolean;
+} & MultiversalPageProps // Generic props that are provided immediately, no matter what
+ & Partial // Pages served by SSR eventually benefit from props injected by the MultiversalAppBootstrap component
+ & E;
diff --git a/src/types/pageProps/SoftPageProps.ts b/src/types/pageProps/SoftPageProps.ts
new file mode 100644
index 000000000..6372bec50
--- /dev/null
+++ b/src/types/pageProps/SoftPageProps.ts
@@ -0,0 +1,20 @@
+import { MultiversalPageProps } from './MultiversalPageProps';
+import { OnlyBrowserPageProps } from './OnlyBrowserPageProps';
+import { OnlyServerPageProps } from './OnlyServerPageProps';
+
+/**
+ * Generic helper meant to be used in pages, when you don't want to use a strict typing
+ * Extends all common properties whether they're multiversal or specific to either browser or server
+ *
+ * Avoid pointless TS warnings when manipulating server-only or browser-only props
+ * Meant to help developers to avoid struggling with TS types
+ *
+ * Alternatively, you can use "MultiversalPageProps" which will ensure stricter types checks
+ *
+ * XXX When using this type, you must make sure you're using the right runtime engine (browser/server)
+ * For instance, it'll allow to use browser-only props like "isInIframe" without complaining, but you should provide a proper default if not set
+ */
+export declare type SoftPageProps =
+ MultiversalPageProps &
+ Partial &
+ Partial;
diff --git a/src/utils/amplitude.ts b/src/utils/amplitude.ts
deleted file mode 100644
index 814e45b88..000000000
--- a/src/utils/amplitude.ts
+++ /dev/null
@@ -1,16 +0,0 @@
-/**
- * Event actions
- *
- * All actions must use action verb (imperative form)
- *
- * DA Usefulness: Avoids using anonymous constants that will likely duplicate each other
- * Using constants ensures strict usage with a proper definition for the analytics team and the developers
- * Example: Using both "remove" and "delete" could lead to misunderstanding or errors when configuring charts
- */
-export enum AMPLITUDE_ACTIONS {
- CLICK = 'click', // When an element is clicked (mouse) or tapped (screen, mobile)
- SELECT = 'select', // When an element is selected (checkbox, select input, multi choices)
- REMOVE = 'remove', // When an element is removed/delete
- OPEN = 'open', // When an element is opened
- CLOSE = 'close', // When an element is closed
-}
diff --git a/src/utils/analytics/amplitude.ts b/src/utils/analytics/amplitude.ts
new file mode 100644
index 000000000..73b411522
--- /dev/null
+++ b/src/utils/analytics/amplitude.ts
@@ -0,0 +1,155 @@
+import * as Sentry from '@sentry/node';
+import { isBrowser } from '@unly/utils';
+import { AmplitudeClient, Identify } from 'amplitude-js';
+import { NextWebVitalsMetricsReport } from '../../types/nextjs/NextWebVitalsMetricsReport';
+import { UserSemiPersistentSession } from '../../types/UserSemiPersistentSession';
+import UniversalCookiesManager from '../cookies/UniversalCookiesManager';
+
+/**
+ * Event actions
+ *
+ * All actions must use action verb (imperative form)
+ *
+ * DA Usefulness: Avoids using anonymous constants that will likely duplicate each other
+ * Using constants ensures strict usage with a proper definition for the analytics team and the developers
+ * Example: Using both "remove" and "delete" could lead to misunderstanding or errors when configuring charts
+ */
+export enum AMPLITUDE_ACTIONS {
+ CLICK = 'click', // When an element is clicked (mouse) or tapped (screen, mobile)
+ SELECT = 'select', // When an element is selected (checkbox, select input, multi choices)
+ REMOVE = 'remove', // When an element is removed/delete
+ OPEN = 'open', // When an element is opened
+ CLOSE = 'close', // When an element is closed
+}
+
+type GetAmplitudeInstanceProps = {
+ customerRef: string;
+ iframeReferrer: string;
+ isInIframe: boolean;
+ lang: string;
+ locale: string;
+ userId: string;
+}
+
+export const getAmplitudeInstance = (props: GetAmplitudeInstanceProps): AmplitudeClient | null => {
+ // XXX Amplitude is disabled on the server side, it's only used on the client side
+ // (avoids duplicated events, and amplitude-js isn't server-side compatible anyway)
+ if (isBrowser()) {
+ const {
+ customerRef,
+ iframeReferrer,
+ isInIframe,
+ lang,
+ locale,
+ userId,
+ } = props;
+
+ Sentry.configureScope((scope) => { // See https://www.npmjs.com/package/@sentry/node
+ scope.setTag('iframe', `${isInIframe}`);
+ scope.setExtra('iframe', isInIframe);
+ scope.setExtra('iframeReferrer', iframeReferrer);
+ });
+
+ const amplitude = require('amplitude-js'); // eslint-disable-line @typescript-eslint/no-var-requires
+ const amplitudeInstance: AmplitudeClient = amplitude.getInstance();
+
+ // See https://help.amplitude.com/hc/en-us/articles/115001361248#settings-configuration-options
+ amplitudeInstance.init(process.env.AMPLITUDE_API_KEY, null, {
+ userId,
+ logLevel: process.env.APP_STAGE === 'production' ? 'DISABLE' : 'WARN',
+ includeGclid: true,
+ includeReferrer: true, // See https://help.amplitude.com/hc/en-us/articles/215131888#track-referrers
+ includeUtm: true,
+ // @ts-ignore XXX onError should be allowed, see https://github.com/DefinitelyTyped/DefinitelyTyped/issues/42005
+ onError: (error): void => {
+ Sentry.captureException(error);
+ console.error(error); // eslint-disable-line no-console
+ },
+ });
+
+ amplitudeInstance.setVersionName(process.env.APP_VERSION); // e.g: 1.0.0
+
+ // We're only doing this when detecting a new session, as it won't be executed multiple times for the same session anyway, and it avoids noise
+ if (amplitudeInstance.isNewSession()) {
+ // Store whether the visitor originally came from an iframe (and from where)
+ const visitor: Identify = new amplitudeInstance.Identify();
+ // XXX Learn more about "setOnce" at https://github.com/amplitude/Amplitude-JavaScript/issues/223
+ visitor.setOnce('initial_lang', lang); // DA Helps figuring out if the initial language (auto-detected) is changed afterwards
+ visitor.setOnce('initial_locale', locale);
+ // DA This will help track down the users who discovered our platform because of an iframe
+ visitor.setOnce('initial_iframe', isInIframe);
+ visitor.setOnce('initial_iframeReferrer', iframeReferrer);
+
+ // XXX We set all "must-have" properties here (instead of doing it in the "AmplitudeProvider", as userProperties), because react-amplitude will send the next "page-displayed" event BEFORE sending the $identify event
+ visitor.setOnce('customer.ref', customerRef);
+ visitor.setOnce('lang', lang);
+ visitor.setOnce('locale', locale);
+ visitor.setOnce('iframe', isInIframe);
+ visitor.setOnce('iframeReferrer', iframeReferrer);
+
+ amplitudeInstance.identify(visitor); // Send the new identify event to amplitude (updates user's identity)
+ }
+
+ return amplitudeInstance;
+
+ } else {
+ return null;
+ }
+};
+
+/**
+ * Initialise Amplitude and send web-vitals metrics report.
+ *
+ * @param report
+ * @see https://web.dev/vitals/ Essential metrics for a healthy site
+ * @see https://nextjs.org/blog/next-9-4#integrated-web-vitals-reporting
+ */
+export const sendWebVitals = (report: NextWebVitalsMetricsReport): void => {
+ try {
+ const amplitude = require('amplitude-js'); // eslint-disable-line @typescript-eslint/no-var-requires
+ const amplitudeInstance: AmplitudeClient = amplitude.getInstance();
+ const universalCookiesManager = new UniversalCookiesManager();
+ const userData: UserSemiPersistentSession = universalCookiesManager.getUserData();
+
+ // https://help.amplitude.com/hc/en-us/articles/115001361248#settings-configuration-options
+ amplitudeInstance.init(process.env.AMPLITUDE_API_KEY, null, {
+ // userId: null,
+ userId: userData.id,
+ logLevel: process.env.APP_STAGE === 'production' ? 'DISABLE' : 'WARN',
+ includeGclid: true,
+ includeReferrer: true, // https://help.amplitude.com/hc/en-us/articles/215131888#track-referrers
+ includeUtm: true,
+ // @ts-ignore XXX onError should be allowed, see https://github.com/DefinitelyTyped/DefinitelyTyped/issues/42005
+ onError: (error): void => {
+ Sentry.captureException(error);
+ console.error(error); // eslint-disable-line no-console
+ },
+ });
+
+ amplitudeInstance.setVersionName(process.env.APP_VERSION); // e.g: 1.0.0
+
+ // Sen metrics to our analytics service
+ amplitudeInstance.logEvent(`report-web-vitals`, {
+ app: {
+ name: process.env.APP_NAME,
+ version: process.env.APP_VERSION,
+ stage: process.env.APP_STAGE,
+ preset: process.env.NRN_PRESET,
+ },
+ page: {
+ url: location.href,
+ path: location.pathname,
+ origin: location.origin,
+ name: null,
+ },
+ customer: {
+ ref: process.env.CUSTOMER_REF,
+ },
+ report,
+ });
+ console.debug('report-web-vitals report sent to Amplitude');
+ } catch (e) {
+ Sentry.captureException(e);
+ console.error(e);// eslint-disable-line no-console
+ }
+};
diff --git a/src/utils/ignoreNoisyWarningsHacks.ts b/src/utils/app/ignoreNoisyWarningsHacks.ts
similarity index 81%
rename from src/utils/ignoreNoisyWarningsHacks.ts
rename to src/utils/app/ignoreNoisyWarningsHacks.ts
index 1e5182948..f04849279 100644
--- a/src/utils/ignoreNoisyWarningsHacks.ts
+++ b/src/utils/app/ignoreNoisyWarningsHacks.ts
@@ -7,6 +7,9 @@ console.error = (...args): void => {
if (/Warning.*Function components cannot be given refs/.test(args[0])) {
// HACK: Muting error, fix as soon as https://github.com/zeit/next.js/issues/7915 gets resolved
return;
+ }else if (/Warning.*Expected server HTML to contain a matching/.test(args[0]) && /Footer/.test(args[3])) {
+ // XXX Silent false-positive warning (server doesn't render that part because it can't on server when using SSG, perfectly normal and not an actual issue)
+ return;
}
originalError.call(console, ...args);
};
diff --git a/src/utils/app/redirect.ts b/src/utils/app/redirect.ts
new file mode 100644
index 000000000..59a3b3739
--- /dev/null
+++ b/src/utils/app/redirect.ts
@@ -0,0 +1,17 @@
+export default function redirect(res, statusCode, location) {
+ if (!res) {
+ throw new Error('Response object required');
+ }
+
+ if (!statusCode) {
+ throw new Error('Status code required');
+ }
+
+ if (!location) {
+ throw new Error('Location required');
+ }
+
+ res.statusCode = statusCode;
+ res.setHeader('Location', location);
+ res.end();
+}
diff --git a/src/utils/app/router.ts b/src/utils/app/router.ts
new file mode 100644
index 000000000..fa62b7a75
--- /dev/null
+++ b/src/utils/app/router.ts
@@ -0,0 +1,104 @@
+import { NextRouter } from 'next/router';
+import { removeTrailingSlash } from '../js/string';
+
+export type Route = {
+ locale: string;
+ href: string;
+ as?: string;
+}
+
+export type I18nRoute = {
+ i18nHref: string;
+ i18nAs: string;
+}
+
+/**
+ * Resolve the i18n route based on the route
+ *
+ * I18n route add the locale at the beginning of the route
+ *
+ * @example '/terms' => '/fr/terms'
+ *
+ * @param route
+ */
+export const resolveI18nRoute = (route: Route): I18nRoute => {
+ const { locale, href, as } = route;
+ let i18nHref = href;
+ let i18nAs = as;
+
+ if (locale) {
+ i18nHref = removeTrailingSlash(`/[locale]${i18nHref}`);
+
+ // Apply default if "as" isn't specified (otherwise, keep provided value)
+ if (!as) {
+ i18nAs = removeTrailingSlash(`/${locale}${href}`);
+ }
+ }
+
+ return {
+ i18nAs,
+ i18nHref,
+ };
+};
+
+/**
+ * Resolve the home page based on the given locale
+ *
+ * @example 'fr-FR' => /fr-FR
+ *
+ * @param locale
+ */
+export const resolveI18nHomePage = (locale: string): I18nRoute => {
+ return {
+ i18nAs: '/[locale]',
+ i18nHref: `/${locale}`,
+ };
+};
+
+/**
+ * Resolves whether the "path" is the current active route
+ *
+ * Only consider the base path, will match nested paths if base matches
+ *
+ * @example isActive({pathname: '/[locale]'}, '') => true
+ * @example isActive({pathname: '/[locale]/terms'}, 'terms') => true
+ * @example isActive({pathname: '/[locale]/terms'}, '') => false
+ *
+ * @param router
+ * @param path
+ */
+export const isActive = (router: NextRouter, path: string): boolean => {
+ const route = router.pathname.replace('/[locale]', '');
+ const currentPaths = route.split('/');
+
+ return (currentPaths?.[1] || currentPaths?.[0]) === path;
+};
+
+/**
+ * Returns the current page url, but for a different locale
+ *
+ * @param locale
+ * @param router
+ */
+export const getSamePageI18nUrl = (locale, router: NextRouter): string => {
+ return `${router.pathname.replace('[locale]', locale)}`;
+};
+
+/**
+ * Redirects the current page to the "same" page, but for a different locale
+ *
+ * @param locale
+ * @param router
+ * @param pageReload
+ * @see https://nextjs.org/docs/routing/imperatively Programmatic usage of Next Router
+ * @see https://nextjs.org/docs/api-reference/next/router#router-api Router API
+ */
+export const i18nRedirect = (locale, router: NextRouter, pageReload = false): void => {
+ const newUrl = getSamePageI18nUrl(locale, router);
+
+ if (pageReload) {
+ location.href = newUrl;
+ } else {
+ router.push(router.pathname, newUrl);
+ }
+};
diff --git a/src/utils/logo.test.ts b/src/utils/assets/logo.test.ts
similarity index 97%
rename from src/utils/logo.test.ts
rename to src/utils/assets/logo.test.ts
index 9c409fc8b..85088f76c 100644
--- a/src/utils/logo.test.ts
+++ b/src/utils/assets/logo.test.ts
@@ -10,7 +10,7 @@ describe('toPixels', () => {
// Edge cases, not handled yet
test('should convert to pixels incorrectly (edge cases)', async () => {
expect(toPixels(null)).toEqual(null);
- // @ts-ignore
+ // @ts-expect-error
expect(toPixels()).toEqual(undefined);
expect(toPixels('string')).toEqual('string');
expect(toPixels('50')).toEqual('50');
diff --git a/src/utils/logo.ts b/src/utils/assets/logo.ts
similarity index 98%
rename from src/utils/logo.ts
rename to src/utils/assets/logo.ts
index 6f4fd3676..4d902bc07 100644
--- a/src/utils/logo.ts
+++ b/src/utils/assets/logo.ts
@@ -1,5 +1,5 @@
import map from 'lodash.map';
-import { Logo } from '../types/data/Logo';
+import { Logo } from '../../types/data/Logo';
export const SIZE_XS = 'xs';
export const SIZE_SM = 'sm';
diff --git a/src/utils/UniversalCookiesManager.browser.test.ts b/src/utils/cookies/UniversalCookiesManager.browser.test.ts
similarity index 95%
rename from src/utils/UniversalCookiesManager.browser.test.ts
rename to src/utils/cookies/UniversalCookiesManager.browser.test.ts
index 0c9a502e7..bc9fd864d 100644
--- a/src/utils/UniversalCookiesManager.browser.test.ts
+++ b/src/utils/cookies/UniversalCookiesManager.browser.test.ts
@@ -2,7 +2,7 @@
* @jest-environment jsdom
*/
-import { UserSemiPersistentSession } from '../types/UserSemiPersistentSession';
+import { UserSemiPersistentSession } from '../../types/UserSemiPersistentSession';
import { deleteAllCookies } from './cookies';
import UniversalCookiesManager from './UniversalCookiesManager';
@@ -16,9 +16,9 @@ describe(`utils/UniversalCookiesManager.ts`, () => {
test(`should init correctly (no arg)`, async () => {
const universalCookiesManager = new UniversalCookiesManager();
- // @ts-ignore
+ // @ts-expect-error
expect(universalCookiesManager.req).toEqual(null);
- // @ts-ignore
+ // @ts-expect-error
expect(universalCookiesManager.res).toEqual(null);
});
});
@@ -80,7 +80,7 @@ describe(`utils/UniversalCookiesManager.ts`, () => {
expect(userSessionPatched.id).toBeDefined();
expect(userSessionPatched.deviceId).toBeDefined();
- // @ts-ignore
+ // @ts-expect-error
expect(document.cookie).toEqual(`user={"id":"${userSessionPatched.id}","deviceId":"${userSessionPatched.deviceId}","persona":"${userSessionPatched.persona}"}`);
});
});
diff --git a/src/utils/UniversalCookiesManager.server.test.ts b/src/utils/cookies/UniversalCookiesManager.server.test.ts
similarity index 93%
rename from src/utils/UniversalCookiesManager.server.test.ts
rename to src/utils/cookies/UniversalCookiesManager.server.test.ts
index 67334729f..ee83c980a 100644
--- a/src/utils/UniversalCookiesManager.server.test.ts
+++ b/src/utils/cookies/UniversalCookiesManager.server.test.ts
@@ -13,9 +13,9 @@ describe(`utils/UniversalCookiesManager.ts`, () => {
const res = httpMocks.createResponse();
const universalCookiesManager = new UniversalCookiesManager(req, res);
- // @ts-ignore
+ // @ts-expect-error
expect(universalCookiesManager.req).toBeDefined();
- // @ts-ignore
+ // @ts-expect-error
expect(universalCookiesManager.res).toBeDefined();
});
});
diff --git a/src/utils/UniversalCookiesManager.ts b/src/utils/cookies/UniversalCookiesManager.ts
similarity index 83%
rename from src/utils/UniversalCookiesManager.ts
rename to src/utils/cookies/UniversalCookiesManager.ts
index 1144c2a4f..0ed3656d4 100644
--- a/src/utils/UniversalCookiesManager.ts
+++ b/src/utils/cookies/UniversalCookiesManager.ts
@@ -6,9 +6,9 @@ import { IncomingMessage, ServerResponse } from 'http';
import BrowserCookies, { CookieAttributes } from 'js-cookie';
import uuid from 'uuid/v1'; // XXX Use v1 for uniqueness - See https://www.sohamkamani.com/blog/2016/10/05/uuid1-vs-uuid4/
-import { Cookies } from '../types/Cookies';
-import { PatchedUserSemiPersistentSession, UserSemiPersistentSession } from '../types/UserSemiPersistentSession';
-import { addYears } from './date';
+import { Cookies } from '../../types/Cookies';
+import { PatchedUserSemiPersistentSession, UserSemiPersistentSession } from '../../types/UserSemiPersistentSession';
+import { addYears } from '../js/date';
const USER_LS_KEY = 'user';
@@ -54,24 +54,28 @@ export default class UniversalCookiesManager {
* @param browserOptions
*/
replaceUserData(newUserData: UserSemiPersistentSession, serverOptions = this.defaultServerOptions, browserOptions: CookieAttributes = this.defaultBrowserOptions): void {
- if (isBrowser()) {
- // XXX By default, "js-cookies" apply a "percent encoding" when writing data, which isn't compatible with the "cookies" lib
- // We therefore override this behaviour because we need to write proper JSON
- // See https://github.com/js-cookie/js-cookie#encoding
- const browserCookies = BrowserCookies.withConverter({
- write: function (value: string, name: string) {
- return value;
- },
- });
- browserCookies.set(USER_LS_KEY, JSON.stringify(newUserData), browserOptions);
- } else {
- const serverCookies = new ServerCookies(this.req, this.res);
+ try {
+ if (isBrowser()) {
+ // XXX By default, "js-cookies" apply a "percent encoding" when writing data, which isn't compatible with the "cookies" lib
+ // We therefore override this behaviour because we need to write proper JSON
+ // See https://github.com/js-cookie/js-cookie#encoding
+ const browserCookies = BrowserCookies.withConverter({
+ write: function (value: string, name: string) {
+ return value;
+ },
+ });
+ browserCookies.set(USER_LS_KEY, JSON.stringify(newUserData), browserOptions);
+ } else {
+ const serverCookies = new ServerCookies(this.req, this.res);
- // If running on the server side but req or res aren't set, then we don't do anything
- // It's likely because we're calling this code from a view (that doesn't belong to getInitialProps and doesn't have access to req/res even though if it's running on the server)
- if (this.req && this.res) {
- serverCookies.set(USER_LS_KEY, JSON.stringify(newUserData), serverOptions);
+ // If running on the server side but req or res aren't set, then we don't do anything
+ // It's likely because we're calling this code from a view (that doesn't belong to getInitialProps and doesn't have access to req/res even though if it's running on the server)
+ if (this.req && this.res) {
+ serverCookies.set(USER_LS_KEY, JSON.stringify(newUserData), serverOptions);
+ }
}
+ } catch (e) {
+ Sentry.captureException(e);
}
}
diff --git a/src/utils/cookies.ts b/src/utils/cookies/cookies.ts
similarity index 100%
rename from src/utils/cookies.ts
rename to src/utils/cookies/cookies.ts
diff --git a/src/utils/css.ts b/src/utils/css.ts
index 4aec7b3ca..d4bc96aac 100644
--- a/src/utils/css.ts
+++ b/src/utils/css.ts
@@ -25,8 +25,7 @@ const logger = createLogger({
export const cssToReactStyle = (css: string | object): object => {
// If object is given, return object (could be react style object mistakenly provided)
if (isPlainObject(css)) {
- // @ts-ignore
- return css;
+ return css as object;
}
// If falsy, then probably empty string or null, nothing to be done there
diff --git a/src/utils/record.test.ts b/src/utils/data/record.test.ts
similarity index 95%
rename from src/utils/record.test.ts
rename to src/utils/data/record.test.ts
index 42d91195e..3373e6358 100644
--- a/src/utils/record.test.ts
+++ b/src/utils/data/record.test.ts
@@ -20,7 +20,7 @@ describe('utils/record.ts', () => {
htmlEmptyParagraph: '
',
};
- // @ts-ignore
+ // @ts-expect-error
expect(hasValue(item)).toEqual(false);
expect(hasValue(item, null)).toEqual(false);
expect(hasValue(item, undefined)).toEqual(false);
@@ -75,13 +75,13 @@ describe('utils/record.ts', () => {
expect(getValue(item, '_', null, STRATEGY_DO_NOTHING)).toEqual(null);
expect(getValue(item, '', null, STRATEGY_DO_NOTHING)).toEqual(null);
expect(getValue(item, null, null, STRATEGY_DO_NOTHING)).toEqual(null);
- // @ts-ignore
+ // @ts-expect-error
expect(getValue(item, 50.5, null, STRATEGY_DO_NOTHING)).toEqual(null);
- // @ts-ignore
+ // @ts-expect-error
expect(getValue(item, {}, null, STRATEGY_DO_NOTHING)).toEqual(null);
- // @ts-ignore
+ // @ts-expect-error
expect(getValue(item, { 0: 0 }, null, STRATEGY_DO_NOTHING)).toEqual(null);
- // @ts-ignore
+ // @ts-expect-error
expect(getValue(item, 0, null, STRATEGY_DO_NOTHING)).toEqual(null);
expect(console.log).not.toBeCalled();
});
@@ -106,23 +106,22 @@ describe('utils/record.ts', () => {
expect(console.log).toBeCalled();
expect(getValue(item, null)).toEqual(null);
expect(console.log).toBeCalled();
- // @ts-ignore
+ // @ts-expect-error
expect(getValue(item, 50.5)).toEqual(null);
expect(console.log).toBeCalled();
- // @ts-ignore
+ // @ts-expect-error
expect(getValue(item, {})).toEqual(null);
expect(console.log).toBeCalled();
- // @ts-ignore
+ // @ts-expect-error
expect(getValue(item, { 0: 0 })).toEqual(null);
expect(console.log).toBeCalled();
- // @ts-ignore
+ // @ts-expect-error
expect(getValue(item, 0)).toEqual(null);
expect(console.log).toBeCalled();
});
test('should return the expected value when the given value is defined (with multi depths)', async () => {
const item: Record = {
- // @ts-ignore
string: 'string',
string2: '0',
string3: '-1',
@@ -175,7 +174,6 @@ describe('utils/record.ts', () => {
});
test('should return the expected value when given a proper "fallbacks" to fallback from (2 fallbacks)', async () => {
- // @ts-ignore
const fallbacks: Array = [
{
record: {
@@ -196,7 +194,6 @@ describe('utils/record.ts', () => {
});
test('should return the expected value when given a proper "fallbacks" to fallback from (3 fallbacks)', async () => {
- // @ts-ignore
const fallbacks: Array = [
{
record: {
@@ -223,7 +220,6 @@ describe('utils/record.ts', () => {
});
test('should return the expected value when given a proper "fallbacks" to fallback from (4 fallbacks)', async () => {
- // @ts-ignore
const fallbacks: Array = [
{
record: {
@@ -256,7 +252,6 @@ describe('utils/record.ts', () => {
});
test('should return the expected value when given a proper "fallbacks" to fallback from (4 fallbacks bis)', async () => {
- // @ts-ignore
const fallbacks: Array = [
{
record: {
@@ -291,25 +286,25 @@ describe('utils/record.ts', () => {
test('should return the default value when given an improper "fallbacks" to fallback from', async () => {
expect(getValueFallback(null)).toEqual(null);
expect(console.log).toBeCalled();
- // @ts-ignore
+ // @ts-expect-error
expect(getValueFallback(1)).toEqual(null);
expect(console.log).toBeCalled();
- // @ts-ignore
+ // @ts-expect-error
expect(getValueFallback(0)).toEqual(null);
expect(console.log).toBeCalled();
- // @ts-ignore
+ // @ts-expect-error
expect(getValueFallback('')).toEqual(null);
expect(console.log).toBeCalled();
- // @ts-ignore
+ // @ts-expect-error
expect(getValueFallback({})).toEqual(null);
expect(console.log).toBeCalled();
- // @ts-ignore
+ // @ts-expect-error
expect(getValueFallback({ a: 5 })).toEqual(null);
expect(console.log).toBeCalled();
- // @ts-ignore
+ // @ts-expect-error
expect(getValueFallback(-42.00)).toEqual(null);
expect(console.log).toBeCalled();
- // @ts-ignore
+ // @ts-expect-error
expect(getValueFallback(NaN)).toEqual(null);
expect(console.log).toBeCalled();
});
@@ -317,25 +312,25 @@ describe('utils/record.ts', () => {
test('should return the expected value when given an improper "fallbacks" to fallback from', async () => {
expect(getValueFallback(null, 55)).toEqual(55);
expect(console.log).toBeCalled();
- // @ts-ignore
+ // @ts-expect-error
expect(getValueFallback(1, 'fallbackValue')).toEqual('fallbackValue');
expect(console.log).toBeCalled();
- // @ts-ignore
+ // @ts-expect-error
expect(getValueFallback(0, true)).toEqual(true);
expect(console.log).toBeCalled();
- // @ts-ignore
+ // @ts-expect-error
expect(getValueFallback('', false)).toEqual(false);
expect(console.log).toBeCalled();
- // @ts-ignore
+ // @ts-expect-error
expect(getValueFallback({}, {})).toMatchObject({});
expect(console.log).toBeCalled();
- // @ts-ignore
+ // @ts-expect-error
expect(getValueFallback({ a: 5 }, { a: 5 })).toMatchObject({ a: 5 });
expect(console.log).toBeCalled();
- // @ts-ignore
+ // @ts-expect-error
expect(getValueFallback(-42.00, [6])).toEqual([6]);
expect(console.log).toBeCalled();
- // @ts-ignore
+ // @ts-expect-error
expect(getValueFallback(NaN, NaN)).toEqual(NaN);
expect(console.log).toBeCalled();
});
diff --git a/src/utils/record.ts b/src/utils/data/record.ts
similarity index 98%
rename from src/utils/record.ts
rename to src/utils/data/record.ts
index c2d907bbc..55870f02d 100644
--- a/src/utils/record.ts
+++ b/src/utils/data/record.ts
@@ -9,11 +9,11 @@ import map from 'lodash.map';
import remove from 'lodash.remove';
import xOrBy from 'lodash.xorby';
-import { GraphCMSSystemFields } from '../types/data/GraphCMSSystemFields';
-import { SerializedRecord } from '../types/SerializedRecord';
+import { GraphCMSSystemFields } from '../../types/data/GraphCMSSystemFields';
+import { SerializedRecord } from '../../types/SerializedRecord';
const logger = createLogger({
- label: 'utils/record',
+ label: 'utils/data/record',
});
/**
diff --git a/src/utils/data/theme.ts b/src/utils/data/theme.ts
new file mode 100644
index 000000000..e3ef89a2e
--- /dev/null
+++ b/src/utils/data/theme.ts
@@ -0,0 +1,15 @@
+import { NRN_DEFAULT_THEME } from '../../constants';
+import { Customer } from '../../types/data/Customer';
+import { Theme } from '../../types/data/Theme';
+
+/**
+ * Initialises customer theme, uses default values if not specified
+ *
+ * @param customer
+ */
+export const initCustomerTheme = (customer: Customer): Theme => {
+ const theme: Theme = customer?.theme || {};
+ theme.primaryColor = theme?.primaryColor || NRN_DEFAULT_THEME.primaryColor; // Apply default theming if not specified
+
+ return theme;
+};
diff --git a/src/utils/graphcms.test.ts b/src/utils/gql/graphcms.test.ts
similarity index 100%
rename from src/utils/graphcms.test.ts
rename to src/utils/gql/graphcms.test.ts
diff --git a/src/utils/graphcms.ts b/src/utils/gql/graphcms.ts
similarity index 100%
rename from src/utils/graphcms.ts
rename to src/utils/gql/graphcms.ts
diff --git a/src/utils/gql/graphql.ts b/src/utils/gql/graphql.ts
new file mode 100644
index 000000000..f6f17e3db
--- /dev/null
+++ b/src/utils/gql/graphql.ts
@@ -0,0 +1,25 @@
+import { InMemoryCache, NormalizedCacheObject } from 'apollo-cache-inmemory';
+import { ApolloClient } from 'apollo-client';
+import { HttpLink } from 'apollo-link-http';
+
+export const createApolloClient = (initialState = {}, ctx = undefined): ApolloClient => {
+ // The `ctx` (NextPageContext) will only be present on the server.
+ // use it to extract auth headers (ctx.req) or similar.
+ return new ApolloClient({
+ ssrMode: Boolean(ctx),
+ link: new HttpLink({
+ uri: process.env.GRAPHQL_API_ENDPOINT, // Server URL (must be absolute)
+ // Headers applied here will be applied for all requests
+ // See the use of the "options" when running a graphQL query to specify options per-request at https://www.apollographql.com/docs/react/api/react-hooks/#options
+ headers: {
+ 'gcms-locale-no-default': false,
+ 'authorization': `Bearer ${process.env.GRAPHQL_API_KEY}`,
+ },
+ credentials: 'same-origin', // XXX See https://www.apollographql.com/docs/react/recipes/authentication#cookie
+ fetch, // Switches between unfetch & node-fetch for client & server.
+ }),
+ cache: new InMemoryCache().restore(initialState || {}),
+ });
+};
+
+export default createApolloClient;
diff --git a/src/utils/i18n.ts b/src/utils/i18n.ts
deleted file mode 100644
index 0b48939e2..000000000
--- a/src/utils/i18n.ts
+++ /dev/null
@@ -1,22 +0,0 @@
-export const LANG_EN = 'en';
-export const LANG_FR = 'fr';
-export const SUPPORTED_LANGUAGES = [
- LANG_EN,
- LANG_FR,
-];
-
-/**
- * Language used by default if no user language can be resolved
- * We use English because it's the most used languages among those supported
- *
- * @type {string}
- */
-export const DEFAULT_LANG: string = LANG_EN;
-
-export const resolveFallbackLanguage = (primaryLanguage: string): string => {
- if (primaryLanguage === LANG_FR) {
- return LANG_EN;
- } else {
- return LANG_FR;
- }
-};
diff --git a/src/utils/i18n/i18n.ts b/src/utils/i18n/i18n.ts
new file mode 100644
index 000000000..ccdf32d43
--- /dev/null
+++ b/src/utils/i18n/i18n.ts
@@ -0,0 +1,78 @@
+import {
+ defaultLocale,
+ supportedLanguages,
+ supportedLocales,
+} from '../../i18nConfig';
+import { I18nLocale } from '../../types/i18n/I18nLocale';
+
+export const LANG_EN = 'en';
+export const LANG_FR = 'fr';
+export const SUPPORTED_LOCALES: I18nLocale[] = supportedLocales;
+export const SUPPORTED_LANGUAGES: string[] = supportedLanguages;
+
+/**
+ * Language used by default if no user language can be resolved
+ * We use English because it's the most used languages among those supported
+ *
+ * @type {string}
+ */
+export const DEFAULT_LOCALE: string = defaultLocale;
+
+export const resolveFallbackLanguage = (primaryLanguage: string): string => {
+ if (primaryLanguage === LANG_FR) {
+ return LANG_EN;
+ } else {
+ return LANG_FR;
+ }
+};
+
+/**
+ * Detects the browser locale (from "accept-language" header) and returns an array of locales by order of importance
+ *
+ * TODO Should be re-implemented using https://github.com/UnlyEd/universal-language-detector
+ * or https://www.npmjs.com/package/accept-language-parser or similar
+ * because current implementation is undecipherable and doesn't have any test
+ *
+ * @param req
+ * @see https://codesandbox.io/s/nextjs-i18n-staticprops-new-pbwjj?file=/src/static-translations/apiUtils/headerLanguage.js
+ */
+export const acceptLanguageHeaderLookup = (req): string[] | undefined => {
+ let found: string[];
+
+ if (typeof req !== 'undefined') {
+ const { headers } = req;
+ if (!headers) return found;
+
+ const locales = [];
+ const acceptLanguage = headers['accept-language'];
+
+ if (acceptLanguage) {
+ const lngs = [];
+ let i;
+ let m;
+ const rgx = /(([a-z]{2})-?([A-Z]{2})?)\s*;?\s*(q=([0-9.]+))?/gi;
+
+ do {
+ m = rgx.exec(acceptLanguage);
+ if (m) {
+ const lng = m[1];
+ const weight = m[5] || '1';
+ const q = Number(weight);
+ if (lng && !isNaN(q)) {
+ lngs.push({ lng, q });
+ }
+ }
+ } while (m);
+
+ lngs.sort((a, b) => b.q - a.q);
+
+ for (i = 0; i < lngs.length; i++) {
+ locales.push(lngs[i].lng);
+ }
+
+ if (locales.length) found = locales;
+ }
+ }
+
+ return found;
+};
diff --git a/src/utils/i18nextLocize.ts b/src/utils/i18n/i18nextLocize.ts
similarity index 87%
rename from src/utils/i18nextLocize.ts
rename to src/utils/i18n/i18nextLocize.ts
index 739d977c1..5538e3adc 100644
--- a/src/utils/i18nextLocize.ts
+++ b/src/utils/i18n/i18nextLocize.ts
@@ -2,17 +2,20 @@ import * as Sentry from '@sentry/node';
import { isBrowser } from '@unly/utils';
import { createLogger } from '@unly/utils-simple-logger';
import i18next, { i18n } from 'i18next';
-import fetch from 'isomorphic-unfetch';
+import i18nextLocizeBackend from 'i18next-locize-backend/cjs'; // https://github.com/locize/i18next-locize-backend/issues/323#issuecomment-619625571
import get from 'lodash.get';
import map from 'lodash.map';
import { initReactI18next } from 'react-i18next';
-
import { LANG_EN, LANG_FR } from './i18n';
const logger = createLogger({
- label: 'utils/i18nextLocize',
+ label: 'utils/i18n/i18nextLocize',
});
+// On the client, we store the i18nextLocize instance in the following variable.
+// This prevents the client from reinitializing between page transitions, which caused infinite loop rendering.
+let globalI18nextInstance: i18n = null;
+
/**
* A resource locale can be either using a "flat" format or a "nested" format
*
@@ -261,10 +264,10 @@ export const fetchTranslations = async (lang: string): Promise
return (memoizedI18nextResources).resources;
} else {
// Memoized cache is too old, we need to fetch from Locize API again
- logger.info('Translations from in-memory cache are too old (> max age) and thus have been invalidated');
+ logger.info(`Translations from in-memory cache are too old (> ${memoizedCacheMaxAge} seconds) and thus have been invalidated`);
}
}
- let commonLocales = {};
+ let commonLocales: I18nextResources = {};
try {
// Fetching locales for i18next, for the "common" namespace
@@ -273,7 +276,7 @@ export const fetchTranslations = async (lang: string): Promise
// On the other hand, it seems that once the i18next "resources" are set, they don't change,
// so this workaround could cause sync issue if we were using multiple namespaces, but we aren't and probably won't
logger.info(`Pre-fetching translations from ${locizeAPIEndpoint}`);
- const defaultLocalesResponse = await fetch(locizeAPIEndpoint);
+ const defaultLocalesResponse: Response = await fetch(locizeAPIEndpoint);
try {
commonLocales = await defaultLocalesResponse.json();
@@ -324,7 +327,7 @@ export const fetchTranslations = async (lang: string): Promise
* @param lang
* @param defaultLocales
*/
-const i18nextLocize = (lang: string, defaultLocales: I18nextResources): i18n => {
+const createI18nextLocizeInstance = (lang: string, i18nTranslations: I18nextResources): i18n => {
// If LOCIZE_PROJECT_ID is not defined then we mustn't init i18next or it'll crash the whole app when running in non-production stage
// In that case, better crash early with an explicit message
if (!process.env.LOCIZE_PROJECT_ID) {
@@ -334,45 +337,42 @@ const i18nextLocize = (lang: string, defaultLocales: I18nextResources): i18n =>
// Plugins will be dynamically added at runtime, depending on the runtime engine (node or browser)
const plugins = [ // XXX Only plugins that are common to all runtimes should be defined by default
initReactI18next, // passes i18next down to react-i18next
+ i18nextLocizeBackend, // loads translations, saves new keys to it (when saveMissing: true) - https://github.com/locize/i18next-locize-backend
];
+ logger.info(`Using "react-i18next" plugin`);
+ logger.info(`Using "i18next-locize-backend" plugin`);
// Dynamically load different modules depending on whether we're running node or browser engine
if (!isBrowser()) {
// XXX Use "__non_webpack_require__" on the server
- // loads translations, saves new keys to it (saveMissing: true)
- // https://github.com/locize/i18next-node-locize-backend
- const i18nextNodeLocizeBackend = __non_webpack_require__('i18next-node-locize-backend');
- plugins.push(i18nextNodeLocizeBackend);
-
- // sets a timestamp of last access on every translation segment on locize
- // -> safely remove the ones not being touched for weeks/months
+ // Sets a timestamp of last access on every translation segment on locize
+ // -> Helps to safely remove the ones not being touched for weeks/months
+ // N.B: It doesn't delete anything on its own, it just a helper to help you know when a translation was last used
+ // XXX We only enable this server side because it's only used in development and there is no point increasing the browser bundle size
// https://github.com/locize/locize-node-lastused
- const locizeNodeLastUsed = __non_webpack_require__('locize-node-lastused');
+ const locizeNodeLastUsed = __non_webpack_require__('locize-lastused/cjs');
plugins.push(locizeNodeLastUsed);
+ logger.info(`Using "locize-lastused" plugin`);
} else {
// XXX Use "require" on the browser, always take the "default" export specifically
- // loads translations, saves new keys to it (saveMissing: true)
- // https://github.com/locize/i18next-locize-backend
- // eslint-disable-next-line @typescript-eslint/no-var-requires
- const i18nextLocizeBackend = require('i18next-locize-backend').default;
- plugins.push(i18nextLocizeBackend);
-
// InContext Editor of locize ?locize=true to show it
// https://github.com/locize/locize-editor
// eslint-disable-next-line @typescript-eslint/no-var-requires
const locizeEditor = require('locize-editor').default;
plugins.push(locizeEditor);
+ logger.info(`Using "locize-editor" plugin`);
}
const i18nInstance = i18next;
+ logger.info(`Using ${plugins.length} plugins in total`);
map(plugins, (plugin) => i18nInstance.use(plugin));
// @ts-ignore
i18nInstance.init({ // XXX See https://www.i18next.com/overview/configuration-options
- resources: defaultLocales,
+ resources: i18nTranslations,
// preload: ['fr', 'en'], // XXX Supposed to preload languages, doesn't work with Next
cleanCode: true, // language will be lowercased EN --> en while leaving full locales like en-US
- debug: process.env.APP_STAGE === 'development', // Only enable locally, too much noise otherwise
+ debug: process.env.APP_STAGE !== 'production' && isBrowser(), // Only enable on non-production stages and only on browser (too much noise on server) XXX Note that missing keys will be created on the server first, so you should enable server logs if you need to debug "saveMissing" feature
saveMissing: process.env.APP_STAGE === 'development', // Only save missing translations on development environment, to avoid outdated keys to be created from older staging deployments
saveMissingTo: defaultNamespace,
lng: lang, // XXX We don't use the built-in i18next-browser-languageDetector because we have our own way of detecting language, which must behave identically for both GraphCMS I18n and react-I18n
@@ -404,5 +404,25 @@ const i18nextLocize = (lang: string, defaultLocales: I18nextResources): i18n =>
return i18nInstance;
};
+/**
+ * Singleton helper
+ *
+ * Return the global globalI18nextInstance if set, or initialize it, if not.
+ * This prevents the client from reinitializing between page transitions, which caused infinite loop rendering.
+ *
+ * @param lang
+ * @param i18nTranslations
+ */
+const i18nextLocize = (lang: string, i18nTranslations: I18nextResources): i18n => {
+ // If the singleton isn't init yet, or if the requested language is different from the singleton, then we create a new instance
+ if (!globalI18nextInstance || lang !== get(globalI18nextInstance, 'language', lang)) {
+ globalI18nextInstance = createI18nextLocizeInstance(lang, i18nTranslations);
+
+ return globalI18nextInstance;
+ } else {
+ return globalI18nextInstance;
+ }
+};
+
export default i18nextLocize;
diff --git a/src/utils/array.test.ts b/src/utils/js/array.test.ts
similarity index 100%
rename from src/utils/array.test.ts
rename to src/utils/js/array.test.ts
diff --git a/src/utils/array.ts b/src/utils/js/array.ts
similarity index 100%
rename from src/utils/array.ts
rename to src/utils/js/array.ts
diff --git a/src/utils/date.ts b/src/utils/js/date.ts
similarity index 100%
rename from src/utils/date.ts
rename to src/utils/js/date.ts
diff --git a/src/utils/string.test.ts b/src/utils/js/string.test.ts
similarity index 95%
rename from src/utils/string.test.ts
rename to src/utils/js/string.test.ts
index 1ee268020..942f9251a 100644
--- a/src/utils/string.test.ts
+++ b/src/utils/js/string.test.ts
@@ -20,9 +20,9 @@ describe(`utils/string.ts`, () => {
expect(replaceAllOccurrences('example', null)).toBe('example');
});
test(`when the "variables" are of unexpected types`, async () => {
- // @ts-ignore
+ // @ts-expect-error
expect(replaceAllOccurrences('example', 1)).toBe('example');
- // @ts-ignore
+ // @ts-expect-error
expect(replaceAllOccurrences('example', 'test')).toBe('example');
expect(replaceAllOccurrences('example', ['test'])).toBe('example');
});
diff --git a/src/utils/string.ts b/src/utils/js/string.ts
similarity index 80%
rename from src/utils/string.ts
rename to src/utils/js/string.ts
index c265befcb..88ae1ea44 100644
--- a/src/utils/string.ts
+++ b/src/utils/js/string.ts
@@ -31,3 +31,18 @@ export const replaceAllOccurrences = (initialString: string, variables: object,
return initialString;
};
+
+/**
+ * Remove the trailing slash of a string
+ *
+ * Useful for urls, in particular
+ *
+ * @param string
+ */
+export const removeTrailingSlash = (string): string => {
+ if (string[string.length - 1] === '/') {
+ return string.slice(0, -1);
+ }
+
+ return string;
+};
diff --git a/src/utils/url.test.ts b/src/utils/js/url.test.ts
similarity index 100%
rename from src/utils/url.test.ts
rename to src/utils/js/url.test.ts
diff --git a/src/utils/url.ts b/src/utils/js/url.ts
similarity index 100%
rename from src/utils/url.ts
rename to src/utils/js/url.ts
diff --git a/src/utils/math/random.ts b/src/utils/math/random.ts
new file mode 100644
index 000000000..ffaa44834
--- /dev/null
+++ b/src/utils/math/random.ts
@@ -0,0 +1,23 @@
+/**
+ * Returns a random number between min (inclusive) and max (exclusive)
+ *
+ * @see https://stackoverflow.com/a/1527820/2391795
+ */
+export const getRandomArbitrary = (min, max): number => {
+ return Math.random() * (max - min) + min;
+};
+
+/**
+ * Returns a random integer between min (inclusive) and max (inclusive).
+ * The value is no lower than min (or the next integer greater than min
+ * if min isn't an integer) and no greater than max (or the next integer
+ * lower than max if max isn't an integer).
+ * Using Math.round() will give you a non-uniform distribution!
+ *
+ * @see https://stackoverflow.com/a/1527820/2391795
+ */
+export const getRandomInt = (min, max): number => {
+ min = Math.ceil(min);
+ max = Math.floor(max);
+ return Math.floor(Math.random() * (max - min + 1)) + min;
+};
diff --git a/src/utils/monitoring/sentry.ts b/src/utils/monitoring/sentry.ts
new file mode 100644
index 000000000..ee6b5bb2c
--- /dev/null
+++ b/src/utils/monitoring/sentry.ts
@@ -0,0 +1,54 @@
+import { NowRequest } from '@now/node/dist';
+import * as Sentry from '@sentry/node';
+import { isBrowser } from '@unly/utils';
+import get from 'lodash.get';
+
+// Don't initialise Sentry if SENTRY_DSN isn't defined (won't crash the app, usage of the Sentry lib is resilient to this and doesn't cause any issue)
+if (process.env.SENTRY_DSN) {
+ /**
+ * Initialize Sentry and export it.
+ *
+ * Helper to avoid duplicating the init() call in every /pages/api file.
+ * Also used in pages/_app for the client side, which automatically applies it for all frontend pages.
+ */
+ Sentry.init({
+ dsn: process.env.SENTRY_DSN,
+ enabled: process.env.NODE_ENV !== 'test',
+ environment: process.env.APP_STAGE,
+ release: process.env.APP_VERSION_RELEASE,
+ });
+
+ if (!process.env.SENTRY_DSN && process.env.NODE_ENV !== 'test') {
+ // eslint-disable-next-line no-console
+ console.error('Sentry DSN not defined');
+ }
+
+ // Scope configured by default, subsequent calls to "configureScope" will add additional data
+ Sentry.configureScope((scope) => { // See https://www.npmjs.com/package/@sentry/node
+ scope.setTag('appVersion', process.env.APP_VERSION);
+ scope.setTag('nodejs', process.version);
+ scope.setTag('nodejsAWS', process.env.AWS_EXECUTION_ENV || null); // Optional - Available on production environment only
+ scope.setTag('memory', process.env.AWS_LAMBDA_FUNCTION_MEMORY_SIZE || null); // Optional - Available on production environment only
+ scope.setTag('runtimeEngine', isBrowser() ? 'browser' : 'server');
+ scope.setTag('buildTime', process.env.BUILD_TIME);
+ });
+}
+
+/**
+ * Configure the Sentry scope by extracting useful tags and context from the given request.
+ *
+ * @param req
+ */
+export const configureReq = (req: NowRequest): void => {
+ Sentry.configureScope((scope) => {
+ scope.setTag('host', get(req, 'headers.host'));
+ scope.setTag('url', get(req, 'url'));
+ scope.setTag('method', get(req, 'method'));
+ scope.setContext('query', get(req, 'query'));
+ scope.setContext('cookies', get(req, 'cookies'));
+ scope.setContext('body', get(req, 'body'));
+ scope.setContext('headers', get(req, 'headers'));
+ });
+};
+
+export default Sentry;
diff --git a/src/utils/nextjs/SSG.ts b/src/utils/nextjs/SSG.ts
new file mode 100644
index 000000000..7dc513b5e
--- /dev/null
+++ b/src/utils/nextjs/SSG.ts
@@ -0,0 +1,124 @@
+import { ApolloQueryResult } from 'apollo-client';
+import map from 'lodash.map';
+import { GetStaticPaths, GetStaticProps } from 'next';
+import { LAYOUT_QUERY } from '../../gql/common/layoutQuery';
+
+import { supportedLocales } from '../../i18nConfig';
+import { Customer } from '../../types/data/Customer';
+import { I18nLocale } from '../../types/i18n/I18nLocale';
+import { StaticParams } from '../../types/nextjs/StaticParams';
+import { StaticPath } from '../../types/nextjs/StaticPath';
+import { StaticPathsOutput } from '../../types/nextjs/StaticPathsOutput';
+import { SSGPageProps } from '../../types/pageProps/SSGPageProps';
+import { StaticPropsInput } from '../../types/nextjs/StaticPropsInput';
+import { StaticPropsOutput } from '../../types/nextjs/StaticPropsOutput';
+import { prepareGraphCMSLocaleHeader } from '../gql/graphcms';
+import { createApolloClient } from '../gql/graphql';
+import { DEFAULT_LOCALE, resolveFallbackLanguage } from '../i18n/i18n';
+import { fetchTranslations, I18nextResources } from '../i18n/i18nextLocize';
+
+/**
+ * Only executed on the server side at build time.
+ * Computes all static props that should be available for all SSG pages
+ *
+ * Note that when a page uses "getStaticProps", then "_app:getInitialProps" is executed (if defined) but not actually used by the page,
+ * only the results from getStaticProps are actually injected into the page (as "SSGPageProps").
+ *
+ * Meant to avoid code duplication
+ * Can be overridden for per-page customisation (e.g: deepmerge)
+ *
+ * @param props
+ * @return Props (as "SSGPageProps") that will be passed to the Page component, as props
+ *
+ * @see https://github.com/zeit/next.js/discussions/10949#discussioncomment-6884
+ * @see https://nextjs.org/docs/basic-features/data-fetching#getstaticprops-static-generation
+ */
+export const getCommonStaticProps: GetStaticProps = async (props: StaticPropsInput): Promise => {
+ const customerRef: string = process.env.CUSTOMER_REF;
+ const hasLocaleFromUrl = !!props?.params?.locale;
+ const locale: string = hasLocaleFromUrl ? props?.params?.locale : DEFAULT_LOCALE; // If the locale isn't found (e.g: 404 page)
+ const lang: string = locale.split('-')?.[0];
+ const bestCountryCodes: string[] = [lang, resolveFallbackLanguage(lang)];
+ const gcmsLocales: string = prepareGraphCMSLocaleHeader(bestCountryCodes);
+ const i18nTranslations: I18nextResources = await fetchTranslations(lang); // Pre-fetches translations from Locize API
+ const apolloClient = createApolloClient();
+ const variables = {
+ customerRef,
+ };
+ const queryOptions = {
+ displayName: 'LAYOUT_QUERY',
+ query: LAYOUT_QUERY,
+ variables,
+ context: {
+ headers: {
+ 'gcms-locale': gcmsLocales,
+ },
+ },
+ };
+
+ const {
+ data,
+ errors,
+ loading,
+ networkStatus,
+ stale,
+ }: ApolloQueryResult<{
+ customer: Customer;
+ }> = await apolloClient.query(queryOptions);
+
+ if (errors) {
+ console.error(errors);
+ throw new Error('Errors were detected in GraphQL query.');
+ }
+
+ const {
+ customer,
+ } = data || {}; // XXX Use empty object as fallback, to avoid app crash when destructuring, if no data is returned
+
+ return {
+ // Props returned here will be available as page properties (pageProps)
+ props: {
+ apolloState: apolloClient.cache.extract(),
+ bestCountryCodes,
+ customer,
+ customerRef,
+ i18nTranslations,
+ gcmsLocales,
+ hasLocaleFromUrl,
+ isReadyToRender: true,
+ isStaticRendering: true,
+ lang,
+ locale,
+ },
+ // unstable_revalidate: false,
+ };
+};
+
+/**
+ * Only executed on the server side at build time.
+ * Computes all static paths that should be available for all SSG pages
+ * Necessary when a page has dynamic routes and uses "getStaticProps", in order to build the HTML pages
+ *
+ * You can use "fallback" option to avoid building all page variants and allow runtime fallback
+ *
+ * Meant to avoid code duplication
+ * Can be overridden for per-page customisation (e.g: deepmerge)
+ *
+ * @return
+ *
+ * @see https://nextjs.org/docs/basic-features/data-fetching#getstaticpaths-static-generation
+ */
+export const getCommonStaticPaths: GetStaticPaths = async (): Promise => {
+ const paths: StaticPath[] = map(supportedLocales, (supportedLocale: I18nLocale): StaticPath => {
+ return {
+ params: {
+ locale: supportedLocale.name,
+ },
+ };
+ });
+
+ return {
+ fallback: false,
+ paths,
+ };
+};
diff --git a/src/utils/nextjs/SSR.ts b/src/utils/nextjs/SSR.ts
new file mode 100644
index 000000000..8fa4b8858
--- /dev/null
+++ b/src/utils/nextjs/SSR.ts
@@ -0,0 +1,98 @@
+import { NormalizedCacheObject } from 'apollo-cache-inmemory';
+import { ApolloClient } from 'apollo-client';
+import { IncomingMessage } from 'http';
+import get from 'lodash.get';
+import NextCookies from 'next-cookies';
+import { LAYOUT_QUERY } from '../../gql/common/layoutQuery';
+import { ApolloQueryOptions } from '../../types/gql/ApolloQueryOptions';
+import { Cookies } from '../../types/Cookies';
+import { GetServerSidePropsContext } from '../../types/nextjs/GetServerSidePropsContext';
+import { PublicHeaders } from '../../types/pageProps/PublicHeaders';
+import { SSRPageProps } from '../../types/pageProps/SSRPageProps';
+import { UserSemiPersistentSession } from '../../types/UserSemiPersistentSession';
+import { prepareGraphCMSLocaleHeader } from '../gql/graphcms';
+import { createApolloClient } from '../gql/graphql';
+import { DEFAULT_LOCALE, resolveFallbackLanguage } from '../i18n/i18n';
+import { fetchTranslations, I18nextResources } from '../i18n/i18nextLocize';
+import UniversalCookiesManager from '../cookies/UniversalCookiesManager';
+
+/**
+ * getCommonServerSideProps returns only part of the props expected in SSRPageProps
+ * To avoid TS issue, we omit those that we don't return, and add those necessary to the getServerSideProps function
+ */
+export type GetCommonServerSidePropsResults = Omit & {
+ apolloClient: ApolloClient;
+ layoutQueryOptions: ApolloQueryOptions;
+ headers: PublicHeaders;
+}
+
+/**
+ * Only executed on the server side, for every request.
+ * Computes some dynamic props that should be available for all SSR pages that use getServerSideProps
+ *
+ * Because the exact GQL query will depend on the consumer (AKA "caller"), this helper doesn't run any query by itself, but rather return all necessary props to allow the consumer to perform its own queries
+ * This improves performances, by only running one GQL query instead of many (consumer's choice)
+ *
+ * Meant to avoid code duplication
+ *
+ * @param context
+ *
+ * @see https://nextjs.org/docs/basic-features/data-fetching#getserversideprops-server-side-rendering
+ */
+export const getCommonServerSideProps = async (context: GetServerSidePropsContext): Promise => {
+ const {
+ query,
+ params,
+ req,
+ res,
+ } = context;
+ const customerRef: string = process.env.CUSTOMER_REF;
+ const readonlyCookies: Cookies = NextCookies(context); // Parses Next.js cookies in a universal way (server + client)
+ const cookiesManager: UniversalCookiesManager = new UniversalCookiesManager(req, res); // Cannot be forwarded as pageProps, because contains circular refs
+ const userSession: UserSemiPersistentSession = cookiesManager.getUserData();
+ const { headers }: IncomingMessage = req;
+ const publicHeaders: PublicHeaders = {
+ 'accept-language': get(headers, 'accept-language'),
+ 'user-agent': get(headers, 'user-agent'),
+ 'host': get(headers, 'host'),
+ };
+ const hasLocaleFromUrl = !!query?.locale;
+ const locale: string = hasLocaleFromUrl ? query?.locale as string : DEFAULT_LOCALE; // If the locale isn't found (e.g: 404 page)
+ const lang: string = locale.split('-')?.[0];
+ const bestCountryCodes: string[] = [lang, resolveFallbackLanguage(lang)];
+ const gcmsLocales: string = prepareGraphCMSLocaleHeader(bestCountryCodes);
+ const i18nTranslations: I18nextResources = await fetchTranslations(lang); // Pre-fetches translations from Locize API
+ const apolloClient = createApolloClient();
+ const variables = {
+ customerRef,
+ };
+ const layoutQueryOptions: ApolloQueryOptions = {
+ displayName: 'LAYOUT_QUERY',
+ query: LAYOUT_QUERY,
+ variables,
+ context: {
+ headers: {
+ 'gcms-locale': gcmsLocales,
+ },
+ },
+ };
+
+ // Most props returned here will be necessary for the app to work properly (see "SSRPageProps")
+ // Some props are meant to be helpful to the consumer and won't be passed down to the _app.render (e.g: apolloClient, layoutQueryOptions)
+ return {
+ apolloClient,
+ bestCountryCodes,
+ customerRef,
+ i18nTranslations,
+ headers: publicHeaders,
+ gcmsLocales,
+ hasLocaleFromUrl,
+ isReadyToRender: true,
+ isServerRendering: true,
+ lang,
+ locale,
+ layoutQueryOptions,
+ readonlyCookies,
+ userSession,
+ };
+};
diff --git a/src/utils/sentry.ts b/src/utils/sentry.ts
deleted file mode 100644
index 949922519..000000000
--- a/src/utils/sentry.ts
+++ /dev/null
@@ -1,50 +0,0 @@
-import { NowRequest } from '@now/node/dist';
-import * as Sentry from '@sentry/node';
-import get from 'lodash.get';
-import { isBrowser } from '@unly/utils';
-
-/**
- * Initialize Sentry and export it.
- *
- * Helper to avoid duplicating the init() call in every /pages/api file.
- * Also used in pages/_app for the client side, which automatically applies it for all frontend pages.
- */
-Sentry.init({
- dsn: process.env.SENTRY_DSN,
- enabled: process.env.NODE_ENV !== 'test',
- environment: process.env.APP_STAGE,
- release: process.env.APP_VERSION_RELEASE,
-});
-
-if (!process.env.SENTRY_DSN && process.env.NODE_ENV !== 'test') {
- // eslint-disable-next-line no-console
- console.error('Sentry DSN not defined');
-}
-
-// Scope configured by default, subsequent calls to "configureScope" will add additional data
-Sentry.configureScope((scope) => { // See https://www.npmjs.com/package/@sentry/node
- scope.setTag('nodejs', process.version);
- scope.setTag('nodejsAWS', process.env.AWS_EXECUTION_ENV || null); // Optional - Available on production environment only
- scope.setTag('memory', process.env.AWS_LAMBDA_FUNCTION_MEMORY_SIZE || null); // Optional - Available on production environment only
- scope.setTag('runtimeEngine', isBrowser() ? 'browser' : 'server');
- scope.setTag('buildTime', process.env.BUILD_TIME);
-});
-
-/**
- * Configure the Sentry scope by extracting useful tags and context from the given request.
- *
- * @param req
- */
-export const configureReq = (req: NowRequest): void => {
- Sentry.configureScope((scope) => {
- scope.setTag('host', get(req, 'headers.host'));
- scope.setTag('url', get(req, 'url'));
- scope.setTag('method', get(req, 'method'));
- scope.setContext('query', get(req, 'query'));
- scope.setContext('cookies', get(req, 'cookies'));
- scope.setContext('body', get(req, 'body'));
- scope.setContext('headers', get(req, 'headers'));
- });
-};
-
-export default Sentry;
diff --git a/src/utils/svgTemplate.ts b/src/utils/svg/svgTemplate.ts
similarity index 100%
rename from src/utils/svgTemplate.ts
rename to src/utils/svg/svgTemplate.ts
diff --git a/src/utils/tests-mocks.ts b/src/utils/testing/tests-mocks.ts
similarity index 95%
rename from src/utils/tests-mocks.ts
rename to src/utils/testing/tests-mocks.ts
index f93d23ea2..664ec8ec1 100644
--- a/src/utils/tests-mocks.ts
+++ b/src/utils/testing/tests-mocks.ts
@@ -2,7 +2,7 @@ import { NowRequest, NowResponse } from '@now/node';
export const mockRequest = (sessionData, body): NowRequest => ({
// eslint-disable-next-line @typescript-eslint/ban-ts-ignore
- // @ts-ignore
+ // @ts-expect-error
session: { data: sessionData },
body,
});
diff --git a/src/utils/time/timeDifference.ts b/src/utils/time/timeDifference.ts
new file mode 100644
index 000000000..cbfff899f
--- /dev/null
+++ b/src/utils/time/timeDifference.ts
@@ -0,0 +1,34 @@
+/**
+ * Displays the difference (as en English sentence) between two Date objects
+ *
+ * @param current
+ * @param previous
+ *
+ * @see https://stackoverflow.com/a/6109105/2391795
+ */
+const timeDifference = (current: Date, previous: Date): string => {
+ const msPerMinute = 60 * 1000;
+ const msPerHour = msPerMinute * 60;
+ const msPerDay = msPerHour * 24;
+ const msPerMonth = msPerDay * 30;
+ const msPerYear = msPerDay * 365;
+
+ // @ts-ignore Don't know if there is a proper way to do that, shouldn't it be allowed?
+ const elapsed = current - previous;
+
+ if (elapsed < msPerMinute) {
+ return Math.floor(elapsed / 1000) + ' seconds ago';
+ } else if (elapsed < msPerHour) {
+ return Math.floor(elapsed / msPerMinute) + ' minutes ago';
+ } else if (elapsed < msPerDay) {
+ return Math.floor(elapsed / msPerHour) + ' hours ago';
+ } else if (elapsed < msPerMonth) {
+ return 'approximately ' + Math.floor(elapsed / msPerDay) + ' days ago';
+ } else if (elapsed < msPerYear) {
+ return 'approximately ' + Math.floor(elapsed / msPerMonth) + ' months ago';
+ } else {
+ return 'approximately ' + Math.floor(elapsed / msPerYear) + ' years ago';
+ }
+};
+
+export default timeDifference;
diff --git a/src/utils/timers/waitFor.ts b/src/utils/timers/waitFor.ts
new file mode 100644
index 000000000..572a9fe8a
--- /dev/null
+++ b/src/utils/timers/waitFor.ts
@@ -0,0 +1,3 @@
+const waitFor = (ms: number): Promise => new Promise((res) => setTimeout(res, ms));
+
+export default waitFor;
diff --git a/tsconfig.json b/tsconfig.json
index 31fcf53b2..fa24457cc 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -1,6 +1,6 @@
{
"compilerOptions": {
- "allowJs": true,
+ "allowJs": false,
"allowSyntheticDefaultImports": true,
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true,
@@ -25,7 +25,13 @@
"target": "ES2019"
},
"exclude": [
- "node_modules"
+ ".github",
+ ".next",
+ "_site",
+ "coverage",
+ "cypress",
+ "node_modules",
+ "public"
],
"include": [
"next-env.d.ts",
diff --git a/yarn.lock b/yarn.lock
index 97c4dac67..357bed655 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -15,45 +15,47 @@
resolved "https://registry.yarnpkg.com/@amplitude/ua-parser-js/-/ua-parser-js-0.7.20.tgz#15652f8cc4fee72d962a5f2101cfde6f3c8e87b8"
integrity sha512-bmW++BLt1Hg+4HCExLXP+0Jhgy2eTsEevqkVc5o4yYbgwdP/gV3gEQXzyVrMVlWWNLgph/tFIkf5PVlSpCELEg==
-"@ampproject/toolbox-core@^2.0.0", "@ampproject/toolbox-core@^2.2.0":
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/@ampproject/toolbox-core/-/toolbox-core-2.2.0.tgz#3878c5fbdd2acdd865f070ded43ee84652a7a16b"
- integrity sha512-g0NnZZqPJttIcdplIpiMDmOLewwvCWPSnFKvNdyYXN7vknRvR4krpV2qveuVgjnA+dSlDmtzuFapFCaWh4V7FQ==
+"@ampproject/toolbox-core@^2.4.0-alpha.1":
+ version "2.4.0-alpha.1"
+ resolved "https://registry.yarnpkg.com/@ampproject/toolbox-core/-/toolbox-core-2.4.0-alpha.1.tgz#2e073fafedf46ef4f85326162e5b6c0080076142"
+ integrity sha512-QEIIXBdpevMJSan5JWJ5qLy3/R+V1cngWchKdenmkRzvoDhWWcZyCnUz5+xKhetD9ilPaM71bSJ0dF78OrYBIQ==
dependencies:
cross-fetch "3.0.4"
-"@ampproject/toolbox-optimizer@2.0.1":
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/@ampproject/toolbox-optimizer/-/toolbox-optimizer-2.0.1.tgz#943681faf24443044aa66f0b55eefb13cdcc068c"
- integrity sha512-zroXqrV7mY77+/6hV7kaaWxp4LA85V0B/2vg7WdF+FrwiO9Wior/lIW8UbpRek6INjw0VOp1ED73MmGJkwaDhA==
- dependencies:
- "@ampproject/toolbox-core" "^2.0.0"
- "@ampproject/toolbox-runtime-version" "^2.0.0"
- "@ampproject/toolbox-script-csp" "^2.0.0"
- "@ampproject/toolbox-validator-rules" "^2.0.0"
- css "2.2.4"
+"@ampproject/toolbox-optimizer@2.4.0":
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/@ampproject/toolbox-optimizer/-/toolbox-optimizer-2.4.0.tgz#16bde73913f8b58a9bf617d37cdc1f21a1222f38"
+ integrity sha512-Bmb+eMF9/VB3H0qPdZy0V5yPSkWe5RwuGbXiMxzqYdJgmMat+NL75EtozQnlpa0uBlESnOGe7bMojm/SA1ImrA==
+ dependencies:
+ "@ampproject/toolbox-core" "^2.4.0-alpha.1"
+ "@ampproject/toolbox-runtime-version" "^2.4.0-alpha.1"
+ "@ampproject/toolbox-script-csp" "^2.3.0"
+ "@ampproject/toolbox-validator-rules" "^2.3.0"
+ cssnano "4.1.10"
domhandler "3.0.0"
- domutils "2.0.0"
+ domutils "2.1.0"
htmlparser2 "4.1.0"
+ lru-cache "5.1.1"
normalize-html-whitespace "1.0.0"
- terser "4.6.7"
+ postcss-safe-parser "4.0.2"
+ terser "4.6.13"
-"@ampproject/toolbox-runtime-version@^2.0.0":
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/@ampproject/toolbox-runtime-version/-/toolbox-runtime-version-2.2.0.tgz#e90ae9e97081c9c5362262f9ba093ac029837a8c"
- integrity sha512-kQRLMreDp1Wp9DotQzJ4k/ZKK6ZxtI6ce2JIvyH8Xfi6H4BQNu0Ht0agMgm51/OsMKyHD+dDIGEHKaKWIOiPLQ==
+"@ampproject/toolbox-runtime-version@^2.4.0-alpha.1":
+ version "2.4.0-alpha.1"
+ resolved "https://registry.yarnpkg.com/@ampproject/toolbox-runtime-version/-/toolbox-runtime-version-2.4.0-alpha.1.tgz#448c7206d9136e242ac99810141b6bbae6b1674f"
+ integrity sha512-iPOlATHFcaLyiuVdzCKiM4DamTvPpysHc5eW2oYoSMXsxOsAdp4LNyt05biFRJA/7za5+b9P15blPtOucj2WyQ==
dependencies:
- "@ampproject/toolbox-core" "^2.2.0"
+ "@ampproject/toolbox-core" "^2.4.0-alpha.1"
-"@ampproject/toolbox-script-csp@^2.0.0":
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/@ampproject/toolbox-script-csp/-/toolbox-script-csp-2.2.0.tgz#7bc33985e94a40acdbddb5695dc8d85f11066803"
- integrity sha512-Z5AzbWFTlTMJg0z1/frMDmW6Gj+EbOw0dVdFYfdma4AJq4rNoxCQMVgVOjl4ryWNouJvK1RUA8o7sY1WmMx6eg==
+"@ampproject/toolbox-script-csp@^2.3.0":
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/@ampproject/toolbox-script-csp/-/toolbox-script-csp-2.3.0.tgz#374cd0bf69bfdd0f1784064d0de69162722c89af"
+ integrity sha512-Qba53ohvCH79sYl5O8K5GMSo/372OjuyxNc+XySG26sAsG26WpBKJEE0HTr8rsa//CD3Fc92FieT1gK5U/jK4Q==
-"@ampproject/toolbox-validator-rules@^2.0.0":
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/@ampproject/toolbox-validator-rules/-/toolbox-validator-rules-2.2.0.tgz#830a2bc22a09dc17ff37835991858902d04cfe19"
- integrity sha512-R5VkDmhmNatq9SuuHaeA2Uno4O5K4YSh11o6A/5jJZ2EjilAcpuAKvZlRp9tjucPWHi+/z/n5PCJ8YUxzCzWaQ==
+"@ampproject/toolbox-validator-rules@^2.3.0":
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/@ampproject/toolbox-validator-rules/-/toolbox-validator-rules-2.3.0.tgz#047d8a8106ba777f1df308c19f1c1c41ffea4054"
+ integrity sha512-S10YIyOKettoRDWoyRymRyjzWZD4/qW7YfHNhHAS13QVneabRcU5MF7vEwkG6dHWx/UdufT5GbqYnvpQRMNt3Q==
dependencies:
cross-fetch "3.0.4"
@@ -65,66 +67,75 @@
ts-invariant "^0.4.4"
tslib "^1.10.0"
-"@apollo/react-components@^3.1.4":
- version "3.1.4"
- resolved "https://registry.yarnpkg.com/@apollo/react-components/-/react-components-3.1.4.tgz#29936a4862aee1c8fe5f25549509fecd45d2f40f"
- integrity sha512-dLZFeJ+x48nPuo2BjFjfbl8afQyazoqU8xBTidMnYy99w9DcTHtnURTw18o2dT5jkfuIJEWjbTfxyjJnHk+clw==
+"@apollo/react-components@^3.1.5":
+ version "3.1.5"
+ resolved "https://registry.yarnpkg.com/@apollo/react-components/-/react-components-3.1.5.tgz#040d2f35ce4947747efe16f76d59dcbd797ffdaf"
+ integrity sha512-c82VyUuE9VBnJB7bnX+3dmwpIPMhyjMwyoSLyQWPHxz8jK4ak30XszJtqFf4eC4hwvvLYa+Ou6X73Q8V8e2/jg==
dependencies:
"@apollo/react-common" "^3.1.4"
- "@apollo/react-hooks" "^3.1.4"
+ "@apollo/react-hooks" "^3.1.5"
prop-types "^15.7.2"
ts-invariant "^0.4.4"
tslib "^1.10.0"
-"@apollo/react-hoc@^3.1.4":
- version "3.1.4"
- resolved "https://registry.yarnpkg.com/@apollo/react-hoc/-/react-hoc-3.1.4.tgz#11accab356e15308f4721c670c7014aaeec7b3c0"
- integrity sha512-dCzVM2/JzEWqwTocwozb9/msOgVY5EG7gh593IIXYcBfHcthSK21nIsbH/uDgwCcLSIZE2EOC3n0aKgDuoMtjA==
+"@apollo/react-hoc@^3.1.5":
+ version "3.1.5"
+ resolved "https://registry.yarnpkg.com/@apollo/react-hoc/-/react-hoc-3.1.5.tgz#6552d2fb4aafc59fdc8f4e353358b98b89cfab6f"
+ integrity sha512-jlZ2pvEnRevLa54H563BU0/xrYSgWQ72GksarxUzCHQW85nmn9wQln0kLBX7Ua7SBt9WgiuYQXQVechaaCulfQ==
dependencies:
"@apollo/react-common" "^3.1.4"
- "@apollo/react-components" "^3.1.4"
+ "@apollo/react-components" "^3.1.5"
hoist-non-react-statics "^3.3.0"
ts-invariant "^0.4.4"
tslib "^1.10.0"
-"@apollo/react-hooks@^3.1.4":
- version "3.1.4"
- resolved "https://registry.yarnpkg.com/@apollo/react-hooks/-/react-hooks-3.1.4.tgz#2d966ed4fdf01729113850a72698faee490fd429"
- integrity sha512-yamD5a1Gu9fGQjZYEQn2nSG+BRyde4dy055agtYOvP/5/njJBSJ25tRFbjxKf7+YW9fsu2Xguib3anoQTuesNg==
+"@apollo/react-hooks@3.1.5", "@apollo/react-hooks@^3.1.5":
+ version "3.1.5"
+ resolved "https://registry.yarnpkg.com/@apollo/react-hooks/-/react-hooks-3.1.5.tgz#7e710be52461255ae7fc0b3b9c2ece64299c10e6"
+ integrity sha512-y0CJ393DLxIIkksRup4nt+vSjxalbZBXnnXxYbviq/woj+zKa431zy0yT4LqyRKpFy9ahMIwxBnBwfwIoupqLQ==
dependencies:
"@apollo/react-common" "^3.1.4"
"@wry/equality" "^0.1.9"
ts-invariant "^0.4.4"
tslib "^1.10.0"
-"@apollo/react-ssr@3.1.4", "@apollo/react-ssr@^3.1.4":
- version "3.1.4"
- resolved "https://registry.yarnpkg.com/@apollo/react-ssr/-/react-ssr-3.1.4.tgz#b2b4e29c480761ff749a53d19ab257037bef3648"
- integrity sha512-c5KBD75RvSJqzpXpYngcOwLIbc7CAXhuMHrAH0J6+p4hfN+ZgqKdAOq0h143N1LfreUD4Is1PKXx4k2nPwifMw==
+"@apollo/react-ssr@3.1.5", "@apollo/react-ssr@^3.1.5":
+ version "3.1.5"
+ resolved "https://registry.yarnpkg.com/@apollo/react-ssr/-/react-ssr-3.1.5.tgz#53703cd493afcde567acc6d5512cab03dafce6de"
+ integrity sha512-wuLPkKlctNn3u8EU8rlECyktpOUCeekFfb0KhIKknpGY6Lza2Qu0bThx7D9MIbVEzhKadNNrzLcpk0Y8/5UuWg==
dependencies:
"@apollo/react-common" "^3.1.4"
- "@apollo/react-hooks" "^3.1.4"
+ "@apollo/react-hooks" "^3.1.5"
tslib "^1.10.0"
-"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.5.5", "@babel/code-frame@^7.8.3":
+"@babel/code-frame@7.8.3", "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.5.5", "@babel/code-frame@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e"
integrity sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==
dependencies:
"@babel/highlight" "^7.8.3"
-"@babel/core@7.7.2":
- version "7.7.2"
- resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.7.2.tgz#ea5b99693bcfc058116f42fa1dd54da412b29d91"
- integrity sha512-eeD7VEZKfhK1KUXGiyPFettgF3m513f8FoBSWiQ1xTvl1RAopLs42Wp9+Ze911I6H0N9lNqJMDgoZT7gHsipeQ==
+"@babel/compat-data@^7.9.6":
+ version "7.9.6"
+ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.9.6.tgz#3f604c40e420131affe6f2c8052e9a275ae2049b"
+ integrity sha512-5QPTrNen2bm7RBc7dsOmcA5hbrS4O2Vhmk5XOL4zWW/zD/hV0iinpefDlkm+tBBy8kDtFaaeEvmAqt+nURAV2g==
+ dependencies:
+ browserslist "^4.11.1"
+ invariant "^2.2.4"
+ semver "^5.5.0"
+
+"@babel/core@7.7.7":
+ version "7.7.7"
+ resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.7.7.tgz#ee155d2e12300bcc0cff6a8ad46f2af5063803e9"
+ integrity sha512-jlSjuj/7z138NLZALxVgrx13AOtqip42ATZP7+kYl53GvDV6+4dCek1mVUo8z8c8Xnw/mx2q3d9HWh3griuesQ==
dependencies:
"@babel/code-frame" "^7.5.5"
- "@babel/generator" "^7.7.2"
- "@babel/helpers" "^7.7.0"
- "@babel/parser" "^7.7.2"
- "@babel/template" "^7.7.0"
- "@babel/traverse" "^7.7.2"
- "@babel/types" "^7.7.2"
+ "@babel/generator" "^7.7.7"
+ "@babel/helpers" "^7.7.4"
+ "@babel/parser" "^7.7.7"
+ "@babel/template" "^7.7.4"
+ "@babel/traverse" "^7.7.4"
+ "@babel/types" "^7.7.4"
convert-source-map "^1.7.0"
debug "^4.1.0"
json5 "^2.1.0"
@@ -154,7 +165,17 @@
semver "^5.4.1"
source-map "^0.5.0"
-"@babel/generator@^7.7.2", "@babel/generator@^7.8.4":
+"@babel/generator@^7.7.7", "@babel/generator@^7.9.6":
+ version "7.9.6"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.9.6.tgz#5408c82ac5de98cda0d77d8124e99fa1f2170a43"
+ integrity sha512-+htwWKJbH2bL72HRluF8zumBxzuX0ZZUFl3JLNyoUjM/Ho8wnVpPXM6aUz8cfKDqQ/h7zHqKt4xzJteUosckqQ==
+ dependencies:
+ "@babel/types" "^7.9.6"
+ jsesc "^2.5.1"
+ lodash "^4.17.13"
+ source-map "^0.5.0"
+
+"@babel/generator@^7.8.4":
version "7.8.4"
resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.8.4.tgz#35bbc74486956fe4251829f9f6c48330e8d0985e"
integrity sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==
@@ -164,7 +185,7 @@
lodash "^4.17.13"
source-map "^0.5.0"
-"@babel/helper-annotate-as-pure@^7.8.3":
+"@babel/helper-annotate-as-pure@^7.0.0", "@babel/helper-annotate-as-pure@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz#60bc0bc657f63a0924ff9a4b4a0b24a13cf4deee"
integrity sha512-6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw==
@@ -179,24 +200,35 @@
"@babel/helper-explode-assignable-expression" "^7.8.3"
"@babel/types" "^7.8.3"
-"@babel/helper-builder-react-jsx@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.8.3.tgz#dee98d7d79cc1f003d80b76fe01c7f8945665ff6"
- integrity sha512-JT8mfnpTkKNCboTqZsQTdGo3l3Ik3l7QIt9hh0O9DYiwVel37VoJpILKM4YFbP2euF32nkQSb+F9cUk9b7DDXQ==
+"@babel/helper-builder-react-jsx-experimental@^7.9.0":
+ version "7.9.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.9.5.tgz#0b4b3e04e6123f03b404ca4dfd6528fe6bb92fe3"
+ integrity sha512-HAagjAC93tk748jcXpZ7oYRZH485RCq/+yEv9SIWezHRPv9moZArTnkUNciUNzvwHUABmiWKlcxJvMcu59UwTg==
dependencies:
- "@babel/types" "^7.8.3"
- esutils "^2.0.0"
+ "@babel/helper-annotate-as-pure" "^7.8.3"
+ "@babel/helper-module-imports" "^7.8.3"
+ "@babel/types" "^7.9.5"
-"@babel/helper-call-delegate@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.8.3.tgz#de82619898aa605d409c42be6ffb8d7204579692"
- integrity sha512-6Q05px0Eb+N4/GTyKPPvnkig7Lylw+QzihMpws9iiZQv7ZImf84ZsZpQH7QoWN4n4tm81SnSzPgHw2qtO0Zf3A==
+"@babel/helper-builder-react-jsx@^7.9.0":
+ version "7.9.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.9.0.tgz#16bf391990b57732700a3278d4d9a81231ea8d32"
+ integrity sha512-weiIo4gaoGgnhff54GQ3P5wsUQmnSwpkvU0r6ZHq6TzoSzKy4JxHEgnxNytaKbov2a9z/CVNyzliuCOUPEX3Jw==
dependencies:
- "@babel/helper-hoist-variables" "^7.8.3"
- "@babel/traverse" "^7.8.3"
- "@babel/types" "^7.8.3"
+ "@babel/helper-annotate-as-pure" "^7.8.3"
+ "@babel/types" "^7.9.0"
+
+"@babel/helper-compilation-targets@^7.9.6":
+ version "7.9.6"
+ resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.9.6.tgz#1e05b7ccc9d38d2f8b40b458b380a04dcfadd38a"
+ integrity sha512-x2Nvu0igO0ejXzx09B/1fGBxY9NXQlBW2kZsSxCJft+KHN8t9XWzIvFxtPHnBOAXpVsdxZKZFbRUC8TsNKajMw==
+ dependencies:
+ "@babel/compat-data" "^7.9.6"
+ browserslist "^4.11.1"
+ invariant "^2.2.4"
+ levenary "^1.1.1"
+ semver "^5.5.0"
-"@babel/helper-create-class-features-plugin@^7.7.0", "@babel/helper-create-class-features-plugin@^7.8.3":
+"@babel/helper-create-class-features-plugin@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.3.tgz#5b94be88c255f140fd2c10dd151e7f98f4bff397"
integrity sha512-qmp4pD7zeTxsv0JNecSBsEmG1ei2MqwJq4YQcK3ZWm/0t07QstWfvuV/vm3Qt5xNMFETn2SZqpMx2MQzbtq+KA==
@@ -208,6 +240,18 @@
"@babel/helper-replace-supers" "^7.8.3"
"@babel/helper-split-export-declaration" "^7.8.3"
+"@babel/helper-create-class-features-plugin@^7.9.6":
+ version "7.9.6"
+ resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.9.6.tgz#965c8b0a9f051801fd9d3b372ca0ccf200a90897"
+ integrity sha512-6N9IeuyHvMBRyjNYOMJHrhwtu4WJMrYf8hVbEHD3pbbbmNOk1kmXSQs7bA4dYDUaIx4ZEzdnvo6NwC3WHd/Qow==
+ dependencies:
+ "@babel/helper-function-name" "^7.9.5"
+ "@babel/helper-member-expression-to-functions" "^7.8.3"
+ "@babel/helper-optimise-call-expression" "^7.8.3"
+ "@babel/helper-plugin-utils" "^7.8.3"
+ "@babel/helper-replace-supers" "^7.9.6"
+ "@babel/helper-split-export-declaration" "^7.8.3"
+
"@babel/helper-create-regexp-features-plugin@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.3.tgz#c774268c95ec07ee92476a3862b75cc2839beb79"
@@ -216,6 +260,15 @@
"@babel/helper-regex" "^7.8.3"
regexpu-core "^4.6.0"
+"@babel/helper-create-regexp-features-plugin@^7.8.8":
+ version "7.8.8"
+ resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.8.tgz#5d84180b588f560b7864efaeea89243e58312087"
+ integrity sha512-LYVPdwkrQEiX9+1R29Ld/wTrmQu1SSKYnuOk3g0CkcZMA1p0gsNxJFj/3gBdaJ7Cg0Fnek5z0DsMULePP7Lrqg==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.8.3"
+ "@babel/helper-regex" "^7.8.3"
+ regexpu-core "^4.7.0"
+
"@babel/helper-define-map@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.8.3.tgz#a0655cad5451c3760b726eba875f1cd8faa02c15"
@@ -242,6 +295,15 @@
"@babel/template" "^7.8.3"
"@babel/types" "^7.8.3"
+"@babel/helper-function-name@^7.9.5":
+ version "7.9.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz#2b53820d35275120e1874a82e5aabe1376920a5c"
+ integrity sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw==
+ dependencies:
+ "@babel/helper-get-function-arity" "^7.8.3"
+ "@babel/template" "^7.8.3"
+ "@babel/types" "^7.9.5"
+
"@babel/helper-get-function-arity@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz#b894b947bd004381ce63ea1db9f08547e920abd5"
@@ -263,23 +325,24 @@
dependencies:
"@babel/types" "^7.8.3"
-"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.7.0", "@babel/helper-module-imports@^7.8.3":
+"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz#7fe39589b39c016331b6b8c3f441e8f0b1419498"
integrity sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==
dependencies:
"@babel/types" "^7.8.3"
-"@babel/helper-module-transforms@^7.7.0", "@babel/helper-module-transforms@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.8.3.tgz#d305e35d02bee720fbc2c3c3623aa0c316c01590"
- integrity sha512-C7NG6B7vfBa/pwCOshpMbOYUmrYQDfCpVL/JCRu0ek8B5p8kue1+BCXpg2vOYs7w5ACB9GTOBYQ5U6NwrMg+3Q==
+"@babel/helper-module-transforms@^7.9.0":
+ version "7.9.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz#43b34dfe15961918707d247327431388e9fe96e5"
+ integrity sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA==
dependencies:
"@babel/helper-module-imports" "^7.8.3"
+ "@babel/helper-replace-supers" "^7.8.6"
"@babel/helper-simple-access" "^7.8.3"
"@babel/helper-split-export-declaration" "^7.8.3"
- "@babel/template" "^7.8.3"
- "@babel/types" "^7.8.3"
+ "@babel/template" "^7.8.6"
+ "@babel/types" "^7.9.0"
lodash "^4.17.13"
"@babel/helper-optimise-call-expression@^7.8.3":
@@ -322,7 +385,17 @@
"@babel/traverse" "^7.8.3"
"@babel/types" "^7.8.3"
-"@babel/helper-simple-access@^7.7.0", "@babel/helper-simple-access@^7.8.3":
+"@babel/helper-replace-supers@^7.8.6", "@babel/helper-replace-supers@^7.9.6":
+ version "7.9.6"
+ resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.9.6.tgz#03149d7e6a5586ab6764996cd31d6981a17e1444"
+ integrity sha512-qX+chbxkbArLyCImk3bWV+jB5gTNU/rsze+JlcF6Nf8tVTigPJSI1o1oBow/9Resa1yehUO9lIipsmu9oG4RzA==
+ dependencies:
+ "@babel/helper-member-expression-to-functions" "^7.8.3"
+ "@babel/helper-optimise-call-expression" "^7.8.3"
+ "@babel/traverse" "^7.9.6"
+ "@babel/types" "^7.9.6"
+
+"@babel/helper-simple-access@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz#7f8109928b4dab4654076986af575231deb639ae"
integrity sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==
@@ -337,6 +410,11 @@
dependencies:
"@babel/types" "^7.8.3"
+"@babel/helper-validator-identifier@^7.9.5":
+ version "7.9.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz#90977a8e6fbf6b431a7dc31752eee233bf052d80"
+ integrity sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==
+
"@babel/helper-wrap-function@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz#9dbdb2bb55ef14aaa01fe8c99b629bd5352d8610"
@@ -347,7 +425,16 @@
"@babel/traverse" "^7.8.3"
"@babel/types" "^7.8.3"
-"@babel/helpers@^7.7.0", "@babel/helpers@^7.8.4":
+"@babel/helpers@^7.7.4":
+ version "7.9.6"
+ resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.9.6.tgz#092c774743471d0bb6c7de3ad465ab3d3486d580"
+ integrity sha512-tI4bUbldloLcHWoRUMAj4g1bF313M/o6fBKhIsb3QnGVPwRm9JsNf/gqMkQ7zjqReABiffPV6RWj7hEglID5Iw==
+ dependencies:
+ "@babel/template" "^7.8.3"
+ "@babel/traverse" "^7.9.6"
+ "@babel/types" "^7.9.6"
+
+"@babel/helpers@^7.8.4":
version "7.8.4"
resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.8.4.tgz#754eb3ee727c165e0a240d6c207de7c455f36f73"
integrity sha512-VPbe7wcQ4chu4TDQjimHv/5tj73qz88o12EPkO2ValS2QiQS/1F2SsjyIGNnAD0vF/nZS6Cf9i+vW6HIlnaR8w==
@@ -365,12 +452,17 @@
esutils "^2.0.2"
js-tokens "^4.0.0"
-"@babel/parser@^7.1.0", "@babel/parser@^7.7.2", "@babel/parser@^7.7.5", "@babel/parser@^7.8.3", "@babel/parser@^7.8.4":
+"@babel/parser@^7.1.0", "@babel/parser@^7.7.5", "@babel/parser@^7.8.3", "@babel/parser@^7.8.4":
version "7.8.4"
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.8.4.tgz#d1dbe64691d60358a974295fa53da074dd2ce8e8"
integrity sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==
-"@babel/plugin-proposal-async-generator-functions@^7.7.0":
+"@babel/parser@^7.7.7", "@babel/parser@^7.8.6", "@babel/parser@^7.9.6":
+ version "7.9.6"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.9.6.tgz#3b1bbb30dabe600cd72db58720998376ff653bc7"
+ integrity sha512-AoeIEJn8vt+d/6+PXDRPaksYhnlbMIiejioBZvvMQsOjW/JYK6k/0dKnvvP3EhK5GfMBWDPtrxRtegWdAcdq9Q==
+
+"@babel/plugin-proposal-async-generator-functions@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.3.tgz#bad329c670b382589721b27540c7d288601c6e6f"
integrity sha512-NZ9zLv848JsV3hs8ryEh7Uaz/0KsmPLqv0+PdkDJL1cJy0K4kOCFa8zc1E3mp+RHPQcpdfb/6GovEsW4VDrOMw==
@@ -379,15 +471,15 @@
"@babel/helper-remap-async-to-generator" "^7.8.3"
"@babel/plugin-syntax-async-generators" "^7.8.0"
-"@babel/plugin-proposal-class-properties@7.7.0":
- version "7.7.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.7.0.tgz#ac54e728ecf81d90e8f4d2a9c05a890457107917"
- integrity sha512-tufDcFA1Vj+eWvwHN+jvMN6QsV5o+vUlytNKrbMiCeDL0F2j92RURzUsUMWE5EJkLyWxjdUslCsMQa9FWth16A==
+"@babel/plugin-proposal-class-properties@7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.8.3.tgz#5e06654af5cd04b608915aada9b2a6788004464e"
+ integrity sha512-EqFhbo7IosdgPgZggHaNObkmO1kNUe3slaKu54d5OWvy+p9QIKOzK1GAEpAIsZtWVtPXUHSMcT4smvDrCfY4AA==
dependencies:
- "@babel/helper-create-class-features-plugin" "^7.7.0"
- "@babel/helper-plugin-utils" "^7.0.0"
+ "@babel/helper-create-class-features-plugin" "^7.8.3"
+ "@babel/helper-plugin-utils" "^7.8.3"
-"@babel/plugin-proposal-dynamic-import@^7.7.0":
+"@babel/plugin-proposal-dynamic-import@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.8.3.tgz#38c4fe555744826e97e2ae930b0fb4cc07e66054"
integrity sha512-NyaBbyLFXFLT9FP+zk0kYlUlA8XtCUbehs67F0nnEg7KICgMc2mNkIeu9TYhKzyXMkrapZFwAhXLdnt4IYHy1w==
@@ -395,7 +487,7 @@
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/plugin-syntax-dynamic-import" "^7.8.0"
-"@babel/plugin-proposal-json-strings@^7.2.0":
+"@babel/plugin-proposal-json-strings@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.3.tgz#da5216b238a98b58a1e05d6852104b10f9a70d6b"
integrity sha512-KGhQNZ3TVCQG/MjRbAUwuH+14y9q0tpxs1nWWs3pbSleRdDro9SAMMDyye8HhY1gqZ7/NqIc8SKhya0wRDgP1Q==
@@ -403,15 +495,15 @@
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/plugin-syntax-json-strings" "^7.8.0"
-"@babel/plugin-proposal-nullish-coalescing-operator@7.7.4":
- version "7.7.4"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.7.4.tgz#7db302c83bc30caa89e38fee935635ef6bd11c28"
- integrity sha512-TbYHmr1Gl1UC7Vo2HVuj/Naci5BEGNZ0AJhzqD2Vpr6QPFWpUmBRLrIDjedzx7/CShq0bRDS2gI4FIs77VHLVQ==
+"@babel/plugin-proposal-nullish-coalescing-operator@7.8.3", "@babel/plugin-proposal-nullish-coalescing-operator@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz#e4572253fdeed65cddeecfdab3f928afeb2fd5d2"
+ integrity sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw==
dependencies:
- "@babel/helper-plugin-utils" "^7.0.0"
- "@babel/plugin-syntax-nullish-coalescing-operator" "^7.7.4"
+ "@babel/helper-plugin-utils" "^7.8.3"
+ "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0"
-"@babel/plugin-proposal-numeric-separator@7.8.3":
+"@babel/plugin-proposal-numeric-separator@7.8.3", "@babel/plugin-proposal-numeric-separator@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.8.3.tgz#5d6769409699ec9b3b68684cd8116cedff93bad8"
integrity sha512-jWioO1s6R/R+wEHizfaScNsAx+xKgwTLNXSh7tTC4Usj3ItsPEhYkEpU4h+lpnBwq7NBVOJXfO6cRFYcX69JUQ==
@@ -419,23 +511,16 @@
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/plugin-syntax-numeric-separator" "^7.8.3"
-"@babel/plugin-proposal-object-rest-spread@7.6.2":
- version "7.6.2"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.6.2.tgz#8ffccc8f3a6545e9f78988b6bf4fe881b88e8096"
- integrity sha512-LDBXlmADCsMZV1Y9OQwMc0MyGZ8Ta/zlD9N67BfQT8uYwkRswiu2hU6nJKrjrt/58aH/vqfQlR/9yId/7A2gWw==
- dependencies:
- "@babel/helper-plugin-utils" "^7.0.0"
- "@babel/plugin-syntax-object-rest-spread" "^7.2.0"
-
-"@babel/plugin-proposal-object-rest-spread@^7.6.2":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.8.3.tgz#eb5ae366118ddca67bed583b53d7554cad9951bb"
- integrity sha512-8qvuPwU/xxUCt78HocNlv0mXXo0wdh9VT1R04WU8HGOfaOob26pF+9P5/lYjN/q7DHOX1bvX60hnhOvuQUJdbA==
+"@babel/plugin-proposal-object-rest-spread@7.9.6", "@babel/plugin-proposal-object-rest-spread@^7.9.6":
+ version "7.9.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.6.tgz#7a093586fcb18b08266eb1a7177da671ac575b63"
+ integrity sha512-Ga6/fhGqA9Hj+y6whNpPv8psyaK5xzrQwSPsGPloVkvmH+PqW1ixdnfJ9uIO06OjQNYol3PMnfmJ8vfZtkzF+A==
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/plugin-syntax-object-rest-spread" "^7.8.0"
+ "@babel/plugin-transform-parameters" "^7.9.5"
-"@babel/plugin-proposal-optional-catch-binding@^7.2.0":
+"@babel/plugin-proposal-optional-catch-binding@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.3.tgz#9dee96ab1650eed88646ae9734ca167ac4a9c5c9"
integrity sha512-0gkX7J7E+AtAw9fcwlVQj8peP61qhdg/89D5swOkjYbkboA2CVckn3kiyum1DE0wskGb7KJJxBdyEBApDLLVdw==
@@ -443,15 +528,15 @@
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/plugin-syntax-optional-catch-binding" "^7.8.0"
-"@babel/plugin-proposal-optional-chaining@7.7.4":
- version "7.7.4"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.7.4.tgz#3f04c2de1a942cbd3008324df8144b9cbc0ca0ba"
- integrity sha512-JmgaS+ygAWDR/STPe3/7y0lNlHgS+19qZ9aC06nYLwQ/XB7c0q5Xs+ksFU3EDnp9EiEsO0dnRAOKeyLHTZuW3A==
+"@babel/plugin-proposal-optional-chaining@7.9.0", "@babel/plugin-proposal-optional-chaining@^7.9.0":
+ version "7.9.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.9.0.tgz#31db16b154c39d6b8a645292472b98394c292a58"
+ integrity sha512-NDn5tu3tcv4W30jNhmc2hyD5c56G6cXx4TesJubhxrJeCvuuMpttxr0OnNCqbZGhFjLrg+NIhxxC+BK5F6yS3w==
dependencies:
- "@babel/helper-plugin-utils" "^7.0.0"
- "@babel/plugin-syntax-optional-chaining" "^7.7.4"
+ "@babel/helper-plugin-utils" "^7.8.3"
+ "@babel/plugin-syntax-optional-chaining" "^7.8.0"
-"@babel/plugin-proposal-unicode-property-regex@^7.4.4", "@babel/plugin-proposal-unicode-property-regex@^7.7.0":
+"@babel/plugin-proposal-unicode-property-regex@^7.4.4":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.3.tgz#b646c3adea5f98800c9ab45105ac34d06cd4a47f"
integrity sha512-1/1/rEZv2XGweRwwSkLpY+s60za9OZ1hJs4YDqFHCw0kYWYwL5IFljVY1MYBL+weT1l9pokDO2uhSTLVxzoHkQ==
@@ -459,35 +544,43 @@
"@babel/helper-create-regexp-features-plugin" "^7.8.3"
"@babel/helper-plugin-utils" "^7.8.3"
-"@babel/plugin-syntax-async-generators@^7.2.0", "@babel/plugin-syntax-async-generators@^7.8.0":
+"@babel/plugin-proposal-unicode-property-regex@^7.8.3":
+ version "7.8.8"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.8.tgz#ee3a95e90cdc04fe8cd92ec3279fa017d68a0d1d"
+ integrity sha512-EVhjVsMpbhLw9ZfHWSx2iy13Q8Z/eg8e8ccVWt23sWQK5l1UdkoLJPN5w69UA4uITGBnEZD2JOe4QOHycYKv8A==
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.8.8"
+ "@babel/helper-plugin-utils" "^7.8.3"
+
+"@babel/plugin-syntax-async-generators@^7.8.0", "@babel/plugin-syntax-async-generators@^7.8.4":
version "7.8.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d"
integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==
dependencies:
"@babel/helper-plugin-utils" "^7.8.0"
-"@babel/plugin-syntax-bigint@7.8.3", "@babel/plugin-syntax-bigint@^7.0.0":
+"@babel/plugin-syntax-bigint@7.8.3", "@babel/plugin-syntax-bigint@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea"
integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==
dependencies:
"@babel/helper-plugin-utils" "^7.8.0"
-"@babel/plugin-syntax-dynamic-import@7.2.0":
- version "7.2.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz#69c159ffaf4998122161ad8ebc5e6d1f55df8612"
- integrity sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w==
+"@babel/plugin-syntax-class-properties@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.8.3.tgz#6cb933a8872c8d359bfde69bbeaae5162fd1e8f7"
+ integrity sha512-UcAyQWg2bAN647Q+O811tG9MrJ38Z10jjhQdKNAL8fsyPzE3cCN/uT+f55cFVY4aGO4jqJAvmqsuY3GQDwAoXg==
dependencies:
- "@babel/helper-plugin-utils" "^7.0.0"
+ "@babel/helper-plugin-utils" "^7.8.3"
-"@babel/plugin-syntax-dynamic-import@^7.2.0", "@babel/plugin-syntax-dynamic-import@^7.8.0":
+"@babel/plugin-syntax-dynamic-import@7.8.3", "@babel/plugin-syntax-dynamic-import@^7.8.0":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3"
integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==
dependencies:
"@babel/helper-plugin-utils" "^7.8.0"
-"@babel/plugin-syntax-json-strings@^7.2.0", "@babel/plugin-syntax-json-strings@^7.8.0":
+"@babel/plugin-syntax-json-strings@^7.8.0", "@babel/plugin-syntax-json-strings@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a"
integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==
@@ -501,42 +594,49 @@
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
-"@babel/plugin-syntax-nullish-coalescing-operator@^7.7.4":
+"@babel/plugin-syntax-logical-assignment-operators@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.8.3.tgz#3995d7d7ffff432f6ddc742b47e730c054599897"
+ integrity sha512-Zpg2Sgc++37kuFl6ppq2Q7Awc6E6AIW671x5PY8E/f7MCIyPPGK/EoeZXvvY3P42exZ3Q4/t3YOzP/HiN79jDg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.3"
+
+"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0", "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9"
integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==
dependencies:
"@babel/helper-plugin-utils" "^7.8.0"
-"@babel/plugin-syntax-numeric-separator@^7.8.3":
+"@babel/plugin-syntax-numeric-separator@^7.8.0", "@babel/plugin-syntax-numeric-separator@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.8.3.tgz#0e3fb63e09bea1b11e96467271c8308007e7c41f"
integrity sha512-H7dCMAdN83PcCmqmkHB5dtp+Xa9a6LKSvA2hiFBC/5alSHxM5VgWZXFqDi0YFe8XNGT6iCa+z4V4zSt/PdZ7Dw==
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
-"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.2.0", "@babel/plugin-syntax-object-rest-spread@^7.8.0":
+"@babel/plugin-syntax-object-rest-spread@^7.8.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871"
integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==
dependencies:
"@babel/helper-plugin-utils" "^7.8.0"
-"@babel/plugin-syntax-optional-catch-binding@^7.2.0", "@babel/plugin-syntax-optional-catch-binding@^7.8.0":
+"@babel/plugin-syntax-optional-catch-binding@^7.8.0", "@babel/plugin-syntax-optional-catch-binding@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1"
integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==
dependencies:
"@babel/helper-plugin-utils" "^7.8.0"
-"@babel/plugin-syntax-optional-chaining@^7.7.4":
+"@babel/plugin-syntax-optional-chaining@^7.8.0", "@babel/plugin-syntax-optional-chaining@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a"
integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==
dependencies:
"@babel/helper-plugin-utils" "^7.8.0"
-"@babel/plugin-syntax-top-level-await@^7.7.0":
+"@babel/plugin-syntax-top-level-await@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.8.3.tgz#3acdece695e6b13aaf57fc291d1a800950c71391"
integrity sha512-kwj1j9lL/6Wd0hROD3b/OZZ7MSrZLqqn9RAZ5+cYYsflQ9HZBIKCUkr3+uL1MEJ1NePiUbf98jjiMQSv0NMR9g==
@@ -550,14 +650,14 @@
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
-"@babel/plugin-transform-arrow-functions@^7.2.0":
+"@babel/plugin-transform-arrow-functions@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.3.tgz#82776c2ed0cd9e1a49956daeb896024c9473b8b6"
integrity sha512-0MRF+KC8EqH4dbuITCWwPSzsyO3HIWWlm30v8BbbpOrS1B++isGxPnnuq/IZvOX5J2D/p7DQalQm+/2PnlKGxg==
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
-"@babel/plugin-transform-async-to-generator@^7.7.0":
+"@babel/plugin-transform-async-to-generator@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.3.tgz#4308fad0d9409d71eafb9b1a6ee35f9d64b64086"
integrity sha512-imt9tFLD9ogt56Dd5CI/6XgpukMwd/fLGSrix2httihVe7LOGVPhyhMh1BU5kDM7iHD08i8uUtmV2sWaBFlHVQ==
@@ -566,14 +666,14 @@
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/helper-remap-async-to-generator" "^7.8.3"
-"@babel/plugin-transform-block-scoped-functions@^7.2.0":
+"@babel/plugin-transform-block-scoped-functions@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.3.tgz#437eec5b799b5852072084b3ae5ef66e8349e8a3"
integrity sha512-vo4F2OewqjbB1+yaJ7k2EJFHlTP3jR634Z9Cj9itpqNjuLXvhlVxgnjsHsdRgASR8xYDrx6onw4vW5H6We0Jmg==
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
-"@babel/plugin-transform-block-scoping@^7.6.3":
+"@babel/plugin-transform-block-scoping@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.3.tgz#97d35dab66857a437c166358b91d09050c868f3a"
integrity sha512-pGnYfm7RNRgYRi7bids5bHluENHqJhrV4bCZRwc5GamaWIIs07N4rZECcmJL6ZClwjDz1GbdMZFtPs27hTB06w==
@@ -581,35 +681,35 @@
"@babel/helper-plugin-utils" "^7.8.3"
lodash "^4.17.13"
-"@babel/plugin-transform-classes@^7.7.0":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.8.3.tgz#46fd7a9d2bb9ea89ce88720477979fe0d71b21b8"
- integrity sha512-SjT0cwFJ+7Rbr1vQsvphAHwUHvSUPmMjMU/0P59G8U2HLFqSa082JO7zkbDNWs9kH/IUqpHI6xWNesGf8haF1w==
+"@babel/plugin-transform-classes@^7.9.5":
+ version "7.9.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.5.tgz#800597ddb8aefc2c293ed27459c1fcc935a26c2c"
+ integrity sha512-x2kZoIuLC//O5iA7PEvecB105o7TLzZo8ofBVhP79N+DO3jaX+KYfww9TQcfBEZD0nikNyYcGB1IKtRq36rdmg==
dependencies:
"@babel/helper-annotate-as-pure" "^7.8.3"
"@babel/helper-define-map" "^7.8.3"
- "@babel/helper-function-name" "^7.8.3"
+ "@babel/helper-function-name" "^7.9.5"
"@babel/helper-optimise-call-expression" "^7.8.3"
"@babel/helper-plugin-utils" "^7.8.3"
- "@babel/helper-replace-supers" "^7.8.3"
+ "@babel/helper-replace-supers" "^7.8.6"
"@babel/helper-split-export-declaration" "^7.8.3"
globals "^11.1.0"
-"@babel/plugin-transform-computed-properties@^7.2.0":
+"@babel/plugin-transform-computed-properties@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.3.tgz#96d0d28b7f7ce4eb5b120bb2e0e943343c86f81b"
integrity sha512-O5hiIpSyOGdrQZRQ2ccwtTVkgUDBBiCuK//4RJ6UfePllUTCENOzKxfh6ulckXKc0DixTFLCfb2HVkNA7aDpzA==
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
-"@babel/plugin-transform-destructuring@^7.6.0":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.8.3.tgz#20ddfbd9e4676906b1056ee60af88590cc7aaa0b"
- integrity sha512-H4X646nCkiEcHZUZaRkhE2XVsoz0J/1x3VVujnn96pSoGCtKPA99ZZA+va+gK+92Zycd6OBKCD8tDb/731bhgQ==
+"@babel/plugin-transform-destructuring@^7.9.5":
+ version "7.9.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.9.5.tgz#72c97cf5f38604aea3abf3b935b0e17b1db76a50"
+ integrity sha512-j3OEsGel8nHL/iusv/mRd5fYZ3DrOxWC82x0ogmdN/vHfAP4MYw+AFKYanzWlktNwikKvlzUV//afBW5FTp17Q==
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
-"@babel/plugin-transform-dotall-regex@^7.4.4", "@babel/plugin-transform-dotall-regex@^7.7.0":
+"@babel/plugin-transform-dotall-regex@^7.4.4", "@babel/plugin-transform-dotall-regex@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.3.tgz#c3c6ec5ee6125c6993c5cbca20dc8621a9ea7a6e"
integrity sha512-kLs1j9Nn4MQoBYdRXH6AeaXMbEJFaFu/v1nQkvib6QzTj8MZI5OQzqmD83/2jEM1z0DLilra5aWO5YpyC0ALIw==
@@ -617,14 +717,14 @@
"@babel/helper-create-regexp-features-plugin" "^7.8.3"
"@babel/helper-plugin-utils" "^7.8.3"
-"@babel/plugin-transform-duplicate-keys@^7.5.0":
+"@babel/plugin-transform-duplicate-keys@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.3.tgz#8d12df309aa537f272899c565ea1768e286e21f1"
integrity sha512-s8dHiBUbcbSgipS4SMFuWGqCvyge5V2ZeAWzR6INTVC3Ltjig/Vw1G2Gztv0vU/hRG9X8IvKvYdoksnUfgXOEQ==
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
-"@babel/plugin-transform-exponentiation-operator@^7.2.0":
+"@babel/plugin-transform-exponentiation-operator@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.3.tgz#581a6d7f56970e06bf51560cd64f5e947b70d7b7"
integrity sha512-zwIpuIymb3ACcInbksHaNcR12S++0MDLKkiqXHl3AzpgdKlFNhog+z/K0+TGW+b0w5pgTq4H6IwV/WhxbGYSjQ==
@@ -632,14 +732,14 @@
"@babel/helper-builder-binary-assignment-operator-visitor" "^7.8.3"
"@babel/helper-plugin-utils" "^7.8.3"
-"@babel/plugin-transform-for-of@^7.4.4":
- version "7.8.4"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.8.4.tgz#6fe8eae5d6875086ee185dd0b098a8513783b47d"
- integrity sha512-iAXNlOWvcYUYoV8YIxwS7TxGRJcxyl8eQCfT+A5j8sKUzRFvJdcyjp97jL2IghWSRDaL2PU2O2tX8Cu9dTBq5A==
+"@babel/plugin-transform-for-of@^7.9.0":
+ version "7.9.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.9.0.tgz#0f260e27d3e29cd1bb3128da5e76c761aa6c108e"
+ integrity sha512-lTAnWOpMwOXpyDx06N+ywmF3jNbafZEqZ96CGYabxHrxNX8l5ny7dt4bK/rGwAh9utyP2b2Hv7PlZh1AAS54FQ==
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
-"@babel/plugin-transform-function-name@^7.7.0":
+"@babel/plugin-transform-function-name@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.3.tgz#279373cb27322aaad67c2683e776dfc47196ed8b"
integrity sha512-rO/OnDS78Eifbjn5Py9v8y0aR+aSYhDhqAwVfsTl0ERuMZyr05L1aFSCJnbv2mmsLkit/4ReeQ9N2BgLnOcPCQ==
@@ -647,82 +747,72 @@
"@babel/helper-function-name" "^7.8.3"
"@babel/helper-plugin-utils" "^7.8.3"
-"@babel/plugin-transform-literals@^7.2.0":
+"@babel/plugin-transform-literals@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.3.tgz#aef239823d91994ec7b68e55193525d76dbd5dc1"
integrity sha512-3Tqf8JJ/qB7TeldGl+TT55+uQei9JfYaregDcEAyBZ7akutriFrt6C/wLYIer6OYhleVQvH/ntEhjE/xMmy10A==
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
-"@babel/plugin-transform-member-expression-literals@^7.2.0":
+"@babel/plugin-transform-member-expression-literals@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.3.tgz#963fed4b620ac7cbf6029c755424029fa3a40410"
integrity sha512-3Wk2EXhnw+rP+IDkK6BdtPKsUE5IeZ6QOGrPYvw52NwBStw9V1ZVzxgK6fSKSxqUvH9eQPR3tm3cOq79HlsKYA==
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
-"@babel/plugin-transform-modules-amd@^7.5.0":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.8.3.tgz#65606d44616b50225e76f5578f33c568a0b876a5"
- integrity sha512-MadJiU3rLKclzT5kBH4yxdry96odTUwuqrZM+GllFI/VhxfPz+k9MshJM+MwhfkCdxxclSbSBbUGciBngR+kEQ==
+"@babel/plugin-transform-modules-amd@^7.9.6":
+ version "7.9.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.9.6.tgz#8539ec42c153d12ea3836e0e3ac30d5aae7b258e"
+ integrity sha512-zoT0kgC3EixAyIAU+9vfaUVKTv9IxBDSabgHoUCBP6FqEJ+iNiN7ip7NBKcYqbfUDfuC2mFCbM7vbu4qJgOnDw==
dependencies:
- "@babel/helper-module-transforms" "^7.8.3"
+ "@babel/helper-module-transforms" "^7.9.0"
"@babel/helper-plugin-utils" "^7.8.3"
- babel-plugin-dynamic-import-node "^2.3.0"
-
-"@babel/plugin-transform-modules-commonjs@7.7.0":
- version "7.7.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.7.0.tgz#3e5ffb4fd8c947feede69cbe24c9554ab4113fe3"
- integrity sha512-KEMyWNNWnjOom8vR/1+d+Ocz/mILZG/eyHHO06OuBQ2aNhxT62fr4y6fGOplRx+CxCSp3IFwesL8WdINfY/3kg==
- dependencies:
- "@babel/helper-module-transforms" "^7.7.0"
- "@babel/helper-plugin-utils" "^7.0.0"
- "@babel/helper-simple-access" "^7.7.0"
- babel-plugin-dynamic-import-node "^2.3.0"
+ babel-plugin-dynamic-import-node "^2.3.3"
-"@babel/plugin-transform-modules-commonjs@^7.7.0":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.8.3.tgz#df251706ec331bd058a34bdd72613915f82928a5"
- integrity sha512-JpdMEfA15HZ/1gNuB9XEDlZM1h/gF/YOH7zaZzQu2xCFRfwc01NXBMHHSTT6hRjlXJJs5x/bfODM3LiCk94Sxg==
+"@babel/plugin-transform-modules-commonjs@7.9.6", "@babel/plugin-transform-modules-commonjs@^7.9.6":
+ version "7.9.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.9.6.tgz#64b7474a4279ee588cacd1906695ca721687c277"
+ integrity sha512-7H25fSlLcn+iYimmsNe3uK1at79IE6SKW9q0/QeEHTMC9MdOZ+4bA+T1VFB5fgOqBWoqlifXRzYD0JPdmIrgSQ==
dependencies:
- "@babel/helper-module-transforms" "^7.8.3"
+ "@babel/helper-module-transforms" "^7.9.0"
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/helper-simple-access" "^7.8.3"
- babel-plugin-dynamic-import-node "^2.3.0"
+ babel-plugin-dynamic-import-node "^2.3.3"
-"@babel/plugin-transform-modules-systemjs@^7.7.0":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.8.3.tgz#d8bbf222c1dbe3661f440f2f00c16e9bb7d0d420"
- integrity sha512-8cESMCJjmArMYqa9AO5YuMEkE4ds28tMpZcGZB/jl3n0ZzlsxOAi3mC+SKypTfT8gjMupCnd3YiXCkMjj2jfOg==
+"@babel/plugin-transform-modules-systemjs@^7.9.6":
+ version "7.9.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.9.6.tgz#207f1461c78a231d5337a92140e52422510d81a4"
+ integrity sha512-NW5XQuW3N2tTHim8e1b7qGy7s0kZ2OH3m5octc49K1SdAKGxYxeIx7hiIz05kS1R2R+hOWcsr1eYwcGhrdHsrg==
dependencies:
"@babel/helper-hoist-variables" "^7.8.3"
- "@babel/helper-module-transforms" "^7.8.3"
+ "@babel/helper-module-transforms" "^7.9.0"
"@babel/helper-plugin-utils" "^7.8.3"
- babel-plugin-dynamic-import-node "^2.3.0"
+ babel-plugin-dynamic-import-node "^2.3.3"
-"@babel/plugin-transform-modules-umd@^7.7.0":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.8.3.tgz#592d578ce06c52f5b98b02f913d653ffe972661a"
- integrity sha512-evhTyWhbwbI3/U6dZAnx/ePoV7H6OUG+OjiJFHmhr9FPn0VShjwC2kdxqIuQ/+1P50TMrneGzMeyMTFOjKSnAw==
+"@babel/plugin-transform-modules-umd@^7.9.0":
+ version "7.9.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.9.0.tgz#e909acae276fec280f9b821a5f38e1f08b480697"
+ integrity sha512-uTWkXkIVtg/JGRSIABdBoMsoIeoHQHPTL0Y2E7xf5Oj7sLqwVsNXOkNk0VJc7vF0IMBsPeikHxFjGe+qmwPtTQ==
dependencies:
- "@babel/helper-module-transforms" "^7.8.3"
+ "@babel/helper-module-transforms" "^7.9.0"
"@babel/helper-plugin-utils" "^7.8.3"
-"@babel/plugin-transform-named-capturing-groups-regex@^7.7.0":
+"@babel/plugin-transform-named-capturing-groups-regex@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz#a2a72bffa202ac0e2d0506afd0939c5ecbc48c6c"
integrity sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw==
dependencies:
"@babel/helper-create-regexp-features-plugin" "^7.8.3"
-"@babel/plugin-transform-new-target@^7.4.4":
+"@babel/plugin-transform-new-target@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.3.tgz#60cc2ae66d85c95ab540eb34babb6434d4c70c43"
integrity sha512-QuSGysibQpyxexRyui2vca+Cmbljo8bcRckgzYV4kRIsHpVeyeC3JDO63pY+xFZ6bWOBn7pfKZTqV4o/ix9sFw==
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
-"@babel/plugin-transform-object-super@^7.5.5":
+"@babel/plugin-transform-object-super@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.3.tgz#ebb6a1e7a86ffa96858bd6ac0102d65944261725"
integrity sha512-57FXk+gItG/GejofIyLIgBKTas4+pEU47IXKDBWFTxdPd7F80H8zybyAY7UoblVfBhBGs2EKM+bJUu2+iUYPDQ==
@@ -730,93 +820,102 @@
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/helper-replace-supers" "^7.8.3"
-"@babel/plugin-transform-parameters@^7.4.4":
- version "7.8.4"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.8.4.tgz#1d5155de0b65db0ccf9971165745d3bb990d77d3"
- integrity sha512-IsS3oTxeTsZlE5KqzTbcC2sV0P9pXdec53SU+Yxv7o/6dvGM5AkTotQKhoSffhNgZ/dftsSiOoxy7evCYJXzVA==
+"@babel/plugin-transform-parameters@^7.9.5":
+ version "7.9.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.9.5.tgz#173b265746f5e15b2afe527eeda65b73623a0795"
+ integrity sha512-0+1FhHnMfj6lIIhVvS4KGQJeuhe1GI//h5uptK4PvLt+BGBxsoUJbd3/IW002yk//6sZPlFgsG1hY6OHLcy6kA==
dependencies:
- "@babel/helper-call-delegate" "^7.8.3"
"@babel/helper-get-function-arity" "^7.8.3"
"@babel/helper-plugin-utils" "^7.8.3"
-"@babel/plugin-transform-property-literals@^7.2.0":
+"@babel/plugin-transform-property-literals@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.3.tgz#33194300d8539c1ed28c62ad5087ba3807b98263"
integrity sha512-uGiiXAZMqEoQhRWMK17VospMZh5sXWg+dlh2soffpkAl96KAm+WZuJfa6lcELotSRmooLqg0MWdH6UUq85nmmg==
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
-"@babel/plugin-transform-react-display-name@^7.0.0":
+"@babel/plugin-transform-react-display-name@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.8.3.tgz#70ded987c91609f78353dd76d2fb2a0bb991e8e5"
integrity sha512-3Jy/PCw8Fe6uBKtEgz3M82ljt+lTg+xJaM4og+eyu83qLT87ZUSckn0wy7r31jflURWLO83TW6Ylf7lyXj3m5A==
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
-"@babel/plugin-transform-react-jsx-self@^7.0.0":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.8.3.tgz#c4f178b2aa588ecfa8d077ea80d4194ee77ed702"
- integrity sha512-01OT7s5oa0XTLf2I8XGsL8+KqV9lx3EZV+jxn/L2LQ97CGKila2YMroTkCEIE0HV/FF7CMSRsIAybopdN9NTdg==
+"@babel/plugin-transform-react-jsx-development@^7.9.0":
+ version "7.9.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.9.0.tgz#3c2a130727caf00c2a293f0aed24520825dbf754"
+ integrity sha512-tK8hWKrQncVvrhvtOiPpKrQjfNX3DtkNLSX4ObuGcpS9p0QrGetKmlySIGR07y48Zft8WVgPakqd/bk46JrMSw==
dependencies:
+ "@babel/helper-builder-react-jsx-experimental" "^7.9.0"
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/plugin-syntax-jsx" "^7.8.3"
-"@babel/plugin-transform-react-jsx-source@^7.0.0":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.8.3.tgz#951e75a8af47f9f120db731be095d2b2c34920e0"
- integrity sha512-PLMgdMGuVDtRS/SzjNEQYUT8f4z1xb2BAT54vM1X5efkVuYBf5WyGUMbpmARcfq3NaglIwz08UVQK4HHHbC6ag==
+"@babel/plugin-transform-react-jsx-self@^7.9.0":
+ version "7.9.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.9.0.tgz#f4f26a325820205239bb915bad8e06fcadabb49b"
+ integrity sha512-K2ObbWPKT7KUTAoyjCsFilOkEgMvFG+y0FqOl6Lezd0/13kMkkjHskVsZvblRPj1PHA44PrToaZANrryppzTvQ==
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/plugin-syntax-jsx" "^7.8.3"
-"@babel/plugin-transform-react-jsx@^7.7.0":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.8.3.tgz#4220349c0390fdefa505365f68c103562ab2fc4a"
- integrity sha512-r0h+mUiyL595ikykci+fbwm9YzmuOrUBi0b+FDIKmi3fPQyFokWVEMJnRWHJPPQEjyFJyna9WZC6Viv6UHSv1g==
+"@babel/plugin-transform-react-jsx-source@^7.9.0":
+ version "7.9.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.9.0.tgz#89ef93025240dd5d17d3122294a093e5e0183de0"
+ integrity sha512-K6m3LlSnTSfRkM6FcRk8saNEeaeyG5k7AVkBU2bZK3+1zdkSED3qNdsWrUgQBeTVD2Tp3VMmerxVO2yM5iITmw==
dependencies:
- "@babel/helper-builder-react-jsx" "^7.8.3"
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/plugin-syntax-jsx" "^7.8.3"
-"@babel/plugin-transform-regenerator@^7.7.0":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.3.tgz#b31031e8059c07495bf23614c97f3d9698bc6ec8"
- integrity sha512-qt/kcur/FxrQrzFR432FGZznkVAjiyFtCOANjkAKwCbt465L6ZCiUQh2oMYGU3Wo8LRFJxNDFwWn106S5wVUNA==
+"@babel/plugin-transform-react-jsx@^7.9.4":
+ version "7.9.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.9.4.tgz#86f576c8540bd06d0e95e0b61ea76d55f6cbd03f"
+ integrity sha512-Mjqf3pZBNLt854CK0C/kRuXAnE6H/bo7xYojP+WGtX8glDGSibcwnsWwhwoSuRg0+EBnxPC1ouVnuetUIlPSAw==
+ dependencies:
+ "@babel/helper-builder-react-jsx" "^7.9.0"
+ "@babel/helper-builder-react-jsx-experimental" "^7.9.0"
+ "@babel/helper-plugin-utils" "^7.8.3"
+ "@babel/plugin-syntax-jsx" "^7.8.3"
+
+"@babel/plugin-transform-regenerator@^7.8.7":
+ version "7.8.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.7.tgz#5e46a0dca2bee1ad8285eb0527e6abc9c37672f8"
+ integrity sha512-TIg+gAl4Z0a3WmD3mbYSk+J9ZUH6n/Yc57rtKRnlA/7rcCvpekHXe0CMZHP1gYp7/KLe9GHTuIba0vXmls6drA==
dependencies:
- regenerator-transform "^0.14.0"
+ regenerator-transform "^0.14.2"
-"@babel/plugin-transform-reserved-words@^7.2.0":
+"@babel/plugin-transform-reserved-words@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.8.3.tgz#9a0635ac4e665d29b162837dd3cc50745dfdf1f5"
integrity sha512-mwMxcycN3omKFDjDQUl+8zyMsBfjRFr0Zn/64I41pmjv4NJuqcYlEtezwYtw9TFd9WR1vN5kiM+O0gMZzO6L0A==
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
-"@babel/plugin-transform-runtime@7.6.2":
- version "7.6.2"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.6.2.tgz#2669f67c1fae0ae8d8bf696e4263ad52cb98b6f8"
- integrity sha512-cqULw/QB4yl73cS5Y0TZlQSjDvNkzDbu0FurTZyHlJpWE5T3PCMdnyV+xXoH1opr1ldyHODe3QAX3OMAii5NxA==
+"@babel/plugin-transform-runtime@7.9.6":
+ version "7.9.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.9.6.tgz#3ba804438ad0d880a17bca5eaa0cdf1edeedb2fd"
+ integrity sha512-qcmiECD0mYOjOIt8YHNsAP1SxPooC/rDmfmiSK9BNY72EitdSc7l44WTEklaWuFtbOEBjNhWWyph/kOImbNJ4w==
dependencies:
- "@babel/helper-module-imports" "^7.0.0"
- "@babel/helper-plugin-utils" "^7.0.0"
+ "@babel/helper-module-imports" "^7.8.3"
+ "@babel/helper-plugin-utils" "^7.8.3"
resolve "^1.8.1"
semver "^5.5.1"
-"@babel/plugin-transform-shorthand-properties@^7.2.0":
+"@babel/plugin-transform-shorthand-properties@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.3.tgz#28545216e023a832d4d3a1185ed492bcfeac08c8"
integrity sha512-I9DI6Odg0JJwxCHzbzW08ggMdCezoWcuQRz3ptdudgwaHxTjxw5HgdFJmZIkIMlRymL6YiZcped4TTCB0JcC8w==
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
-"@babel/plugin-transform-spread@^7.6.2":
+"@babel/plugin-transform-spread@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.3.tgz#9c8ffe8170fdfb88b114ecb920b82fb6e95fe5e8"
integrity sha512-CkuTU9mbmAoFOI1tklFWYYbzX5qCIZVXPVy0jpXgGwkplCndQAa58s2jr66fTeQnA64bDox0HL4U56CFYoyC7g==
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
-"@babel/plugin-transform-sticky-regex@^7.2.0":
+"@babel/plugin-transform-sticky-regex@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.3.tgz#be7a1290f81dae767475452199e1f76d6175b100"
integrity sha512-9Spq0vGCD5Bb4Z/ZXXSK5wbbLFMG085qd2vhL1JYu1WcQ5bXqZBAYRzU1d+p79GcHs2szYv5pVQCX13QgldaWw==
@@ -824,7 +923,7 @@
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/helper-regex" "^7.8.3"
-"@babel/plugin-transform-template-literals@^7.4.4":
+"@babel/plugin-transform-template-literals@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.3.tgz#7bfa4732b455ea6a43130adc0ba767ec0e402a80"
integrity sha512-820QBtykIQOLFT8NZOcTRJ1UNuztIELe4p9DCgvj4NK+PwluSJ49we7s9FB1HIGNIYT7wFUJ0ar2QpCDj0escQ==
@@ -832,23 +931,23 @@
"@babel/helper-annotate-as-pure" "^7.8.3"
"@babel/helper-plugin-utils" "^7.8.3"
-"@babel/plugin-transform-typeof-symbol@^7.2.0":
+"@babel/plugin-transform-typeof-symbol@^7.8.4":
version "7.8.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.4.tgz#ede4062315ce0aaf8a657a920858f1a2f35fc412"
integrity sha512-2QKyfjGdvuNfHsb7qnBBlKclbD4CfshH2KvDabiijLMGXPHJXGxtDzwIF7bQP+T0ysw8fYTtxPafgfs/c1Lrqg==
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
-"@babel/plugin-transform-typescript@^7.7.2":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.8.3.tgz#be6f01a7ef423be68e65ace1f04fc407e6d88917"
- integrity sha512-Ebj230AxcrKGZPKIp4g4TdQLrqX95TobLUWKd/CwG7X1XHUH1ZpkpFvXuXqWbtGRWb7uuEWNlrl681wsOArAdQ==
+"@babel/plugin-transform-typescript@^7.9.0":
+ version "7.9.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.9.6.tgz#2248971416a506fc78278fc0c0ea3179224af1e9"
+ integrity sha512-8OvsRdvpt3Iesf2qsAn+YdlwAJD7zJ+vhFZmDCa4b8dTp7MmHtKk5FF2mCsGxjZwuwsy/yIIay/nLmxST1ctVQ==
dependencies:
- "@babel/helper-create-class-features-plugin" "^7.8.3"
+ "@babel/helper-create-class-features-plugin" "^7.9.6"
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/plugin-syntax-typescript" "^7.8.3"
-"@babel/plugin-transform-unicode-regex@^7.7.0":
+"@babel/plugin-transform-unicode-regex@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.3.tgz#0cef36e3ba73e5c57273effb182f46b91a1ecaad"
integrity sha512-+ufgJjYdmWfSQ+6NS9VGUR2ns8cjJjYbrbi11mZBTaWm+Fui/ncTLFF28Ei1okavY+xkojGr1eJxNsWYeA5aZw==
@@ -856,67 +955,76 @@
"@babel/helper-create-regexp-features-plugin" "^7.8.3"
"@babel/helper-plugin-utils" "^7.8.3"
-"@babel/preset-env@7.7.1":
- version "7.7.1"
- resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.7.1.tgz#04a2ff53552c5885cf1083e291c8dd5490f744bb"
- integrity sha512-/93SWhi3PxcVTDpSqC+Dp4YxUu3qZ4m7I76k0w73wYfn7bGVuRIO4QUz95aJksbS+AD1/mT1Ie7rbkT0wSplaA==
+"@babel/preset-env@7.9.6":
+ version "7.9.6"
+ resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.9.6.tgz#df063b276c6455ec6fcfc6e53aacc38da9b0aea6"
+ integrity sha512-0gQJ9RTzO0heXOhzftog+a/WyOuqMrAIugVYxMYf83gh1CQaQDjMtsOpqOwXyDL/5JcWsrCm8l4ju8QC97O7EQ==
dependencies:
- "@babel/helper-module-imports" "^7.7.0"
- "@babel/helper-plugin-utils" "^7.0.0"
- "@babel/plugin-proposal-async-generator-functions" "^7.7.0"
- "@babel/plugin-proposal-dynamic-import" "^7.7.0"
- "@babel/plugin-proposal-json-strings" "^7.2.0"
- "@babel/plugin-proposal-object-rest-spread" "^7.6.2"
- "@babel/plugin-proposal-optional-catch-binding" "^7.2.0"
- "@babel/plugin-proposal-unicode-property-regex" "^7.7.0"
- "@babel/plugin-syntax-async-generators" "^7.2.0"
- "@babel/plugin-syntax-dynamic-import" "^7.2.0"
- "@babel/plugin-syntax-json-strings" "^7.2.0"
- "@babel/plugin-syntax-object-rest-spread" "^7.2.0"
- "@babel/plugin-syntax-optional-catch-binding" "^7.2.0"
- "@babel/plugin-syntax-top-level-await" "^7.7.0"
- "@babel/plugin-transform-arrow-functions" "^7.2.0"
- "@babel/plugin-transform-async-to-generator" "^7.7.0"
- "@babel/plugin-transform-block-scoped-functions" "^7.2.0"
- "@babel/plugin-transform-block-scoping" "^7.6.3"
- "@babel/plugin-transform-classes" "^7.7.0"
- "@babel/plugin-transform-computed-properties" "^7.2.0"
- "@babel/plugin-transform-destructuring" "^7.6.0"
- "@babel/plugin-transform-dotall-regex" "^7.7.0"
- "@babel/plugin-transform-duplicate-keys" "^7.5.0"
- "@babel/plugin-transform-exponentiation-operator" "^7.2.0"
- "@babel/plugin-transform-for-of" "^7.4.4"
- "@babel/plugin-transform-function-name" "^7.7.0"
- "@babel/plugin-transform-literals" "^7.2.0"
- "@babel/plugin-transform-member-expression-literals" "^7.2.0"
- "@babel/plugin-transform-modules-amd" "^7.5.0"
- "@babel/plugin-transform-modules-commonjs" "^7.7.0"
- "@babel/plugin-transform-modules-systemjs" "^7.7.0"
- "@babel/plugin-transform-modules-umd" "^7.7.0"
- "@babel/plugin-transform-named-capturing-groups-regex" "^7.7.0"
- "@babel/plugin-transform-new-target" "^7.4.4"
- "@babel/plugin-transform-object-super" "^7.5.5"
- "@babel/plugin-transform-parameters" "^7.4.4"
- "@babel/plugin-transform-property-literals" "^7.2.0"
- "@babel/plugin-transform-regenerator" "^7.7.0"
- "@babel/plugin-transform-reserved-words" "^7.2.0"
- "@babel/plugin-transform-shorthand-properties" "^7.2.0"
- "@babel/plugin-transform-spread" "^7.6.2"
- "@babel/plugin-transform-sticky-regex" "^7.2.0"
- "@babel/plugin-transform-template-literals" "^7.4.4"
- "@babel/plugin-transform-typeof-symbol" "^7.2.0"
- "@babel/plugin-transform-unicode-regex" "^7.7.0"
- "@babel/types" "^7.7.1"
- browserslist "^4.6.0"
- core-js-compat "^3.1.1"
+ "@babel/compat-data" "^7.9.6"
+ "@babel/helper-compilation-targets" "^7.9.6"
+ "@babel/helper-module-imports" "^7.8.3"
+ "@babel/helper-plugin-utils" "^7.8.3"
+ "@babel/plugin-proposal-async-generator-functions" "^7.8.3"
+ "@babel/plugin-proposal-dynamic-import" "^7.8.3"
+ "@babel/plugin-proposal-json-strings" "^7.8.3"
+ "@babel/plugin-proposal-nullish-coalescing-operator" "^7.8.3"
+ "@babel/plugin-proposal-numeric-separator" "^7.8.3"
+ "@babel/plugin-proposal-object-rest-spread" "^7.9.6"
+ "@babel/plugin-proposal-optional-catch-binding" "^7.8.3"
+ "@babel/plugin-proposal-optional-chaining" "^7.9.0"
+ "@babel/plugin-proposal-unicode-property-regex" "^7.8.3"
+ "@babel/plugin-syntax-async-generators" "^7.8.0"
+ "@babel/plugin-syntax-dynamic-import" "^7.8.0"
+ "@babel/plugin-syntax-json-strings" "^7.8.0"
+ "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0"
+ "@babel/plugin-syntax-numeric-separator" "^7.8.0"
+ "@babel/plugin-syntax-object-rest-spread" "^7.8.0"
+ "@babel/plugin-syntax-optional-catch-binding" "^7.8.0"
+ "@babel/plugin-syntax-optional-chaining" "^7.8.0"
+ "@babel/plugin-syntax-top-level-await" "^7.8.3"
+ "@babel/plugin-transform-arrow-functions" "^7.8.3"
+ "@babel/plugin-transform-async-to-generator" "^7.8.3"
+ "@babel/plugin-transform-block-scoped-functions" "^7.8.3"
+ "@babel/plugin-transform-block-scoping" "^7.8.3"
+ "@babel/plugin-transform-classes" "^7.9.5"
+ "@babel/plugin-transform-computed-properties" "^7.8.3"
+ "@babel/plugin-transform-destructuring" "^7.9.5"
+ "@babel/plugin-transform-dotall-regex" "^7.8.3"
+ "@babel/plugin-transform-duplicate-keys" "^7.8.3"
+ "@babel/plugin-transform-exponentiation-operator" "^7.8.3"
+ "@babel/plugin-transform-for-of" "^7.9.0"
+ "@babel/plugin-transform-function-name" "^7.8.3"
+ "@babel/plugin-transform-literals" "^7.8.3"
+ "@babel/plugin-transform-member-expression-literals" "^7.8.3"
+ "@babel/plugin-transform-modules-amd" "^7.9.6"
+ "@babel/plugin-transform-modules-commonjs" "^7.9.6"
+ "@babel/plugin-transform-modules-systemjs" "^7.9.6"
+ "@babel/plugin-transform-modules-umd" "^7.9.0"
+ "@babel/plugin-transform-named-capturing-groups-regex" "^7.8.3"
+ "@babel/plugin-transform-new-target" "^7.8.3"
+ "@babel/plugin-transform-object-super" "^7.8.3"
+ "@babel/plugin-transform-parameters" "^7.9.5"
+ "@babel/plugin-transform-property-literals" "^7.8.3"
+ "@babel/plugin-transform-regenerator" "^7.8.7"
+ "@babel/plugin-transform-reserved-words" "^7.8.3"
+ "@babel/plugin-transform-shorthand-properties" "^7.8.3"
+ "@babel/plugin-transform-spread" "^7.8.3"
+ "@babel/plugin-transform-sticky-regex" "^7.8.3"
+ "@babel/plugin-transform-template-literals" "^7.8.3"
+ "@babel/plugin-transform-typeof-symbol" "^7.8.4"
+ "@babel/plugin-transform-unicode-regex" "^7.8.3"
+ "@babel/preset-modules" "^0.1.3"
+ "@babel/types" "^7.9.6"
+ browserslist "^4.11.1"
+ core-js-compat "^3.6.2"
invariant "^2.2.2"
- js-levenshtein "^1.1.3"
+ levenary "^1.1.1"
semver "^5.5.0"
-"@babel/preset-modules@0.1.1":
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.1.tgz#add61473e3182771b36930c1312f3c56c114e406"
- integrity sha512-x/kt2aAZlgcFnP3P851fkkb2s4FmTiyGic58pkWMaRK9Am3u9KkH1ttHGjwlsKu7/TVJsLEBXZnjUxqsid3tww==
+"@babel/preset-modules@0.1.3", "@babel/preset-modules@^0.1.3":
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.3.tgz#13242b53b5ef8c883c3cf7dddd55b36ce80fbc72"
+ integrity sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg==
dependencies:
"@babel/helper-plugin-utils" "^7.0.0"
"@babel/plugin-proposal-unicode-property-regex" "^7.4.4"
@@ -924,24 +1032,25 @@
"@babel/types" "^7.4.4"
esutils "^2.0.2"
-"@babel/preset-react@7.7.0":
- version "7.7.0"
- resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.7.0.tgz#8ab0c4787d98cf1f5f22dabf115552bf9e4e406c"
- integrity sha512-IXXgSUYBPHUGhUkH+89TR6faMcBtuMW0h5OHbMuVbL3/5wK2g6a2M2BBpkLa+Kw0sAHiZ9dNVgqJMDP/O4GRBA==
+"@babel/preset-react@7.9.4":
+ version "7.9.4"
+ resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.9.4.tgz#c6c97693ac65b6b9c0b4f25b948a8f665463014d"
+ integrity sha512-AxylVB3FXeOTQXNXyiuAQJSvss62FEotbX2Pzx3K/7c+MKJMdSg6Ose6QYllkdCFA8EInCJVw7M/o5QbLuA4ZQ==
dependencies:
- "@babel/helper-plugin-utils" "^7.0.0"
- "@babel/plugin-transform-react-display-name" "^7.0.0"
- "@babel/plugin-transform-react-jsx" "^7.7.0"
- "@babel/plugin-transform-react-jsx-self" "^7.0.0"
- "@babel/plugin-transform-react-jsx-source" "^7.0.0"
+ "@babel/helper-plugin-utils" "^7.8.3"
+ "@babel/plugin-transform-react-display-name" "^7.8.3"
+ "@babel/plugin-transform-react-jsx" "^7.9.4"
+ "@babel/plugin-transform-react-jsx-development" "^7.9.0"
+ "@babel/plugin-transform-react-jsx-self" "^7.9.0"
+ "@babel/plugin-transform-react-jsx-source" "^7.9.0"
-"@babel/preset-typescript@7.7.2":
- version "7.7.2"
- resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.7.2.tgz#f71c8bba2ae02f11b29dbf7d6a35f47bbe011632"
- integrity sha512-1B4HthAelaLGfNRyrWqJtBEjXX1ulThCrLQ5B2VOtEAznWFIFXFJahgXImqppy66lx/Oh+cOSCQdJzZqh2Jh5g==
+"@babel/preset-typescript@7.9.0":
+ version "7.9.0"
+ resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.9.0.tgz#87705a72b1f0d59df21c179f7c3d2ef4b16ce192"
+ integrity sha512-S4cueFnGrIbvYJgwsVFKdvOmpiL0XGw9MFW9D0vgRys5g36PBhZRL8NX8Gr2akz8XRtzq6HuDXPD/1nniagNUg==
dependencies:
- "@babel/helper-plugin-utils" "^7.0.0"
- "@babel/plugin-transform-typescript" "^7.7.2"
+ "@babel/helper-plugin-utils" "^7.8.3"
+ "@babel/plugin-transform-typescript" "^7.9.0"
"@babel/runtime-corejs3@^7.8.3":
version "7.9.2"
@@ -951,21 +1060,30 @@
core-js-pure "^3.0.0"
regenerator-runtime "^0.13.4"
-"@babel/runtime@7.7.2":
- version "7.7.2"
- resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.7.2.tgz#111a78002a5c25fc8e3361bedc9529c696b85a6a"
- integrity sha512-JONRbXbTXc9WQE2mAZd1p0Z3DZ/6vaQIkgYMSTP3KjRCyd7rCZCcfhCyX+YjwcKxcZ82UrxbRD358bpExNgrjw==
+"@babel/runtime@7.9.6", "@babel/runtime@^7.8.4":
+ version "7.9.6"
+ resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.9.6.tgz#a9102eb5cadedf3f31d08a9ecf294af7827ea29f"
+ integrity sha512-64AF1xY3OAkFHqOb9s4jpgk1Mm5vDZ4L3acHvAml+53nO1XbXLuDodsVpO4OIUsmemlUHMxNdYMNJmsvOwLrvQ==
dependencies:
- regenerator-runtime "^0.13.2"
+ regenerator-runtime "^0.13.4"
-"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.2.0", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.7":
+"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.2.0", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2":
version "7.8.4"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.8.4.tgz#d79f5a2040f7caa24d53e563aad49cbc05581308"
integrity sha512-neAp3zt80trRVBI1x0azq6c57aNBqYZH8KhMm3TaB7wEI5Q4A2SHfBHE8w9gOhI/lrqxtEbXZgQIrHP+wvSGwQ==
dependencies:
regenerator-runtime "^0.13.2"
-"@babel/template@^7.7.0", "@babel/template@^7.7.4", "@babel/template@^7.8.3":
+"@babel/template@^7.3.3", "@babel/template@^7.8.6":
+ version "7.8.6"
+ resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.6.tgz#86b22af15f828dfb086474f964dcc3e39c43ce2b"
+ integrity sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==
+ dependencies:
+ "@babel/code-frame" "^7.8.3"
+ "@babel/parser" "^7.8.6"
+ "@babel/types" "^7.8.6"
+
+"@babel/template@^7.7.4", "@babel/template@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.3.tgz#e02ad04fe262a657809327f578056ca15fd4d1b8"
integrity sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==
@@ -974,7 +1092,7 @@
"@babel/parser" "^7.8.3"
"@babel/types" "^7.8.3"
-"@babel/traverse@^7.1.0", "@babel/traverse@^7.7.2", "@babel/traverse@^7.7.4", "@babel/traverse@^7.8.3", "@babel/traverse@^7.8.4":
+"@babel/traverse@^7.1.0", "@babel/traverse@^7.7.4", "@babel/traverse@^7.8.3", "@babel/traverse@^7.8.4":
version "7.8.4"
resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.8.4.tgz#f0845822365f9d5b0e312ed3959d3f827f869e3c"
integrity sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==
@@ -989,16 +1107,22 @@
globals "^11.1.0"
lodash "^4.17.13"
-"@babel/types@7.7.4":
- version "7.7.4"
- resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.7.4.tgz#516570d539e44ddf308c07569c258ff94fde9193"
- integrity sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==
+"@babel/traverse@^7.9.6":
+ version "7.9.6"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.9.6.tgz#5540d7577697bf619cc57b92aa0f1c231a94f442"
+ integrity sha512-b3rAHSjbxy6VEAvlxM8OV/0X4XrG72zoxme6q1MOoe2vd0bEc+TwayhuC1+Dfgqh1QEG+pj7atQqvUprHIccsg==
dependencies:
- esutils "^2.0.2"
+ "@babel/code-frame" "^7.8.3"
+ "@babel/generator" "^7.9.6"
+ "@babel/helper-function-name" "^7.9.5"
+ "@babel/helper-split-export-declaration" "^7.8.3"
+ "@babel/parser" "^7.9.6"
+ "@babel/types" "^7.9.6"
+ debug "^4.1.0"
+ globals "^11.1.0"
lodash "^4.17.13"
- to-fast-properties "^2.0.0"
-"@babel/types@7.8.3", "@babel/types@^7.0.0", "@babel/types@^7.3.0", "@babel/types@^7.4.4", "@babel/types@^7.7.1", "@babel/types@^7.7.2", "@babel/types@^7.8.3":
+"@babel/types@7.8.3", "@babel/types@^7.0.0", "@babel/types@^7.3.0", "@babel/types@^7.4.4", "@babel/types@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.8.3.tgz#5a383dffa5416db1b73dedffd311ffd0788fb31c"
integrity sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==
@@ -1007,6 +1131,15 @@
lodash "^4.17.13"
to-fast-properties "^2.0.0"
+"@babel/types@7.9.6", "@babel/types@^7.3.3", "@babel/types@^7.7.4", "@babel/types@^7.8.6", "@babel/types@^7.9.0", "@babel/types@^7.9.5", "@babel/types@^7.9.6":
+ version "7.9.6"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.9.6.tgz#2c5502b427251e9de1bd2dff95add646d95cc9f7"
+ integrity sha512-qxXzvBO//jO9ZnoasKF1uJzHd2+M6Q2ZPIVfnFps8JJvXy0ZBbwbNOmE6SGIY5XOY6d1Bo5lb9d9RJ8nv3WSeA==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.9.5"
+ lodash "^4.17.13"
+ to-fast-properties "^2.0.0"
+
"@bcoe/v8-coverage@^0.2.3":
version "0.2.3"
resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39"
@@ -1107,6 +1240,18 @@
dependencies:
"@emotion/memoize" "0.7.4"
+"@emotion/is-prop-valid@^0.7.3":
+ version "0.7.3"
+ resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-0.7.3.tgz#a6bf4fa5387cbba59d44e698a4680f481a8da6cc"
+ integrity sha512-uxJqm/sqwXw3YPA5GXX365OBcJGFtxUVkB6WyezqFHlNe9jqUWH5ur2O2M8dGBz61kn1g3ZBlzUunFQXQIClhA==
+ dependencies:
+ "@emotion/memoize" "0.7.1"
+
+"@emotion/memoize@0.7.1":
+ version "0.7.1"
+ resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.1.tgz#e93c13942592cf5ef01aa8297444dc192beee52f"
+ integrity sha512-Qv4LTqO11jepd5Qmlp3M1YEjBumoTHcHFdgPTQ+sFlIL5myi/7xu/POwP7IRu6odBdmLXdtIs1D6TuW6kbwbbg==
+
"@emotion/memoize@0.7.4":
version "0.7.4"
resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.4.tgz#19bf0f5af19149111c40d98bb0cf82119f5d9eeb"
@@ -1151,7 +1296,7 @@
resolved "https://registry.yarnpkg.com/@emotion/stylis/-/stylis-0.8.5.tgz#deacb389bd6ee77d1e7fcaccce9e16c5c7e78e04"
integrity sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==
-"@emotion/unitless@0.7.5":
+"@emotion/unitless@0.7.5", "@emotion/unitless@^0.7.0":
version "0.7.5"
resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.5.tgz#77211291c1900a700b8a78cfafda3160d76949ed"
integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==
@@ -1185,6 +1330,13 @@
dependencies:
"@fortawesome/fontawesome-common-types" "^0.2.28"
+"@fortawesome/free-regular-svg-icons@5.13.0":
+ version "5.13.0"
+ resolved "https://registry.yarnpkg.com/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-5.13.0.tgz#925a13d8bdda0678f71551828cac80ab47b8150c"
+ integrity sha512-70FAyiS5j+ANYD4dh9NGowTorNDnyvQHHpCM7FpnF7GxtDjBUCKdrFqCPzesEIpNDFNd+La3vex+jDk4nnUfpA==
+ dependencies:
+ "@fortawesome/fontawesome-common-types" "^0.2.28"
+
"@fortawesome/free-solid-svg-icons@5.13.0":
version "5.13.0"
resolved "https://registry.yarnpkg.com/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.13.0.tgz#44d9118668ad96b4fd5c9434a43efc5903525739"
@@ -1223,100 +1375,110 @@
chalk "^2.0.1"
slash "^2.0.0"
-"@jest/console@^25.2.6":
- version "25.2.6"
- resolved "https://registry.yarnpkg.com/@jest/console/-/console-25.2.6.tgz#f594847ec8aef3cf27f448abe97e76e491212e97"
- integrity sha512-bGp+0PicZVCEhb+ifnW9wpKWONNdkhtJsRE7ap729hiAfTvCN6VhGx0s/l/V/skA2pnyqq+N/7xl9ZWfykDpsg==
+"@jest/console@^26.0.1":
+ version "26.0.1"
+ resolved "https://registry.yarnpkg.com/@jest/console/-/console-26.0.1.tgz#62b3b2fa8990f3cbffbef695c42ae9ddbc8f4b39"
+ integrity sha512-9t1KUe/93coV1rBSxMmBAOIK3/HVpwxArCA1CxskKyRiv6o8J70V8C/V3OJminVCTa2M0hQI9AWRd5wxu2dAHw==
dependencies:
- "@jest/source-map" "^25.2.6"
- chalk "^3.0.0"
- jest-util "^25.2.6"
+ "@jest/types" "^26.0.1"
+ chalk "^4.0.0"
+ jest-message-util "^26.0.1"
+ jest-util "^26.0.1"
slash "^3.0.0"
-"@jest/core@^25.2.7":
- version "25.2.7"
- resolved "https://registry.yarnpkg.com/@jest/core/-/core-25.2.7.tgz#58d697687e94ee644273d15e4eed6a20e27187cd"
- integrity sha512-Nd6ELJyR+j0zlwhzkfzY70m04hAur0VnMwJXVe4VmmD/SaQ6DEyal++ERQ1sgyKIKKEqRuui6k/R0wHLez4P+g==
+"@jest/core@^26.0.1":
+ version "26.0.1"
+ resolved "https://registry.yarnpkg.com/@jest/core/-/core-26.0.1.tgz#aa538d52497dfab56735efb00e506be83d841fae"
+ integrity sha512-Xq3eqYnxsG9SjDC+WLeIgf7/8KU6rddBxH+SCt18gEpOhAGYC/Mq+YbtlNcIdwjnnT+wDseXSbU0e5X84Y4jTQ==
dependencies:
- "@jest/console" "^25.2.6"
- "@jest/reporters" "^25.2.6"
- "@jest/test-result" "^25.2.6"
- "@jest/transform" "^25.2.6"
- "@jest/types" "^25.2.6"
+ "@jest/console" "^26.0.1"
+ "@jest/reporters" "^26.0.1"
+ "@jest/test-result" "^26.0.1"
+ "@jest/transform" "^26.0.1"
+ "@jest/types" "^26.0.1"
ansi-escapes "^4.2.1"
- chalk "^3.0.0"
+ chalk "^4.0.0"
exit "^0.1.2"
- graceful-fs "^4.2.3"
- jest-changed-files "^25.2.6"
- jest-config "^25.2.7"
- jest-haste-map "^25.2.6"
- jest-message-util "^25.2.6"
- jest-regex-util "^25.2.6"
- jest-resolve "^25.2.6"
- jest-resolve-dependencies "^25.2.7"
- jest-runner "^25.2.7"
- jest-runtime "^25.2.7"
- jest-snapshot "^25.2.7"
- jest-util "^25.2.6"
- jest-validate "^25.2.6"
- jest-watcher "^25.2.7"
+ graceful-fs "^4.2.4"
+ jest-changed-files "^26.0.1"
+ jest-config "^26.0.1"
+ jest-haste-map "^26.0.1"
+ jest-message-util "^26.0.1"
+ jest-regex-util "^26.0.0"
+ jest-resolve "^26.0.1"
+ jest-resolve-dependencies "^26.0.1"
+ jest-runner "^26.0.1"
+ jest-runtime "^26.0.1"
+ jest-snapshot "^26.0.1"
+ jest-util "^26.0.1"
+ jest-validate "^26.0.1"
+ jest-watcher "^26.0.1"
micromatch "^4.0.2"
p-each-series "^2.1.0"
- realpath-native "^2.0.0"
rimraf "^3.0.0"
slash "^3.0.0"
strip-ansi "^6.0.0"
-"@jest/environment@^25.2.6":
- version "25.2.6"
- resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-25.2.6.tgz#8f7931e79abd81893ce88b7306f0cc4744835000"
- integrity sha512-17WIw+wCb9drRNFw1hi8CHah38dXVdOk7ga9exThhGtXlZ9mK8xH4DjSB9uGDGXIWYSHmrxoyS6KJ7ywGr7bzg==
+"@jest/environment@^26.0.1":
+ version "26.0.1"
+ resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-26.0.1.tgz#82f519bba71959be9b483675ee89de8c8f72a5c8"
+ integrity sha512-xBDxPe8/nx251u0VJ2dFAFz2H23Y98qdIaNwnMK6dFQr05jc+Ne/2np73lOAx+5mSBO/yuQldRrQOf6hP1h92g==
dependencies:
- "@jest/fake-timers" "^25.2.6"
- "@jest/types" "^25.2.6"
- jest-mock "^25.2.6"
+ "@jest/fake-timers" "^26.0.1"
+ "@jest/types" "^26.0.1"
+ jest-mock "^26.0.1"
-"@jest/fake-timers@^25.2.6":
- version "25.2.6"
- resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-25.2.6.tgz#239dbde3f56badf7d05bcf888f5d669296077cad"
- integrity sha512-A6qtDIA2zg/hVgUJJYzQSHFBIp25vHdSxW/s4XmTJAYxER6eL0NQdQhe4+232uUSviKitubHGXXirt5M7blPiA==
+"@jest/fake-timers@^26.0.1":
+ version "26.0.1"
+ resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-26.0.1.tgz#f7aeff13b9f387e9d0cac9a8de3bba538d19d796"
+ integrity sha512-Oj/kCBnTKhm7CR+OJSjZty6N1bRDr9pgiYQr4wY221azLz5PHi08x/U+9+QpceAYOWheauLP8MhtSVFrqXQfhg==
dependencies:
- "@jest/types" "^25.2.6"
- jest-message-util "^25.2.6"
- jest-mock "^25.2.6"
- jest-util "^25.2.6"
- lolex "^5.0.0"
+ "@jest/types" "^26.0.1"
+ "@sinonjs/fake-timers" "^6.0.1"
+ jest-message-util "^26.0.1"
+ jest-mock "^26.0.1"
+ jest-util "^26.0.1"
-"@jest/reporters@^25.2.6":
- version "25.2.6"
- resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-25.2.6.tgz#6d87e40fb15adb69e22bb83aa02a4d88b2253b5f"
- integrity sha512-DRMyjaxcd6ZKctiXNcuVObnPwB1eUs7xrUVu0J2V0p5/aZJei5UM9GL3s/bmN4hRV8Mt3zXh+/9X2o0Q4ClZIA==
+"@jest/globals@^26.0.1":
+ version "26.0.1"
+ resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-26.0.1.tgz#3f67b508a7ce62b6e6efc536f3d18ec9deb19a9c"
+ integrity sha512-iuucxOYB7BRCvT+TYBzUqUNuxFX1hqaR6G6IcGgEqkJ5x4htNKo1r7jk1ji9Zj8ZMiMw0oB5NaA7k5Tx6MVssA==
+ dependencies:
+ "@jest/environment" "^26.0.1"
+ "@jest/types" "^26.0.1"
+ expect "^26.0.1"
+
+"@jest/reporters@^26.0.1":
+ version "26.0.1"
+ resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-26.0.1.tgz#14ae00e7a93e498cec35b0c00ab21c375d9b078f"
+ integrity sha512-NWWy9KwRtE1iyG/m7huiFVF9YsYv/e+mbflKRV84WDoJfBqUrNRyDbL/vFxQcYLl8IRqI4P3MgPn386x76Gf2g==
dependencies:
"@bcoe/v8-coverage" "^0.2.3"
- "@jest/console" "^25.2.6"
- "@jest/test-result" "^25.2.6"
- "@jest/transform" "^25.2.6"
- "@jest/types" "^25.2.6"
- chalk "^3.0.0"
+ "@jest/console" "^26.0.1"
+ "@jest/test-result" "^26.0.1"
+ "@jest/transform" "^26.0.1"
+ "@jest/types" "^26.0.1"
+ chalk "^4.0.0"
collect-v8-coverage "^1.0.0"
exit "^0.1.2"
glob "^7.1.2"
+ graceful-fs "^4.2.4"
istanbul-lib-coverage "^3.0.0"
istanbul-lib-instrument "^4.0.0"
istanbul-lib-report "^3.0.0"
istanbul-lib-source-maps "^4.0.0"
- istanbul-reports "^3.0.0"
- jest-haste-map "^25.2.6"
- jest-resolve "^25.2.6"
- jest-util "^25.2.6"
- jest-worker "^25.2.6"
+ istanbul-reports "^3.0.2"
+ jest-haste-map "^26.0.1"
+ jest-resolve "^26.0.1"
+ jest-util "^26.0.1"
+ jest-worker "^26.0.0"
slash "^3.0.0"
source-map "^0.6.0"
- string-length "^3.1.0"
+ string-length "^4.0.1"
terminal-link "^2.0.0"
- v8-to-istanbul "^4.0.1"
+ v8-to-istanbul "^4.1.3"
optionalDependencies:
- node-notifier "^6.0.0"
+ node-notifier "^7.0.0"
"@jest/source-map@^24.9.0":
version "24.9.0"
@@ -1327,13 +1489,13 @@
graceful-fs "^4.1.15"
source-map "^0.6.0"
-"@jest/source-map@^25.2.6":
- version "25.2.6"
- resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-25.2.6.tgz#0ef2209514c6d445ebccea1438c55647f22abb4c"
- integrity sha512-VuIRZF8M2zxYFGTEhkNSvQkUKafQro4y+mwUxy5ewRqs5N/ynSFUODYp3fy1zCnbCMy1pz3k+u57uCqx8QRSQQ==
+"@jest/source-map@^26.0.0":
+ version "26.0.0"
+ resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-26.0.0.tgz#fd7706484a7d3faf7792ae29783933bbf48a4749"
+ integrity sha512-S2Z+Aj/7KOSU2TfW0dyzBze7xr95bkm5YXNUqqCek+HE0VbNNSNzrRwfIi5lf7wvzDTSS0/ib8XQ1krFNyYgbQ==
dependencies:
callsites "^3.0.0"
- graceful-fs "^4.2.3"
+ graceful-fs "^4.2.4"
source-map "^0.6.0"
"@jest/test-result@^24.9.0":
@@ -1345,44 +1507,44 @@
"@jest/types" "^24.9.0"
"@types/istanbul-lib-coverage" "^2.0.0"
-"@jest/test-result@^25.2.6":
- version "25.2.6"
- resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-25.2.6.tgz#f6082954955313eb96f6cabf9fb14f8017826916"
- integrity sha512-gmGgcF4qz/pkBzyfJuVHo2DA24kIgVQ5Pf/VpW4QbyMLSegi8z+9foSZABfIt5se6k0fFj/3p/vrQXdaOgit0w==
+"@jest/test-result@^26.0.1":
+ version "26.0.1"
+ resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-26.0.1.tgz#1ffdc1ba4bc289919e54b9414b74c9c2f7b2b718"
+ integrity sha512-oKwHvOI73ICSYRPe8WwyYPTtiuOAkLSbY8/MfWF3qDEd/sa8EDyZzin3BaXTqufir/O/Gzea4E8Zl14XU4Mlyg==
dependencies:
- "@jest/console" "^25.2.6"
- "@jest/types" "^25.2.6"
+ "@jest/console" "^26.0.1"
+ "@jest/types" "^26.0.1"
"@types/istanbul-lib-coverage" "^2.0.0"
collect-v8-coverage "^1.0.0"
-"@jest/test-sequencer@^25.2.7":
- version "25.2.7"
- resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-25.2.7.tgz#e4331f7b4850e34289b9a5c8ec8a2c03b400da8f"
- integrity sha512-s2uYGOXONDSTJQcZJ9A3Zkg3hwe53RlX1HjUNqjUy3HIqwgwCKJbnAKYsORPbhxXi3ARMKA7JNBi9arsTxXoYw==
+"@jest/test-sequencer@^26.0.1":
+ version "26.0.1"
+ resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-26.0.1.tgz#b0563424728f3fe9e75d1442b9ae4c11da73f090"
+ integrity sha512-ssga8XlwfP8YjbDcmVhwNlrmblddMfgUeAkWIXts1V22equp2GMIHxm7cyeD5Q/B0ZgKPK/tngt45sH99yLLGg==
dependencies:
- "@jest/test-result" "^25.2.6"
- jest-haste-map "^25.2.6"
- jest-runner "^25.2.7"
- jest-runtime "^25.2.7"
+ "@jest/test-result" "^26.0.1"
+ graceful-fs "^4.2.4"
+ jest-haste-map "^26.0.1"
+ jest-runner "^26.0.1"
+ jest-runtime "^26.0.1"
-"@jest/transform@^25.2.6":
- version "25.2.6"
- resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-25.2.6.tgz#007fd946dedf12d2a9eb5d4154faf1991d5f61ff"
- integrity sha512-rZnjCjZf9avPOf9q/w9RUZ9Uc29JmB53uIXNJmNz04QbDMD5cR/VjfikiMKajBsXe2vnFl5sJ4RTt+9HPicauQ==
+"@jest/transform@^26.0.1":
+ version "26.0.1"
+ resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-26.0.1.tgz#0e3ecbb34a11cd4b2080ed0a9c4856cf0ceb0639"
+ integrity sha512-pPRkVkAQ91drKGbzCfDOoHN838+FSbYaEAvBXvKuWeeRRUD8FjwXkqfUNUZL6Ke48aA/1cqq/Ni7kVMCoqagWA==
dependencies:
"@babel/core" "^7.1.0"
- "@jest/types" "^25.2.6"
+ "@jest/types" "^26.0.1"
babel-plugin-istanbul "^6.0.0"
- chalk "^3.0.0"
+ chalk "^4.0.0"
convert-source-map "^1.4.0"
fast-json-stable-stringify "^2.0.0"
- graceful-fs "^4.2.3"
- jest-haste-map "^25.2.6"
- jest-regex-util "^25.2.6"
- jest-util "^25.2.6"
+ graceful-fs "^4.2.4"
+ jest-haste-map "^26.0.1"
+ jest-regex-util "^26.0.0"
+ jest-util "^26.0.1"
micromatch "^4.0.2"
pirates "^4.0.1"
- realpath-native "^2.0.0"
slash "^3.0.0"
source-map "^0.6.1"
write-file-atomic "^3.0.0"
@@ -1396,25 +1558,25 @@
"@types/istanbul-reports" "^1.1.1"
"@types/yargs" "^13.0.0"
-"@jest/types@^25.1.0":
- version "25.1.0"
- resolved "https://registry.yarnpkg.com/@jest/types/-/types-25.1.0.tgz#b26831916f0d7c381e11dbb5e103a72aed1b4395"
- integrity sha512-VpOtt7tCrgvamWZh1reVsGADujKigBUFTi19mlRjqEGsE8qH4r3s+skY33dNdXOwyZIvuftZ5tqdF1IgsMejMA==
+"@jest/types@^25.5.0":
+ version "25.5.0"
+ resolved "https://registry.yarnpkg.com/@jest/types/-/types-25.5.0.tgz#4d6a4793f7b9599fc3680877b856a97dbccf2a9d"
+ integrity sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==
dependencies:
"@types/istanbul-lib-coverage" "^2.0.0"
"@types/istanbul-reports" "^1.1.1"
"@types/yargs" "^15.0.0"
chalk "^3.0.0"
-"@jest/types@^25.2.6":
- version "25.2.6"
- resolved "https://registry.yarnpkg.com/@jest/types/-/types-25.2.6.tgz#c12f44af9bed444438091e4b59e7ed05f8659cb6"
- integrity sha512-myJTTV37bxK7+3NgKc4Y/DlQ5q92/NOwZsZ+Uch7OXdElxOg61QYc72fPYNAjlvbnJ2YvbXLamIsa9tj48BmyQ==
+"@jest/types@^26.0.1":
+ version "26.0.1"
+ resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.0.1.tgz#b78333fbd113fa7aec8d39de24f88de8686dac67"
+ integrity sha512-IbtjvqI9+eS1qFnOIEL7ggWmT+iK/U+Vde9cGWtYb/b6XgKb3X44ZAe/z9YZzoAAZ/E92m0DqrilF934IGNnQA==
dependencies:
"@types/istanbul-lib-coverage" "^2.0.0"
"@types/istanbul-reports" "^1.1.1"
"@types/yargs" "^15.0.0"
- chalk "^3.0.0"
+ chalk "^4.0.0"
"@jsdevtools/ez-spawn@^3.0.0":
version "3.0.3"
@@ -1440,6 +1602,34 @@
log-symbols "^3.0.0"
semver "^7.1.1"
+"@next/bundle-analyzer@9.4.1":
+ version "9.4.1"
+ resolved "https://registry.yarnpkg.com/@next/bundle-analyzer/-/bundle-analyzer-9.4.1.tgz#a80148db5518dd82d505f0a619cd1fe669d683f5"
+ integrity sha512-Q1AeMErdAP6Jgq4a/vQlw8BQxfLClidysEHClRqNbBlRMu+tPET/y3CUHOk1yYW1QmHICsPgQh5K0/NlMnxMqQ==
+ dependencies:
+ webpack-bundle-analyzer "3.6.1"
+
+"@next/react-dev-overlay@9.4.4":
+ version "9.4.4"
+ resolved "https://registry.yarnpkg.com/@next/react-dev-overlay/-/react-dev-overlay-9.4.4.tgz#4ae03ac839ff022b3ce5c695bd24b179d4ef459d"
+ integrity sha512-UUAa8RbH7BeWDPCkagIkR4sUsyvTPlEdFrPZ9kGjf2+p8HkLHpcVY7y+XRnNvJQs4PsAF0Plh20FBz7t54U2iQ==
+ dependencies:
+ "@babel/code-frame" "7.8.3"
+ ally.js "1.4.1"
+ anser "1.4.9"
+ chalk "4.0.0"
+ classnames "2.2.6"
+ data-uri-to-buffer "3.0.0"
+ shell-quote "1.7.2"
+ source-map "0.8.0-beta.0"
+ stacktrace-parser "0.1.10"
+ strip-ansi "6.0.0"
+
+"@next/react-refresh-utils@9.4.4":
+ version "9.4.4"
+ resolved "https://registry.yarnpkg.com/@next/react-refresh-utils/-/react-refresh-utils-9.4.4.tgz#d94cbb3b354a07f1f5b80e554d6b9e34aba99e41"
+ integrity sha512-9nKENeWRI6kQk44TbeqleIVtNLfcS3klVUepzl/ZCqzR5Bi06uqBCD277hdVvG/wL1pxA+R/pgJQLqnF5E2wPQ==
+
"@nodelib/fs.scandir@2.1.3":
version "2.1.3"
resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz#3a582bdb53804c6ba6d146579c46e52130cf4a3b"
@@ -1461,10 +1651,10 @@
"@nodelib/fs.scandir" "2.1.3"
fastq "^1.6.0"
-"@now/node@1.5.0":
- version "1.5.0"
- resolved "https://registry.yarnpkg.com/@now/node/-/node-1.5.0.tgz#a159772276ae11acf87cf2620a86204abff38f1c"
- integrity sha512-0MChNIBHsViTMPDsifTveWmMpUSUbVQYAHg9Qa8p7uF7pkfBAghyCGHSKHJVg3zxx0vVE4z+rYgaRS6xvF8qMA==
+"@now/node@1.6.1":
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/@now/node/-/node-1.6.1.tgz#d478bfbc98af05d3eae7b5b01b26d1a1c638819b"
+ integrity sha512-EdSdOS4HSJRexibxIbrKCLZZ1sc0+oaD0P7kvhf26CbXSNlrZP0Iycpb+fbO4Qc2EcmGR2am90DhoX548B5a7g==
dependencies:
"@types/node" "*"
@@ -1475,83 +1665,83 @@
dependencies:
any-observable "^0.3.0"
-"@sentry/apm@5.15.4":
- version "5.15.4"
- resolved "https://registry.yarnpkg.com/@sentry/apm/-/apm-5.15.4.tgz#59af766d2bb4c9d98eda5ddba7a32a79ecc807a2"
- integrity sha512-gcW225Jls1ShyBXMWN6zZyuVJwBOIQ63sI+URI2NSFsdpBpdpZ8yennIm+oMlSfb25Nzt9SId7TRSjPhlSbTZQ==
+"@sentry/apm@5.15.5":
+ version "5.15.5"
+ resolved "https://registry.yarnpkg.com/@sentry/apm/-/apm-5.15.5.tgz#dc0515f16405de52b3ba0d26f8a6dc2fcefe5fcc"
+ integrity sha512-2PyifsiQdvFEQhbL7tQnCKGLOO1JtZeqso3bc6ARJBvKxM77mtyMo/D0C2Uzt9sXCYiALhQ1rbB1aY8iYyglpg==
dependencies:
- "@sentry/browser" "5.15.4"
- "@sentry/hub" "5.15.4"
- "@sentry/minimal" "5.15.4"
- "@sentry/types" "5.15.4"
- "@sentry/utils" "5.15.4"
+ "@sentry/browser" "5.15.5"
+ "@sentry/hub" "5.15.5"
+ "@sentry/minimal" "5.15.5"
+ "@sentry/types" "5.15.5"
+ "@sentry/utils" "5.15.5"
tslib "^1.9.3"
-"@sentry/browser@5.15.4":
- version "5.15.4"
- resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-5.15.4.tgz#5a7e7bad088556665ed8e69bceb0e18784e4f6c7"
- integrity sha512-l/auT1HtZM3KxjCGQHYO/K51ygnlcuOrM+7Ga8gUUbU9ZXDYw6jRi0+Af9aqXKmdDw1naNxr7OCSy6NBrLWVZw==
+"@sentry/browser@5.15.5":
+ version "5.15.5"
+ resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-5.15.5.tgz#d9a51f1388581067b50d30ed9b1aed2cbb333a36"
+ integrity sha512-rqDvjk/EvogfdbZ4TiEpxM/lwpPKmq23z9YKEO4q81+1SwJNua53H60dOk9HpRU8nOJ1g84TMKT2Ov8H7sqDWA==
dependencies:
- "@sentry/core" "5.15.4"
- "@sentry/types" "5.15.4"
- "@sentry/utils" "5.15.4"
+ "@sentry/core" "5.15.5"
+ "@sentry/types" "5.15.5"
+ "@sentry/utils" "5.15.5"
tslib "^1.9.3"
-"@sentry/core@5.15.4":
- version "5.15.4"
- resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.15.4.tgz#08b617e093a636168be5aebad141d1f744217085"
- integrity sha512-9KP4NM4SqfV5NixpvAymC7Nvp36Zj4dU2fowmxiq7OIbzTxGXDhwuN/t0Uh8xiqlkpkQqSECZ1OjSFXrBldetQ==
+"@sentry/core@5.15.5":
+ version "5.15.5"
+ resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.15.5.tgz#40ea79bff5272d3fbbeeb4a98cdc59e1adbd2c92"
+ integrity sha512-enxBLv5eibBMqcWyr+vApqeix8uqkfn0iGsD3piKvoMXCgKsrfMwlb/qo9Ox0lKr71qIlZVt+9/A2vZohdgnlg==
dependencies:
- "@sentry/hub" "5.15.4"
- "@sentry/minimal" "5.15.4"
- "@sentry/types" "5.15.4"
- "@sentry/utils" "5.15.4"
+ "@sentry/hub" "5.15.5"
+ "@sentry/minimal" "5.15.5"
+ "@sentry/types" "5.15.5"
+ "@sentry/utils" "5.15.5"
tslib "^1.9.3"
-"@sentry/hub@5.15.4":
- version "5.15.4"
- resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.15.4.tgz#cb64473725a60eec63b0be58ed1143eaaf894bee"
- integrity sha512-1XJ1SVqadkbUT4zLS0TVIVl99si7oHizLmghR8LMFl5wOkGEgehHSoOydQkIAX2C7sJmaF5TZ47ORBHgkqclUg==
+"@sentry/hub@5.15.5":
+ version "5.15.5"
+ resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.15.5.tgz#f5abbcdbe656a70e2ff02c02a5a4cffa0f125935"
+ integrity sha512-zX9o49PcNIVMA4BZHe//GkbQ4Jx+nVofqU/Il32/IbwKhcpPlhGX3c1sOVQo4uag3cqd/JuQsk+DML9TKkN0Lw==
dependencies:
- "@sentry/types" "5.15.4"
- "@sentry/utils" "5.15.4"
+ "@sentry/types" "5.15.5"
+ "@sentry/utils" "5.15.5"
tslib "^1.9.3"
-"@sentry/minimal@5.15.4":
- version "5.15.4"
- resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.15.4.tgz#113f01fefb86b7830994c3dfa7ad4889ba7b2003"
- integrity sha512-GL4GZ3drS9ge+wmxkHBAMEwulaE7DMvAEfKQPDAjg2p3MfcCMhAYfuY4jJByAC9rg9OwBGGehz7UmhWMFjE0tw==
+"@sentry/minimal@5.15.5":
+ version "5.15.5"
+ resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.15.5.tgz#a0e4e071f01d9c4d808094ae7203f6c4cca9348a"
+ integrity sha512-zQkkJ1l9AjmU/Us5IrOTzu7bic4sTPKCatptXvLSTfyKW7N6K9MPIIFeSpZf9o1yM2sRYdK7GV08wS2eCT3JYw==
dependencies:
- "@sentry/hub" "5.15.4"
- "@sentry/types" "5.15.4"
+ "@sentry/hub" "5.15.5"
+ "@sentry/types" "5.15.5"
tslib "^1.9.3"
-"@sentry/node@5.15.4":
- version "5.15.4"
- resolved "https://registry.yarnpkg.com/@sentry/node/-/node-5.15.4.tgz#e7bc3962d321a12b633743200165ca5f1757cb68"
- integrity sha512-OfdhNEvOJZ55ZkCUcVgctjaZkOw7rmLzO5VyDTSgevA4uLsPaTNXSAeK2GSQBXc5J0KdRpNz4sSIyuxOS4Z7Vg==
+"@sentry/node@5.15.5":
+ version "5.15.5"
+ resolved "https://registry.yarnpkg.com/@sentry/node/-/node-5.15.5.tgz#f64cfcf8770cc0249f48b3ef439a7efcabdcec1d"
+ integrity sha512-BK0iTOiiIM0UnydLeT/uUBY1o1Sp85aqwaQRMfZbjMCsgXERLNGvzzV68FDH1cyC1nR6dREK3Gs8bxS4S54aLQ==
dependencies:
- "@sentry/apm" "5.15.4"
- "@sentry/core" "5.15.4"
- "@sentry/hub" "5.15.4"
- "@sentry/types" "5.15.4"
- "@sentry/utils" "5.15.4"
+ "@sentry/apm" "5.15.5"
+ "@sentry/core" "5.15.5"
+ "@sentry/hub" "5.15.5"
+ "@sentry/types" "5.15.5"
+ "@sentry/utils" "5.15.5"
cookie "^0.3.1"
https-proxy-agent "^4.0.0"
lru_map "^0.3.3"
tslib "^1.9.3"
-"@sentry/types@5.15.4":
- version "5.15.4"
- resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.15.4.tgz#37f30e35b06e8e12ad1101f1beec3e9b88ca1aab"
- integrity sha512-quPHPpeAuwID48HLPmqBiyXE3xEiZLZ5D3CEbU3c3YuvvAg8qmfOOTI6z4Z3Eedi7flvYpnx3n7N3dXIEz30Eg==
+"@sentry/types@5.15.5":
+ version "5.15.5"
+ resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.15.5.tgz#16c97e464cf09bbd1d2e8ce90d130e781709076e"
+ integrity sha512-F9A5W7ucgQLJUG4LXw1ZIy4iLevrYZzbeZ7GJ09aMlmXH9PqGThm1t5LSZlVpZvUfQ2rYA8NU6BdKJSt7B5LPw==
-"@sentry/utils@5.15.4":
- version "5.15.4"
- resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-5.15.4.tgz#02865ab3c9b745656cea0ab183767ec26c96f6e6"
- integrity sha512-lO8SLBjrUDGADl0LOkd55R5oL510d/1SaI08/IBHZCxCUwI4TiYo5EPECq8mrj3XGfgCyq9osw33bymRlIDuSQ==
+"@sentry/utils@5.15.5":
+ version "5.15.5"
+ resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-5.15.5.tgz#dec1d4c79037c4da08b386f5d34409234dcbfb15"
+ integrity sha512-Nl9gl/MGnzSkuKeo3QaefoD/OJrFLB8HmwQ7HUbTXb6E7yyEzNKAQMHXGkwNAjbdYyYbd42iABP6Y5F/h39NtA==
dependencies:
- "@sentry/types" "5.15.4"
+ "@sentry/types" "5.15.5"
tslib "^1.9.3"
"@sinonjs/commons@^1.7.0":
@@ -1561,15 +1751,22 @@
dependencies:
type-detect "4.0.8"
-"@svgr/babel-plugin-add-jsx-attribute@^5.0.1":
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.0.1.tgz#744853b6533e83ce712d41d1873200b3e0a0b6fc"
- integrity sha512-av76JbSudaN2CUOGuKQp5BVqLFidtojg4ApRTg1PBOVsskXK2ORwKnBYhIu0JLA6ynmuNDprlHNCD6IwLiYidw==
+"@sinonjs/fake-timers@^6.0.1":
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz#293674fccb3262ac782c7aadfdeca86b10c75c40"
+ integrity sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==
+ dependencies:
+ "@sinonjs/commons" "^1.7.0"
-"@svgr/babel-plugin-remove-jsx-attribute@^5.0.1":
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.0.1.tgz#5df0ccf99e4745e105f76059025986d4da8443cd"
- integrity sha512-oXyByaDQEK4Ut/eC75698MDKnaadbWmp/LS2w22cZAaoObCkkiwYYgZTZ+bvb3moo//AxvKkBtNrlz6+xBb9ZQ==
+"@svgr/babel-plugin-add-jsx-attribute@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz#81ef61947bb268eb9d50523446f9c638fb355906"
+ integrity sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==
+
+"@svgr/babel-plugin-remove-jsx-attribute@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz#6b2c770c95c874654fd5e1d5ef475b78a0a962ef"
+ integrity sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==
"@svgr/babel-plugin-remove-jsx-empty-expression@^5.0.1":
version "5.0.1"
@@ -1581,108 +1778,108 @@
resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz#0b221fc57f9fcd10e91fe219e2cd0dd03145a897"
integrity sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==
-"@svgr/babel-plugin-svg-dynamic-title@^5.0.1":
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.0.1.tgz#221abd28898130c6466b018bf19e905648100c38"
- integrity sha512-IbFiDBvq5WpANPndjEom1Y9k1pHCNfJs87jCN1Lt8NEA7yrNVPSoAjBVmmfi0aVBERfp8IT/lgjn2a/S85lXGg==
-
-"@svgr/babel-plugin-svg-em-dimensions@^5.0.1":
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.0.1.tgz#bd77607634deb1d970dbd8c0b1397b41e28c59dd"
- integrity sha512-7kL9LtqCm1ca+zAbBsrD4ME3EQeVcRxkdrf2GsbKPgkzWJ+399vS4VqCP462+WvFRbG13jSwpNCrvhekdyvXsA==
-
-"@svgr/babel-plugin-transform-react-native-svg@^5.0.1":
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.0.1.tgz#8c593dcfe17179f5a87734a76c9174aac91d2a2b"
- integrity sha512-ITG1jJ0zHQ4yft6ISQqlMW4fHIzsrSB/FmrMxAcJtkTjh9M2/9M8wfKxQya9NnTfZ5WMSlQjXMQNZmGQsuxRrw==
-
-"@svgr/babel-plugin-transform-svg-component@^5.3.0":
- version "5.3.0"
- resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.3.0.tgz#a75ab70cba06c3cdd0a5b2de9ea81466e2ffdb06"
- integrity sha512-x+XT8iqm81xRado8GLqDg5eUni8KbgTooqLvVZNUey2s8QBWXy7RbzJP6VX5WB9LgfbA7en6ka1/GfRUHyNhWg==
-
-"@svgr/babel-preset@^5.3.0":
- version "5.3.0"
- resolved "https://registry.yarnpkg.com/@svgr/babel-preset/-/babel-preset-5.3.0.tgz#98f4c79b13b496fa55645b92448e59afd565f57b"
- integrity sha512-VQPa3czStMhaDdOpGtzyVwWMZPbe437ocTGtXoa8R/iLTDYLD9BwyQLZZMPglKRBVaWJxqAVA8kbyFJQ9ahVdw==
- dependencies:
- "@svgr/babel-plugin-add-jsx-attribute" "^5.0.1"
- "@svgr/babel-plugin-remove-jsx-attribute" "^5.0.1"
+"@svgr/babel-plugin-svg-dynamic-title@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz#139b546dd0c3186b6e5db4fefc26cb0baea729d7"
+ integrity sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==
+
+"@svgr/babel-plugin-svg-em-dimensions@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz#6543f69526632a133ce5cabab965deeaea2234a0"
+ integrity sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==
+
+"@svgr/babel-plugin-transform-react-native-svg@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz#00bf9a7a73f1cad3948cdab1f8dfb774750f8c80"
+ integrity sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==
+
+"@svgr/babel-plugin-transform-svg-component@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.4.0.tgz#a2212b4d018e6075a058bb7e220a66959ef7a03c"
+ integrity sha512-zLl4Fl3NvKxxjWNkqEcpdSOpQ3LGVH2BNFQ6vjaK6sFo2IrSznrhURIPI0HAphKiiIwNYjAfE0TNoQDSZv0U9A==
+
+"@svgr/babel-preset@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@svgr/babel-preset/-/babel-preset-5.4.0.tgz#da21854643e1c4ad2279239baa7d5a8b128c1f15"
+ integrity sha512-Gyx7cCxua04DBtyILTYdQxeO/pwfTBev6+eXTbVbxe4HTGhOUW6yo7PSbG2p6eJMl44j6XSequ0ZDP7bl0nu9A==
+ dependencies:
+ "@svgr/babel-plugin-add-jsx-attribute" "^5.4.0"
+ "@svgr/babel-plugin-remove-jsx-attribute" "^5.4.0"
"@svgr/babel-plugin-remove-jsx-empty-expression" "^5.0.1"
"@svgr/babel-plugin-replace-jsx-attribute-value" "^5.0.1"
- "@svgr/babel-plugin-svg-dynamic-title" "^5.0.1"
- "@svgr/babel-plugin-svg-em-dimensions" "^5.0.1"
- "@svgr/babel-plugin-transform-react-native-svg" "^5.0.1"
- "@svgr/babel-plugin-transform-svg-component" "^5.3.0"
-
-"@svgr/cli@5.3.0":
- version "5.3.0"
- resolved "https://registry.yarnpkg.com/@svgr/cli/-/cli-5.3.0.tgz#377cb63e3d633810b44e59d56eb1b68e1d1bb6ec"
- integrity sha512-pQe/Rw8IHXUtx/3Iq8YNWchKoDcLEpMFdcu1SZl1Mc+UJV/Y9IPe1SDDyO+AdfIB+BMYnOLo9xhXyC+Ozhksxg==
- dependencies:
- "@svgr/core" "^5.3.0"
- "@svgr/plugin-jsx" "^5.3.0"
- "@svgr/plugin-prettier" "^5.3.0"
- "@svgr/plugin-svgo" "^5.3.0"
- camelcase "^5.3.1"
- chalk "^3.0.0"
- commander "^5.0.0"
+ "@svgr/babel-plugin-svg-dynamic-title" "^5.4.0"
+ "@svgr/babel-plugin-svg-em-dimensions" "^5.4.0"
+ "@svgr/babel-plugin-transform-react-native-svg" "^5.4.0"
+ "@svgr/babel-plugin-transform-svg-component" "^5.4.0"
+
+"@svgr/cli@5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@svgr/cli/-/cli-5.4.0.tgz#6eb153ff460a67f82fb833959d38e59749c38188"
+ integrity sha512-Wc2GtpQzk+drx8D5ZIC9cDd/dkdrhK2OwyqvBanWMc92perDmdCDwf4scMWrO/T9I5fMMg8BFRs9ifUvFIl6JA==
+ dependencies:
+ "@svgr/core" "^5.4.0"
+ "@svgr/plugin-jsx" "^5.4.0"
+ "@svgr/plugin-prettier" "^5.4.0"
+ "@svgr/plugin-svgo" "^5.4.0"
+ camelcase "^6.0.0"
+ chalk "^4.0.0"
+ commander "^5.1.0"
dashify "^2.0.0"
glob "^7.1.4"
output-file-sync "^2.0.1"
-"@svgr/core@^5.3.0":
- version "5.3.0"
- resolved "https://registry.yarnpkg.com/@svgr/core/-/core-5.3.0.tgz#fc49d29596daffd739528d76cf9de26ac0548094"
- integrity sha512-ijUF5bLsK4xA0hmg9GEEeFC35LPYcIkONmQLCgjW3NDTf0eRBgCCm+ZZFdeDTYnkNeh+fFOfHEkv7U3tEbJnZQ==
+"@svgr/core@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@svgr/core/-/core-5.4.0.tgz#655378ee43679eb94fee3d4e1976e38252dff8e7"
+ integrity sha512-hWGm1DCCvd4IEn7VgDUHYiC597lUYhFau2lwJBYpQWDirYLkX4OsXu9IslPgJ9UpP7wsw3n2Ffv9sW7SXJVfqQ==
dependencies:
- "@svgr/plugin-jsx" "^5.3.0"
- camelcase "^5.3.1"
+ "@svgr/plugin-jsx" "^5.4.0"
+ camelcase "^6.0.0"
cosmiconfig "^6.0.0"
-"@svgr/hast-util-to-babel-ast@^5.0.1":
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.0.1.tgz#0dce60a955465f0bd86bcd9c523b21472d6531d3"
- integrity sha512-G7UHNPNhLyDK5p6RJvSh4TRpHszTxG8jPp5lAxC6Ez6O6rj1plEAjrCDdYj50mvilUuT9IKjqn87F8+agpKaSw==
+"@svgr/hast-util-to-babel-ast@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.4.0.tgz#bb5d002e428f510aa5b53ec0a02377a95b367715"
+ integrity sha512-+U0TZZpPsP2V1WvVhqAOSTk+N+CjYHdZx+x9UBa1eeeZDXwH8pt0CrQf2+SvRl/h2CAPRFkm+Ey96+jKP8Bsgg==
dependencies:
- "@babel/types" "^7.4.4"
+ "@babel/types" "^7.9.5"
-"@svgr/plugin-jsx@^5.3.0":
- version "5.3.0"
- resolved "https://registry.yarnpkg.com/@svgr/plugin-jsx/-/plugin-jsx-5.3.0.tgz#6452bc3adab0d6e83d211c49bd5d539f93c28ca8"
- integrity sha512-duJFQ99ZvIXvxJmEhV/8GoKnPrAMOuK7k+lVyepRYHmR0BZr33RupjpApdleU29teXcJO5oMHYsviiHRCQcU9Q==
+"@svgr/plugin-jsx@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@svgr/plugin-jsx/-/plugin-jsx-5.4.0.tgz#ab47504c55615833c6db70fca2d7e489f509787c"
+ integrity sha512-SGzO4JZQ2HvGRKDzRga9YFSqOqaNrgLlQVaGvpZ2Iht2gwRp/tq+18Pvv9kS9ZqOMYgyix2LLxZMY1LOe9NPqw==
dependencies:
"@babel/core" "^7.7.5"
- "@svgr/babel-preset" "^5.3.0"
- "@svgr/hast-util-to-babel-ast" "^5.0.1"
+ "@svgr/babel-preset" "^5.4.0"
+ "@svgr/hast-util-to-babel-ast" "^5.4.0"
svg-parser "^2.0.2"
-"@svgr/plugin-prettier@^5.3.0":
- version "5.3.0"
- resolved "https://registry.yarnpkg.com/@svgr/plugin-prettier/-/plugin-prettier-5.3.0.tgz#4ae6395b7aa56473c789421d7fc6cf502877fd96"
- integrity sha512-TyIgFuox1L+tm57cBC6CzTrQ/5Uw0cuuu+/NXv3zN84pOaugLHCoaF56raYL23SUqOQnUaxuJFEE8YvbXm/tJQ==
+"@svgr/plugin-prettier@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@svgr/plugin-prettier/-/plugin-prettier-5.4.0.tgz#64039e118e3cc026e7754e943f3d044d81611561"
+ integrity sha512-Ml/NdLHy4hLhPSNNABTduRvex7r8v08fmv1FbcB6dMUMHfsPNkOFJUmGbv/c/6KOvEX06Pnh+R8BHBJlH13v/w==
dependencies:
merge-deep "^3.0.2"
- prettier "^2.0.1 || ^1.19.1"
+ prettier "^2.0.5"
-"@svgr/plugin-svgo@^5.3.0":
- version "5.3.0"
- resolved "https://registry.yarnpkg.com/@svgr/plugin-svgo/-/plugin-svgo-5.3.0.tgz#a33d45ecd64cb2c1adaab9196faddc10022552a7"
- integrity sha512-rQw558t/pPPA/aWrazLDt3xIuxh9zDuUcQUeR8EO6yiYftkjT7My1MLPz1pha1LhkJCR1ug83fp+TPRYkV9EIQ==
+"@svgr/plugin-svgo@^5.4.0":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@svgr/plugin-svgo/-/plugin-svgo-5.4.0.tgz#45d9800b7099a6f7b4d85ebac89ab9abe8592f64"
+ integrity sha512-3Cgv3aYi1l6SHyzArV9C36yo4kgwVdF3zPQUC6/aCDUeXAofDYwE5kk3e3oT5ZO2a0N3lB+lLGvipBG6lnG8EA==
dependencies:
cosmiconfig "^6.0.0"
merge-deep "^3.0.2"
svgo "^1.2.2"
-"@types/amplitude-js@5.8.0":
- version "5.8.0"
- resolved "https://registry.yarnpkg.com/@types/amplitude-js/-/amplitude-js-5.8.0.tgz#6e4047b0021e73246c00ae6119b47b28ac73859a"
- integrity sha512-thNXK9K5SDOs21qbYgbRIofIgSV/8PVRmQ5fWD2BcRfat6XJVXRJ69b7P6roAHxMsy6ugd096SsWYjKork+GUA==
+"@types/amplitude-js@5.11.0":
+ version "5.11.0"
+ resolved "https://registry.yarnpkg.com/@types/amplitude-js/-/amplitude-js-5.11.0.tgz#2d45f43e701d52407a5b57547a42d321c6d3c1b4"
+ integrity sha512-d+ELEiXtU8H/wVtmGPxTiPuyZW5HWEdKrOWGO99Y1eOvJuSLw3g/b6xlB9+snUOW5P8AYDhCHh8TzT6Vsz8jzQ==
-"@types/babel__core@^7.1.0":
- version "7.1.6"
- resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.6.tgz#16ff42a5ae203c9af1c6e190ed1f30f83207b610"
- integrity sha512-tTnhWszAqvXnhW7m5jQU9PomXSiKXk2sFxpahXvI20SZKu9ylPi8WtIxueZ6ehDWikPT0jeFujMj3X4ZHuf3Tg==
+"@types/babel__core@^7.1.7":
+ version "7.1.7"
+ resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.7.tgz#1dacad8840364a57c98d0dd4855c6dd3752c6b89"
+ integrity sha512-RL62NqSFPCDK2FM1pSDH0scHpJvsXtZNiYlMB73DgPBaG1E38ZYVL+ei5EkWRbr+KC4YNiAUNBnRj+bgwpgjMw==
dependencies:
"@babel/parser" "^7.1.0"
"@babel/types" "^7.0.0"
@@ -1811,6 +2008,13 @@
"@types/minimatch" "*"
"@types/node" "*"
+"@types/graceful-fs@^4.1.2":
+ version "4.1.3"
+ resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.3.tgz#039af35fe26bec35003e8d86d2ee9c586354348f"
+ integrity sha512-AiHRaEB50LQg0pZmm659vNBb9f4SJ0qrAnteuzhSeAUcJKxoYgEnprg/83kppCnc2zvtCKbdZry1a5pVY3lOTQ==
+ dependencies:
+ "@types/node" "*"
+
"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1":
version "2.0.1"
resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz#42995b446db9a48a11a07ec083499a860e9138ff"
@@ -1831,13 +2035,13 @@
"@types/istanbul-lib-coverage" "*"
"@types/istanbul-lib-report" "*"
-"@types/jest@25.1.5":
- version "25.1.5"
- resolved "https://registry.yarnpkg.com/@types/jest/-/jest-25.1.5.tgz#3c3c078b3cd19c6403e21277f1cfdc0ce5ebf9a9"
- integrity sha512-FBmb9YZHoEOH56Xo/PIYtfuyTL0IzJLM3Hy0Sqc82nn5eqqXgefKcl/eMgChM8eSGVfoDee8cdlj7K74T8a6Yg==
+"@types/jest@25.2.2":
+ version "25.2.2"
+ resolved "https://registry.yarnpkg.com/@types/jest/-/jest-25.2.2.tgz#6a752e7a00f69c3e790ea00c345029d5cefa92bf"
+ integrity sha512-aRctFbG8Pb7DSLzUt/fEtL3q/GKb9mretFuYhRub2J0q6NhzBYbx9HTQzHrWgBNIxYOlxGNVe6Z54cpbUt+Few==
dependencies:
- jest-diff "25.1.0"
- pretty-format "25.1.0"
+ jest-diff "^25.2.1"
+ pretty-format "^25.2.1"
"@types/jquery@*":
version "3.3.34"
@@ -1853,10 +2057,10 @@
dependencies:
"@types/sizzle" "*"
-"@types/js-cookie@2.2.5":
- version "2.2.5"
- resolved "https://registry.yarnpkg.com/@types/js-cookie/-/js-cookie-2.2.5.tgz#38dfaacae8623b37cc0b0d27398e574e3fc28b1e"
- integrity sha512-cpmwBRcHJmmZx0OGU7aPVwGWGbs4iKwVYchk9iuMtxNCA2zorwdaTz4GkLgs2WGxiRZRFKnV1k6tRUHX7tBMxg==
+"@types/js-cookie@2.2.6":
+ version "2.2.6"
+ resolved "https://registry.yarnpkg.com/@types/js-cookie/-/js-cookie-2.2.6.tgz#f1a1cb35aff47bc5cfb05cb0c441ca91e914c26f"
+ integrity sha512-+oY0FDTO2GYKEV0YPvSshGq9t7YozVkgvXLty7zogQNuCxBhT9/3INX9Q7H1aRZ4SUDRXAKlJuA4EA5nTt7SNw==
"@types/json-schema@^7.0.3":
version "7.0.4"
@@ -1875,6 +2079,13 @@
dependencies:
"@types/lodash" "*"
+"@types/lodash.filter@4.6.6":
+ version "4.6.6"
+ resolved "https://registry.yarnpkg.com/@types/lodash.filter/-/lodash.filter-4.6.6.tgz#34d93d3d40b2585384a12093eb4bdf2a26cbb829"
+ integrity sha512-K9oEglaInmu7pnQnZYdciNePpKe0W7O9yssnCza9mLjpq5N5Ju8RIMwTvp9tovb8V5yemxFTJqHzG+tIkAl1xw==
+ dependencies:
+ "@types/lodash" "*"
+
"@types/lodash.find@4.6.6":
version "4.6.6"
resolved "https://registry.yarnpkg.com/@types/lodash.find/-/lodash.find-4.6.6.tgz#9b298092ff15642ddf0c6b04d9e0a2f3c49ac845"
@@ -1917,6 +2128,13 @@
dependencies:
"@types/lodash" "*"
+"@types/lodash.kebabcase@4.1.6":
+ version "4.1.6"
+ resolved "https://registry.yarnpkg.com/@types/lodash.kebabcase/-/lodash.kebabcase-4.1.6.tgz#07b07aeca6c0647836de46f87a3cdfff72166c8e"
+ integrity sha512-+RAD9pCAa8kuVyCYTeDNiwBXwD/0u0p+hos3NSqD+tXTjJextbfF3farfYB+ssAKgEssoewXEtBsfwBpsI7gsA==
+ dependencies:
+ "@types/lodash" "*"
+
"@types/lodash.map@4.6.13":
version "4.6.13"
resolved "https://registry.yarnpkg.com/@types/lodash.map/-/lodash.map-4.6.13.tgz#7d776611d4c0345e48cfdfe466d7b291b31d1d13"
@@ -1931,6 +2149,27 @@
dependencies:
"@types/lodash" "*"
+"@types/lodash.size@4.2.6":
+ version "4.2.6"
+ resolved "https://registry.yarnpkg.com/@types/lodash.size/-/lodash.size-4.2.6.tgz#3503299c541e5f967be274e2d97ee831de29d3af"
+ integrity sha512-IY1r3hxyqxg0cclYIpygQDV61hFsyTR1904FxTj9kDAAIuOsftE88vNHUv3WLOApsWZMSlyiMJtH6928NHfN+Q==
+ dependencies:
+ "@types/lodash" "*"
+
+"@types/lodash.some@4.6.6":
+ version "4.6.6"
+ resolved "https://registry.yarnpkg.com/@types/lodash.some/-/lodash.some-4.6.6.tgz#6b79f350f7031aee8d93edde3e5b5e8147d9b74b"
+ integrity sha512-7MNJlK+WU2udp6QhxWDp3e05cjYq1v34JMpVVucal7XcZSlC1mZS3Gvdo/z/rL9CZgXXhoGvXerkfT+B8AfZEg==
+ dependencies:
+ "@types/lodash" "*"
+
+"@types/lodash.startswith@4.2.6":
+ version "4.2.6"
+ resolved "https://registry.yarnpkg.com/@types/lodash.startswith/-/lodash.startswith-4.2.6.tgz#a2258131627cfa2a7a066cfbb11e42f27e21cd49"
+ integrity sha512-yE8EVX/6MJ8woAKpR04s+77W8Dd1oQgYSfK6LjqYwz47iXms9JezCbikCgQyvmDWP8du8OYMl4Q64xMOkaM9vg==
+ dependencies:
+ "@types/lodash" "*"
+
"@types/lodash.xorby@4.7.6":
version "4.7.6"
resolved "https://registry.yarnpkg.com/@types/lodash.xorby/-/lodash.xorby-4.7.6.tgz#709c3d6994cc95fc0a2892cb60c7cbee5259f8d0"
@@ -1953,6 +2192,11 @@
resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d"
integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==
+"@types/minimist@^1.2.0":
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.0.tgz#69a23a3ad29caf0097f06eda59b361ee2f0639f6"
+ integrity sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY=
+
"@types/mocha@5.2.7":
version "5.2.7"
resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-5.2.7.tgz#315d570ccb56c53452ff8638738df60726d5b6ea"
@@ -1963,6 +2207,11 @@
resolved "https://registry.yarnpkg.com/@types/node/-/node-13.7.6.tgz#cb734a7c191472ae6a2b3a502b4dfffcea974113"
integrity sha512-eyK7MWD0R1HqVTp+PtwRgFeIsemzuj4gBFSQxfPHY5iMjS7474e5wq+VFgTcdpyHeNxyKSaetYAjdMLJlKoWqA==
+"@types/normalize-package-data@^2.4.0":
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e"
+ integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==
+
"@types/object-assign@^4.0.30":
version "4.0.30"
resolved "https://registry.yarnpkg.com/@types/object-assign/-/object-assign-4.0.30.tgz#8949371d5a99f4381ee0f1df0a9b7a187e07e652"
@@ -1973,10 +2222,17 @@
resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0"
integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==
-"@types/prettier@^1.19.0":
- version "1.19.1"
- resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-1.19.1.tgz#33509849f8e679e4add158959fdb086440e9553f"
- integrity sha512-5qOlnZscTn4xxM5MeGXAMOsIOIKIbh9e85zJWfBRVPlRMEVawzoPhINYbRGkBZCI8LxvBe7tJCdWiarA99OZfQ==
+"@types/popper.js@1.11.0":
+ version "1.11.0"
+ resolved "https://registry.yarnpkg.com/@types/popper.js/-/popper.js-1.11.0.tgz#217a9231953ded26b15a6264f9942e963a8f6e69"
+ integrity sha512-1SDEDA6VacGAqDOmwbMcJD39bg0sHbM8y6LHOV3CMxyDBRrwTodRyIIj5f4eR/nlgpeyPoG1fKXqbkRmg+5yRg==
+ dependencies:
+ popper.js "*"
+
+"@types/prettier@^2.0.0":
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.0.0.tgz#dc85454b953178cc6043df5208b9e949b54a3bc4"
+ integrity sha512-/rM+sWiuOZ5dvuVzV37sUuklsbg+JPOP8d+nNFlo2ZtfpzPiPvh1/gc8liWOLBqe+sR+ZM7guPaIcTt6UZTo7Q==
"@types/prop-types@*":
version "15.7.3"
@@ -1993,14 +2249,22 @@
resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.3.tgz#7ee330ba7caafb98090bece86a5ee44115904c2c"
integrity sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==
-"@types/react@16.9.32":
- version "16.9.32"
- resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.32.tgz#f6368625b224604148d1ddf5920e4fefbd98d383"
- integrity sha512-fmejdp0CTH00mOJmxUPPbWCEBWPvRIL4m8r0qD+BSDUqmutPyGQCHifzMpMzdvZwROdEdL78IuZItntFWgPXHQ==
+"@types/react@*", "@types/react@16.9.35":
+ version "16.9.35"
+ resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.35.tgz#a0830d172e8aadd9bd41709ba2281a3124bbd368"
+ integrity sha512-q0n0SsWcGc8nDqH2GJfWQWUOmZSJhXV64CjVN5SvcNti3TdEaA3AH0D8DwNmMdzjMAC/78tB8nAZIlV8yTz+zQ==
dependencies:
"@types/prop-types" "*"
csstype "^2.2.0"
+"@types/reactstrap@8.4.2":
+ version "8.4.2"
+ resolved "https://registry.yarnpkg.com/@types/reactstrap/-/reactstrap-8.4.2.tgz#e7066d0e67e2924dab0a52c6aedcf922f2be53b6"
+ integrity sha512-ag4hfFqBZaeoNSSTKjCtedvdcO68QqqlBrFd3obg94JSmhgNTmHz50BvNJkf9NjSzx1yGTW4l/OyP/khLPKqww==
+ dependencies:
+ "@types/react" "*"
+ popper.js "^1.14.1"
+
"@types/serve-static@*":
version "1.13.3"
resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.3.tgz#eb7e1c41c4468272557e897e9171ded5e2ded9d1"
@@ -2044,15 +2308,15 @@
resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e"
integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==
-"@types/webfontloader@1.6.29":
- version "1.6.29"
- resolved "https://registry.yarnpkg.com/@types/webfontloader/-/webfontloader-1.6.29.tgz#c6b5f6eb8ca31d0aae6b02b6c1300349dd93ea8e"
- integrity sha512-wobuM+LvpkzU296NsFVRGDAFWw3X2XEhrLHuvV+VGSbok6aOxQcymmopUFwNB69qy5oudHt9lYC0JF+z+DxFLw==
+"@types/webfontloader@1.6.30":
+ version "1.6.30"
+ resolved "https://registry.yarnpkg.com/@types/webfontloader/-/webfontloader-1.6.30.tgz#c4fbb1177ef0aa9c8284de237c06fca3291f6c20"
+ integrity sha512-Qn9CTW2hiDNX4UxIiFWUg450wTkNYGlMUh9pz1AO7KIkcqA1Ps0gOkeWtFF8DET/iMyXH1lobmxawQ0wjC8isA==
-"@types/webpack-env@1.15.1":
- version "1.15.1"
- resolved "https://registry.yarnpkg.com/@types/webpack-env/-/webpack-env-1.15.1.tgz#c8e84705e08eed430b5e15b39c65b0944e4d1422"
- integrity sha512-eWN5ElDTeBc5lRDh95SqA8x18D0ll2pWudU3uWiyfsRmIZcmUXpEsxPU+7+BsdCrO2vfLRC629u/MmjbmF+2tA==
+"@types/webpack-env@1.15.2":
+ version "1.15.2"
+ resolved "https://registry.yarnpkg.com/@types/webpack-env/-/webpack-env-1.15.2.tgz#927997342bb9f4a5185a86e6579a0a18afc33b0a"
+ integrity sha512-67ZgZpAlhIICIdfQrB5fnDvaKFcDxpKibxznfYRVAT4mQE41Dido/3Ty+E3xGBmTogc5+0Qb8tWhna+5B8z1iQ==
"@types/yargs-parser@*":
version "15.0.0"
@@ -2078,23 +2342,23 @@
resolved "https://registry.yarnpkg.com/@types/zen-observable/-/zen-observable-0.8.0.tgz#8b63ab7f1aa5321248aad5ac890a485656dcea4d"
integrity sha512-te5lMAWii1uEJ4FwLjzdlbw3+n0FZNOvFXHxQDKeT0dilh7HOzdMzV2TrJVUzq8ep7J4Na8OUYPRLSQkJHAlrg==
-"@typescript-eslint/eslint-plugin@2.26.0":
- version "2.26.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.26.0.tgz#04c96560c8981421e5a9caad8394192363cc423f"
- integrity sha512-4yUnLv40bzfzsXcTAtZyTjbiGUXMrcIJcIMioI22tSOyAxpdXiZ4r7YQUU8Jj6XXrLz9d5aMHPQf5JFR7h27Nw==
+"@typescript-eslint/eslint-plugin@2.33.0":
+ version "2.33.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.33.0.tgz#d6c8319d5011b4783bb3d2dadf105d8bdd499bd5"
+ integrity sha512-QV6P32Btu1sCI/kTqjTNI/8OpCYyvlGjW5vD8MpTIg+HGE5S88HtT1G+880M4bXlvXj/NjsJJG0aGcVh0DdbeQ==
dependencies:
- "@typescript-eslint/experimental-utils" "2.26.0"
+ "@typescript-eslint/experimental-utils" "2.33.0"
functional-red-black-tree "^1.0.1"
regexpp "^3.0.0"
tsutils "^3.17.1"
-"@typescript-eslint/experimental-utils@2.26.0":
- version "2.26.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.26.0.tgz#063390c404d9980767d76274df386c0aa675d91d"
- integrity sha512-RELVoH5EYd+JlGprEyojUv9HeKcZqF7nZUGSblyAw1FwOGNnmQIU8kxJ69fttQvEwCsX5D6ECJT8GTozxrDKVQ==
+"@typescript-eslint/experimental-utils@2.33.0":
+ version "2.33.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.33.0.tgz#000f1e5f344fbea1323dc91cc174805d75f99a03"
+ integrity sha512-qzPM2AuxtMrRq78LwyZa8Qn6gcY8obkIrBs1ehqmQADwkYzTE1Pb4y2W+U3rE/iFkSWcWHG2LS6MJfj6SmHApg==
dependencies:
"@types/json-schema" "^7.0.3"
- "@typescript-eslint/typescript-estree" "2.26.0"
+ "@typescript-eslint/typescript-estree" "2.33.0"
eslint-scope "^5.0.0"
eslint-utils "^2.0.0"
@@ -2107,14 +2371,14 @@
"@typescript-eslint/typescript-estree" "2.21.0"
eslint-scope "^5.0.0"
-"@typescript-eslint/parser@2.26.0":
- version "2.26.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.26.0.tgz#385463615818b33acb72a25b39c03579df93d76f"
- integrity sha512-+Xj5fucDtdKEVGSh9353wcnseMRkPpEAOY96EEenN7kJVrLqy/EVwtIh3mxcUz8lsFXW1mT5nN5vvEam/a5HiQ==
+"@typescript-eslint/parser@2.33.0":
+ version "2.33.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.33.0.tgz#395c0ef229ebef883608f8632a34f0acf02b9bdd"
+ integrity sha512-AUtmwUUhJoH6yrtxZMHbRUEMsC2G6z5NSxg9KsROOGqNXasM71I8P2NihtumlWTUCRld70vqIZ6Pm4E5PAziEA==
dependencies:
"@types/eslint-visitor-keys" "^1.0.0"
- "@typescript-eslint/experimental-utils" "2.26.0"
- "@typescript-eslint/typescript-estree" "2.26.0"
+ "@typescript-eslint/experimental-utils" "2.33.0"
+ "@typescript-eslint/typescript-estree" "2.33.0"
eslint-visitor-keys "^1.1.0"
"@typescript-eslint/typescript-estree@2.21.0":
@@ -2130,17 +2394,17 @@
semver "^6.3.0"
tsutils "^3.17.1"
-"@typescript-eslint/typescript-estree@2.26.0":
- version "2.26.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.26.0.tgz#d8132cf1ee8a72234f996519a47d8a9118b57d56"
- integrity sha512-3x4SyZCLB4zsKsjuhxDLeVJN6W29VwBnYpCsZ7vIdPel9ZqLfIZJgJXO47MNUkurGpQuIBALdPQKtsSnWpE1Yg==
+"@typescript-eslint/typescript-estree@2.33.0":
+ version "2.33.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.33.0.tgz#33504c050ccafd38f397a645d4e9534d2eccbb5c"
+ integrity sha512-d8rY6/yUxb0+mEwTShCQF2zYQdLlqihukNfG9IUlLYz5y1CH6G/9XYbrxQLq3Z14RNvkCC6oe+OcFlyUpwUbkg==
dependencies:
debug "^4.1.1"
eslint-visitor-keys "^1.1.0"
glob "^7.1.6"
is-glob "^4.0.1"
lodash "^4.17.15"
- semver "^6.3.0"
+ semver "^7.3.2"
tsutils "^3.17.1"
"@unly/iso3166-1@1.0.2":
@@ -2171,152 +2435,158 @@
resolved "https://registry.yarnpkg.com/@unly/utils/-/utils-1.0.3.tgz#6fd8e361dfb977f0cfdc9ce83d7f0719dd6ae3de"
integrity sha512-QTRknIDX56FvzGcIpBum5D/oRSlX3dkZ+l1op1jsFlYCTd925OGUb991V7zsFv3ePcqFfvfqfR5cNVv+w4JAOw==
-"@webassemblyjs/ast@1.8.5":
- version "1.8.5"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.8.5.tgz#51b1c5fe6576a34953bf4b253df9f0d490d9e359"
- integrity sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==
- dependencies:
- "@webassemblyjs/helper-module-context" "1.8.5"
- "@webassemblyjs/helper-wasm-bytecode" "1.8.5"
- "@webassemblyjs/wast-parser" "1.8.5"
-
-"@webassemblyjs/floating-point-hex-parser@1.8.5":
- version "1.8.5"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz#1ba926a2923613edce496fd5b02e8ce8a5f49721"
- integrity sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==
-
-"@webassemblyjs/helper-api-error@1.8.5":
- version "1.8.5"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz#c49dad22f645227c5edb610bdb9697f1aab721f7"
- integrity sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==
-
-"@webassemblyjs/helper-buffer@1.8.5":
- version "1.8.5"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz#fea93e429863dd5e4338555f42292385a653f204"
- integrity sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==
-
-"@webassemblyjs/helper-code-frame@1.8.5":
- version "1.8.5"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz#9a740ff48e3faa3022b1dff54423df9aa293c25e"
- integrity sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==
- dependencies:
- "@webassemblyjs/wast-printer" "1.8.5"
-
-"@webassemblyjs/helper-fsm@1.8.5":
- version "1.8.5"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz#ba0b7d3b3f7e4733da6059c9332275d860702452"
- integrity sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==
-
-"@webassemblyjs/helper-module-context@1.8.5":
- version "1.8.5"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz#def4b9927b0101dc8cbbd8d1edb5b7b9c82eb245"
- integrity sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==
- dependencies:
- "@webassemblyjs/ast" "1.8.5"
- mamacro "^0.0.3"
-
-"@webassemblyjs/helper-wasm-bytecode@1.8.5":
- version "1.8.5"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz#537a750eddf5c1e932f3744206551c91c1b93e61"
- integrity sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==
-
-"@webassemblyjs/helper-wasm-section@1.8.5":
- version "1.8.5"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz#74ca6a6bcbe19e50a3b6b462847e69503e6bfcbf"
- integrity sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==
- dependencies:
- "@webassemblyjs/ast" "1.8.5"
- "@webassemblyjs/helper-buffer" "1.8.5"
- "@webassemblyjs/helper-wasm-bytecode" "1.8.5"
- "@webassemblyjs/wasm-gen" "1.8.5"
-
-"@webassemblyjs/ieee754@1.8.5":
- version "1.8.5"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz#712329dbef240f36bf57bd2f7b8fb9bf4154421e"
- integrity sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==
+"@webassemblyjs/ast@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964"
+ integrity sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==
+ dependencies:
+ "@webassemblyjs/helper-module-context" "1.9.0"
+ "@webassemblyjs/helper-wasm-bytecode" "1.9.0"
+ "@webassemblyjs/wast-parser" "1.9.0"
+
+"@webassemblyjs/floating-point-hex-parser@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz#3c3d3b271bddfc84deb00f71344438311d52ffb4"
+ integrity sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==
+
+"@webassemblyjs/helper-api-error@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz#203f676e333b96c9da2eeab3ccef33c45928b6a2"
+ integrity sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==
+
+"@webassemblyjs/helper-buffer@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz#a1442d269c5feb23fcbc9ef759dac3547f29de00"
+ integrity sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==
+
+"@webassemblyjs/helper-code-frame@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz#647f8892cd2043a82ac0c8c5e75c36f1d9159f27"
+ integrity sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==
+ dependencies:
+ "@webassemblyjs/wast-printer" "1.9.0"
+
+"@webassemblyjs/helper-fsm@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz#c05256b71244214671f4b08ec108ad63b70eddb8"
+ integrity sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==
+
+"@webassemblyjs/helper-module-context@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz#25d8884b76839871a08a6c6f806c3979ef712f07"
+ integrity sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==
+ dependencies:
+ "@webassemblyjs/ast" "1.9.0"
+
+"@webassemblyjs/helper-wasm-bytecode@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz#4fed8beac9b8c14f8c58b70d124d549dd1fe5790"
+ integrity sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==
+
+"@webassemblyjs/helper-wasm-section@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz#5a4138d5a6292ba18b04c5ae49717e4167965346"
+ integrity sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==
+ dependencies:
+ "@webassemblyjs/ast" "1.9.0"
+ "@webassemblyjs/helper-buffer" "1.9.0"
+ "@webassemblyjs/helper-wasm-bytecode" "1.9.0"
+ "@webassemblyjs/wasm-gen" "1.9.0"
+
+"@webassemblyjs/ieee754@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz#15c7a0fbaae83fb26143bbacf6d6df1702ad39e4"
+ integrity sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==
dependencies:
"@xtuc/ieee754" "^1.2.0"
-"@webassemblyjs/leb128@1.8.5":
- version "1.8.5"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.8.5.tgz#044edeb34ea679f3e04cd4fd9824d5e35767ae10"
- integrity sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==
+"@webassemblyjs/leb128@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.9.0.tgz#f19ca0b76a6dc55623a09cffa769e838fa1e1c95"
+ integrity sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==
dependencies:
"@xtuc/long" "4.2.2"
-"@webassemblyjs/utf8@1.8.5":
- version "1.8.5"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.8.5.tgz#a8bf3b5d8ffe986c7c1e373ccbdc2a0915f0cedc"
- integrity sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==
-
-"@webassemblyjs/wasm-edit@1.8.5":
- version "1.8.5"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz#962da12aa5acc1c131c81c4232991c82ce56e01a"
- integrity sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==
- dependencies:
- "@webassemblyjs/ast" "1.8.5"
- "@webassemblyjs/helper-buffer" "1.8.5"
- "@webassemblyjs/helper-wasm-bytecode" "1.8.5"
- "@webassemblyjs/helper-wasm-section" "1.8.5"
- "@webassemblyjs/wasm-gen" "1.8.5"
- "@webassemblyjs/wasm-opt" "1.8.5"
- "@webassemblyjs/wasm-parser" "1.8.5"
- "@webassemblyjs/wast-printer" "1.8.5"
-
-"@webassemblyjs/wasm-gen@1.8.5":
- version "1.8.5"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz#54840766c2c1002eb64ed1abe720aded714f98bc"
- integrity sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==
- dependencies:
- "@webassemblyjs/ast" "1.8.5"
- "@webassemblyjs/helper-wasm-bytecode" "1.8.5"
- "@webassemblyjs/ieee754" "1.8.5"
- "@webassemblyjs/leb128" "1.8.5"
- "@webassemblyjs/utf8" "1.8.5"
-
-"@webassemblyjs/wasm-opt@1.8.5":
- version "1.8.5"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz#b24d9f6ba50394af1349f510afa8ffcb8a63d264"
- integrity sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==
- dependencies:
- "@webassemblyjs/ast" "1.8.5"
- "@webassemblyjs/helper-buffer" "1.8.5"
- "@webassemblyjs/wasm-gen" "1.8.5"
- "@webassemblyjs/wasm-parser" "1.8.5"
-
-"@webassemblyjs/wasm-parser@1.8.5":
- version "1.8.5"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz#21576f0ec88b91427357b8536383668ef7c66b8d"
- integrity sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==
- dependencies:
- "@webassemblyjs/ast" "1.8.5"
- "@webassemblyjs/helper-api-error" "1.8.5"
- "@webassemblyjs/helper-wasm-bytecode" "1.8.5"
- "@webassemblyjs/ieee754" "1.8.5"
- "@webassemblyjs/leb128" "1.8.5"
- "@webassemblyjs/utf8" "1.8.5"
-
-"@webassemblyjs/wast-parser@1.8.5":
- version "1.8.5"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz#e10eecd542d0e7bd394f6827c49f3df6d4eefb8c"
- integrity sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==
- dependencies:
- "@webassemblyjs/ast" "1.8.5"
- "@webassemblyjs/floating-point-hex-parser" "1.8.5"
- "@webassemblyjs/helper-api-error" "1.8.5"
- "@webassemblyjs/helper-code-frame" "1.8.5"
- "@webassemblyjs/helper-fsm" "1.8.5"
+"@webassemblyjs/utf8@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.9.0.tgz#04d33b636f78e6a6813227e82402f7637b6229ab"
+ integrity sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==
+
+"@webassemblyjs/wasm-edit@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz#3fe6d79d3f0f922183aa86002c42dd256cfee9cf"
+ integrity sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==
+ dependencies:
+ "@webassemblyjs/ast" "1.9.0"
+ "@webassemblyjs/helper-buffer" "1.9.0"
+ "@webassemblyjs/helper-wasm-bytecode" "1.9.0"
+ "@webassemblyjs/helper-wasm-section" "1.9.0"
+ "@webassemblyjs/wasm-gen" "1.9.0"
+ "@webassemblyjs/wasm-opt" "1.9.0"
+ "@webassemblyjs/wasm-parser" "1.9.0"
+ "@webassemblyjs/wast-printer" "1.9.0"
+
+"@webassemblyjs/wasm-gen@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz#50bc70ec68ded8e2763b01a1418bf43491a7a49c"
+ integrity sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==
+ dependencies:
+ "@webassemblyjs/ast" "1.9.0"
+ "@webassemblyjs/helper-wasm-bytecode" "1.9.0"
+ "@webassemblyjs/ieee754" "1.9.0"
+ "@webassemblyjs/leb128" "1.9.0"
+ "@webassemblyjs/utf8" "1.9.0"
+
+"@webassemblyjs/wasm-opt@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz#2211181e5b31326443cc8112eb9f0b9028721a61"
+ integrity sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==
+ dependencies:
+ "@webassemblyjs/ast" "1.9.0"
+ "@webassemblyjs/helper-buffer" "1.9.0"
+ "@webassemblyjs/wasm-gen" "1.9.0"
+ "@webassemblyjs/wasm-parser" "1.9.0"
+
+"@webassemblyjs/wasm-parser@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz#9d48e44826df4a6598294aa6c87469d642fff65e"
+ integrity sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==
+ dependencies:
+ "@webassemblyjs/ast" "1.9.0"
+ "@webassemblyjs/helper-api-error" "1.9.0"
+ "@webassemblyjs/helper-wasm-bytecode" "1.9.0"
+ "@webassemblyjs/ieee754" "1.9.0"
+ "@webassemblyjs/leb128" "1.9.0"
+ "@webassemblyjs/utf8" "1.9.0"
+
+"@webassemblyjs/wast-parser@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz#3031115d79ac5bd261556cecc3fa90a3ef451914"
+ integrity sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==
+ dependencies:
+ "@webassemblyjs/ast" "1.9.0"
+ "@webassemblyjs/floating-point-hex-parser" "1.9.0"
+ "@webassemblyjs/helper-api-error" "1.9.0"
+ "@webassemblyjs/helper-code-frame" "1.9.0"
+ "@webassemblyjs/helper-fsm" "1.9.0"
"@xtuc/long" "4.2.2"
-"@webassemblyjs/wast-printer@1.8.5":
- version "1.8.5"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz#114bbc481fd10ca0e23b3560fa812748b0bae5bc"
- integrity sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==
+"@webassemblyjs/wast-printer@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz#4935d54c85fef637b00ce9f52377451d00d47899"
+ integrity sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==
dependencies:
- "@webassemblyjs/ast" "1.8.5"
- "@webassemblyjs/wast-parser" "1.8.5"
+ "@webassemblyjs/ast" "1.9.0"
+ "@webassemblyjs/wast-parser" "1.9.0"
"@xtuc/long" "4.2.2"
+"@welldone-software/why-did-you-render@4.2.2":
+ version "4.2.2"
+ resolved "https://registry.yarnpkg.com/@welldone-software/why-did-you-render/-/why-did-you-render-4.2.2.tgz#720128a4f626997ece1ac455a7b13f9ef10dae0a"
+ integrity sha512-v08t2WXFQdnxkPodXzbPeho3FwgrlwzjwxasN+8A1LSZnkcxJpYvOF8/z+OySqehC44JT6oPB1KEnBVMrebHdw==
+ dependencies:
+ lodash "^4"
+
"@wry/context@^0.4.0":
version "0.4.4"
resolved "https://registry.yarnpkg.com/@wry/context/-/context-0.4.4.tgz#e50f5fa1d6cfaabf2977d1fda5ae91717f8815f8"
@@ -2342,24 +2612,12 @@
resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d"
integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==
-"@zeit/next-css@1.0.1":
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/@zeit/next-css/-/next-css-1.0.1.tgz#4f784e841e7ca1b21b3468a902e2c1fa95a3e75c"
- integrity sha512-yfHPRy/ne/5SddVClsoy+fpU7e0Cs1gkWA67/wm2uIu+9rznF45yQLxHEt5dPGF3h6IiIh7ZtIgA8VV8YKq87A==
- dependencies:
- css-loader "1.0.0"
- extracted-loader "1.0.4"
- find-up "2.1.0"
- ignore-loader "0.1.2"
- mini-css-extract-plugin "0.4.3"
- postcss-loader "3.0.0"
-
"@zeit/next-source-maps@0.0.4-canary.1":
version "0.0.4-canary.1"
resolved "https://registry.yarnpkg.com/@zeit/next-source-maps/-/next-source-maps-0.0.4-canary.1.tgz#5051ff8425e5f615da2d21dd08a99284fbb63d7d"
integrity sha512-SPQCLs7ToaqzQnqXqGSCoL7KTlnOAao+1F5hy7Hkuq85TjHsUC3eeLsmVrBIraIhXG/ARHmZ0JHOesPDtBfpzw==
-abab@^2.0.0:
+abab@^2.0.3:
version "2.0.3"
resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.3.tgz#623e2075e02eb2d3f2475e49f99c91846467907a"
integrity sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg==
@@ -2369,7 +2627,7 @@ accept-language-parser@1.5.0:
resolved "https://registry.yarnpkg.com/accept-language-parser/-/accept-language-parser-1.5.0.tgz#8877c54040a8dcb59e0a07d9c1fde42298334791"
integrity sha1-iHfFQECo3LWeCgfZwf3kIpgzR5E=
-accepts@^1.3.7:
+accepts@^1.3.7, accepts@~1.3.7:
version "1.3.7"
resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd"
integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==
@@ -2377,33 +2635,33 @@ accepts@^1.3.7:
mime-types "~2.1.24"
negotiator "0.6.2"
-acorn-globals@^4.3.2:
- version "4.3.4"
- resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.4.tgz#9fa1926addc11c97308c4e66d7add0d40c3272e7"
- integrity sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==
+acorn-globals@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45"
+ integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==
dependencies:
- acorn "^6.0.1"
- acorn-walk "^6.0.1"
+ acorn "^7.1.1"
+ acorn-walk "^7.1.1"
-acorn-jsx@^5.1.0:
+acorn-jsx@^5.2.0:
version "5.2.0"
resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe"
integrity sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==
-acorn-walk@^6.0.1:
- version "6.2.0"
- resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c"
- integrity sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==
+acorn-walk@^7.1.1:
+ version "7.1.1"
+ resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.1.1.tgz#345f0dffad5c735e7373d2fec9a1023e6a44b83e"
+ integrity sha512-wdlPY2tm/9XBr7QkKlq0WQVgiuGTX6YWPyRyBviSoScBuLfTVQhvwg6wJ369GJ/1nPfTLMfnrFIfjqVg6d+jQQ==
-acorn@^6.0.1, acorn@^6.2.1:
- version "6.4.0"
- resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.0.tgz#b659d2ffbafa24baf5db1cdbb2c94a983ecd2784"
- integrity sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw==
+acorn@^6.4.1:
+ version "6.4.1"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474"
+ integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==
-acorn@^7.1.0:
- version "7.1.0"
- resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.0.tgz#949d36f2c292535da602283586c2477c57eb2d6c"
- integrity sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==
+acorn@^7.1.1:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.2.0.tgz#17ea7e40d7c8640ff54a694c889c26f31704effe"
+ integrity sha512-apwXVmYVpQ34m/i71vrApRrRKCWQnZZF1+npOD0WV5xZFfwWOmKGQ2RWlfdy9vWITsenisM8M0Qeq8agcFHNiQ==
add-dom-event-listener@^1.1.0:
version "1.1.0"
@@ -2456,21 +2714,49 @@ ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.5.5:
json-schema-traverse "^0.4.1"
uri-js "^4.2.2"
-amplitude-js@5.10.0:
- version "5.10.0"
- resolved "https://registry.yarnpkg.com/amplitude-js/-/amplitude-js-5.10.0.tgz#b5258e374a62740072dfa7bc072e5d3b20e06512"
- integrity sha512-B6CAgzdOAwkVQou/zWXpauaA89EW0nJt4G9J/1e7wdZx2Hn8SXcfM2WESHJpnTCae6fWW3wRsZxKF1LxZRThPQ==
+ajv@^6.12.0:
+ version "6.12.2"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.2.tgz#c629c5eced17baf314437918d2da88c99d5958cd"
+ integrity sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==
dependencies:
- "@amplitude/ua-parser-js" "0.7.20"
- blueimp-md5 "^2.10.0"
- query-string "5"
+ fast-deep-equal "^3.1.1"
+ fast-json-stable-stringify "^2.0.0"
+ json-schema-traverse "^0.4.1"
+ uri-js "^4.2.2"
-animate.css@3.7.2:
- version "3.7.2"
- resolved "https://registry.yarnpkg.com/animate.css/-/animate.css-3.7.2.tgz#e73e0d50e92cb1cfef1597d9b38a9481020e08ea"
- integrity sha512-0bE8zYo7C0KvgOYrSVfrzkbYk6IOTVPNqkiHg2cbyF4Pq/PXzilz4BRWA3hwEUBoMp5VBgrC29lQIZyhRWdBTw==
+ally.js@1.4.1:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/ally.js/-/ally.js-1.4.1.tgz#9fb7e6ba58efac4ee9131cb29aa9ee3b540bcf1e"
+ integrity sha1-n7fmuljvrE7pExyymqnuO1QLzx4=
+ dependencies:
+ css.escape "^1.5.0"
+ platform "1.3.3"
-ansi-escapes@^3.0.0:
+alphanum-sort@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3"
+ integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=
+
+amplitude-js@6.2.0:
+ version "6.2.0"
+ resolved "https://registry.yarnpkg.com/amplitude-js/-/amplitude-js-6.2.0.tgz#fc5d3b4d0cecd8f4b17d8d9770f13ed565aaaea0"
+ integrity sha512-l+00XubD0ZJHcWUBMzV6JrtXs1JhsqO/qGoDbYLtljtgup/cCclOAuirwQJMtYLRP6vEmstGjZtq1Ew9nWnzug==
+ dependencies:
+ "@amplitude/ua-parser-js" "0.7.20"
+ blueimp-md5 "^2.10.0"
+ query-string "5"
+
+animate.css@4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/animate.css/-/animate.css-4.1.0.tgz#dec2aabe4babfc6f6777f9a5cccd132838729b50"
+ integrity sha512-0aVcfWDeU9ykV6vjn1P67ZSs01jxoUQZCGaYbkk0SIIelIG8kUdLrIkua1+VabHfTtsSivDRMMn0ILPvZum2gw==
+
+anser@1.4.9:
+ version "1.4.9"
+ resolved "https://registry.yarnpkg.com/anser/-/anser-1.4.9.tgz#1f85423a5dcf8da4631a341665ff675b96845760"
+ integrity sha512-AI+BjTeGt2+WFk4eWcqbQ7snZpDBt8SaLlj0RT2h5xfdWaiy51OjYvqwMrNzJLGy8iOAL6nKDITWO+rd4MkYEA==
+
+ansi-escapes@^3.0.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b"
integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==
@@ -2543,14 +2829,14 @@ anymatch@^3.0.3, anymatch@~3.1.1:
normalize-path "^3.0.0"
picomatch "^2.0.4"
-apollo-boost@0.4.7:
- version "0.4.7"
- resolved "https://registry.yarnpkg.com/apollo-boost/-/apollo-boost-0.4.7.tgz#b0680ab0893e3f8b1ab1058dcfa2b00cb6440d79"
- integrity sha512-jfc3aqO0vpCV+W662EOG5gq4AH94yIsvSgAUuDvS3o/Z+8Joqn4zGC9CgLCDHusK30mFgtsEgwEe0pZoedohsQ==
+apollo-boost@0.4.9:
+ version "0.4.9"
+ resolved "https://registry.yarnpkg.com/apollo-boost/-/apollo-boost-0.4.9.tgz#ab3ba539c2ca944e6fd156583a1b1954b17a6791"
+ integrity sha512-05y5BKcDaa8w47f8d81UVwKqrAjn8uKLv6QM9fNdldoNzQ+rnOHgFlnrySUZRz9QIT3vPftQkEz2UEASp1Mi5g==
dependencies:
- apollo-cache "^1.3.4"
- apollo-cache-inmemory "^1.6.5"
- apollo-client "^2.6.7"
+ apollo-cache "^1.3.5"
+ apollo-cache-inmemory "^1.6.6"
+ apollo-client "^2.6.10"
apollo-link "^1.0.6"
apollo-link-error "^1.0.3"
apollo-link-http "^1.3.1"
@@ -2558,34 +2844,34 @@ apollo-boost@0.4.7:
ts-invariant "^0.4.0"
tslib "^1.10.0"
-apollo-cache-inmemory@1.6.5, apollo-cache-inmemory@^1.6.5:
- version "1.6.5"
- resolved "https://registry.yarnpkg.com/apollo-cache-inmemory/-/apollo-cache-inmemory-1.6.5.tgz#2ccaa3827686f6ed7fb634203dbf2b8d7015856a"
- integrity sha512-koB76JUDJaycfejHmrXBbWIN9pRKM0Z9CJGQcBzIOtmte1JhEBSuzsOUu7NQgiXKYI4iGoMREcnaWffsosZynA==
+apollo-cache-inmemory@1.6.6, apollo-cache-inmemory@^1.6.6:
+ version "1.6.6"
+ resolved "https://registry.yarnpkg.com/apollo-cache-inmemory/-/apollo-cache-inmemory-1.6.6.tgz#56d1f2a463a6b9db32e9fa990af16d2a008206fd"
+ integrity sha512-L8pToTW/+Xru2FFAhkZ1OA9q4V4nuvfoPecBM34DecAugUZEBhI2Hmpgnzq2hTKZ60LAMrlqiASm0aqAY6F8/A==
dependencies:
- apollo-cache "^1.3.4"
- apollo-utilities "^1.3.3"
+ apollo-cache "^1.3.5"
+ apollo-utilities "^1.3.4"
optimism "^0.10.0"
ts-invariant "^0.4.0"
tslib "^1.10.0"
-apollo-cache@1.3.4, apollo-cache@^1.3.4:
- version "1.3.4"
- resolved "https://registry.yarnpkg.com/apollo-cache/-/apollo-cache-1.3.4.tgz#0c9f63c793e1cd6e34c450f7668e77aff58c9a42"
- integrity sha512-7X5aGbqaOWYG+SSkCzJNHTz2ZKDcyRwtmvW4mGVLRqdQs+HxfXS4dUS2CcwrAj449se6tZ6NLUMnjko4KMt3KA==
+apollo-cache@1.3.5, apollo-cache@^1.3.5:
+ version "1.3.5"
+ resolved "https://registry.yarnpkg.com/apollo-cache/-/apollo-cache-1.3.5.tgz#9dbebfc8dbe8fe7f97ba568a224bca2c5d81f461"
+ integrity sha512-1XoDy8kJnyWY/i/+gLTEbYLnoiVtS8y7ikBr/IfmML4Qb+CM7dEEbIUOjnY716WqmZ/UpXIxTfJsY7rMcqiCXA==
dependencies:
- apollo-utilities "^1.3.3"
+ apollo-utilities "^1.3.4"
tslib "^1.10.0"
-apollo-client@2.6.8, apollo-client@^2.6.7:
- version "2.6.8"
- resolved "https://registry.yarnpkg.com/apollo-client/-/apollo-client-2.6.8.tgz#01cebc18692abf90c6b3806414e081696b0fa537"
- integrity sha512-0zvJtAcONiozpa5z5zgou83iEKkBaXhhSSXJebFHRXs100SecDojyUWKjwTtBPn9HbM6o5xrvC5mo9VQ5fgAjw==
+apollo-client@2.6.10, apollo-client@^2.6.10:
+ version "2.6.10"
+ resolved "https://registry.yarnpkg.com/apollo-client/-/apollo-client-2.6.10.tgz#86637047b51d940c8eaa771a4ce1b02df16bea6a"
+ integrity sha512-jiPlMTN6/5CjZpJOkGeUV0mb4zxx33uXWdj/xQCfAMkuNAC3HN7CvYDyMHHEzmcQ5GV12LszWoQ/VlxET24CtA==
dependencies:
"@types/zen-observable" "^0.8.0"
- apollo-cache "1.3.4"
+ apollo-cache "1.3.5"
apollo-link "^1.0.0"
- apollo-utilities "1.3.3"
+ apollo-utilities "1.3.4"
symbol-observable "^1.0.2"
ts-invariant "^0.4.0"
tslib "^1.10.0"
@@ -2609,7 +2895,25 @@ apollo-link-http-common@^0.2.15:
ts-invariant "^0.4.0"
tslib "^1.9.3"
-apollo-link-http@1.5.16, apollo-link-http@^1.3.1:
+apollo-link-http-common@^0.2.16:
+ version "0.2.16"
+ resolved "https://registry.yarnpkg.com/apollo-link-http-common/-/apollo-link-http-common-0.2.16.tgz#756749dafc732792c8ca0923f9a40564b7c59ecc"
+ integrity sha512-2tIhOIrnaF4UbQHf7kjeQA/EmSorB7+HyJIIrUjJOKBgnXwuexi8aMecRlqTIDWcyVXCeqLhUnztMa6bOH/jTg==
+ dependencies:
+ apollo-link "^1.2.14"
+ ts-invariant "^0.4.0"
+ tslib "^1.9.3"
+
+apollo-link-http@1.5.17:
+ version "1.5.17"
+ resolved "https://registry.yarnpkg.com/apollo-link-http/-/apollo-link-http-1.5.17.tgz#499e9f1711bf694497f02c51af12d82de5d8d8ba"
+ integrity sha512-uWcqAotbwDEU/9+Dm9e1/clO7hTB2kQ/94JYcGouBVLjoKmTeJTUPQKcJGpPwUjZcSqgYicbFqQSoJIW0yrFvg==
+ dependencies:
+ apollo-link "^1.2.14"
+ apollo-link-http-common "^0.2.16"
+ tslib "^1.9.3"
+
+apollo-link-http@^1.3.1:
version "1.5.16"
resolved "https://registry.yarnpkg.com/apollo-link-http/-/apollo-link-http-1.5.16.tgz#44fe760bcc2803b8a7f57fc9269173afb00f3814"
integrity sha512-IA3xA/OcrOzINRZEECI6IdhRp/Twom5X5L9jMehfzEo2AXdeRwAMlH5LuvTZHgKD8V1MBnXdM6YXawXkTDSmJw==
@@ -2628,7 +2932,27 @@ apollo-link@^1.0.0, apollo-link@^1.0.6, apollo-link@^1.2.13:
tslib "^1.9.3"
zen-observable-ts "^0.8.20"
-apollo-utilities@1.3.3, apollo-utilities@^1.3.0, apollo-utilities@^1.3.3:
+apollo-link@^1.2.14:
+ version "1.2.14"
+ resolved "https://registry.yarnpkg.com/apollo-link/-/apollo-link-1.2.14.tgz#3feda4b47f9ebba7f4160bef8b977ba725b684d9"
+ integrity sha512-p67CMEFP7kOG1JZ0ZkYZwRDa369w5PIjtMjvrQd/HnIV8FRsHRqLqK+oAZQnFa1DDdZtOtHTi+aMIW6EatC2jg==
+ dependencies:
+ apollo-utilities "^1.3.0"
+ ts-invariant "^0.4.0"
+ tslib "^1.9.3"
+ zen-observable-ts "^0.8.21"
+
+apollo-utilities@1.3.4, apollo-utilities@^1.3.4:
+ version "1.3.4"
+ resolved "https://registry.yarnpkg.com/apollo-utilities/-/apollo-utilities-1.3.4.tgz#6129e438e8be201b6c55b0f13ce49d2c7175c9cf"
+ integrity sha512-pk2hiWrCXMAy2fRPwEyhvka+mqwzeP60Jr1tRYi5xru+3ko94HI9o6lK0CT33/w4RDlxWchmdhDCrvdr+pHCig==
+ dependencies:
+ "@wry/equality" "^0.1.2"
+ fast-json-stable-stringify "^2.0.0"
+ ts-invariant "^0.4.0"
+ tslib "^1.10.0"
+
+apollo-utilities@^1.3.0:
version "1.3.3"
resolved "https://registry.yarnpkg.com/apollo-utilities/-/apollo-utilities-1.3.3.tgz#f1854715a7be80cd810bc3ac95df085815c0787c"
integrity sha512-F14aX2R/fKNYMvhuP2t9GD9fggID7zp5I96MF5QeKYWDWTrkRdHRp4+SVfXUVN+cXOaB/IebfvRtzPf25CM0zw==
@@ -2688,15 +3012,10 @@ array-back@^3.0.1:
resolved "https://registry.yarnpkg.com/array-back/-/array-back-3.1.0.tgz#b8859d7a508871c9a7b2cf42f99428f65e96bfb0"
integrity sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==
-array-equal@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93"
- integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=
-
-array-find-index@^1.0.1:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1"
- integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=
+array-flatten@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
+ integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=
array-includes@^3.0.3, array-includes@^3.1.1:
version "3.1.1"
@@ -2783,6 +3102,11 @@ async-each@^1.0.1:
resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf"
integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==
+async-limiter@~1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd"
+ integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==
+
async@^2.6.1:
version "2.6.3"
resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff"
@@ -2820,7 +3144,7 @@ axobject-query@^2.0.2:
resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.1.2.tgz#2bdffc0371e643e5f03ba99065d5179b9ca79799"
integrity sha512-ICt34ZmrVt8UQnvPl6TVyDTkmhXmAyAT4Jh5ugfGUX4MOrZ+U/ZY6/sdylRw3qGNr9Ub5AJsaHeDMzNLehRdOQ==
-babel-code-frame@^6.22.0, babel-code-frame@^6.26.0:
+babel-code-frame@^6.22.0:
version "6.26.0"
resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b"
integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=
@@ -2829,23 +3153,24 @@ babel-code-frame@^6.22.0, babel-code-frame@^6.26.0:
esutils "^2.0.2"
js-tokens "^3.0.2"
-babel-jest@^25.2.6:
- version "25.2.6"
- resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-25.2.6.tgz#fe67ff4d0db3626ca8082da8881dd5e84e07ae75"
- integrity sha512-MDJOAlwtIeIQiGshyX0d2PxTbV73xZMpNji40ivVTPQOm59OdRR9nYCkffqI7ugtsK4JR98HgNKbDbuVf4k5QQ==
+babel-jest@^26.0.1:
+ version "26.0.1"
+ resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-26.0.1.tgz#450139ce4b6c17174b136425bda91885c397bc46"
+ integrity sha512-Z4GGmSNQ8pX3WS1O+6v3fo41YItJJZsVxG5gIQ+HuB/iuAQBJxMTHTwz292vuYws1LnHfwSRgoqI+nxdy/pcvw==
dependencies:
- "@jest/transform" "^25.2.6"
- "@jest/types" "^25.2.6"
- "@types/babel__core" "^7.1.0"
+ "@jest/transform" "^26.0.1"
+ "@jest/types" "^26.0.1"
+ "@types/babel__core" "^7.1.7"
babel-plugin-istanbul "^6.0.0"
- babel-preset-jest "^25.2.6"
- chalk "^3.0.0"
+ babel-preset-jest "^26.0.0"
+ chalk "^4.0.0"
+ graceful-fs "^4.2.4"
slash "^3.0.0"
-babel-plugin-dynamic-import-node@^2.3.0:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz#f00f507bdaa3c3e3ff6e7e5e98d90a7acab96f7f"
- integrity sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==
+babel-plugin-dynamic-import-node@^2.3.3:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3"
+ integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==
dependencies:
object.assign "^4.1.0"
@@ -2876,11 +3201,13 @@ babel-plugin-istanbul@^6.0.0:
istanbul-lib-instrument "^4.0.0"
test-exclude "^6.0.0"
-babel-plugin-jest-hoist@^25.2.6:
- version "25.2.6"
- resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-25.2.6.tgz#2af07632b8ac7aad7d414c1e58425d5fc8e84909"
- integrity sha512-qE2xjMathybYxjiGFJg0mLFrz0qNp83aNZycWDY/SuHiZNq+vQfRQtuINqyXyue1ELd8Rd+1OhFSLjms8msMbw==
+babel-plugin-jest-hoist@^26.0.0:
+ version "26.0.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.0.0.tgz#fd1d35f95cf8849fc65cb01b5e58aedd710b34a8"
+ integrity sha512-+AuoehOrjt9irZL7DOt2+4ZaTM6dlu1s5TTS46JBa0/qem4dy7VNW3tMb96qeEqcIh20LD73TVNtmVEeymTG7w==
dependencies:
+ "@babel/template" "^7.3.3"
+ "@babel/types" "^7.3.3"
"@types/babel__traverse" "^7.0.6"
babel-plugin-macros@^2.0.0:
@@ -2892,6 +3219,16 @@ babel-plugin-macros@^2.0.0:
cosmiconfig "^6.0.0"
resolve "^1.12.0"
+"babel-plugin-styled-components@>= 1":
+ version "1.10.7"
+ resolved "https://registry.yarnpkg.com/babel-plugin-styled-components/-/babel-plugin-styled-components-1.10.7.tgz#3494e77914e9989b33cc2d7b3b29527a949d635c"
+ integrity sha512-MBMHGcIA22996n9hZRf/UJLVVgkEOITuR2SvjHLb5dSTUyR4ZRGn+ngITapes36FI3WLxZHfRhkA1ffHxihOrg==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.0.0"
+ "@babel/helper-module-imports" "^7.0.0"
+ babel-plugin-syntax-jsx "^6.18.0"
+ lodash "^4.17.11"
+
babel-plugin-syntax-jsx@6.18.0, babel-plugin-syntax-jsx@^6.18.0:
version "6.18.0"
resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946"
@@ -2910,14 +3247,29 @@ babel-plugin-transform-react-remove-prop-types@0.4.24:
resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz#f2edaf9b4c6a5fbe5c1d678bfb531078c1555f3a"
integrity sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==
-babel-preset-jest@^25.2.6:
- version "25.2.6"
- resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-25.2.6.tgz#5d3f7c99e2a8508d61775c9d68506d143b7f71b5"
- integrity sha512-Xh2eEAwaLY9+SyMt/xmGZDnXTW/7pSaBPG0EMo7EuhvosFKVWYB6CqwYD31DaEQuoTL090oDZ0FEqygffGRaSQ==
+babel-preset-current-node-syntax@^0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-0.1.2.tgz#fb4a4c51fe38ca60fede1dc74ab35eb843cb41d6"
+ integrity sha512-u/8cS+dEiK1SFILbOC8/rUI3ml9lboKuuMvZ/4aQnQmhecQAgPw5ew066C1ObnEAUmlx7dv/s2z52psWEtLNiw==
+ dependencies:
+ "@babel/plugin-syntax-async-generators" "^7.8.4"
+ "@babel/plugin-syntax-bigint" "^7.8.3"
+ "@babel/plugin-syntax-class-properties" "^7.8.3"
+ "@babel/plugin-syntax-json-strings" "^7.8.3"
+ "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3"
+ "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
+ "@babel/plugin-syntax-numeric-separator" "^7.8.3"
+ "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
+ "@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
+ "@babel/plugin-syntax-optional-chaining" "^7.8.3"
+
+babel-preset-jest@^26.0.0:
+ version "26.0.0"
+ resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-26.0.0.tgz#1eac82f513ad36c4db2e9263d7c485c825b1faa6"
+ integrity sha512-9ce+DatAa31DpR4Uir8g4Ahxs5K4W4L8refzt+qHWQANb6LhGcAEfIFgLUwk67oya2cCUd6t4eUMtO/z64ocNw==
dependencies:
- "@babel/plugin-syntax-bigint" "^7.0.0"
- "@babel/plugin-syntax-object-rest-spread" "^7.0.0"
- babel-plugin-jest-hoist "^25.2.6"
+ babel-plugin-jest-hoist "^26.0.0"
+ babel-preset-current-node-syntax "^0.1.2"
babel-runtime@6.x:
version "6.26.0"
@@ -2957,6 +3309,16 @@ bcrypt-pbkdf@^1.0.0:
dependencies:
tweetnacl "^0.14.3"
+bfj@^6.1.1:
+ version "6.1.2"
+ resolved "https://registry.yarnpkg.com/bfj/-/bfj-6.1.2.tgz#325c861a822bcb358a41c78a33b8e6e2086dde7f"
+ integrity sha512-BmBJa4Lip6BPRINSZ0BPEIfB1wUY/9rwbwvIHQA1KjX9om29B6id0wnWXq7m3bn5JrUVjeOTnVuhPT1FiHwPGw==
+ dependencies:
+ bluebird "^3.5.5"
+ check-types "^8.0.3"
+ hoopy "^0.1.4"
+ tryer "^1.0.1"
+
big.js@^5.2.2:
version "5.2.2"
resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328"
@@ -2994,15 +3356,31 @@ bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0:
resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f"
integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==
+body-parser@1.19.0:
+ version "1.19.0"
+ resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a"
+ integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==
+ dependencies:
+ bytes "3.1.0"
+ content-type "~1.0.4"
+ debug "2.6.9"
+ depd "~1.1.2"
+ http-errors "1.7.2"
+ iconv-lite "0.4.24"
+ on-finished "~2.3.0"
+ qs "6.7.0"
+ raw-body "2.4.0"
+ type-is "~1.6.17"
+
boolbase@^1.0.0, boolbase@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24=
-bootstrap@4.4.1:
- version "4.4.1"
- resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.4.1.tgz#8582960eea0c5cd2bede84d8b0baf3789c3e8b01"
- integrity sha512-tbx5cHubwE6e2ZG7nqM3g/FZ5PQEDMWmMGNrCUBVRPHXTJaH7CBDdsLeu3eCh3B1tzAxTnAbtmrzvWEvT2NNEA==
+bootstrap@4.5.0:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.5.0.tgz#97d9dbcb5a8972f8722c9962483543b907d9b9ec"
+ integrity sha512-Z93QoXvodoVslA+PWNdk23Hze4RBYIkpb5h8I2HY2Tu2h7A0LpAgLcyrhrSUyo2/Oxm2l1fRZPs1e5hnxnliXA==
brace-expansion@^1.1.7:
version "1.1.11"
@@ -3040,17 +3418,10 @@ brorand@^1.0.1:
resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=
-browser-process-hrtime@^0.1.2:
- version "0.1.3"
- resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz#616f00faef1df7ec1b5bf9cfe2bdc3170f26c7b4"
- integrity sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw==
-
-browser-resolve@^1.11.3:
- version "1.11.3"
- resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6"
- integrity sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==
- dependencies:
- resolve "1.1.7"
+browser-process-hrtime@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626"
+ integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==
browserify-aes@^1.0.0, browserify-aes@^1.0.4:
version "1.2.0"
@@ -3111,23 +3482,15 @@ browserify-zlib@^0.2.0:
dependencies:
pako "~1.0.5"
-browserslist@4.8.3:
- version "4.8.3"
- resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.8.3.tgz#65802fcd77177c878e015f0e3189f2c4f627ba44"
- integrity sha512-iU43cMMknxG1ClEZ2MDKeonKE1CCrFVkQK2AqO2YWFmvIrx4JWrvQ4w4hQez6EpVI8rHTtqh/ruHHDHSOKxvUg==
- dependencies:
- caniuse-lite "^1.0.30001017"
- electron-to-chromium "^1.3.322"
- node-releases "^1.1.44"
-
-browserslist@^4.6.0, browserslist@^4.8.3:
- version "4.9.0"
- resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.9.0.tgz#ff85c390889e0f754d7bd8ad13412575cdcf5dc7"
- integrity sha512-seffIXhwgB84+OCeT/aMjpZnsAsYDiMSC+CEs3UkF8iU64BZGYcu+TZYs/IBpo4nRi0vJywUJWYdbTsOhFTweg==
+browserslist@4.12.0, browserslist@^4.0.0, browserslist@^4.11.1, browserslist@^4.8.5:
+ version "4.12.0"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.12.0.tgz#06c6d5715a1ede6c51fc39ff67fd647f740b656d"
+ integrity sha512-UH2GkcEDSI0k/lRkuDSzFl9ZZ87skSy9w2XAn1MsZnL+4c4rqbBd3e82UWHbYDpztABrPBhZsTEeuxVfHppqDg==
dependencies:
- caniuse-lite "^1.0.30001030"
- electron-to-chromium "^1.3.361"
- node-releases "^1.1.50"
+ caniuse-lite "^1.0.30001043"
+ electron-to-chromium "^1.3.413"
+ node-releases "^1.1.53"
+ pkg-up "^2.0.0"
bs-logger@0.x:
version "0.2.6"
@@ -3148,7 +3511,7 @@ buffer-crc32@~0.2.3:
resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=
-buffer-from@1.x, buffer-from@^1.0.0:
+buffer-from@1.x, buffer-from@^1.0.0, buffer-from@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==
@@ -3172,6 +3535,35 @@ builtin-status-codes@^3.0.0:
resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=
+bytes@3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6"
+ integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==
+
+cacache@13.0.1:
+ version "13.0.1"
+ resolved "https://registry.yarnpkg.com/cacache/-/cacache-13.0.1.tgz#a8000c21697089082f85287a1aec6e382024a71c"
+ integrity sha512-5ZvAxd05HDDU+y9BVvcqYu2LLXmPnQ0hW62h32g4xBTgL/MppR4/04NHfj/ycM2y6lmTnbw6HVi+1eN0Psba6w==
+ dependencies:
+ chownr "^1.1.2"
+ figgy-pudding "^3.5.1"
+ fs-minipass "^2.0.0"
+ glob "^7.1.4"
+ graceful-fs "^4.2.2"
+ infer-owner "^1.0.4"
+ lru-cache "^5.1.1"
+ minipass "^3.0.0"
+ minipass-collect "^1.0.2"
+ minipass-flush "^1.0.5"
+ minipass-pipeline "^1.2.2"
+ mkdirp "^0.5.1"
+ move-concurrently "^1.0.1"
+ p-map "^3.0.0"
+ promise-inflight "^1.0.1"
+ rimraf "^2.7.1"
+ ssri "^7.0.0"
+ unique-filename "^1.1.1"
+
cacache@^12.0.2:
version "12.0.3"
resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.3.tgz#be99abba4e1bf5df461cd5a2c1071fc432573390"
@@ -3242,14 +3634,14 @@ callsites@^3.0.0:
resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
-camelcase-keys@^4.0.0:
- version "4.2.0"
- resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-4.2.0.tgz#a2aa5fb1af688758259c32c141426d78923b9b77"
- integrity sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=
+camelcase-keys@^6.2.2:
+ version "6.2.2"
+ resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0"
+ integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==
dependencies:
- camelcase "^4.1.0"
- map-obj "^2.0.0"
- quick-lru "^1.0.0"
+ camelcase "^5.3.1"
+ map-obj "^4.0.0"
+ quick-lru "^4.0.1"
camelcase@5.0.0:
version "5.0.0"
@@ -3261,20 +3653,30 @@ camelcase@5.3.1, camelcase@^5.0.0, camelcase@^5.3.1:
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320"
integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
-camelcase@^4.1.0:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd"
- integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=
+camelcase@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.0.0.tgz#5259f7c30e35e278f1bdc2a4d91230b37cad981e"
+ integrity sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w==
camelize@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.0.tgz#164a5483e630fa4321e5af07020e531831b2609b"
integrity sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs=
-caniuse-lite@^1.0.30001017, caniuse-lite@^1.0.30001030:
- version "1.0.30001030"
- resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001030.tgz#78076c4c6d67d3e41d6eb9399853fb27fe6e44ee"
- integrity sha512-QGK0W4Ft/Ac+zTjEiRJfwDNATvS3fodDczBXrH42784kcfqcDKpEPfN08N0HQjrAp8He/Jw8QiSS9QRn7XAbUw==
+caniuse-api@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0"
+ integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==
+ dependencies:
+ browserslist "^4.0.0"
+ caniuse-lite "^1.0.0"
+ lodash.memoize "^4.1.2"
+ lodash.uniq "^4.5.0"
+
+caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001043:
+ version "1.0.30001048"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001048.tgz#4bb4f1bc2eb304e5e1154da80b93dee3f1cf447e"
+ integrity sha512-g1iSHKVxornw0K8LG9LLdf+Fxnv7T1Z+mMsf0/YYLclQX4Cd522Ap0Lrw6NFqHgezit78dtyWxzlV2Xfc7vgRg==
capture-exit@^2.0.0:
version "2.0.0"
@@ -3288,7 +3690,7 @@ caseless@~0.12.0:
resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=
-chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.1, chalk@^2.4.2:
+chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.4.1, chalk@^2.4.2:
version "2.4.2"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
@@ -3297,6 +3699,14 @@ chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.1, chalk@^2.4.
escape-string-regexp "^1.0.5"
supports-color "^5.3.0"
+chalk@4.0.0, chalk@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.0.0.tgz#6e98081ed2d17faab615eb52ac66ec1fe6209e72"
+ integrity sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==
+ dependencies:
+ ansi-styles "^4.1.0"
+ supports-color "^7.1.0"
+
chalk@^1.0.0, chalk@^1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
@@ -3321,6 +3731,26 @@ change-emitter@^0.1.2:
resolved "https://registry.yarnpkg.com/change-emitter/-/change-emitter-0.1.6.tgz#e8b2fe3d7f1ab7d69a32199aff91ea6931409515"
integrity sha1-6LL+PX8at9aaMhma/5HqaTFAlRU=
+char-regex@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf"
+ integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==
+
+character-entities-legacy@^1.0.0:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1"
+ integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==
+
+character-entities@^1.0.0:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b"
+ integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==
+
+character-reference-invalid@^1.0.0:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560"
+ integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==
+
chardet@^0.7.0:
version "0.7.0"
resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e"
@@ -3331,7 +3761,12 @@ check-more-types@2.24.0:
resolved "https://registry.yarnpkg.com/check-more-types/-/check-more-types-2.24.0.tgz#1420ffb10fd444dcfc79b43891bbfffd32a84600"
integrity sha1-FCD/sQ/URNz8ebQ4kbv//TKoRgA=
-chokidar@^2.0.2:
+check-types@^8.0.3:
+ version "8.0.3"
+ resolved "https://registry.yarnpkg.com/check-types/-/check-types-8.0.3.tgz#3356cca19c889544f2d7a95ed49ce508a0ecf552"
+ integrity sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ==
+
+chokidar@2.1.8, chokidar@^2.1.8:
version "2.1.8"
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917"
integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==
@@ -3365,7 +3800,7 @@ chokidar@^3.1.1, chokidar@^3.3.0:
optionalDependencies:
fsevents "~2.1.2"
-chownr@^1.1.1:
+chownr@^1.1.1, chownr@^1.1.2:
version "1.1.4"
resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b"
integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==
@@ -3454,6 +3889,15 @@ cli-width@^2.0.0:
resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639"
integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=
+clipboard@^2.0.0, clipboard@^2.0.4:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/clipboard/-/clipboard-2.0.6.tgz#52921296eec0fdf77ead1749421b21c968647376"
+ integrity sha512-g5zbiixBRk/wyKakSwCKd7vQXDjFnAMGHoEyBogG/bw9kTD9GvdAvaoRR1ALcEzt3pVKxZR0pViekPMIS0QyGg==
+ dependencies:
+ good-listener "^1.2.2"
+ select "^1.1.2"
+ tiny-emitter "^2.0.0"
+
cliui@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5"
@@ -3564,6 +4008,14 @@ color@3.0.x:
color-convert "^1.9.1"
color-string "^1.5.2"
+color@^3.0.0:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/color/-/color-3.1.2.tgz#68148e7f85d41ad7649c5fa8c8106f098d229e10"
+ integrity sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==
+ dependencies:
+ color-convert "^1.9.1"
+ color-string "^1.5.2"
+
colornames@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/colornames/-/colornames-1.1.1.tgz#f8889030685c7c4ff9e2a559f5077eb76a816f96"
@@ -3589,6 +4041,11 @@ combined-stream@^1.0.6, combined-stream@~1.0.6:
dependencies:
delayed-stream "~1.0.0"
+comma-separated-tokens@^1.0.0:
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz#632b80b6117867a158f1080ad498b2fbe7e3f5ea"
+ integrity sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==
+
command-line-args@^5.1.1:
version "5.1.1"
resolved "https://registry.yarnpkg.com/command-line-args/-/command-line-args-5.1.1.tgz#88e793e5bb3ceb30754a86863f0401ac92fd369a"
@@ -3604,15 +4061,15 @@ commander@4.1.0:
resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.0.tgz#545983a0603fe425bc672d66c9e3c89c42121a83"
integrity sha512-NIQrwvv9V39FHgGFm36+U9SMQzbiHvU79k+iADraJTpmrFFfx7Ds0IvDoAdZsDrknlkRk14OYoWXb57uTh7/sw==
-commander@^2.11.0, commander@^2.20.0:
+commander@^2.11.0, commander@^2.18.0, commander@^2.20.0:
version "2.20.3"
resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
-commander@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/commander/-/commander-5.0.0.tgz#dbf1909b49e5044f8fdaf0adc809f0c0722bdfd0"
- integrity sha512-JrDGPAKjMGSP1G0DUoaceEJ3DZgAfr/q6X7FVk4+U5KxUSKviYGM2k6zWkfyyBHy5rAtzgYJFa1ro2O9PtoxwQ==
+commander@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae"
+ integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==
common-tags@1.8.0:
version "1.8.0"
@@ -3663,10 +4120,10 @@ concat-stream@^1.5.0, concat-stream@^1.6.2:
readable-stream "^2.2.2"
typedarray "^0.0.6"
-concurrently@5.1.0:
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-5.1.0.tgz#05523986ba7aaf4b58a49ddd658fab88fa783132"
- integrity sha512-9ViZMu3OOCID3rBgU31mjBftro2chOop0G2u1olq1OuwRBVRw/GxHTg80TVJBUTJfoswMmEUeuOg1g1yu1X2dA==
+concurrently@5.2.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-5.2.0.tgz#ead55121d08a0fc817085584c123cedec2e08975"
+ integrity sha512-XxcDbQ4/43d6CxR7+iV8IZXhur4KbmEJk1CetVMUqCy34z9l0DkszbY+/9wvmSnToTej0SYomc2WSRH+L0zVJw==
dependencies:
chalk "^2.4.2"
date-fns "^2.0.1"
@@ -3688,6 +4145,18 @@ constants-browserify@^1.0.0:
resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75"
integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=
+content-disposition@0.5.3:
+ version "0.5.3"
+ resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd"
+ integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==
+ dependencies:
+ safe-buffer "5.1.2"
+
+content-type@~1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
+ integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==
+
convert-source-map@1.7.0, convert-source-map@^1.4.0, convert-source-map@^1.5.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0:
version "1.7.0"
resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442"
@@ -3700,16 +4169,21 @@ convert-source-map@^0.3.3:
resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-0.3.5.tgz#f1d802950af7dd2631a1febe0596550c86ab3190"
integrity sha1-8dgClQr33SYxof6+BZZVDIarMZA=
-cookie@^0.3.1:
- version "0.3.1"
- resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb"
- integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=
+cookie-signature@1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
+ integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw=
-cookie@^0.4.0:
+cookie@0.4.0, cookie@^0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba"
integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==
+cookie@^0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb"
+ integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=
+
cookies@0.8.0:
version "0.8.0"
resolved "https://registry.yarnpkg.com/cookies/-/cookies-0.8.0.tgz#1293ce4b391740a8406e3c9870e828c4b54f3f90"
@@ -3735,12 +4209,12 @@ copy-descriptor@^0.1.0:
resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=
-core-js-compat@^3.1.1:
- version "3.6.4"
- resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.6.4.tgz#938476569ebb6cda80d339bcf199fae4f16fff17"
- integrity sha512-zAa3IZPvsJ0slViBQ2z+vgyyTuhd3MFn1rBQjZSKVEgB0UMYhUkCj9jJUVPgGTGqWvsBVmfnruXgTcNyTlEiSA==
+core-js-compat@^3.6.2:
+ version "3.6.5"
+ resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.6.5.tgz#2a51d9a4e25dfd6e690251aa81f99e3c05481f1c"
+ integrity sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==
dependencies:
- browserslist "^4.8.3"
+ browserslist "^4.8.5"
semver "7.0.0"
core-js-pure@^3.0.0:
@@ -3843,7 +4317,7 @@ cross-fetch@3.0.4:
node-fetch "2.6.0"
whatwg-fetch "3.0.0"
-cross-spawn@^6.0.0, cross-spawn@^6.0.5:
+cross-spawn@^6.0.0:
version "6.0.5"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==
@@ -3863,6 +4337,15 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.1:
shebang-command "^2.0.0"
which "^2.0.1"
+cross-spawn@^7.0.2:
+ version "7.0.2"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.2.tgz#d0d7dcfa74e89115c7619f4f721a94e1fdb716d6"
+ integrity sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw==
+ dependencies:
+ path-key "^3.1.0"
+ shebang-command "^2.0.0"
+ which "^2.0.1"
+
crypto-browserify@^3.11.0:
version "3.12.0"
resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec"
@@ -3893,41 +4376,37 @@ css-color-keywords@^1.0.0:
resolved "https://registry.yarnpkg.com/css-color-keywords/-/css-color-keywords-1.0.0.tgz#fea2616dc676b2962686b3af8dbdbe180b244e05"
integrity sha1-/qJhbcZ2spYmhrOvjb2+GAskTgU=
-css-loader@1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-1.0.0.tgz#9f46aaa5ca41dbe31860e3b62b8e23c42916bf56"
- integrity sha512-tMXlTYf3mIMt3b0dDCOQFJiVvxbocJ5Ho577WiGPYPZcqVEO218L2iU22pDXzkTZCLDE+9AmGSUkWxeh/nZReA==
+css-color-names@0.0.4, css-color-names@^0.0.4:
+ version "0.0.4"
+ resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0"
+ integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=
+
+css-declaration-sorter@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz#c198940f63a76d7e36c1e71018b001721054cb22"
+ integrity sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==
dependencies:
- babel-code-frame "^6.26.0"
- css-selector-tokenizer "^0.7.0"
- icss-utils "^2.1.0"
- loader-utils "^1.0.2"
- lodash.camelcase "^4.3.0"
- postcss "^6.0.23"
- postcss-modules-extract-imports "^1.2.0"
- postcss-modules-local-by-default "^1.2.0"
- postcss-modules-scope "^1.1.0"
- postcss-modules-values "^1.3.0"
- postcss-value-parser "^3.3.0"
- source-list-map "^2.0.0"
+ postcss "^7.0.1"
+ timsort "^0.3.0"
-css-loader@3.3.0:
- version "3.3.0"
- resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-3.3.0.tgz#65f889807baec3197313965d6cda9899f936734d"
- integrity sha512-x9Y1vvHe5RR+4tzwFdWExPueK00uqFTCw7mZy+9aE/X1SKWOArm5luaOrtJ4d05IpOwJ6S86b/tVcIdhw1Bu4A==
+css-loader@3.5.3:
+ version "3.5.3"
+ resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-3.5.3.tgz#95ac16468e1adcd95c844729e0bb167639eb0bcf"
+ integrity sha512-UEr9NH5Lmi7+dguAm+/JSPovNjYbm2k3TK58EiwQHzOHH5Jfq1Y+XoP2bQO6TMn7PptMd0opxxedAWcaSTRKHw==
dependencies:
camelcase "^5.3.1"
cssesc "^3.0.0"
icss-utils "^4.1.1"
loader-utils "^1.2.3"
normalize-path "^3.0.0"
- postcss "^7.0.23"
+ postcss "^7.0.27"
postcss-modules-extract-imports "^2.0.0"
postcss-modules-local-by-default "^3.0.2"
- postcss-modules-scope "^2.1.1"
+ postcss-modules-scope "^2.2.0"
postcss-modules-values "^3.0.0"
- postcss-value-parser "^4.0.2"
- schema-utils "^2.6.0"
+ postcss-value-parser "^4.0.3"
+ schema-utils "^2.6.6"
+ semver "^6.3.0"
css-select-base-adapter@^0.1.1:
version "0.1.1"
@@ -3944,15 +4423,6 @@ css-select@^2.0.0:
domutils "^1.7.0"
nth-check "^1.0.2"
-css-selector-tokenizer@^0.7.0:
- version "0.7.1"
- resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz#a177271a8bca5019172f4f891fc6eed9cbf68d5d"
- integrity sha512-xYL0AMZJ4gFzJQsHUKa5jiWWi2vH77WVNg7JYRyewwj6oPh4yb/y6Y9ZCw9dsj/9UauMhtuxR+ogQd//EdEVNA==
- dependencies:
- cssesc "^0.1.0"
- fastparse "^1.1.1"
- regexpu-core "^1.0.0"
-
css-to-react-native@3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/css-to-react-native/-/css-to-react-native-3.0.0.tgz#62dbe678072a824a689bcfee011fc96e02a7d756"
@@ -3962,6 +4432,15 @@ css-to-react-native@3.0.0:
css-color-keywords "^1.0.0"
postcss-value-parser "^4.0.2"
+css-to-react-native@^2.2.2:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/css-to-react-native/-/css-to-react-native-2.3.2.tgz#e75e2f8f7aa385b4c3611c52b074b70a002f2e7d"
+ integrity sha512-VOFaeZA053BqvvvqIA8c9n0+9vFppVBAHCp6JgFTtTMU3Mzi+XnelJ9XC9ul3BqFzZyQ5N+H0SnwsWT2Ebchxw==
+ dependencies:
+ camelize "^1.0.0"
+ css-color-keywords "^1.0.0"
+ postcss-value-parser "^3.3.0"
+
css-tree@1.0.0-alpha.37:
version "1.0.0-alpha.37"
resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22"
@@ -3975,7 +4454,12 @@ css-what@^3.2.1:
resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.2.1.tgz#f4a8f12421064621b456755e34a03a2c22df5da1"
integrity sha512-WwOrosiQTvyms+Ti5ZC5vGEK0Vod3FTt1ca+payZqvKuGJF+dq7bG63DstxtN0dpm6FxY27a/zS3Wten+gEtGw==
-css@2.2.4, css@^2.0.0:
+css.escape@^1.5.0:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb"
+ integrity sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s=
+
+css@^2.0.0:
version "2.2.4"
resolved "https://registry.yarnpkg.com/css/-/css-2.2.4.tgz#c646755c73971f2bba6a601e2cf2fd71b1298929"
integrity sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==
@@ -3985,16 +4469,79 @@ css@2.2.4, css@^2.0.0:
source-map-resolve "^0.5.2"
urix "^0.1.0"
-cssesc@^0.1.0:
- version "0.1.0"
- resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-0.1.0.tgz#c814903e45623371a0477b40109aaafbeeaddbb4"
- integrity sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=
-
cssesc@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee"
integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==
+cssnano-preset-default@^4.0.7:
+ version "4.0.7"
+ resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz#51ec662ccfca0f88b396dcd9679cdb931be17f76"
+ integrity sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==
+ dependencies:
+ css-declaration-sorter "^4.0.1"
+ cssnano-util-raw-cache "^4.0.1"
+ postcss "^7.0.0"
+ postcss-calc "^7.0.1"
+ postcss-colormin "^4.0.3"
+ postcss-convert-values "^4.0.1"
+ postcss-discard-comments "^4.0.2"
+ postcss-discard-duplicates "^4.0.2"
+ postcss-discard-empty "^4.0.1"
+ postcss-discard-overridden "^4.0.1"
+ postcss-merge-longhand "^4.0.11"
+ postcss-merge-rules "^4.0.3"
+ postcss-minify-font-values "^4.0.2"
+ postcss-minify-gradients "^4.0.2"
+ postcss-minify-params "^4.0.2"
+ postcss-minify-selectors "^4.0.2"
+ postcss-normalize-charset "^4.0.1"
+ postcss-normalize-display-values "^4.0.2"
+ postcss-normalize-positions "^4.0.2"
+ postcss-normalize-repeat-style "^4.0.2"
+ postcss-normalize-string "^4.0.2"
+ postcss-normalize-timing-functions "^4.0.2"
+ postcss-normalize-unicode "^4.0.1"
+ postcss-normalize-url "^4.0.1"
+ postcss-normalize-whitespace "^4.0.2"
+ postcss-ordered-values "^4.1.2"
+ postcss-reduce-initial "^4.0.3"
+ postcss-reduce-transforms "^4.0.2"
+ postcss-svgo "^4.0.2"
+ postcss-unique-selectors "^4.0.1"
+
+cssnano-util-get-arguments@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz#ed3a08299f21d75741b20f3b81f194ed49cc150f"
+ integrity sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=
+
+cssnano-util-get-match@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz#c0e4ca07f5386bb17ec5e52250b4f5961365156d"
+ integrity sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=
+
+cssnano-util-raw-cache@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz#b26d5fd5f72a11dfe7a7846fb4c67260f96bf282"
+ integrity sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==
+ dependencies:
+ postcss "^7.0.0"
+
+cssnano-util-same-parent@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz#574082fb2859d2db433855835d9a8456ea18bbf3"
+ integrity sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==
+
+cssnano@4.1.10:
+ version "4.1.10"
+ resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.10.tgz#0ac41f0b13d13d465487e111b778d42da631b8b2"
+ integrity sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==
+ dependencies:
+ cosmiconfig "^5.0.0"
+ cssnano-preset-default "^4.0.7"
+ is-resolvable "^1.0.0"
+ postcss "^7.0.0"
+
csso@^4.0.2:
version "4.0.2"
resolved "https://registry.yarnpkg.com/csso/-/csso-4.0.2.tgz#e5f81ab3a56b8eefb7f0092ce7279329f454de3d"
@@ -4002,7 +4549,7 @@ csso@^4.0.2:
dependencies:
css-tree "1.0.0-alpha.37"
-cssom@^0.4.1:
+cssom@^0.4.4:
version "0.4.4"
resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10"
integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==
@@ -4012,10 +4559,10 @@ cssom@~0.3.6:
resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a"
integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==
-cssstyle@^2.0.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.2.0.tgz#e4c44debccd6b7911ed617a4395e5754bba59992"
- integrity sha512-sEb3XFPx3jNnCAMtqrXPDeSgQr+jojtCeNf8cvMNMh1cG970+lljssvQDzPq6lmmJu2Vhqood/gtEomBiHOGnA==
+cssstyle@^2.2.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852"
+ integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==
dependencies:
cssom "~0.3.6"
@@ -4024,22 +4571,15 @@ csstype@^2.2.0, csstype@^2.5.7:
resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.9.tgz#05141d0cd557a56b8891394c1911c40c8a98d098"
integrity sha512-xz39Sb4+OaTsULgUERcCk+TJj8ylkL4aSVDQiX/ksxbELSqwkgt4d4RD7fovIdgJGSuNYqwZEiVjYY5l0ask+Q==
-currently-unhandled@^0.4.1:
- version "0.4.1"
- resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea"
- integrity sha1-mI3zP+qxke95mmE2nddsF635V+o=
- dependencies:
- array-find-index "^1.0.1"
-
cyclist@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9"
integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=
-cypress@4.3.0:
- version "4.3.0"
- resolved "https://registry.yarnpkg.com/cypress/-/cypress-4.3.0.tgz#74694c2407846119368a6aecc456b3ee1a8ee32b"
- integrity sha512-xO1oef4ns4koDAkQROGJIhKKhGHDOKfOmlirwP1QAk9w/no+YJpN7HZ6IUPiXwWw3C7xVLjScoI8Dad0z5uTTg==
+cypress@4.5.0:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/cypress/-/cypress-4.5.0.tgz#01940d085f6429cec3c87d290daa47bb976a7c7b"
+ integrity sha512-2A4g5FW5d2fHzq8HKUGAMVTnW6P8nlWYQALiCoGN4bqBLvgwhYM/oG9oKc2CS6LnvgHFiKivKzpm9sfk3uU3zQ==
dependencies:
"@cypress/listr-verbose-renderer" "0.4.1"
"@cypress/request" "2.88.5"
@@ -4113,14 +4653,21 @@ dashify@^2.0.0:
resolved "https://registry.yarnpkg.com/dashify/-/dashify-2.0.0.tgz#fff270ca2868ca427fee571de35691d6e437a648"
integrity sha512-hpA5C/YrPjucXypHPPc0oJ1l9Hf6wWbiOL7Ik42cxnsUOhWiCB/fylKbKqqJalW9FgkNQCw16YO8uW9Hs0Iy1A==
-data-urls@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe"
- integrity sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==
+data-uri-to-buffer@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-3.0.0.tgz#8a3088a5efd3f53c3682343313c6895d498eb8d7"
+ integrity sha512-MJ6mFTZ+nPQO+39ua/ltwNePXrfdF3Ww0wP1Od7EePySXN1cP9XNqRQOG3FxTfipp8jx898LUCgBCEP11Qw/ZQ==
dependencies:
- abab "^2.0.0"
- whatwg-mimetype "^2.2.0"
- whatwg-url "^7.0.0"
+ buffer-from "^1.1.1"
+
+data-urls@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b"
+ integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==
+ dependencies:
+ abab "^2.0.3"
+ whatwg-mimetype "^2.3.0"
+ whatwg-url "^8.0.0"
date-fns@^1.27.2:
version "1.30.1"
@@ -4132,6 +4679,13 @@ date-fns@^2.0.1:
resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.10.0.tgz#abd10604d8bafb0bcbd2ba2e9b0563b922ae4b6b"
integrity sha512-EhfEKevYGWhWlZbNeplfhIU/+N+x0iCIx7VzKlXma2EdQyznVlZhCptXUY+BegNpPW2kjdx15Rvq503YcXXrcA==
+debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.9:
+ version "2.6.9"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
+ integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
+ dependencies:
+ ms "2.0.0"
+
debug@4, debug@4.1.1, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791"
@@ -4139,13 +4693,6 @@ debug@4, debug@4.1.1, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1:
dependencies:
ms "^2.1.1"
-debug@^2.2.0, debug@^2.3.3, debug@^2.6.9:
- version "2.6.9"
- resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
- integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
- dependencies:
- ms "2.0.0"
-
debug@^3.1.0:
version "3.2.6"
resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b"
@@ -4153,7 +4700,7 @@ debug@^3.1.0:
dependencies:
ms "^2.1.1"
-decamelize-keys@^1.0.0:
+decamelize-keys@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9"
integrity sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=
@@ -4166,6 +4713,11 @@ decamelize@^1.1.0, decamelize@^1.2.0:
resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=
+decimal.js@^10.2.0:
+ version "10.2.0"
+ resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.2.0.tgz#39466113a9e036111d02f82489b5fd6b0b5ed231"
+ integrity sha512-vDPw+rDgn3bZe1+F/pyEwb1oMG2XTlRVgAa6B4KccTEpYgF8w6eQllVbQcfIJnZyvzFtFpxnpGtx8dd7DJp/Rw==
+
decode-uri-component@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
@@ -4183,7 +4735,7 @@ deep-equal@^1.1.1:
object-keys "^1.1.1"
regexp.prototype.flags "^1.2.0"
-deep-is@~0.1.3:
+deep-is@^0.1.3, deep-is@~0.1.3:
version "0.1.3"
resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=
@@ -4222,13 +4774,13 @@ define-property@^2.0.2:
is-descriptor "^1.0.2"
isobject "^3.0.1"
-del-cli@3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/del-cli/-/del-cli-3.0.0.tgz#327a15d4c18d6b7e5c849a53ef0d17901bc28197"
- integrity sha512-J4HDC2mpcN5aopya4VdkyiFXZaqAoo7ua9VpKbciX3DDUSbtJbPMc3ivggJsAAgS6EqonmbenIiMhBGtJPW9FA==
+del-cli@3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/del-cli/-/del-cli-3.0.1.tgz#2d27ff260204b5104cadeda86f78f180a4ebe89a"
+ integrity sha512-BLHItGr82rUbHhjMu41d+vw9Md49i81jmZSV00HdTq4t+RTHywmEht/23mNFpUl2YeLYJZJyGz4rdlMAyOxNeg==
dependencies:
del "^5.1.0"
- meow "^5.0.0"
+ meow "^6.1.1"
del@^5.1.0:
version "5.1.0"
@@ -4249,7 +4801,12 @@ delayed-stream@~1.0.0:
resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk=
-depd@^1.1.0:
+delegate@^3.1.2:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/delegate/-/delegate-3.2.0.tgz#b66b71c3158522e8ab5744f720d8ca0c2af59166"
+ integrity sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==
+
+depd@^1.1.0, depd@~1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=
@@ -4267,6 +4824,11 @@ des.js@^1.0.0:
inherits "^2.0.1"
minimalistic-assert "^1.0.0"
+destroy@~1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
+ integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=
+
detect-indent@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.0.0.tgz#0abd0f549f69fc6659a254fe96786186b6f528fd"
@@ -4291,16 +4853,16 @@ diff-sequences@^24.9.0:
resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.9.0.tgz#5715d6244e2aa65f48bba0bc972db0b0b11e95b5"
integrity sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==
-diff-sequences@^25.1.0:
- version "25.1.0"
- resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-25.1.0.tgz#fd29a46f1c913fd66c22645dc75bffbe43051f32"
- integrity sha512-nFIfVk5B/NStCsJ+zaPO4vYuLjlzQ6uFvPxzYyHlejNZ/UGa7G/n7peOXVrVNvRuyfstt+mZQYGpjxg9Z6N8Kw==
-
diff-sequences@^25.2.6:
version "25.2.6"
resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-25.2.6.tgz#5f467c00edd35352b7bca46d7927d60e687a76dd"
integrity sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg==
+diff-sequences@^26.0.0:
+ version "26.0.0"
+ resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.0.0.tgz#0760059a5c287637b842bd7085311db7060e88a6"
+ integrity sha512-JC/eHYEC3aSS0vZGjuoc4vHA0yAQTzhQQldXMeMF+JlxLGJlCO38Gma82NV9gk1jGFz8mDzUMeaKXvjRRdJ2dg==
+
diffie-hellman@^5.0.0:
version "5.0.3"
resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875"
@@ -4366,12 +4928,12 @@ domelementtype@^2.0.1:
resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.1.tgz#1f8bdfe91f5a78063274e803b4bdcedf6e94f94d"
integrity sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==
-domexception@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90"
- integrity sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==
+domexception@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304"
+ integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==
dependencies:
- webidl-conversions "^4.0.2"
+ webidl-conversions "^5.0.0"
domhandler@3.0.0, domhandler@^3.0.0:
version "3.0.0"
@@ -4380,10 +4942,10 @@ domhandler@3.0.0, domhandler@^3.0.0:
dependencies:
domelementtype "^2.0.1"
-domutils@2.0.0, domutils@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.0.0.tgz#15b8278e37bfa8468d157478c58c367718133c08"
- integrity sha512-n5SelJ1axbO636c2yUtOGia/IcJtVtlhQbFiVDBZHKV5ReJO1ViX7sFEemtuyoAnBxk5meNSYgA8V4s0271efg==
+domutils@2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.1.0.tgz#7ade3201af43703fde154952e3a868eb4b635f16"
+ integrity sha512-CD9M0Dm1iaHfQ1R/TI+z3/JWp/pgub0j4jIQKH89ARR4ATAV2nbaOQS5XxU9maJP5jHaPdDDQSEHuE2UmpUTKg==
dependencies:
dom-serializer "^0.2.1"
domelementtype "^2.0.1"
@@ -4397,6 +4959,27 @@ domutils@^1.7.0:
dom-serializer "0"
domelementtype "1"
+domutils@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.0.0.tgz#15b8278e37bfa8468d157478c58c367718133c08"
+ integrity sha512-n5SelJ1axbO636c2yUtOGia/IcJtVtlhQbFiVDBZHKV5ReJO1ViX7sFEemtuyoAnBxk5meNSYgA8V4s0271efg==
+ dependencies:
+ dom-serializer "^0.2.1"
+ domelementtype "^2.0.1"
+ domhandler "^3.0.0"
+
+dot-prop@^5.2.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.2.0.tgz#c34ecc29556dc45f1f4c22697b6f4904e0cc4fcb"
+ integrity sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==
+ dependencies:
+ is-obj "^2.0.0"
+
+duplexer@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1"
+ integrity sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=
+
duplexify@^3.4.2, duplexify@^3.6.0:
version "3.7.1"
resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309"
@@ -4415,10 +4998,20 @@ ecc-jsbn@~0.1.1:
jsbn "~0.1.0"
safer-buffer "^2.1.0"
-electron-to-chromium@^1.3.322, electron-to-chromium@^1.3.361:
- version "1.3.362"
- resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.362.tgz#9ed33f9d0673888d6a2614347b4b63b490009408"
- integrity sha512-xdU5VCoZyMPMOWtCaMgbr48OwWZHrMLbGnAOlEqibXiIGsb4kiCGWEHK5NOghcVLdBVIbr/BW+yuKxVuGTtzEg==
+ee-first@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
+ integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
+
+ejs@^2.6.1:
+ version "2.7.4"
+ resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba"
+ integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==
+
+electron-to-chromium@^1.3.413:
+ version "1.3.424"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.424.tgz#29bf66325521209180829e8c8b5164deaf0f86b8"
+ integrity sha512-h8apsMr1RK3OusH8iwxlJ7TZkpgWfg2HvTXZ3o1w9R/SeRKX0hEGMQmRyTWijZAloHfmfwTLaPurVqKWdFC5dw==
elegant-spinner@^1.0.1:
version "1.0.1"
@@ -4474,6 +5067,11 @@ enabled@1.0.x:
dependencies:
env-variable "0.0.x"
+encodeurl@~1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
+ integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=
+
encoding@^0.1.11:
version "0.1.12"
resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb"
@@ -4573,12 +5171,22 @@ es6-symbol@^3.1.1, es6-symbol@~3.1.3:
d "^1.0.1"
ext "^1.1.2"
+escape-html@~1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
+ integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=
+
escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
-escodegen@^1.11.1:
+escape-string-regexp@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344"
+ integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==
+
+escodegen@^1.14.1:
version "1.14.1"
resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.1.tgz#ba01d0c8278b5e95a9a45350142026659027a457"
integrity sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ==
@@ -4590,10 +5198,10 @@ escodegen@^1.11.1:
optionalDependencies:
source-map "~0.6.1"
-eslint-plugin-jest@23.8.2:
- version "23.8.2"
- resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-23.8.2.tgz#6f28b41c67ef635f803ebd9e168f6b73858eb8d4"
- integrity sha512-xwbnvOsotSV27MtAe7s8uGWOori0nUsrXh2f1EnpmXua8sDfY6VZhHAhHg2sqK7HBNycRQExF074XSZ7DvfoFg==
+eslint-plugin-jest@23.13.1:
+ version "23.13.1"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-23.13.1.tgz#b2ce83f76064ad8ba1f1f26f322b86a86e44148e"
+ integrity sha512-TRLJH6M6EDvGocD98a7yVThrAOCK9WJfo9phuUb0MJptcrOYZeCKzC9aOzZCD93sxXCsiJVZywaTHdI/mAi0FQ==
dependencies:
"@typescript-eslint/experimental-utils" "^2.5.0"
@@ -4612,15 +5220,15 @@ eslint-plugin-jsx-a11y@6.2.3:
has "^1.0.3"
jsx-ast-utils "^2.2.1"
-eslint-plugin-react-hooks@3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-3.0.0.tgz#9e80c71846eb68dd29c3b21d832728aa66e5bd35"
- integrity sha512-EjxTHxjLKIBWFgDJdhKKzLh5q+vjTFrqNZX36uIxWS4OfyXe5DawqPj3U5qeJ1ngLwatjzQnmR0Lz0J0YH3kxw==
+eslint-plugin-react-hooks@4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.0.2.tgz#03700ca761eacc1b6436074c456f90a8e331ff28"
+ integrity sha512-kAMRjNztrLW1rK+81X1NwMB2LqG+nc7Q8AibnG8/VyWhQK8SP6JotCFG+HL4u1EjziplxVz4jARdR8gGk8pLDA==
-eslint-plugin-react@7.19.0:
- version "7.19.0"
- resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.19.0.tgz#6d08f9673628aa69c5559d33489e855d83551666"
- integrity sha512-SPT8j72CGuAP+JFbT0sJHOB80TX/pu44gQ4vXH/cq+hQTiY2PuZ6IHkqXJV6x1b28GDdo1lbInjKUrrdUf0LOQ==
+eslint-plugin-react@7.20.0:
+ version "7.20.0"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.20.0.tgz#f98712f0a5e57dfd3e5542ef0604b8739cd47be3"
+ integrity sha512-rqe1abd0vxMjmbPngo4NaYxTcR3Y4Hrmc/jg4T+sYz63yqlmJRknpEQfmWY+eDWPuMmix6iUIK+mv0zExjeLgA==
dependencies:
array-includes "^3.1.1"
doctrine "^2.1.0"
@@ -4631,7 +5239,6 @@ eslint-plugin-react@7.19.0:
object.values "^1.1.1"
prop-types "^15.7.2"
resolve "^1.15.1"
- semver "^6.3.0"
string.prototype.matchall "^4.0.2"
xregexp "^4.3.0"
@@ -4651,13 +5258,6 @@ eslint-scope@^5.0.0:
esrecurse "^4.1.0"
estraverse "^4.1.1"
-eslint-utils@^1.4.3:
- version "1.4.3"
- resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f"
- integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==
- dependencies:
- eslint-visitor-keys "^1.1.0"
-
eslint-utils@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.0.0.tgz#7be1cc70f27a72a76cd14aa698bcabed6890e1cd"
@@ -4688,22 +5288,22 @@ eslint-watch@6.0.1:
optionator "^0.8.2"
source-map-support "^0.5.13"
-eslint@6.8.0:
- version "6.8.0"
- resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.8.0.tgz#62262d6729739f9275723824302fb227c8c93ffb"
- integrity sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==
+eslint@7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.0.0.tgz#c35dfd04a4372110bd78c69a8d79864273919a08"
+ integrity sha512-qY1cwdOxMONHJfGqw52UOpZDeqXy8xmD0u8CT6jIstil72jkhURC704W8CFyTPDPllz4z4lu0Ql1+07PG/XdIg==
dependencies:
"@babel/code-frame" "^7.0.0"
ajv "^6.10.0"
- chalk "^2.1.0"
- cross-spawn "^6.0.5"
+ chalk "^4.0.0"
+ cross-spawn "^7.0.2"
debug "^4.0.1"
doctrine "^3.0.0"
eslint-scope "^5.0.0"
- eslint-utils "^1.4.3"
+ eslint-utils "^2.0.0"
eslint-visitor-keys "^1.1.0"
- espree "^6.1.2"
- esquery "^1.0.1"
+ espree "^7.0.0"
+ esquery "^1.2.0"
esutils "^2.0.2"
file-entry-cache "^5.0.1"
functional-red-black-tree "^1.0.1"
@@ -4716,28 +5316,27 @@ eslint@6.8.0:
is-glob "^4.0.0"
js-yaml "^3.13.1"
json-stable-stringify-without-jsonify "^1.0.1"
- levn "^0.3.0"
+ levn "^0.4.1"
lodash "^4.17.14"
minimatch "^3.0.4"
- mkdirp "^0.5.1"
natural-compare "^1.4.0"
- optionator "^0.8.3"
+ optionator "^0.9.1"
progress "^2.0.0"
- regexpp "^2.0.1"
- semver "^6.1.2"
- strip-ansi "^5.2.0"
- strip-json-comments "^3.0.1"
+ regexpp "^3.1.0"
+ semver "^7.2.1"
+ strip-ansi "^6.0.0"
+ strip-json-comments "^3.1.0"
table "^5.2.3"
text-table "^0.2.0"
v8-compile-cache "^2.0.3"
-espree@^6.1.2:
- version "6.1.2"
- resolved "https://registry.yarnpkg.com/espree/-/espree-6.1.2.tgz#6c272650932b4f91c3714e5e7b5f5e2ecf47262d"
- integrity sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA==
+espree@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/espree/-/espree-7.0.0.tgz#8a7a60f218e69f120a842dc24c5a88aa7748a74e"
+ integrity sha512-/r2XEx5Mw4pgKdyb7GNLQNsu++asx/dltf/CI8RFi9oGHxmQFgvLbc5Op4U6i8Oaj+kdslhJtVlEZeAqH5qOTw==
dependencies:
- acorn "^7.1.0"
- acorn-jsx "^5.1.0"
+ acorn "^7.1.1"
+ acorn-jsx "^5.2.0"
eslint-visitor-keys "^1.1.0"
esprima@^4.0.0, esprima@^4.0.1:
@@ -4745,12 +5344,12 @@ esprima@^4.0.0, esprima@^4.0.1:
resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
-esquery@^1.0.1:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.1.0.tgz#c5c0b66f383e7656404f86b31334d72524eddb48"
- integrity sha512-MxYW9xKmROWF672KqjO75sszsA8Mxhw06YFeS5VHlB98KDHbOSurm3ArsjO60Eaf3QmGMCP1yn+0JQkNLo/97Q==
+esquery@^1.2.0:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57"
+ integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==
dependencies:
- estraverse "^4.0.0"
+ estraverse "^5.1.0"
esrecurse@^4.1.0:
version "4.2.1"
@@ -4759,16 +5358,26 @@ esrecurse@^4.1.0:
dependencies:
estraverse "^4.1.0"
-estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0:
+estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0:
version "4.3.0"
resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d"
integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==
-esutils@^2.0.0, esutils@^2.0.2:
- version "2.0.3"
+estraverse@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.1.0.tgz#374309d39fd935ae500e7b92e8a6b4c720e59642"
+ integrity sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==
+
+esutils@^2.0.2:
+ version "2.0.3"
resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
+etag@~1.8.1:
+ version "1.8.1"
+ resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
+ integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=
+
eventemitter2@4.1.2:
version "4.1.2"
resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-4.1.2.tgz#0e1a8477af821a6ef3995b311bf74c23a5247f15"
@@ -4820,10 +5429,10 @@ execa@^2.0.4:
signal-exit "^3.0.2"
strip-final-newline "^2.0.0"
-execa@^3.2.0:
- version "3.4.0"
- resolved "https://registry.yarnpkg.com/execa/-/execa-3.4.0.tgz#c08ed4550ef65d858fac269ffc8572446f37eb89"
- integrity sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==
+execa@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/execa/-/execa-4.0.1.tgz#988488781f1f0238cd156f7aaede11c3e853b4c1"
+ integrity sha512-SCjM/zlBdOK8Q5TIjOn6iEHZaPHFsMoTxXQ2nvUvtPnuohz3H2dIozSg+etNR98dGoYUp2ENSKLL/XaMmbxVgw==
dependencies:
cross-spawn "^7.0.0"
get-stream "^5.0.0"
@@ -4832,7 +5441,6 @@ execa@^3.2.0:
merge-stream "^2.0.0"
npm-run-path "^4.0.0"
onetime "^5.1.0"
- p-finally "^2.0.0"
signal-exit "^3.0.2"
strip-final-newline "^2.0.0"
@@ -4878,17 +5486,53 @@ expect@^24.1.0:
jest-message-util "^24.9.0"
jest-regex-util "^24.9.0"
-expect@^25.2.7:
- version "25.2.7"
- resolved "https://registry.yarnpkg.com/expect/-/expect-25.2.7.tgz#509b79f47502835f4071ff3ecc401f2eaecca709"
- integrity sha512-yA+U2Ph0MkMsJ9N8q5hs9WgWI6oJYfecdXta6LkP/alY/jZZL1MHlJ2wbLh60Ucqf3G+51ytbqV3mlGfmxkpNw==
+expect@^26.0.1:
+ version "26.0.1"
+ resolved "https://registry.yarnpkg.com/expect/-/expect-26.0.1.tgz#18697b9611a7e2725e20ba3ceadda49bc9865421"
+ integrity sha512-QcCy4nygHeqmbw564YxNbHTJlXh47dVID2BUP52cZFpLU9zHViMFK6h07cC1wf7GYCTIigTdAXhVua8Yl1FkKg==
dependencies:
- "@jest/types" "^25.2.6"
+ "@jest/types" "^26.0.1"
ansi-styles "^4.0.0"
- jest-get-type "^25.2.6"
- jest-matcher-utils "^25.2.7"
- jest-message-util "^25.2.6"
- jest-regex-util "^25.2.6"
+ jest-get-type "^26.0.0"
+ jest-matcher-utils "^26.0.1"
+ jest-message-util "^26.0.1"
+ jest-regex-util "^26.0.0"
+
+express@^4.16.3:
+ version "4.17.1"
+ resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134"
+ integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==
+ dependencies:
+ accepts "~1.3.7"
+ array-flatten "1.1.1"
+ body-parser "1.19.0"
+ content-disposition "0.5.3"
+ content-type "~1.0.4"
+ cookie "0.4.0"
+ cookie-signature "1.0.6"
+ debug "2.6.9"
+ depd "~1.1.2"
+ encodeurl "~1.0.2"
+ escape-html "~1.0.3"
+ etag "~1.8.1"
+ finalhandler "~1.1.2"
+ fresh "0.5.2"
+ merge-descriptors "1.0.1"
+ methods "~1.1.2"
+ on-finished "~2.3.0"
+ parseurl "~1.3.3"
+ path-to-regexp "0.1.7"
+ proxy-addr "~2.0.5"
+ qs "6.7.0"
+ range-parser "~1.2.1"
+ safe-buffer "5.1.2"
+ send "0.17.1"
+ serve-static "1.14.1"
+ setprototypeof "1.1.1"
+ statuses "~1.5.0"
+ type-is "~1.6.18"
+ utils-merge "1.0.1"
+ vary "~1.1.2"
ext@^1.1.2:
version "1.4.0"
@@ -4950,11 +5594,6 @@ extract-zip@1.7.0:
mkdirp "^0.5.4"
yauzl "^2.10.0"
-extracted-loader@1.0.4:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/extracted-loader/-/extracted-loader-1.0.4.tgz#e1a3f1791813c14091a1959e261e23e95dd90115"
- integrity sha512-G8A0hT/WCWIjesZm7BwbWdST5dQ08GNnCpTrJT/k/FYzuiJwlV1gyWjnuoizOzAR4jpEYXG2J++JyEKN/EB26Q==
-
extsprintf@1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
@@ -4987,7 +5626,7 @@ fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0:
resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
-fast-levenshtein@~2.0.6:
+fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6:
version "2.0.6"
resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=
@@ -4997,11 +5636,6 @@ fast-safe-stringify@^2.0.4:
resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz#124aa885899261f68aedb42a7c080de9da608743"
integrity sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==
-fastparse@^1.1.1:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.2.tgz#91728c5a5942eced8531283c79441ee4122c35a9"
- integrity sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==
-
fastq@^1.6.0:
version "1.6.0"
resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.6.0.tgz#4ec8a38f4ac25f21492673adb7eae9cfef47d1c2"
@@ -5009,6 +5643,13 @@ fastq@^1.6.0:
dependencies:
reusify "^1.0.0"
+fault@^1.0.2:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/fault/-/fault-1.0.4.tgz#eafcfc0a6d214fc94601e170df29954a4f842f13"
+ integrity sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==
+ dependencies:
+ format "^0.2.0"
+
fb-watchman@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85"
@@ -5080,6 +5721,11 @@ file-uri-to-path@1.0.0:
resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd"
integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==
+filesize@^3.6.1:
+ version "3.6.1"
+ resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317"
+ integrity sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==
+
fill-range@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7"
@@ -5097,6 +5743,28 @@ fill-range@^7.0.1:
dependencies:
to-regex-range "^5.0.1"
+finalhandler@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d"
+ integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==
+ dependencies:
+ debug "2.6.9"
+ encodeurl "~1.0.2"
+ escape-html "~1.0.3"
+ on-finished "~2.3.0"
+ parseurl "~1.3.3"
+ statuses "~1.5.0"
+ unpipe "~1.0.0"
+
+find-cache-dir@3.3.1:
+ version "3.3.1"
+ resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz#89b33fad4a4670daa94f855f7fbe31d6d84fe880"
+ integrity sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==
+ dependencies:
+ commondir "^1.0.1"
+ make-dir "^3.0.2"
+ pkg-dir "^4.1.0"
+
find-cache-dir@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7"
@@ -5118,7 +5786,7 @@ find-root@^1.1.0:
resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4"
integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==
-find-up@2.1.0, find-up@^2.0.0:
+find-up@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c=
@@ -5207,6 +5875,16 @@ form-data@~2.3.2:
combined-stream "^1.0.6"
mime-types "^2.1.12"
+format@^0.2.0:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/format/-/format-0.2.2.tgz#d6170107e9efdc4ed30c9dc39016df942b5cb58b"
+ integrity sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs=
+
+forwarded@~0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84"
+ integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=
+
fragment-cache@^0.2.1:
version "0.2.1"
resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19"
@@ -5214,7 +5892,7 @@ fragment-cache@^0.2.1:
dependencies:
map-cache "^0.2.2"
-fresh@^0.5.2:
+fresh@0.5.2, fresh@^0.5.2:
version "0.5.2"
resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=
@@ -5236,6 +5914,13 @@ fs-extra@8.1.0:
jsonfile "^4.0.0"
universalify "^0.1.0"
+fs-minipass@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb"
+ integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==
+ dependencies:
+ minipass "^3.0.0"
+
fs-write-stream-atomic@^1.0.8:
version "1.0.10"
resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9"
@@ -5394,11 +6079,23 @@ globby@^11.0.0:
merge2 "^1.3.0"
slash "^3.0.0"
-graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.2, graceful-fs@^4.2.3:
+good-listener@^1.2.2:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/good-listener/-/good-listener-1.2.2.tgz#d53b30cdf9313dffb7dc9a0d477096aa6d145c50"
+ integrity sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=
+ dependencies:
+ delegate "^3.1.2"
+
+graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.2:
version "4.2.3"
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423"
integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==
+graceful-fs@^4.2.4:
+ version "4.2.4"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb"
+ integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==
+
graphql-tag@2.10.3, graphql-tag@^2.4.2:
version "2.10.3"
resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.10.3.tgz#ea1baba5eb8fc6339e4c4cf049dabe522b0edf03"
@@ -5419,12 +6116,20 @@ gud@^1.0.0:
resolved "https://registry.yarnpkg.com/gud/-/gud-1.0.0.tgz#a489581b17e6a70beca9abe3ae57de7a499852c0"
integrity sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw==
+gzip-size@^5.0.0:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.1.1.tgz#cb9bee692f87c0612b232840a873904e4c135274"
+ integrity sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==
+ dependencies:
+ duplexer "^0.1.1"
+ pify "^4.0.1"
+
har-schema@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92"
integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=
-har-validator@~5.1.0, har-validator@~5.1.3:
+har-validator@~5.1.3:
version "5.1.3"
resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080"
integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==
@@ -5432,6 +6137,11 @@ har-validator@~5.1.0, har-validator@~5.1.3:
ajv "^6.5.5"
har-schema "^2.0.0"
+hard-rejection@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883"
+ integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==
+
has-ansi@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
@@ -5485,7 +6195,7 @@ has-values@^1.0.0:
is-number "^3.0.0"
kind-of "^4.0.0"
-has@^1.0.3:
+has@^1.0.0, has@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
@@ -5508,6 +6218,31 @@ hash.js@^1.0.0, hash.js@^1.0.3:
inherits "^2.0.3"
minimalistic-assert "^1.0.1"
+hast-util-parse-selector@^2.0.0:
+ version "2.2.4"
+ resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-2.2.4.tgz#60c99d0b519e12ab4ed32e58f150ec3f61ed1974"
+ integrity sha512-gW3sxfynIvZApL4L07wryYF4+C9VvH3AUi7LAnVXV4MneGEgwOByXvFo18BgmTWnm7oHAe874jKbIB1YhHSIzA==
+
+hastscript@^5.0.0:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-5.1.2.tgz#bde2c2e56d04c62dd24e8c5df288d050a355fb8a"
+ integrity sha512-WlztFuK+Lrvi3EggsqOkQ52rKbxkXL3RwB6t5lwoa8QLMemoWfBuL43eDrwOamJyR7uKQKdmKYaBH1NZBiIRrQ==
+ dependencies:
+ comma-separated-tokens "^1.0.0"
+ hast-util-parse-selector "^2.0.0"
+ property-information "^5.0.0"
+ space-separated-tokens "^1.0.0"
+
+hex-color-regex@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e"
+ integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==
+
+highlight.js@~9.13.0:
+ version "9.13.1"
+ resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.13.1.tgz#054586d53a6863311168488a0f58d6c505ce641e"
+ integrity sha512-Sc28JNQNDzaH6PORtRLMvif9RSn1mYuOoX3omVjnb0+HbpPygU2ALBI0R/wsiqCb4/fcp07Gdo8g+fhtFrQl6A==
+
hmac-drbg@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
@@ -5529,17 +6264,37 @@ hoist-non-react-statics@^3.3.0:
dependencies:
react-is "^16.7.0"
+hoopy@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/hoopy/-/hoopy-0.1.4.tgz#609207d661100033a9a9402ad3dea677381c1b1d"
+ integrity sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==
+
hosted-git-info@^2.1.4:
version "2.8.7"
resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.7.tgz#4d2e0d5248e1cfabc984b0f6a6d75fe36e679511"
integrity sha512-ChkjQtKJ3GI6SsI4O5jwr8q8EPrWCnxuc4Tbx+vRI5x6mDOpjKKltNo1lRlszw3xwgTOSns1ZRBiMmmwpcvLxg==
-html-encoding-sniffer@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8"
- integrity sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==
+hsl-regex@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e"
+ integrity sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=
+
+hsla-regex@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38"
+ integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg=
+
+html-comment-regex@^1.1.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7"
+ integrity sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==
+
+html-encoding-sniffer@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3"
+ integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==
dependencies:
- whatwg-encoding "^1.0.1"
+ whatwg-encoding "^1.0.5"
html-escaper@^2.0.0:
version "2.0.0"
@@ -5563,6 +6318,28 @@ htmlparser2@4.1.0:
domutils "^2.0.0"
entities "^2.0.0"
+http-errors@1.7.2:
+ version "1.7.2"
+ resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f"
+ integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==
+ dependencies:
+ depd "~1.1.2"
+ inherits "2.0.3"
+ setprototypeof "1.1.1"
+ statuses ">= 1.5.0 < 2"
+ toidentifier "1.0.0"
+
+http-errors@~1.7.2:
+ version "1.7.3"
+ resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06"
+ integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==
+ dependencies:
+ depd "~1.1.2"
+ inherits "2.0.4"
+ setprototypeof "1.1.1"
+ statuses ">= 1.5.0 < 2"
+ toidentifier "1.0.0"
+
http-signature@~1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1"
@@ -5597,19 +6374,12 @@ i18next-browser-languagedetector@4.0.1:
dependencies:
"@babel/runtime" "^7.5.5"
-i18next-locize-backend@3.1.1:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/i18next-locize-backend/-/i18next-locize-backend-3.1.1.tgz#cf41decbddfaed7216569c39455ea70af2211da5"
- integrity sha512-eLZUloTOzKmbt0CEYfSG4WysO6Gp6/MIVIR2MXgssaPS3anSl4dz9+YrTA7G6KvkIC5tOmOEbcY/Nt2W7+ah2Q==
- dependencies:
- "@babel/runtime" "^7.7.7"
-
-i18next-node-locize-backend@3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/i18next-node-locize-backend/-/i18next-node-locize-backend-3.1.0.tgz#17a0027c8c5d9e731277317ac977f53d67105537"
- integrity sha512-hYv/ku8Lc+H86SiMqMCpo0vB2zbiBZbWl3siWaGQ+oz2SFn2GQh5eTIxPyaQh7wAeV8OAAVh2L44fvrXtFEd5w==
+i18next-locize-backend@4.0.8:
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/i18next-locize-backend/-/i18next-locize-backend-4.0.8.tgz#4f1a021da71984ac815bba510f87bb816e4a3fdd"
+ integrity sha512-uPSNlAjGbTgmZqs4Har2W/zw0JUOPXFkz8kqe+H3iQ3VjNglykC8MyKHzrmQtv6RMelnm0c5Qb00EqpzGCS8Cg==
dependencies:
- request "^2.88.0"
+ node-fetch "2.6.0"
i18next@19.0.2:
version "19.0.2"
@@ -5618,10 +6388,10 @@ i18next@19.0.2:
dependencies:
"@babel/runtime" "^7.3.1"
-i18next@19.3.4:
- version "19.3.4"
- resolved "https://registry.yarnpkg.com/i18next/-/i18next-19.3.4.tgz#512de50ee6075df825c646e1ce646a104f0938c9"
- integrity sha512-ef7AxxutzdhBsBNugE9jgqsbwesG1muJOtZ9ZrPARPs/jXegViTp4+8JCeMp8BAyTIo1Zn0giqc8+2UpqFjU0w==
+i18next@19.4.4:
+ version "19.4.4"
+ resolved "https://registry.yarnpkg.com/i18next/-/i18next-19.4.4.tgz#c0a18bc2f2be554da636e67bfbf5200c7948b60d"
+ integrity sha512-ofaHtdsDdX3A5nYur1HWblB7J4hIcjr2ACdnwTAJgc8hTfPbyzZfGX0hVkKpI3vzDIgO6Uzc4v1ffW2W6gG6zw==
dependencies:
"@babel/runtime" "^7.3.1"
@@ -5632,18 +6402,6 @@ iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@~0.4.13:
dependencies:
safer-buffer ">= 2.1.2 < 3"
-icss-replace-symbols@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded"
- integrity sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=
-
-icss-utils@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-2.1.0.tgz#83f0a0ec378bf3246178b6c2ad9136f135b1c962"
- integrity sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=
- dependencies:
- postcss "^6.0.1"
-
icss-utils@^4.0.0, icss-utils@^4.1.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.1.tgz#21170b53789ee27447c2f47dd683081403f9a467"
@@ -5661,11 +6419,6 @@ iferr@^0.1.5:
resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501"
integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE=
-ignore-loader@0.1.2:
- version "0.1.2"
- resolved "https://registry.yarnpkg.com/ignore-loader/-/ignore-loader-0.1.2.tgz#d81f240376d0ba4f0d778972c3ad25874117a463"
- integrity sha1-2B8kA3bQuk8Nd4lyw60lh0EXpGM=
-
ignore@^4.0.6:
version "4.0.6"
resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc"
@@ -5676,13 +6429,6 @@ ignore@^5.1.1, ignore@^5.1.4:
resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.4.tgz#84b7b3dbe64552b6ef0eca99f6743dbec6d97adf"
integrity sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==
-import-cwd@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9"
- integrity sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=
- dependencies:
- import-from "^2.1.0"
-
import-fresh@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546"
@@ -5699,13 +6445,6 @@ import-fresh@^3.0.0, import-fresh@^3.1.0:
parent-module "^1.0.0"
resolve-from "^4.0.0"
-import-from@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/import-from/-/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1"
- integrity sha1-M1238qev/VOqpHHUuAId7ja387E=
- dependencies:
- resolve-from "^3.0.0"
-
import-local@^3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.0.2.tgz#a8cfd0431d1de4a2199703d003e3e62364fa6db6"
@@ -5734,7 +6473,7 @@ indexes-of@^1.0.1:
resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607"
integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc=
-infer-owner@^1.0.3:
+infer-owner@^1.0.3, infer-owner@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467"
integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==
@@ -5747,7 +6486,7 @@ inflight@^1.0.4:
once "^1.3.0"
wrappy "1"
-inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3:
+inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3:
version "2.0.4"
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
@@ -5814,7 +6553,7 @@ internal-slot@^1.0.2:
has "^1.0.3"
side-channel "^1.0.2"
-invariant@^2.2.2:
+invariant@^2.2.2, invariant@^2.2.4:
version "2.2.4"
resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6"
integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==
@@ -5826,6 +6565,16 @@ ip-regex@^2.1.0:
resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9"
integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=
+ipaddr.js@1.9.1:
+ version "1.9.1"
+ resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3"
+ integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==
+
+is-absolute-url@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6"
+ integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=
+
is-accessor-descriptor@^0.1.6:
version "0.1.6"
resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6"
@@ -5840,6 +6589,19 @@ is-accessor-descriptor@^1.0.0:
dependencies:
kind-of "^6.0.0"
+is-alphabetical@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d"
+ integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==
+
+is-alphanumerical@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf"
+ integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==
+ dependencies:
+ is-alphabetical "^1.0.0"
+ is-decimal "^1.0.0"
+
is-arguments@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.0.4.tgz#3faf966c7cba0ff437fb31f6250082fcf0448cf3"
@@ -5886,6 +6648,18 @@ is-ci@2.0.0, is-ci@^2.0.0:
dependencies:
ci-info "^2.0.0"
+is-color-stop@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345"
+ integrity sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=
+ dependencies:
+ css-color-names "^0.0.4"
+ hex-color-regex "^1.1.0"
+ hsl-regex "^1.0.0"
+ hsla-regex "^1.0.0"
+ rgb-regex "^1.0.1"
+ rgba-regex "^1.0.0"
+
is-data-descriptor@^0.1.4:
version "0.1.4"
resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56"
@@ -5905,6 +6679,11 @@ is-date-object@^1.0.1:
resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e"
integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==
+is-decimal@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5"
+ integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==
+
is-descriptor@^0.1.0:
version "0.1.6"
resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca"
@@ -5981,6 +6760,11 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1:
dependencies:
is-extglob "^2.1.1"
+is-hexadecimal@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7"
+ integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==
+
is-installed-globally@0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80"
@@ -6001,6 +6785,11 @@ is-number@^7.0.0:
resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
+is-obj@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982"
+ integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==
+
is-observable@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/is-observable/-/is-observable-1.1.0.tgz#b3e986c8f44de950867cab5403f5a3465005975e"
@@ -6037,6 +6826,11 @@ is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4:
dependencies:
isobject "^3.0.1"
+is-potential-custom-element-name@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz#0c52e54bcca391bb2c494b21e8626d7336c6e397"
+ integrity sha1-DFLlS8yjkbssSUsh6GJtczbG45c=
+
is-promise@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa"
@@ -6049,6 +6843,11 @@ is-regex@^1.0.4, is-regex@^1.0.5:
dependencies:
has "^1.0.3"
+is-resolvable@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88"
+ integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==
+
is-stream@^1.0.1, is-stream@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
@@ -6064,6 +6863,13 @@ is-string@^1.0.5:
resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6"
integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==
+is-svg@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-3.0.0.tgz#9321dbd29c212e5ca99c4fa9794c714bcafa2f75"
+ integrity sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==
+ dependencies:
+ html-comment-regex "^1.1.0"
+
is-symbol@^1.0.2:
version "1.0.3"
resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937"
@@ -6121,7 +6927,7 @@ isomorphic-fetch@^2.1.1:
node-fetch "^1.0.1"
whatwg-fetch ">=0.10.0"
-isomorphic-unfetch@3.0.0, isomorphic-unfetch@^3.0.0:
+isomorphic-unfetch@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/isomorphic-unfetch/-/isomorphic-unfetch-3.0.0.tgz#de6d80abde487b17de2c400a7ef9e5ecc2efb362"
integrity sha512-V0tmJSYfkKokZ5mgl0cmfQMTb7MLHsBMngTkbLY0eXvKqiVRRoZP04Ly+KhKrJfKtzC9E6Pp15Jo+bwh7Vi2XQ==
@@ -6170,75 +6976,65 @@ istanbul-lib-source-maps@^4.0.0:
istanbul-lib-coverage "^3.0.0"
source-map "^0.6.1"
-istanbul-reports@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.0.0.tgz#d4d16d035db99581b6194e119bbf36c963c5eb70"
- integrity sha512-2osTcC8zcOSUkImzN2EWQta3Vdi4WjjKw99P2yWx5mLnigAM0Rd5uYFn1cf2i/Ois45GkNjaoTqc5CxgMSX80A==
+istanbul-reports@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.0.2.tgz#d593210e5000683750cb09fc0644e4b6e27fd53b"
+ integrity sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==
dependencies:
html-escaper "^2.0.0"
istanbul-lib-report "^3.0.0"
-jest-changed-files@^25.2.6:
- version "25.2.6"
- resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-25.2.6.tgz#7d569cd6b265b1a84db3914db345d9c452f26b71"
- integrity sha512-F7l2m5n55jFnJj4ItB9XbAlgO+6umgvz/mdK76BfTd2NGkvGf9x96hUXP/15a1K0k14QtVOoutwpRKl360msvg==
+jest-changed-files@^26.0.1:
+ version "26.0.1"
+ resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-26.0.1.tgz#1334630c6a1ad75784120f39c3aa9278e59f349f"
+ integrity sha512-q8LP9Sint17HaE2LjxQXL+oYWW/WeeXMPE2+Op9X3mY8IEGFVc14xRxFjUuXUbcPAlDLhtWdIEt59GdQbn76Hw==
dependencies:
- "@jest/types" "^25.2.6"
- execa "^3.2.0"
+ "@jest/types" "^26.0.1"
+ execa "^4.0.0"
throat "^5.0.0"
-jest-cli@^25.2.7:
- version "25.2.7"
- resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-25.2.7.tgz#515b61fee402c397ffa8d570532f7b039c3159f4"
- integrity sha512-OOAZwY4Jkd3r5WhVM5L3JeLNFaylvHUczMLxQDVLrrVyb1Cy+DNJ6MVsb5TLh6iBklB42m5TOP+IbOgKGGOtMw==
+jest-cli@^26.0.1:
+ version "26.0.1"
+ resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-26.0.1.tgz#3a42399a4cbc96a519b99ad069a117d955570cac"
+ integrity sha512-pFLfSOBcbG9iOZWaMK4Een+tTxi/Wcm34geqZEqrst9cZDkTQ1LZ2CnBrTlHWuYAiTMFr0EQeK52ScyFU8wK+w==
dependencies:
- "@jest/core" "^25.2.7"
- "@jest/test-result" "^25.2.6"
- "@jest/types" "^25.2.6"
- chalk "^3.0.0"
+ "@jest/core" "^26.0.1"
+ "@jest/test-result" "^26.0.1"
+ "@jest/types" "^26.0.1"
+ chalk "^4.0.0"
exit "^0.1.2"
+ graceful-fs "^4.2.4"
import-local "^3.0.2"
is-ci "^2.0.0"
- jest-config "^25.2.7"
- jest-util "^25.2.6"
- jest-validate "^25.2.6"
+ jest-config "^26.0.1"
+ jest-util "^26.0.1"
+ jest-validate "^26.0.1"
prompts "^2.0.1"
- realpath-native "^2.0.0"
yargs "^15.3.1"
-jest-config@^25.2.7:
- version "25.2.7"
- resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-25.2.7.tgz#a14e5b96575987ce913dd9fc20ac8cd4b35a8c29"
- integrity sha512-rIdPPXR6XUxi+7xO4CbmXXkE6YWprvlKc4kg1SrkCL2YV5m/8MkHstq9gBZJ19Qoa3iz/GP+0sTG/PcIwkFojg==
+jest-config@^26.0.1:
+ version "26.0.1"
+ resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-26.0.1.tgz#096a3d4150afadf719d1fab00e9a6fb2d6d67507"
+ integrity sha512-9mWKx2L1LFgOXlDsC4YSeavnblN6A4CPfXFiobq+YYLaBMymA/SczN7xYTSmLaEYHZOcB98UdoN4m5uNt6tztg==
dependencies:
"@babel/core" "^7.1.0"
- "@jest/test-sequencer" "^25.2.7"
- "@jest/types" "^25.2.6"
- babel-jest "^25.2.6"
- chalk "^3.0.0"
+ "@jest/test-sequencer" "^26.0.1"
+ "@jest/types" "^26.0.1"
+ babel-jest "^26.0.1"
+ chalk "^4.0.0"
deepmerge "^4.2.2"
glob "^7.1.1"
- jest-environment-jsdom "^25.2.6"
- jest-environment-node "^25.2.6"
- jest-get-type "^25.2.6"
- jest-jasmine2 "^25.2.7"
- jest-regex-util "^25.2.6"
- jest-resolve "^25.2.6"
- jest-util "^25.2.6"
- jest-validate "^25.2.6"
+ graceful-fs "^4.2.4"
+ jest-environment-jsdom "^26.0.1"
+ jest-environment-node "^26.0.1"
+ jest-get-type "^26.0.0"
+ jest-jasmine2 "^26.0.1"
+ jest-regex-util "^26.0.0"
+ jest-resolve "^26.0.1"
+ jest-util "^26.0.1"
+ jest-validate "^26.0.1"
micromatch "^4.0.2"
- pretty-format "^25.2.6"
- realpath-native "^2.0.0"
-
-jest-diff@25.1.0:
- version "25.1.0"
- resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-25.1.0.tgz#58b827e63edea1bc80c1de952b80cec9ac50e1ad"
- integrity sha512-nepXgajT+h017APJTreSieh4zCqnSHEJ1iT8HDlewu630lSJ4Kjjr9KNzm+kzGwwcpsDE6Snx1GJGzzsefaEHw==
- dependencies:
- chalk "^3.0.0"
- diff-sequences "^25.1.0"
- jest-get-type "^25.1.0"
- pretty-format "^25.1.0"
+ pretty-format "^26.0.1"
jest-diff@^24.9.0:
version "24.9.0"
@@ -6250,57 +7046,66 @@ jest-diff@^24.9.0:
jest-get-type "^24.9.0"
pretty-format "^24.9.0"
-jest-diff@^25.2.6:
- version "25.2.6"
- resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-25.2.6.tgz#a6d70a9ab74507715ea1092ac513d1ab81c1b5e7"
- integrity sha512-KuadXImtRghTFga+/adnNrv9s61HudRMR7gVSbP35UKZdn4IK2/0N0PpGZIqtmllK9aUyye54I3nu28OYSnqOg==
+jest-diff@^25.2.1:
+ version "25.5.0"
+ resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-25.5.0.tgz#1dd26ed64f96667c068cef026b677dfa01afcfa9"
+ integrity sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A==
dependencies:
chalk "^3.0.0"
diff-sequences "^25.2.6"
jest-get-type "^25.2.6"
- pretty-format "^25.2.6"
+ pretty-format "^25.5.0"
-jest-docblock@^25.2.6:
- version "25.2.6"
- resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-25.2.6.tgz#4b09f1e7b7d6b3f39242ef3647ac7106770f722b"
- integrity sha512-VAYrljEq0upq0oERfIaaNf28gC6p9gORndhHstCYF8NWGNQJnzoaU//S475IxfWMk4UjjVmS9rJKLe5Jjjbixw==
+jest-diff@^26.0.1:
+ version "26.0.1"
+ resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-26.0.1.tgz#c44ab3cdd5977d466de69c46929e0e57f89aa1de"
+ integrity sha512-odTcHyl5X+U+QsczJmOjWw5tPvww+y9Yim5xzqxVl/R1j4z71+fHW4g8qu1ugMmKdFdxw+AtQgs5mupPnzcIBQ==
dependencies:
- detect-newline "^3.0.0"
-
-jest-each@^25.2.6:
- version "25.2.6"
- resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-25.2.6.tgz#026f6dea2ccc443c35cea793265620aab1b278b6"
- integrity sha512-OgQ01VINaRD6idWJOhCYwUc5EcgHBiFlJuw+ON2VgYr7HLtMFyCcuo+3mmBvuLUH4QudREZN7cDCZviknzsaJQ==
- dependencies:
- "@jest/types" "^25.2.6"
- chalk "^3.0.0"
- jest-get-type "^25.2.6"
- jest-util "^25.2.6"
- pretty-format "^25.2.6"
+ chalk "^4.0.0"
+ diff-sequences "^26.0.0"
+ jest-get-type "^26.0.0"
+ pretty-format "^26.0.1"
-jest-environment-jsdom@^25.2.6:
- version "25.2.6"
- resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-25.2.6.tgz#b7ae41c6035905b8e58d63a8f63cf8eaa00af279"
- integrity sha512-/o7MZIhGmLGIEG5j7r5B5Az0umWLCHU+F5crwfbm0BzC4ybHTJZOQTFQWhohBg+kbTCNOuftMcqHlVkVduJCQQ==
+jest-docblock@^26.0.0:
+ version "26.0.0"
+ resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-26.0.0.tgz#3e2fa20899fc928cb13bd0ff68bd3711a36889b5"
+ integrity sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==
dependencies:
- "@jest/environment" "^25.2.6"
- "@jest/fake-timers" "^25.2.6"
- "@jest/types" "^25.2.6"
- jest-mock "^25.2.6"
- jest-util "^25.2.6"
- jsdom "^15.2.1"
+ detect-newline "^3.0.0"
-jest-environment-node@^25.2.6:
- version "25.2.6"
- resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-25.2.6.tgz#ad4398432867113f474d94fe37b071ed04b30f3d"
- integrity sha512-D1Ihj14fxZiMHGeTtU/LunhzSI+UeBvlr/rcXMTNyRMUMSz2PEhuqGbB78brBY6Dk3FhJDk7Ta+8reVaGjLWhA==
- dependencies:
- "@jest/environment" "^25.2.6"
- "@jest/fake-timers" "^25.2.6"
- "@jest/types" "^25.2.6"
- jest-mock "^25.2.6"
- jest-util "^25.2.6"
- semver "^6.3.0"
+jest-each@^26.0.1:
+ version "26.0.1"
+ resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-26.0.1.tgz#633083061619302fc90dd8f58350f9d77d67be04"
+ integrity sha512-OTgJlwXCAR8NIWaXFL5DBbeS4QIYPuNASkzSwMCJO+ywo9BEa6TqkaSWsfR7VdbMLdgYJqSfQcIyjJCNwl5n4Q==
+ dependencies:
+ "@jest/types" "^26.0.1"
+ chalk "^4.0.0"
+ jest-get-type "^26.0.0"
+ jest-util "^26.0.1"
+ pretty-format "^26.0.1"
+
+jest-environment-jsdom@^26.0.1:
+ version "26.0.1"
+ resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-26.0.1.tgz#217690852e5bdd7c846a4e3b50c8ffd441dfd249"
+ integrity sha512-u88NJa3aptz2Xix2pFhihRBAatwZHWwSiRLBDBQE1cdJvDjPvv7ZGA0NQBxWwDDn7D0g1uHqxM8aGgfA9Bx49g==
+ dependencies:
+ "@jest/environment" "^26.0.1"
+ "@jest/fake-timers" "^26.0.1"
+ "@jest/types" "^26.0.1"
+ jest-mock "^26.0.1"
+ jest-util "^26.0.1"
+ jsdom "^16.2.2"
+
+jest-environment-node@^26.0.1:
+ version "26.0.1"
+ resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-26.0.1.tgz#584a9ff623124ff6eeb49e0131b5f7612b310b13"
+ integrity sha512-4FRBWcSn5yVo0KtNav7+5NH5Z/tEgDLp7VRQVS5tCouWORxj+nI+1tOLutM07Zb2Qi7ja+HEDoOUkjBSWZg/IQ==
+ dependencies:
+ "@jest/environment" "^26.0.1"
+ "@jest/fake-timers" "^26.0.1"
+ "@jest/types" "^26.0.1"
+ jest-mock "^26.0.1"
+ jest-util "^26.0.1"
jest-extended@0.11.5:
version "0.11.5"
@@ -6321,28 +7126,29 @@ jest-get-type@^24.9.0:
resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-24.9.0.tgz#1684a0c8a50f2e4901b6644ae861f579eed2ef0e"
integrity sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==
-jest-get-type@^25.1.0:
- version "25.1.0"
- resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-25.1.0.tgz#1cfe5fc34f148dc3a8a3b7275f6b9ce9e2e8a876"
- integrity sha512-yWkBnT+5tMr8ANB6V+OjmrIJufHtCAqI5ic2H40v+tRqxDmE0PGnIiTyvRWFOMtmVHYpwRqyazDbTnhpjsGvLw==
-
jest-get-type@^25.2.6:
version "25.2.6"
resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-25.2.6.tgz#0b0a32fab8908b44d508be81681487dbabb8d877"
integrity sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==
-jest-haste-map@^25.2.6:
- version "25.2.6"
- resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-25.2.6.tgz#4aa6bcfa15310afccdb9ca77af58a98add8cedb8"
- integrity sha512-nom0+fnY8jwzelSDQnrqaKAcDZczYQvMEwcBjeL3PQ4MlcsqeB7dmrsAniUw/9eLkngT5DE6FhnenypilQFsgA==
+jest-get-type@^26.0.0:
+ version "26.0.0"
+ resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-26.0.0.tgz#381e986a718998dbfafcd5ec05934be538db4039"
+ integrity sha512-zRc1OAPnnws1EVfykXOj19zo2EMw5Hi6HLbFCSjpuJiXtOWAYIjNsHVSbpQ8bDX7L5BGYGI8m+HmKdjHYFF0kg==
+
+jest-haste-map@^26.0.1:
+ version "26.0.1"
+ resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-26.0.1.tgz#40dcc03c43ac94d25b8618075804d09cd5d49de7"
+ integrity sha512-J9kBl/EdjmDsvyv7CiyKY5+DsTvVOScenprz/fGqfLg/pm1gdjbwwQ98nW0t+OIt+f+5nAVaElvn/6wP5KO7KA==
dependencies:
- "@jest/types" "^25.2.6"
+ "@jest/types" "^26.0.1"
+ "@types/graceful-fs" "^4.1.2"
anymatch "^3.0.3"
fb-watchman "^2.0.0"
- graceful-fs "^4.2.3"
- jest-serializer "^25.2.6"
- jest-util "^25.2.6"
- jest-worker "^25.2.6"
+ graceful-fs "^4.2.4"
+ jest-serializer "^26.0.0"
+ jest-util "^26.0.1"
+ jest-worker "^26.0.0"
micromatch "^4.0.2"
sane "^4.0.3"
walker "^1.0.7"
@@ -6350,36 +7156,36 @@ jest-haste-map@^25.2.6:
optionalDependencies:
fsevents "^2.1.2"
-jest-jasmine2@^25.2.7:
- version "25.2.7"
- resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-25.2.7.tgz#55ff87f8f462ef0e2f16fd19430b8be8bcebef0e"
- integrity sha512-HeQxEbonp8fUvik9jF0lkU9ab1u5TQdIb7YSU9Fj7SxWtqHNDGyCpF6ZZ3r/5yuertxi+R95Ba9eA91GMQ38eA==
+jest-jasmine2@^26.0.1:
+ version "26.0.1"
+ resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-26.0.1.tgz#947c40ee816636ba23112af3206d6fa7b23c1c1c"
+ integrity sha512-ILaRyiWxiXOJ+RWTKupzQWwnPaeXPIoLS5uW41h18varJzd9/7I0QJGqg69fhTT1ev9JpSSo9QtalriUN0oqOg==
dependencies:
"@babel/traverse" "^7.1.0"
- "@jest/environment" "^25.2.6"
- "@jest/source-map" "^25.2.6"
- "@jest/test-result" "^25.2.6"
- "@jest/types" "^25.2.6"
- chalk "^3.0.0"
+ "@jest/environment" "^26.0.1"
+ "@jest/source-map" "^26.0.0"
+ "@jest/test-result" "^26.0.1"
+ "@jest/types" "^26.0.1"
+ chalk "^4.0.0"
co "^4.6.0"
- expect "^25.2.7"
+ expect "^26.0.1"
is-generator-fn "^2.0.0"
- jest-each "^25.2.6"
- jest-matcher-utils "^25.2.7"
- jest-message-util "^25.2.6"
- jest-runtime "^25.2.7"
- jest-snapshot "^25.2.7"
- jest-util "^25.2.6"
- pretty-format "^25.2.6"
+ jest-each "^26.0.1"
+ jest-matcher-utils "^26.0.1"
+ jest-message-util "^26.0.1"
+ jest-runtime "^26.0.1"
+ jest-snapshot "^26.0.1"
+ jest-util "^26.0.1"
+ pretty-format "^26.0.1"
throat "^5.0.0"
-jest-leak-detector@^25.2.6:
- version "25.2.6"
- resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-25.2.6.tgz#68fbaf651142292b03e30641f33e15af9b8c62b1"
- integrity sha512-n+aJUM+j/x1kIaPVxzerMqhAUuqTU1PL5kup46rXh+l9SP8H6LqECT/qD1GrnylE1L463/0StSPkH4fUpkuEjA==
+jest-leak-detector@^26.0.1:
+ version "26.0.1"
+ resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-26.0.1.tgz#79b19ab3f41170e0a78eb8fa754a116d3447fb8c"
+ integrity sha512-93FR8tJhaYIWrWsbmVN1pQ9ZNlbgRpfvrnw5LmgLRX0ckOJ8ut/I35CL7awi2ecq6Ca4lL59bEK9hr7nqoHWPA==
dependencies:
- jest-get-type "^25.2.6"
- pretty-format "^25.2.6"
+ jest-get-type "^26.0.0"
+ pretty-format "^26.0.1"
jest-matcher-utils@^22.0.0:
version "22.4.3"
@@ -6400,15 +7206,15 @@ jest-matcher-utils@^24.9.0:
jest-get-type "^24.9.0"
pretty-format "^24.9.0"
-jest-matcher-utils@^25.2.7:
- version "25.2.7"
- resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-25.2.7.tgz#53fad3c11fc42e92e374306df543026712c957a3"
- integrity sha512-jNYmKQPRyPO3ny0KY1I4f0XW4XnpJ3Nx5ovT4ik0TYDOYzuXJW40axqOyS61l/voWbVT9y9nZ1THL1DlpaBVpA==
+jest-matcher-utils@^26.0.1:
+ version "26.0.1"
+ resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-26.0.1.tgz#12e1fc386fe4f14678f4cc8dbd5ba75a58092911"
+ integrity sha512-PUMlsLth0Azen8Q2WFTwnSkGh2JZ8FYuwijC8NR47vXKpsrKmA1wWvgcj1CquuVfcYiDEdj985u5Wmg7COEARw==
dependencies:
- chalk "^3.0.0"
- jest-diff "^25.2.6"
- jest-get-type "^25.2.6"
- pretty-format "^25.2.6"
+ chalk "^4.0.0"
+ jest-diff "^26.0.1"
+ jest-get-type "^26.0.0"
+ pretty-format "^26.0.1"
jest-message-util@^24.9.0:
version "24.9.0"
@@ -6424,25 +7230,26 @@ jest-message-util@^24.9.0:
slash "^2.0.0"
stack-utils "^1.0.1"
-jest-message-util@^25.2.6:
- version "25.2.6"
- resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-25.2.6.tgz#9d5523bebec8cd9cdef75f0f3069d6ec9a2252df"
- integrity sha512-Hgg5HbOssSqOuj+xU1mi7m3Ti2nwSQJQf/kxEkrz2r2rp2ZLO1pMeKkz2WiDUWgSR+APstqz0uMFcE5yc0qdcg==
+jest-message-util@^26.0.1:
+ version "26.0.1"
+ resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-26.0.1.tgz#07af1b42fc450b4cc8e90e4c9cef11b33ce9b0ac"
+ integrity sha512-CbK8uQREZ8umUfo8+zgIfEt+W7HAHjQCoRaNs4WxKGhAYBGwEyvxuK81FXa7VeB9pwDEXeeKOB2qcsNVCAvB7Q==
dependencies:
"@babel/code-frame" "^7.0.0"
- "@jest/types" "^25.2.6"
+ "@jest/types" "^26.0.1"
"@types/stack-utils" "^1.0.1"
- chalk "^3.0.0"
+ chalk "^4.0.0"
+ graceful-fs "^4.2.4"
micromatch "^4.0.2"
slash "^3.0.0"
- stack-utils "^1.0.1"
+ stack-utils "^2.0.2"
-jest-mock@^25.2.6:
- version "25.2.6"
- resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-25.2.6.tgz#8df66eaa55a713d0f2a7dfb4f14507289d24dfa3"
- integrity sha512-vc4nibavi2RGPdj/MyZy/azuDjZhpYZLvpfgq1fxkhbyTpKVdG7CgmRVKJ7zgLpY5kuMjTzDYA6QnRwhsCU+tA==
+jest-mock@^26.0.1:
+ version "26.0.1"
+ resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-26.0.1.tgz#7fd1517ed4955397cf1620a771dc2d61fad8fd40"
+ integrity sha512-MpYTBqycuPYSY6xKJognV7Ja46/TeRbAZept987Zp+tuJvMN0YBWyyhG9mXyYQaU3SBI0TUlSaO5L3p49agw7Q==
dependencies:
- "@jest/types" "^25.2.6"
+ "@jest/types" "^26.0.1"
jest-pnp-resolver@^1.2.1:
version "1.2.1"
@@ -6454,146 +7261,153 @@ jest-regex-util@^24.9.0:
resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-24.9.0.tgz#c13fb3380bde22bf6575432c493ea8fe37965636"
integrity sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==
-jest-regex-util@^25.2.6:
- version "25.2.6"
- resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-25.2.6.tgz#d847d38ba15d2118d3b06390056028d0f2fd3964"
- integrity sha512-KQqf7a0NrtCkYmZZzodPftn7fL1cq3GQAFVMn5Hg8uKx/fIenLEobNanUxb7abQ1sjADHBseG/2FGpsv/wr+Qw==
+jest-regex-util@^26.0.0:
+ version "26.0.0"
+ resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-26.0.0.tgz#d25e7184b36e39fd466c3bc41be0971e821fee28"
+ integrity sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==
-jest-resolve-dependencies@^25.2.7:
- version "25.2.7"
- resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-25.2.7.tgz#9ca4c62d67cce031a27fa5d5705b4b5b5c029d23"
- integrity sha512-IrnMzCAh11Xd2gAOJL+ThEW6QO8DyqNdvNkQcaCticDrOAr9wtKT7yT6QBFFjqKFgjjvaVKDs59WdgUhgYnHnQ==
+jest-resolve-dependencies@^26.0.1:
+ version "26.0.1"
+ resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-26.0.1.tgz#607ba7ccc32151d185a477cff45bf33bce417f0b"
+ integrity sha512-9d5/RS/ft0vB/qy7jct/qAhzJsr6fRQJyGAFigK3XD4hf9kIbEH5gks4t4Z7kyMRhowU6HWm/o8ILqhaHdSqLw==
dependencies:
- "@jest/types" "^25.2.6"
- jest-regex-util "^25.2.6"
- jest-snapshot "^25.2.7"
+ "@jest/types" "^26.0.1"
+ jest-regex-util "^26.0.0"
+ jest-snapshot "^26.0.1"
-jest-resolve@^25.2.6:
- version "25.2.6"
- resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-25.2.6.tgz#84694ead5da13c2890ac04d4a78699ba937f3896"
- integrity sha512-7O61GVdcAXkLz/vNGKdF+00A80/fKEAA47AEXVNcZwj75vEjPfZbXDaWFmAQCyXj4oo9y9dC9D+CLA11t8ieGw==
+jest-resolve@^26.0.1:
+ version "26.0.1"
+ resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-26.0.1.tgz#21d1ee06f9ea270a343a8893051aeed940cde736"
+ integrity sha512-6jWxk0IKZkPIVTvq6s72RH735P8f9eCJW3IM5CX/SJFeKq1p2cZx0U49wf/SdMlhaB/anann5J2nCJj6HrbezQ==
dependencies:
- "@jest/types" "^25.2.6"
- browser-resolve "^1.11.3"
- chalk "^3.0.0"
+ "@jest/types" "^26.0.1"
+ chalk "^4.0.0"
+ graceful-fs "^4.2.4"
jest-pnp-resolver "^1.2.1"
- realpath-native "^2.0.0"
- resolve "^1.15.1"
+ jest-util "^26.0.1"
+ read-pkg-up "^7.0.1"
+ resolve "^1.17.0"
+ slash "^3.0.0"
-jest-runner@^25.2.7:
- version "25.2.7"
- resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-25.2.7.tgz#3676c01dc0104caa8a0ebb8507df382c88f2a1e2"
- integrity sha512-RFEr71nMrtNwcpoHzie5+fe1w3JQCGMyT2xzNwKe3f88+bK+frM2o1v24gEcPxQ2QqB3COMCe2+1EkElP+qqqQ==
+jest-runner@^26.0.1:
+ version "26.0.1"
+ resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-26.0.1.tgz#ea03584b7ae4bacfb7e533d680a575a49ae35d50"
+ integrity sha512-CApm0g81b49Znm4cZekYQK67zY7kkB4umOlI2Dx5CwKAzdgw75EN+ozBHRvxBzwo1ZLYZ07TFxkaPm+1t4d8jA==
dependencies:
- "@jest/console" "^25.2.6"
- "@jest/environment" "^25.2.6"
- "@jest/test-result" "^25.2.6"
- "@jest/types" "^25.2.6"
- chalk "^3.0.0"
+ "@jest/console" "^26.0.1"
+ "@jest/environment" "^26.0.1"
+ "@jest/test-result" "^26.0.1"
+ "@jest/types" "^26.0.1"
+ chalk "^4.0.0"
exit "^0.1.2"
- graceful-fs "^4.2.3"
- jest-config "^25.2.7"
- jest-docblock "^25.2.6"
- jest-haste-map "^25.2.6"
- jest-jasmine2 "^25.2.7"
- jest-leak-detector "^25.2.6"
- jest-message-util "^25.2.6"
- jest-resolve "^25.2.6"
- jest-runtime "^25.2.7"
- jest-util "^25.2.6"
- jest-worker "^25.2.6"
+ graceful-fs "^4.2.4"
+ jest-config "^26.0.1"
+ jest-docblock "^26.0.0"
+ jest-haste-map "^26.0.1"
+ jest-jasmine2 "^26.0.1"
+ jest-leak-detector "^26.0.1"
+ jest-message-util "^26.0.1"
+ jest-resolve "^26.0.1"
+ jest-runtime "^26.0.1"
+ jest-util "^26.0.1"
+ jest-worker "^26.0.0"
source-map-support "^0.5.6"
throat "^5.0.0"
-jest-runtime@^25.2.7:
- version "25.2.7"
- resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-25.2.7.tgz#cb10e695d036671a83aec3a3803163c354043ac9"
- integrity sha512-Gw3X8KxTTFylu2T/iDSNKRUQXQiPIYUY0b66GwVYa7W8wySkUljKhibQHSq0VhmCAN7vRBEQjlVQ+NFGNmQeBw==
- dependencies:
- "@jest/console" "^25.2.6"
- "@jest/environment" "^25.2.6"
- "@jest/source-map" "^25.2.6"
- "@jest/test-result" "^25.2.6"
- "@jest/transform" "^25.2.6"
- "@jest/types" "^25.2.6"
+jest-runtime@^26.0.1:
+ version "26.0.1"
+ resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-26.0.1.tgz#a121a6321235987d294168e282d52b364d7d3f89"
+ integrity sha512-Ci2QhYFmANg5qaXWf78T2Pfo6GtmIBn2rRaLnklRyEucmPccmCKvS9JPljcmtVamsdMmkyNkVFb9pBTD6si9Lw==
+ dependencies:
+ "@jest/console" "^26.0.1"
+ "@jest/environment" "^26.0.1"
+ "@jest/fake-timers" "^26.0.1"
+ "@jest/globals" "^26.0.1"
+ "@jest/source-map" "^26.0.0"
+ "@jest/test-result" "^26.0.1"
+ "@jest/transform" "^26.0.1"
+ "@jest/types" "^26.0.1"
"@types/yargs" "^15.0.0"
- chalk "^3.0.0"
+ chalk "^4.0.0"
collect-v8-coverage "^1.0.0"
exit "^0.1.2"
glob "^7.1.3"
- graceful-fs "^4.2.3"
- jest-config "^25.2.7"
- jest-haste-map "^25.2.6"
- jest-message-util "^25.2.6"
- jest-mock "^25.2.6"
- jest-regex-util "^25.2.6"
- jest-resolve "^25.2.6"
- jest-snapshot "^25.2.7"
- jest-util "^25.2.6"
- jest-validate "^25.2.6"
- realpath-native "^2.0.0"
+ graceful-fs "^4.2.4"
+ jest-config "^26.0.1"
+ jest-haste-map "^26.0.1"
+ jest-message-util "^26.0.1"
+ jest-mock "^26.0.1"
+ jest-regex-util "^26.0.0"
+ jest-resolve "^26.0.1"
+ jest-snapshot "^26.0.1"
+ jest-util "^26.0.1"
+ jest-validate "^26.0.1"
slash "^3.0.0"
strip-bom "^4.0.0"
yargs "^15.3.1"
-jest-serializer@^25.2.6:
- version "25.2.6"
- resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-25.2.6.tgz#3bb4cc14fe0d8358489dbbefbb8a4e708ce039b7"
- integrity sha512-RMVCfZsezQS2Ww4kB5HJTMaMJ0asmC0BHlnobQC6yEtxiFKIxohFA4QSXSabKwSggaNkqxn6Z2VwdFCjhUWuiQ==
+jest-serializer@^26.0.0:
+ version "26.0.0"
+ resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-26.0.0.tgz#f6c521ddb976943b93e662c0d4d79245abec72a3"
+ integrity sha512-sQGXLdEGWFAE4wIJ2ZaIDb+ikETlUirEOBsLXdoBbeLhTHkZUJwgk3+M8eyFizhM6le43PDCCKPA1hzkSDo4cQ==
+ dependencies:
+ graceful-fs "^4.2.4"
-jest-snapshot@^25.2.7:
- version "25.2.7"
- resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-25.2.7.tgz#7eeafeef4dcbda1c47c8503d2bf5212b6430aac6"
- integrity sha512-Rm8k7xpGM4tzmYhB6IeRjsOMkXaU8/FOz5XlU6oYwhy53mq6txVNqIKqN1VSiexzpC80oWVxVDfUDt71M6XPOA==
+jest-snapshot@^26.0.1:
+ version "26.0.1"
+ resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-26.0.1.tgz#1baa942bd83d47b837a84af7fcf5fd4a236da399"
+ integrity sha512-jxd+cF7+LL+a80qh6TAnTLUZHyQoWwEHSUFJjkw35u3Gx+BZUNuXhYvDqHXr62UQPnWo2P6fvQlLjsU93UKyxA==
dependencies:
"@babel/types" "^7.0.0"
- "@jest/types" "^25.2.6"
- "@types/prettier" "^1.19.0"
- chalk "^3.0.0"
- expect "^25.2.7"
- jest-diff "^25.2.6"
- jest-get-type "^25.2.6"
- jest-matcher-utils "^25.2.7"
- jest-message-util "^25.2.6"
- jest-resolve "^25.2.6"
+ "@jest/types" "^26.0.1"
+ "@types/prettier" "^2.0.0"
+ chalk "^4.0.0"
+ expect "^26.0.1"
+ graceful-fs "^4.2.4"
+ jest-diff "^26.0.1"
+ jest-get-type "^26.0.0"
+ jest-matcher-utils "^26.0.1"
+ jest-message-util "^26.0.1"
+ jest-resolve "^26.0.1"
make-dir "^3.0.0"
natural-compare "^1.4.0"
- pretty-format "^25.2.6"
- semver "^6.3.0"
+ pretty-format "^26.0.1"
+ semver "^7.3.2"
-jest-util@^25.2.6:
- version "25.2.6"
- resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-25.2.6.tgz#3c1c95cdfd653126728b0ed861a86610e30d569c"
- integrity sha512-gpXy0H5ymuQ0x2qgl1zzHg7LYHZYUmDEq6F7lhHA8M0eIwDB2WteOcCnQsohl9c/vBKZ3JF2r4EseipCZz3s4Q==
+jest-util@^26.0.1:
+ version "26.0.1"
+ resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-26.0.1.tgz#72c4c51177b695fdd795ca072a6f94e3d7cef00a"
+ integrity sha512-byQ3n7ad1BO/WyFkYvlWQHTsomB6GIewBh8tlGtusiylAlaxQ1UpS0XYH0ngOyhZuHVLN79Qvl6/pMiDMSSG1g==
dependencies:
- "@jest/types" "^25.2.6"
- chalk "^3.0.0"
+ "@jest/types" "^26.0.1"
+ chalk "^4.0.0"
+ graceful-fs "^4.2.4"
is-ci "^2.0.0"
make-dir "^3.0.0"
-jest-validate@^25.2.6:
- version "25.2.6"
- resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-25.2.6.tgz#ab3631fb97e242c42b09ca53127abe0b12e9125e"
- integrity sha512-a4GN7hYbqQ3Rt9iHsNLFqQz7HDV7KiRPCwPgo5nqtTIWNZw7gnT8KchG+Riwh+UTSn8REjFCodGp50KX/fRNgQ==
+jest-validate@^26.0.1:
+ version "26.0.1"
+ resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-26.0.1.tgz#a62987e1da5b7f724130f904725e22f4e5b2e23c"
+ integrity sha512-u0xRc+rbmov/VqXnX3DlkxD74rHI/CfS5xaV2VpeaVySjbb1JioNVOyly5b56q2l9ZKe7bVG5qWmjfctkQb0bA==
dependencies:
- "@jest/types" "^25.2.6"
- camelcase "^5.3.1"
- chalk "^3.0.0"
- jest-get-type "^25.2.6"
+ "@jest/types" "^26.0.1"
+ camelcase "^6.0.0"
+ chalk "^4.0.0"
+ jest-get-type "^26.0.0"
leven "^3.1.0"
- pretty-format "^25.2.6"
+ pretty-format "^26.0.1"
-jest-watcher@^25.2.7:
- version "25.2.7"
- resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-25.2.7.tgz#01db4332d34d14c03c9ef22255125a3b07f997bc"
- integrity sha512-RdHuW+f49tahWtluTnUdZ2iPliebleROI2L/J5phYrUS6DPC9RB3SuUtqYyYhGZJsbvRSuLMIlY/cICJ+PIecw==
+jest-watcher@^26.0.1:
+ version "26.0.1"
+ resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-26.0.1.tgz#5b5e3ebbdf10c240e22a98af66d645631afda770"
+ integrity sha512-pdZPydsS8475f89kGswaNsN3rhP6lnC3/QDCppP7bg1L9JQz7oU9Mb/5xPETk1RHDCWeqmVC47M4K5RR7ejxFw==
dependencies:
- "@jest/test-result" "^25.2.6"
- "@jest/types" "^25.2.6"
+ "@jest/test-result" "^26.0.1"
+ "@jest/types" "^26.0.1"
ansi-escapes "^4.2.1"
- chalk "^3.0.0"
- jest-util "^25.2.6"
- string-length "^3.1.0"
+ chalk "^4.0.0"
+ jest-util "^26.0.1"
+ string-length "^4.0.1"
jest-worker@24.9.0:
version "24.9.0"
@@ -6603,33 +7417,28 @@ jest-worker@24.9.0:
merge-stream "^2.0.0"
supports-color "^6.1.0"
-jest-worker@^25.2.6:
- version "25.2.6"
- resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-25.2.6.tgz#d1292625326794ce187c38f51109faced3846c58"
- integrity sha512-FJn9XDUSxcOR4cwDzRfL1z56rUofNTFs539FGASpd50RHdb6EVkhxQqktodW2mI49l+W3H+tFJDotCHUQF6dmA==
+jest-worker@^26.0.0:
+ version "26.0.0"
+ resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.0.0.tgz#4920c7714f0a96c6412464718d0c58a3df3fb066"
+ integrity sha512-pPaYa2+JnwmiZjK9x7p9BoZht+47ecFCDFA/CJxspHzeDvQcfVBLWzCiWyo+EGrSiQMWZtCFo9iSvMZnAAo8vw==
dependencies:
merge-stream "^2.0.0"
supports-color "^7.0.0"
-jest@25.2.7:
- version "25.2.7"
- resolved "https://registry.yarnpkg.com/jest/-/jest-25.2.7.tgz#3929a5f35cdd496f7756876a206b99a94e1e09ae"
- integrity sha512-XV1n/CE2McCikl4tfpCY950RytHYvxdo/wvtgmn/qwA8z1s16fuvgFL/KoPrrmkqJTaPMUlLVE58pwiaTX5TdA==
+jest@26.0.1:
+ version "26.0.1"
+ resolved "https://registry.yarnpkg.com/jest/-/jest-26.0.1.tgz#5c51a2e58dff7525b65f169721767173bf832694"
+ integrity sha512-29Q54kn5Bm7ZGKIuH2JRmnKl85YRigp0o0asTc6Sb6l2ch1DCXIeZTLLFy9ultJvhkTqbswF5DEx4+RlkmCxWg==
dependencies:
- "@jest/core" "^25.2.7"
+ "@jest/core" "^26.0.1"
import-local "^3.0.2"
- jest-cli "^25.2.7"
+ jest-cli "^26.0.1"
js-cookie@2.2.1:
version "2.2.1"
resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-2.2.1.tgz#69e106dc5d5806894562902aa5baec3744e9b2b8"
integrity sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==
-js-levenshtein@^1.1.3:
- version "1.1.6"
- resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d"
- integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==
-
"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
@@ -6653,36 +7462,36 @@ jsbn@~0.1.0:
resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM=
-jsdom@^15.2.1:
- version "15.2.1"
- resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-15.2.1.tgz#d2feb1aef7183f86be521b8c6833ff5296d07ec5"
- integrity sha512-fAl1W0/7T2G5vURSyxBzrJ1LSdQn6Tr5UX/xD4PXDx/PDgwygedfW6El/KIj3xJ7FU61TTYnc/l/B7P49Eqt6g==
- dependencies:
- abab "^2.0.0"
- acorn "^7.1.0"
- acorn-globals "^4.3.2"
- array-equal "^1.0.0"
- cssom "^0.4.1"
- cssstyle "^2.0.0"
- data-urls "^1.1.0"
- domexception "^1.0.1"
- escodegen "^1.11.1"
- html-encoding-sniffer "^1.0.2"
+jsdom@^16.2.2:
+ version "16.2.2"
+ resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.2.2.tgz#76f2f7541646beb46a938f5dc476b88705bedf2b"
+ integrity sha512-pDFQbcYtKBHxRaP55zGXCJWgFHkDAYbKcsXEK/3Icu9nKYZkutUXfLBwbD+09XDutkYSHcgfQLZ0qvpAAm9mvg==
+ dependencies:
+ abab "^2.0.3"
+ acorn "^7.1.1"
+ acorn-globals "^6.0.0"
+ cssom "^0.4.4"
+ cssstyle "^2.2.0"
+ data-urls "^2.0.0"
+ decimal.js "^10.2.0"
+ domexception "^2.0.1"
+ escodegen "^1.14.1"
+ html-encoding-sniffer "^2.0.1"
+ is-potential-custom-element-name "^1.0.0"
nwsapi "^2.2.0"
- parse5 "5.1.0"
- pn "^1.1.0"
- request "^2.88.0"
- request-promise-native "^1.0.7"
- saxes "^3.1.9"
- symbol-tree "^3.2.2"
+ parse5 "5.1.1"
+ request "^2.88.2"
+ request-promise-native "^1.0.8"
+ saxes "^5.0.0"
+ symbol-tree "^3.2.4"
tough-cookie "^3.0.1"
- w3c-hr-time "^1.0.1"
- w3c-xmlserializer "^1.1.2"
- webidl-conversions "^4.0.2"
+ w3c-hr-time "^1.0.2"
+ w3c-xmlserializer "^2.0.0"
+ webidl-conversions "^6.0.0"
whatwg-encoding "^1.0.5"
whatwg-mimetype "^2.3.0"
- whatwg-url "^7.0.0"
- ws "^7.0.0"
+ whatwg-url "^8.0.0"
+ ws "^7.2.3"
xml-name-validator "^3.0.0"
jsesc@^2.5.1:
@@ -6804,7 +7613,7 @@ kind-of@^5.0.0:
resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d"
integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==
-kind-of@^6.0.0, kind-of@^6.0.2:
+kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3:
version "6.0.3"
resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd"
integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==
@@ -6841,7 +7650,22 @@ leven@^3.1.0:
resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2"
integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==
-levn@^0.3.0, levn@~0.3.0:
+levenary@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/levenary/-/levenary-1.1.1.tgz#842a9ee98d2075aa7faeedbe32679e9205f46f77"
+ integrity sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==
+ dependencies:
+ leven "^3.1.0"
+
+levn@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade"
+ integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==
+ dependencies:
+ prelude-ls "^1.2.1"
+ type-check "~0.4.0"
+
+levn@~0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=
@@ -6898,16 +7722,6 @@ listr@0.14.3:
p-map "^2.0.0"
rxjs "^6.3.3"
-load-json-file@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b"
- integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs=
- dependencies:
- graceful-fs "^4.1.2"
- parse-json "^4.0.0"
- pify "^3.0.0"
- strip-bom "^3.0.0"
-
loader-runner@^2.4.0:
version "2.4.0"
resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357"
@@ -6922,7 +7736,7 @@ loader-utils@1.2.3:
emojis-list "^2.0.0"
json5 "^1.0.1"
-loader-utils@2.0.0:
+loader-utils@2.0.0, loader-utils@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz#e4cace5b816d425a166b5f097e10cd12b36064b0"
integrity sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==
@@ -6931,7 +7745,7 @@ loader-utils@2.0.0:
emojis-list "^3.0.0"
json5 "^2.1.2"
-loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.3:
+loader-utils@^1.1.0, loader-utils@^1.2.3:
version "1.4.0"
resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613"
integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==
@@ -6970,12 +7784,12 @@ locize-editor@3.0.0:
dependencies:
"@babel/runtime" "^7.4.5"
-locize-node-lastused@2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/locize-node-lastused/-/locize-node-lastused-2.0.0.tgz#488d942b8b8a830206b685104de042ada78a4029"
- integrity sha512-NYvNU8AO+Re9SH+7V0XGPDCv1I8b/dJmEyelOcnL4Z7fmhKMcHTkC+rzWdLGa2O6xY9zCoEEnRaSt90mvL8CMg==
+locize-lastused@3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/locize-lastused/-/locize-lastused-3.0.4.tgz#62980dfc91aefae1d8207b92ab20974cf45cb34d"
+ integrity sha512-GZn9xObIAUswtOZIbM+BrM8JSH9Nk+IcNJIXu+DKLV/R2i1LDmnwKLmcd8ZeKIVQiBOUmiGqHqfI0KEBZz/sww==
dependencies:
- request "2.88.0"
+ node-fetch "2.6.0"
lodash.camelcase@^4.3.0:
version "4.3.0"
@@ -6992,6 +7806,11 @@ lodash.debounce@^4.0.8:
resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168=
+lodash.filter@4.6.0:
+ version "4.6.0"
+ resolved "https://registry.yarnpkg.com/lodash.filter/-/lodash.filter-4.6.0.tgz#668b1d4981603ae1cc5a6fa760143e480b4c4ace"
+ integrity sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4=
+
lodash.find@4.6.0:
version "4.6.0"
resolved "https://registry.yarnpkg.com/lodash.find/-/lodash.find-4.6.0.tgz#cb0704d47ab71789ffa0de8b97dd926fb88b13b1"
@@ -7027,7 +7846,7 @@ lodash.isplainobject@4.0.6:
resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb"
integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=
-lodash.kebabcase@^4.1.1:
+lodash.kebabcase@4.1.1, lodash.kebabcase@^4.1.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36"
integrity sha1-hImxyw0p/4gZXM7KRI/21swpXDY=
@@ -7037,7 +7856,7 @@ lodash.map@4.6.0:
resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f6d3"
integrity sha1-dx7Hg540c9nEzeKLGTlMNWL09tM=
-lodash.memoize@4.x:
+lodash.memoize@4.x, lodash.memoize@^4.1.2:
version "4.1.2"
resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe"
integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=
@@ -7052,22 +7871,47 @@ lodash.remove@4.7.0:
resolved "https://registry.yarnpkg.com/lodash.remove/-/lodash.remove-4.7.0.tgz#f31d31e7c39a0690d5074ec0d3627162334ee626"
integrity sha1-8x0x58OaBpDVB07A02JxYjNO5iY=
+lodash.size@4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/lodash.size/-/lodash.size-4.2.0.tgz#71fe75ed3eabdb2bcb73a1b0b4f51c392ee27b86"
+ integrity sha1-cf517T6r2yvLc6GwtPUcOS7ie4Y=
+
+lodash.some@4.6.0:
+ version "4.6.0"
+ resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d"
+ integrity sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=
+
lodash.sortby@^4.7.0:
version "4.7.0"
resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438"
integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=
+lodash.startswith@4.2.1:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/lodash.startswith/-/lodash.startswith-4.2.1.tgz#c598c4adce188a27e53145731cdc6c0e7177600c"
+ integrity sha1-xZjErc4YiiflMUVzHNxsDnF3YAw=
+
lodash.unionwith@^4.6.0:
version "4.6.0"
resolved "https://registry.yarnpkg.com/lodash.unionwith/-/lodash.unionwith-4.6.0.tgz#74d140b5ca8146e6c643c3724f5152538d9ac1f0"
integrity sha1-dNFAtcqBRubGQ8NyT1FSU42awfA=
+lodash.uniq@^4.5.0:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
+ integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=
+
+lodash.uniqueid@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/lodash.uniqueid/-/lodash.uniqueid-4.0.1.tgz#3268f26a7c88e4f4b1758d679271814e31fa5b26"
+ integrity sha1-MmjyanyI5PSxdY1nknGBTjH6WyY=
+
lodash.xorby@4.7.0:
version "4.7.0"
resolved "https://registry.yarnpkg.com/lodash.xorby/-/lodash.xorby-4.7.0.tgz#9c19a6f9f063a6eb53dd03c1b6871799801463d7"
integrity sha1-nBmm+fBjputT3QPBtocXmYAUY9c=
-lodash@4.17.15, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15:
+lodash@4.17.15, lodash@^4, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15:
version "4.17.15"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548"
integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==
@@ -7106,13 +7950,6 @@ logform@^2.1.1:
ms "^2.1.1"
triple-beam "^1.3.0"
-lolex@^5.0.0:
- version "5.1.2"
- resolved "https://registry.yarnpkg.com/lolex/-/lolex-5.1.2.tgz#953694d098ce7c07bc5ed6d0e42bc6c0c6d5a367"
- integrity sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==
- dependencies:
- "@sinonjs/commons" "^1.7.0"
-
loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
@@ -7120,15 +7957,15 @@ loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0:
dependencies:
js-tokens "^3.0.0 || ^4.0.0"
-loud-rejection@^1.0.0:
- version "1.6.0"
- resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f"
- integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=
+lowlight@~1.11.0:
+ version "1.11.0"
+ resolved "https://registry.yarnpkg.com/lowlight/-/lowlight-1.11.0.tgz#1304d83005126d4e8b1dc0f07981e9b689ec2efc"
+ integrity sha512-xrGGN6XLL7MbTMdPD6NfWPwY43SNkjf/d0mecSx/CW36fUZTjRHEq0/Cdug3TWKtRXLWi7iMl1eP0olYxj/a4A==
dependencies:
- currently-unhandled "^0.4.1"
- signal-exit "^3.0.0"
+ fault "^1.0.2"
+ highlight.js "~9.13.0"
-lru-cache@^5.1.1:
+lru-cache@5.1.1, lru-cache@^5.1.1:
version "5.1.1"
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920"
integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==
@@ -7155,6 +7992,13 @@ make-dir@^3.0.0:
dependencies:
semver "^6.0.0"
+make-dir@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f"
+ integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==
+ dependencies:
+ semver "^6.0.0"
+
make-error@1.x:
version "1.3.6"
resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2"
@@ -7167,11 +8011,6 @@ makeerror@1.0.x:
dependencies:
tmpl "1.0.x"
-mamacro@^0.0.3:
- version "0.0.3"
- resolved "https://registry.yarnpkg.com/mamacro/-/mamacro-0.0.3.tgz#ad2c9576197c9f1abf308d0787865bd975a3f3e4"
- integrity sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==
-
map-cache@^0.2.2:
version "0.2.2"
resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
@@ -7182,10 +8021,10 @@ map-obj@^1.0.0:
resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d"
integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=
-map-obj@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-2.0.0.tgz#a65cd29087a92598b8791257a523e021222ac1f9"
- integrity sha1-plzSkIepJZi4eRJXpSPgISIqwfk=
+map-obj@^4.0.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.1.0.tgz#b91221b542734b9f14256c0132c897c5d7256fd5"
+ integrity sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g==
map-visit@^1.0.0:
version "1.0.0"
@@ -7213,6 +8052,11 @@ media-typer@0.3.0:
resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=
+memoize-one@^5.0.0:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.1.1.tgz#047b6e3199b508eaec03504de71229b8eb1d75c0"
+ integrity sha512-HKeeBpWvqiVJD57ZUAsJNm71eHTykffzcLZVYWiVfQeI1rJtuEaS7hQiEpWfVVk18donPwJEcFKIkCmPJNOhHA==
+
memory-fs@^0.4.1:
version "0.4.1"
resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552"
@@ -7229,20 +8073,22 @@ memory-fs@^0.5.0:
errno "^0.1.3"
readable-stream "^2.0.1"
-meow@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/meow/-/meow-5.0.0.tgz#dfc73d63a9afc714a5e371760eb5c88b91078aa4"
- integrity sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig==
- dependencies:
- camelcase-keys "^4.0.0"
- decamelize-keys "^1.0.0"
- loud-rejection "^1.0.0"
- minimist-options "^3.0.1"
- normalize-package-data "^2.3.4"
- read-pkg-up "^3.0.0"
- redent "^2.0.0"
- trim-newlines "^2.0.0"
- yargs-parser "^10.0.0"
+meow@^6.1.1:
+ version "6.1.1"
+ resolved "https://registry.yarnpkg.com/meow/-/meow-6.1.1.tgz#1ad64c4b76b2a24dfb2f635fddcadf320d251467"
+ integrity sha512-3YffViIt2QWgTy6Pale5QpopX/IvU3LPL03jOTqp6pGj3VjesdO/U8CuHMKpnQr4shCNCM5fd5XFFvIIl6JBHg==
+ dependencies:
+ "@types/minimist" "^1.2.0"
+ camelcase-keys "^6.2.2"
+ decamelize-keys "^1.1.0"
+ hard-rejection "^2.1.0"
+ minimist-options "^4.0.2"
+ normalize-package-data "^2.5.0"
+ read-pkg-up "^7.0.1"
+ redent "^3.0.0"
+ trim-newlines "^3.0.0"
+ type-fest "^0.13.1"
+ yargs-parser "^18.1.3"
merge-deep@^3.0.2:
version "3.0.2"
@@ -7253,7 +8099,7 @@ merge-deep@^3.0.2:
clone-deep "^0.2.4"
kind-of "^3.0.2"
-merge-descriptors@^1.0.1:
+merge-descriptors@1.0.1, merge-descriptors@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=
@@ -7268,7 +8114,7 @@ merge2@^1.2.3, merge2@^1.3.0:
resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.3.0.tgz#5b366ee83b2f1582c48f87e47cf1a9352103ca81"
integrity sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==
-methods@^1.1.2:
+methods@^1.1.2, methods@~1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=
@@ -7278,6 +8124,14 @@ microevent.ts@~0.1.1:
resolved "https://registry.yarnpkg.com/microevent.ts/-/microevent.ts-0.1.1.tgz#70b09b83f43df5172d0205a63025bce0f7357fa0"
integrity sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g==
+micromatch@4.x, micromatch@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259"
+ integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==
+ dependencies:
+ braces "^3.0.1"
+ picomatch "^2.0.5"
+
micromatch@^3.1.10, micromatch@^3.1.4:
version "3.1.10"
resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23"
@@ -7297,14 +8151,6 @@ micromatch@^3.1.10, micromatch@^3.1.4:
snapdragon "^0.8.1"
to-regex "^3.0.2"
-micromatch@^4.0.2:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259"
- integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==
- dependencies:
- braces "^3.0.1"
- picomatch "^2.0.5"
-
miller-rabin@^4.0.0:
version "4.0.1"
resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d"
@@ -7325,7 +8171,7 @@ mime-types@^2.1.12, mime-types@~2.1.19, mime-types@~2.1.24:
dependencies:
mime-db "1.43.0"
-mime@^1.3.4:
+mime@1.6.0, mime@^1.3.4:
version "1.6.0"
resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
@@ -7340,14 +8186,10 @@ mimic-fn@^2.1.0:
resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
-mini-css-extract-plugin@0.4.3:
- version "0.4.3"
- resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.4.3.tgz#98d60fcc5d228c3e36a9bd15a1d6816d6580beb8"
- integrity sha512-Mxs0nxzF1kxPv4TRi2NimewgXlJqh0rGE30vviCU2WHrpbta6wklnUV9dr9FUtoAHmB3p3LeXEC+ZjgHvB0Dzg==
- dependencies:
- loader-utils "^1.1.0"
- schema-utils "^1.0.0"
- webpack-sources "^1.1.0"
+min-indent@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.0.tgz#cfc45c37e9ec0d8f0a0ec3dd4ef7f7c3abe39256"
+ integrity sha1-z8RcN+nsDY8KDsPdTvf3w6vjklY=
mini-css-extract-plugin@0.8.0:
version "0.8.0"
@@ -7376,13 +8218,14 @@ minimatch@^3.0.4:
dependencies:
brace-expansion "^1.1.7"
-minimist-options@^3.0.1:
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-3.0.2.tgz#fba4c8191339e13ecf4d61beb03f070103f3d954"
- integrity sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==
+minimist-options@^4.0.2:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619"
+ integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==
dependencies:
arrify "^1.0.1"
is-plain-obj "^1.1.0"
+ kind-of "^6.0.3"
minimist@0.0.8:
version "0.0.8"
@@ -7399,6 +8242,34 @@ minimist@^1.1.1, minimist@^1.2.0:
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=
+minipass-collect@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617"
+ integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==
+ dependencies:
+ minipass "^3.0.0"
+
+minipass-flush@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373"
+ integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==
+ dependencies:
+ minipass "^3.0.0"
+
+minipass-pipeline@^1.2.2:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.3.tgz#55f7839307d74859d6e8ada9c3ebe72cec216a34"
+ integrity sha512-cFOknTvng5vqnwOpDsZTWhNll6Jf8o2x+/diplafmxpuIymAjzoOolZG0VvQf3V2HgqzJNhnuKHYp2BqDgz8IQ==
+ dependencies:
+ minipass "^3.0.0"
+
+minipass@^3.0.0, minipass@^3.1.1:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.3.tgz#7d42ff1f39635482e15f9cdb53184deebd5815fd"
+ integrity sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==
+ dependencies:
+ yallist "^4.0.0"
+
mississippi@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022"
@@ -7431,6 +8302,13 @@ mixin-object@^2.0.1:
for-in "^0.1.3"
is-extendable "^0.1.1"
+mkdirp@0.5.3:
+ version "0.5.3"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.3.tgz#5a514b7179259287952881e94410ec5465659f8c"
+ integrity sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==
+ dependencies:
+ minimist "^1.2.5"
+
mkdirp@1.x:
version "1.0.3"
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.3.tgz#4cf2e30ad45959dddea53ad97d518b6c8205e1ea"
@@ -7443,6 +8321,13 @@ mkdirp@^0.5.1, mkdirp@~0.5.1:
dependencies:
minimist "0.0.8"
+mkdirp@^0.5.3:
+ version "0.5.5"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def"
+ integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==
+ dependencies:
+ minimist "^1.2.5"
+
mkdirp@^0.5.4:
version "0.5.4"
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.4.tgz#fd01504a6797ec5c9be81ff43d204961ed64a512"
@@ -7472,6 +8357,11 @@ ms@2.0.0:
resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
+ms@2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a"
+ integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==
+
ms@^2.1.1:
version "2.1.2"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
@@ -7504,10 +8394,10 @@ nanomatch@^1.2.9:
snapdragon "^0.8.1"
to-regex "^3.0.1"
-native-url@0.2.6:
- version "0.2.6"
- resolved "https://registry.yarnpkg.com/native-url/-/native-url-0.2.6.tgz#ca1258f5ace169c716ff44eccbddb674e10399ae"
- integrity sha512-k4bDC87WtgrdD362gZz6zoiXQrl40kYlBmpfmSjwRO1VU0V5ccwJTlxuE72F6m3V0vc1xOf6n3UCP9QyerRqmA==
+native-url@0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/native-url/-/native-url-0.3.1.tgz#5045c65d0eb4c3ee548d48e3cb50797eec5a3c54"
+ integrity sha512-VL0XRW8nNBdSpxqZCbLJKrLHmIMn82FZ8pJzriJgyBmErjdEtrUX6eZAJbtHjlkMooEWUV+EtJ0D5tOP3+1Piw==
dependencies:
querystring "^0.2.0"
@@ -7521,7 +8411,7 @@ negotiator@0.6.2:
resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb"
integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==
-neo-async@^2.5.0, neo-async@^2.6.1:
+neo-async@2.6.1, neo-async@^2.5.0, neo-async@^2.6.1:
version "2.6.1"
resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c"
integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==
@@ -7538,57 +8428,68 @@ next-tick@~1.0.0:
resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c"
integrity sha1-yobR/ogoFpsBICCOPchCS524NCw=
-next-with-apollo@5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/next-with-apollo/-/next-with-apollo-5.0.0.tgz#022e58c1a5c2117a6190534271e297a7fa039319"
- integrity sha512-JcMecKv6XtzsLf1hPKrbxM6g9sygnGdQugglmCDkfWhHZt1yziPa+g515qtw7in8A7Ed5W9PdaaaUn7CWWQ71w==
+next-with-apollo@5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/next-with-apollo/-/next-with-apollo-5.0.1.tgz#11055d834e98ad6dbdeb9c853afcfe421b5d4730"
+ integrity sha512-pLNUWYNwY36u/L0Sco9PqML+gbCtyzE85ZysEGOzKfxdWbmazo5cUTGYDqwbHWS3xE7Mh79A26k1WJsIshJurQ==
dependencies:
isomorphic-unfetch "^3.0.0"
-next@9.3.4:
- version "9.3.4"
- resolved "https://registry.yarnpkg.com/next/-/next-9.3.4.tgz#7860d414ae01e2425bf8038277f1573f9d121b57"
- integrity sha512-sEJ3G6AOdgVYKAsIjpwLEd6uVYKvy1C3JmeydCE1ugrHU14WDRQiklRcr7Syu/aSOfB9/GRU80RPWk2c+xfh0Q==
+next@9.4.4:
+ version "9.4.4"
+ resolved "https://registry.yarnpkg.com/next/-/next-9.4.4.tgz#02ad9fea7f7016b6b42fc83b67835e4a0dd0c99a"
+ integrity sha512-ZT8bU2SAv5jkFQ+y8py+Rl5RJRJ6DnZDS+VUnB1cIscmtmUhDi7LYED7pYm4MCKkYhPbEEM1Lbpo7fnoZJGWNQ==
dependencies:
- "@ampproject/toolbox-optimizer" "2.0.1"
- "@babel/core" "7.7.2"
- "@babel/plugin-proposal-class-properties" "7.7.0"
- "@babel/plugin-proposal-nullish-coalescing-operator" "7.7.4"
+ "@ampproject/toolbox-optimizer" "2.4.0"
+ "@babel/code-frame" "7.8.3"
+ "@babel/core" "7.7.7"
+ "@babel/plugin-proposal-class-properties" "7.8.3"
+ "@babel/plugin-proposal-nullish-coalescing-operator" "7.8.3"
"@babel/plugin-proposal-numeric-separator" "7.8.3"
- "@babel/plugin-proposal-object-rest-spread" "7.6.2"
- "@babel/plugin-proposal-optional-chaining" "7.7.4"
+ "@babel/plugin-proposal-object-rest-spread" "7.9.6"
+ "@babel/plugin-proposal-optional-chaining" "7.9.0"
"@babel/plugin-syntax-bigint" "7.8.3"
- "@babel/plugin-syntax-dynamic-import" "7.2.0"
- "@babel/plugin-transform-modules-commonjs" "7.7.0"
- "@babel/plugin-transform-runtime" "7.6.2"
- "@babel/preset-env" "7.7.1"
- "@babel/preset-modules" "0.1.1"
- "@babel/preset-react" "7.7.0"
- "@babel/preset-typescript" "7.7.2"
- "@babel/runtime" "7.7.2"
- "@babel/types" "7.7.4"
+ "@babel/plugin-syntax-dynamic-import" "7.8.3"
+ "@babel/plugin-transform-modules-commonjs" "7.9.6"
+ "@babel/plugin-transform-runtime" "7.9.6"
+ "@babel/preset-env" "7.9.6"
+ "@babel/preset-modules" "0.1.3"
+ "@babel/preset-react" "7.9.4"
+ "@babel/preset-typescript" "7.9.0"
+ "@babel/runtime" "7.9.6"
+ "@babel/types" "7.9.6"
+ "@next/react-dev-overlay" "9.4.4"
+ "@next/react-refresh-utils" "9.4.4"
babel-plugin-syntax-jsx "6.18.0"
babel-plugin-transform-define "2.0.0"
babel-plugin-transform-react-remove-prop-types "0.4.24"
- browserslist "4.8.3"
- css-loader "3.3.0"
+ browserslist "4.12.0"
+ cacache "13.0.1"
+ chokidar "2.1.8"
+ css-loader "3.5.3"
+ find-cache-dir "3.3.1"
fork-ts-checker-webpack-plugin "3.1.1"
jest-worker "24.9.0"
loader-utils "2.0.0"
mini-css-extract-plugin "0.8.0"
- native-url "0.2.6"
- pnp-webpack-plugin "1.5.0"
- postcss "7.0.27"
+ mkdirp "0.5.3"
+ native-url "0.3.1"
+ neo-async "2.6.1"
+ pnp-webpack-plugin "1.6.4"
+ postcss "7.0.29"
prop-types "15.7.2"
prop-types-exact "1.2.0"
- react-is "16.8.6"
+ react-is "16.13.1"
+ react-refresh "0.8.3"
resolve-url-loader "3.1.1"
sass-loader "8.0.2"
- style-loader "1.0.0"
- styled-jsx "3.2.5"
- use-subscription "1.1.1"
+ schema-utils "2.6.6"
+ style-loader "1.2.1"
+ styled-jsx "3.3.0"
+ use-subscription "1.4.1"
watchpack "2.0.0-beta.13"
- webpack "4.42.0"
+ web-vitals "0.2.1"
+ webpack "4.43.0"
webpack-sources "1.4.3"
nice-try@^1.0.4:
@@ -7663,30 +8564,29 @@ node-modules-regexp@^1.0.0:
resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40"
integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=
-node-notifier@^6.0.0:
- version "6.0.0"
- resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-6.0.0.tgz#cea319e06baa16deec8ce5cd7f133c4a46b68e12"
- integrity sha512-SVfQ/wMw+DesunOm5cKqr6yDcvUTDl/yc97ybGHMrteNEY6oekXpNpS3lZwgLlwz0FLgHoiW28ZpmBHUDg37cw==
+node-notifier@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-7.0.0.tgz#513bc42f2aa3a49fce1980a7ff375957c71f718a"
+ integrity sha512-y8ThJESxsHcak81PGpzWwQKxzk+5YtP3IxR8AYdpXQ1IB6FmcVzFdZXrkPin49F/DKUCfeeiziB8ptY9npzGuA==
dependencies:
growly "^1.3.0"
is-wsl "^2.1.1"
- semver "^6.3.0"
+ semver "^7.2.1"
shellwords "^0.1.1"
- which "^1.3.1"
+ uuid "^7.0.3"
+ which "^2.0.2"
-node-releases@^1.1.44, node-releases@^1.1.50:
- version "1.1.50"
- resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.50.tgz#803c40d2c45db172d0410e4efec83aa8c6ad0592"
- integrity sha512-lgAmPv9eYZ0bGwUYAKlr8MG6K4CvWliWqnkcT2P8mMAgVrH3lqfBPorFlxiG1pHQnqmavJZ9vbMXUTNyMLbrgQ==
- dependencies:
- semver "^6.3.0"
+node-releases@^1.1.53:
+ version "1.1.53"
+ resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.53.tgz#2d821bfa499ed7c5dffc5e2f28c88e78a08ee3f4"
+ integrity sha512-wp8zyQVwef2hpZ/dJH7SfSrIPD6YoJz6BDQDpGEkcA0s3LpAQoxBIYmfIq6QAhC1DhwsyCgTaTTcONwX8qzCuQ==
normalize-html-whitespace@1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/normalize-html-whitespace/-/normalize-html-whitespace-1.0.0.tgz#5e3c8e192f1b06c3b9eee4b7e7f28854c7601e34"
integrity sha512-9ui7CGtOOlehQu0t/OhhlmDyc71mKVlv+4vF+me4iZLPrNtRL2xoquEdfZxasC/bdQi/Hr3iTrpyRKIG+ocabA==
-normalize-package-data@^2.3.2, normalize-package-data@^2.3.4:
+normalize-package-data@^2.3.2, normalize-package-data@^2.5.0:
version "2.5.0"
resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8"
integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==
@@ -7718,6 +8618,11 @@ normalize-url@1.9.1:
query-string "^4.1.0"
sort-keys "^1.0.0"
+normalize-url@^3.0.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559"
+ integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==
+
now@17.1.1:
version "17.1.1"
resolved "https://registry.yarnpkg.com/now/-/now-17.1.1.tgz#5e5fade17c3f9c3b7e3900be3febf7c21c7d6935"
@@ -7862,6 +8767,13 @@ object.values@^1.1.0, object.values@^1.1.1:
function-bind "^1.1.1"
has "^1.0.3"
+on-finished@~2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
+ integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=
+ dependencies:
+ ee-first "1.1.1"
+
once@^1.3.0, once@^1.3.1, once@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
@@ -7893,6 +8805,11 @@ onetime@^5.1.0:
dependencies:
mimic-fn "^2.1.0"
+opener@^1.5.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.1.tgz#6d2f0e77f1a0af0032aca716c2c1fbb8e7e8abed"
+ integrity sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA==
+
optimism@^0.10.0:
version "0.10.3"
resolved "https://registry.yarnpkg.com/optimism/-/optimism-0.10.3.tgz#163268fdc741dea2fb50f300bedda80356445fd7"
@@ -7900,7 +8817,7 @@ optimism@^0.10.0:
dependencies:
"@wry/context" "^0.4.0"
-optionator@^0.8.1, optionator@^0.8.2, optionator@^0.8.3:
+optionator@^0.8.1, optionator@^0.8.2:
version "0.8.3"
resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495"
integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==
@@ -7912,6 +8829,18 @@ optionator@^0.8.1, optionator@^0.8.2, optionator@^0.8.3:
type-check "~0.3.2"
word-wrap "~1.2.3"
+optionator@^0.9.1:
+ version "0.9.1"
+ resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499"
+ integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==
+ dependencies:
+ deep-is "^0.1.3"
+ fast-levenshtein "^2.0.6"
+ levn "^0.4.1"
+ prelude-ls "^1.2.1"
+ type-check "^0.4.0"
+ word-wrap "^1.2.3"
+
os-browserify@^0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27"
@@ -8041,6 +8970,18 @@ parse-asn1@^5.0.0:
pbkdf2 "^3.0.3"
safe-buffer "^5.1.1"
+parse-entities@^1.1.2:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-1.2.2.tgz#c31bf0f653b6661354f8973559cb86dd1d5edf50"
+ integrity sha512-NzfpbxW/NPrzZ/yYSoQxyqUZMZXIdCfE0OIN4ESsnptHJECoUk3FZktxNuzQf4tjt5UEopnxpYJbvYuxIFDdsg==
+ dependencies:
+ character-entities "^1.0.0"
+ character-entities-legacy "^1.0.0"
+ character-reference-invalid "^1.0.0"
+ is-alphanumerical "^1.0.0"
+ is-decimal "^1.0.0"
+ is-hexadecimal "^1.0.0"
+
parse-json@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0"
@@ -8059,12 +9000,12 @@ parse-json@^5.0.0:
json-parse-better-errors "^1.0.1"
lines-and-columns "^1.1.6"
-parse5@5.1.0:
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.0.tgz#c59341c9723f414c452975564c7c00a68d58acd2"
- integrity sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==
+parse5@5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178"
+ integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==
-parseurl@^1.3.3:
+parseurl@^1.3.3, parseurl@~1.3.3:
version "1.3.3"
resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==
@@ -8119,12 +9060,10 @@ path-parse@^1.0.6:
resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c"
integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==
-path-type@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f"
- integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==
- dependencies:
- pify "^3.0.0"
+path-to-regexp@0.1.7:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
+ integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=
path-type@^4.0.0:
version "4.0.0"
@@ -8186,26 +9125,33 @@ pkg-dir@^3.0.0:
dependencies:
find-up "^3.0.0"
-pkg-dir@^4.2.0:
+pkg-dir@^4.1.0, pkg-dir@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3"
integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==
dependencies:
find-up "^4.0.0"
-pn@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb"
- integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==
+pkg-up@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-2.0.0.tgz#c819ac728059a461cab1c3889a2be3c49a004d7f"
+ integrity sha1-yBmscoBZpGHKscOImivjxJoATX8=
+ dependencies:
+ find-up "^2.1.0"
-pnp-webpack-plugin@1.5.0:
- version "1.5.0"
- resolved "https://registry.yarnpkg.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.5.0.tgz#62a1cd3068f46d564bb33c56eb250e4d586676eb"
- integrity sha512-jd9olUr9D7do+RN8Wspzhpxhgp1n6Vd0NtQ4SFkmIACZoEL1nkyAdW9Ygrinjec0vgDcWjscFQQ1gDW8rsfKTg==
+platform@1.3.3:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/platform/-/platform-1.3.3.tgz#646c77011899870b6a0903e75e997e8e51da7461"
+ integrity sha1-ZGx3ARiZhwtqCQPnXpl+jlHadGE=
+
+pnp-webpack-plugin@1.6.4:
+ version "1.6.4"
+ resolved "https://registry.yarnpkg.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz#c9711ac4dc48a685dabafc86f8b6dd9f8df84149"
+ integrity sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg==
dependencies:
- ts-pnp "^1.1.2"
+ ts-pnp "^1.1.6"
-popper.js@^1.14.4:
+popper.js@*, popper.js@^1.14.1, popper.js@^1.14.4:
version "1.16.1"
resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.1.tgz#2a223cb3dc7b6213d740e40372be40de43e65b1b"
integrity sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==
@@ -8215,30 +9161,123 @@ posix-character-classes@^0.1.0:
resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=
-postcss-load-config@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.1.0.tgz#c84d692b7bb7b41ddced94ee62e8ab31b417b003"
- integrity sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q==
+postcss-calc@^7.0.1:
+ version "7.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.2.tgz#504efcd008ca0273120568b0792b16cdcde8aac1"
+ integrity sha512-rofZFHUg6ZIrvRwPeFktv06GdbDYLcGqh9EwiMutZg+a0oePCCw1zHOEiji6LCpyRcjTREtPASuUqeAvYlEVvQ==
dependencies:
- cosmiconfig "^5.0.0"
- import-cwd "^2.0.0"
+ postcss "^7.0.27"
+ postcss-selector-parser "^6.0.2"
+ postcss-value-parser "^4.0.2"
-postcss-loader@3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-3.0.0.tgz#6b97943e47c72d845fa9e03f273773d4e8dd6c2d"
- integrity sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==
+postcss-colormin@^4.0.3:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-4.0.3.tgz#ae060bce93ed794ac71264f08132d550956bd381"
+ integrity sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==
dependencies:
- loader-utils "^1.1.0"
+ browserslist "^4.0.0"
+ color "^3.0.0"
+ has "^1.0.0"
postcss "^7.0.0"
- postcss-load-config "^2.0.0"
- schema-utils "^1.0.0"
+ postcss-value-parser "^3.0.0"
-postcss-modules-extract-imports@^1.2.0:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.1.tgz#dc87e34148ec7eab5f791f7cd5849833375b741a"
- integrity sha512-6jt9XZwUhwmRUhb/CkyJY020PYaPJsCyt3UjbaWo6XEbH/94Hmv6MP7fG2C5NDU/BcHzyGYxNtHvM+LTf9HrYw==
+postcss-convert-values@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz#ca3813ed4da0f812f9d43703584e449ebe189a7f"
+ integrity sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==
+ dependencies:
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-discard-comments@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz#1fbabd2c246bff6aaad7997b2b0918f4d7af4033"
+ integrity sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==
+ dependencies:
+ postcss "^7.0.0"
+
+postcss-discard-duplicates@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz#3fe133cd3c82282e550fc9b239176a9207b784eb"
+ integrity sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==
+ dependencies:
+ postcss "^7.0.0"
+
+postcss-discard-empty@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz#c8c951e9f73ed9428019458444a02ad90bb9f765"
+ integrity sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==
+ dependencies:
+ postcss "^7.0.0"
+
+postcss-discard-overridden@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz#652aef8a96726f029f5e3e00146ee7a4e755ff57"
+ integrity sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==
+ dependencies:
+ postcss "^7.0.0"
+
+postcss-merge-longhand@^4.0.11:
+ version "4.0.11"
+ resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz#62f49a13e4a0ee04e7b98f42bb16062ca2549e24"
+ integrity sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==
+ dependencies:
+ css-color-names "0.0.4"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+ stylehacks "^4.0.0"
+
+postcss-merge-rules@^4.0.3:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz#362bea4ff5a1f98e4075a713c6cb25aefef9a650"
+ integrity sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==
+ dependencies:
+ browserslist "^4.0.0"
+ caniuse-api "^3.0.0"
+ cssnano-util-same-parent "^4.0.0"
+ postcss "^7.0.0"
+ postcss-selector-parser "^3.0.0"
+ vendors "^1.0.0"
+
+postcss-minify-font-values@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz#cd4c344cce474343fac5d82206ab2cbcb8afd5a6"
+ integrity sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==
+ dependencies:
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-minify-gradients@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz#93b29c2ff5099c535eecda56c4aa6e665a663471"
+ integrity sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==
dependencies:
- postcss "^6.0.1"
+ cssnano-util-get-arguments "^4.0.0"
+ is-color-stop "^1.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-minify-params@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz#6b9cef030c11e35261f95f618c90036d680db874"
+ integrity sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==
+ dependencies:
+ alphanum-sort "^1.0.0"
+ browserslist "^4.0.0"
+ cssnano-util-get-arguments "^4.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+ uniqs "^2.0.0"
+
+postcss-minify-selectors@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz#e2e5eb40bfee500d0cd9243500f5f8ea4262fbd8"
+ integrity sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==
+ dependencies:
+ alphanum-sort "^1.0.0"
+ has "^1.0.0"
+ postcss "^7.0.0"
+ postcss-selector-parser "^3.0.0"
postcss-modules-extract-imports@^2.0.0:
version "2.0.0"
@@ -8247,14 +9286,6 @@ postcss-modules-extract-imports@^2.0.0:
dependencies:
postcss "^7.0.5"
-postcss-modules-local-by-default@^1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz#f7d80c398c5a393fa7964466bd19500a7d61c069"
- integrity sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=
- dependencies:
- css-selector-tokenizer "^0.7.0"
- postcss "^6.0.1"
-
postcss-modules-local-by-default@^3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.2.tgz#e8a6561be914aaf3c052876377524ca90dbb7915"
@@ -8265,30 +9296,14 @@ postcss-modules-local-by-default@^3.0.2:
postcss-selector-parser "^6.0.2"
postcss-value-parser "^4.0.0"
-postcss-modules-scope@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz#d6ea64994c79f97b62a72b426fbe6056a194bb90"
- integrity sha1-1upkmUx5+XtipytCb75gVqGUu5A=
- dependencies:
- css-selector-tokenizer "^0.7.0"
- postcss "^6.0.1"
-
-postcss-modules-scope@^2.1.1:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.1.1.tgz#33d4fc946602eb5e9355c4165d68a10727689dba"
- integrity sha512-OXRUPecnHCg8b9xWvldG/jUpRIGPNRka0r4D4j0ESUU2/5IOnpsjfPPmDprM3Ih8CgZ8FXjWqaniK5v4rWt3oQ==
+postcss-modules-scope@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz#385cae013cc7743f5a7d7602d1073a89eaae62ee"
+ integrity sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==
dependencies:
postcss "^7.0.6"
postcss-selector-parser "^6.0.0"
-postcss-modules-values@^1.3.0:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz#ecffa9d7e192518389f42ad0e83f72aec456ea20"
- integrity sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=
- dependencies:
- icss-replace-symbols "^1.1.0"
- postcss "^6.0.1"
-
postcss-modules-values@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz#5b5000d6ebae29b4255301b4a3a54574423e7f10"
@@ -8297,6 +9312,132 @@ postcss-modules-values@^3.0.0:
icss-utils "^4.0.0"
postcss "^7.0.6"
+postcss-normalize-charset@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz#8b35add3aee83a136b0471e0d59be58a50285dd4"
+ integrity sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==
+ dependencies:
+ postcss "^7.0.0"
+
+postcss-normalize-display-values@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz#0dbe04a4ce9063d4667ed2be476bb830c825935a"
+ integrity sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==
+ dependencies:
+ cssnano-util-get-match "^4.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-normalize-positions@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz#05f757f84f260437378368a91f8932d4b102917f"
+ integrity sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==
+ dependencies:
+ cssnano-util-get-arguments "^4.0.0"
+ has "^1.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-normalize-repeat-style@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz#c4ebbc289f3991a028d44751cbdd11918b17910c"
+ integrity sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==
+ dependencies:
+ cssnano-util-get-arguments "^4.0.0"
+ cssnano-util-get-match "^4.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-normalize-string@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz#cd44c40ab07a0c7a36dc5e99aace1eca4ec2690c"
+ integrity sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==
+ dependencies:
+ has "^1.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-normalize-timing-functions@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz#8e009ca2a3949cdaf8ad23e6b6ab99cb5e7d28d9"
+ integrity sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==
+ dependencies:
+ cssnano-util-get-match "^4.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-normalize-unicode@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz#841bd48fdcf3019ad4baa7493a3d363b52ae1cfb"
+ integrity sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==
+ dependencies:
+ browserslist "^4.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-normalize-url@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz#10e437f86bc7c7e58f7b9652ed878daaa95faae1"
+ integrity sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==
+ dependencies:
+ is-absolute-url "^2.0.0"
+ normalize-url "^3.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-normalize-whitespace@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz#bf1d4070fe4fcea87d1348e825d8cc0c5faa7d82"
+ integrity sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==
+ dependencies:
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-ordered-values@^4.1.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz#0cf75c820ec7d5c4d280189559e0b571ebac0eee"
+ integrity sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==
+ dependencies:
+ cssnano-util-get-arguments "^4.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-reduce-initial@^4.0.3:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz#7fd42ebea5e9c814609639e2c2e84ae270ba48df"
+ integrity sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==
+ dependencies:
+ browserslist "^4.0.0"
+ caniuse-api "^3.0.0"
+ has "^1.0.0"
+ postcss "^7.0.0"
+
+postcss-reduce-transforms@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz#17efa405eacc6e07be3414a5ca2d1074681d4e29"
+ integrity sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==
+ dependencies:
+ cssnano-util-get-match "^4.0.0"
+ has "^1.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-safe-parser@4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-safe-parser/-/postcss-safe-parser-4.0.2.tgz#a6d4e48f0f37d9f7c11b2a581bf00f8ba4870b96"
+ integrity sha512-Uw6ekxSWNLCPesSv/cmqf2bY/77z11O7jZGPax3ycZMFU/oi2DMH9i89AdHc1tRwFg/arFoEwX0IS3LCUxJh1g==
+ dependencies:
+ postcss "^7.0.26"
+
+postcss-selector-parser@^3.0.0:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz#b310f5c4c0fdaf76f94902bbaa30db6aa84f5270"
+ integrity sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==
+ dependencies:
+ dot-prop "^5.2.0"
+ indexes-of "^1.0.1"
+ uniq "^1.0.1"
+
postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2:
version "6.0.2"
resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz#934cf799d016c83411859e09dcecade01286ec5c"
@@ -8306,7 +9447,26 @@ postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2:
indexes-of "^1.0.1"
uniq "^1.0.1"
-postcss-value-parser@^3.3.0:
+postcss-svgo@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.2.tgz#17b997bc711b333bab143aaed3b8d3d6e3d38258"
+ integrity sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==
+ dependencies:
+ is-svg "^3.0.0"
+ postcss "^7.0.0"
+ postcss-value-parser "^3.0.0"
+ svgo "^1.0.0"
+
+postcss-unique-selectors@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz#9446911f3289bfd64c6d680f073c03b1f9ee4bac"
+ integrity sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==
+ dependencies:
+ alphanum-sort "^1.0.0"
+ postcss "^7.0.0"
+ uniqs "^2.0.0"
+
+postcss-value-parser@^3.0.0, postcss-value-parser@^3.3.0:
version "3.3.1"
resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281"
integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==
@@ -8316,6 +9476,11 @@ postcss-value-parser@^4.0.0, postcss-value-parser@^4.0.2:
resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz#651ff4593aa9eda8d5d0d66593a2417aeaeb325d"
integrity sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg==
+postcss-value-parser@^4.0.3:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb"
+ integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==
+
postcss@7.0.21:
version "7.0.21"
resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.21.tgz#06bb07824c19c2021c5d056d5b10c35b989f7e17"
@@ -8325,7 +9490,16 @@ postcss@7.0.21:
source-map "^0.6.1"
supports-color "^6.1.0"
-postcss@7.0.27, postcss@^7.0.0, postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.23, postcss@^7.0.5, postcss@^7.0.6:
+postcss@7.0.29:
+ version "7.0.29"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.29.tgz#d3a903872bd52280b83bce38cdc83ce55c06129e"
+ integrity sha512-ba0ApvR3LxGvRMMiUa9n0WR4HjzcYm7tS+ht4/2Nd0NLtHpPIH77fuB9Xh1/yJVz9O/E/95Y/dn8ygWsyffXtw==
+ dependencies:
+ chalk "^2.4.2"
+ source-map "^0.6.1"
+ supports-color "^6.1.0"
+
+postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.26, postcss@^7.0.27, postcss@^7.0.5, postcss@^7.0.6:
version "7.0.27"
resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.27.tgz#cc67cdc6b0daa375105b7c424a85567345fc54d9"
integrity sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==
@@ -8334,14 +9508,10 @@ postcss@7.0.27, postcss@^7.0.0, postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.2
source-map "^0.6.1"
supports-color "^6.1.0"
-postcss@^6.0.1, postcss@^6.0.23:
- version "6.0.23"
- resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324"
- integrity sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==
- dependencies:
- chalk "^2.4.1"
- source-map "^0.6.1"
- supports-color "^5.4.0"
+prelude-ls@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
+ integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==
prelude-ls@~1.1.2:
version "1.1.2"
@@ -8353,26 +9523,16 @@ prepend-http@^1.0.0:
resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc"
integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=
-"prettier@^2.0.1 || ^1.19.1":
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.0.2.tgz#1ba8f3eb92231e769b7fcd7cb73ae1b6b74ade08"
- integrity sha512-5xJQIPT8BraI7ZnaDwSbu5zLrB6vvi8hVV58yHQ+QK64qrY40dULy0HSRlQ2/2IdzeBpjhDkqdcFBnFeDEMVdg==
+prettier@^2.0.5:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.0.5.tgz#d6d56282455243f2f92cc1716692c08aa31522d4"
+ integrity sha512-7PtVymN48hGcO4fGjybyBSIWDsLU4H4XlvOHfq91pz9kkGlonzwTfYkaIEwiRg/dAJF9YlbsduBAgtYLi+8cFg==
pretty-bytes@5.3.0:
version "5.3.0"
resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.3.0.tgz#f2849e27db79fb4d6cfe24764fc4134f165989f2"
integrity sha512-hjGrh+P926p4R4WbaB6OckyRtO0F0/lQBiT+0gnxjV+5kjPBrfVBFCsCLbMqVQeydvIoouYTCmmEURiH3R1Bdg==
-pretty-format@25.1.0, pretty-format@^25.1.0:
- version "25.1.0"
- resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-25.1.0.tgz#ed869bdaec1356fc5ae45de045e2c8ec7b07b0c8"
- integrity sha512-46zLRSGLd02Rp+Lhad9zzuNZ+swunitn8zIpfD2B4OPCRLXbM87RJT2aBLBWYOznNUML/2l/ReMyWNC80PJBUQ==
- dependencies:
- "@jest/types" "^25.1.0"
- ansi-regex "^5.0.0"
- ansi-styles "^4.0.0"
- react-is "^16.12.0"
-
pretty-format@^22.4.3:
version "22.4.3"
resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-22.4.3.tgz#f873d780839a9c02e9664c8a082e9ee79eaac16f"
@@ -8391,17 +9551,41 @@ pretty-format@^24.9.0:
ansi-styles "^3.2.0"
react-is "^16.8.4"
-pretty-format@^25.2.6:
- version "25.2.6"
- resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-25.2.6.tgz#542a1c418d019bbf1cca2e3620443bc1323cb8d7"
- integrity sha512-DEiWxLBaCHneffrIT4B+TpMvkV9RNvvJrd3lY9ew1CEQobDzEXmYT1mg0hJhljZty7kCc10z13ohOFAE8jrUDg==
+pretty-format@^25.2.1, pretty-format@^25.5.0:
+ version "25.5.0"
+ resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-25.5.0.tgz#7873c1d774f682c34b8d48b6743a2bf2ac55791a"
+ integrity sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==
+ dependencies:
+ "@jest/types" "^25.5.0"
+ ansi-regex "^5.0.0"
+ ansi-styles "^4.0.0"
+ react-is "^16.12.0"
+
+pretty-format@^26.0.1:
+ version "26.0.1"
+ resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.0.1.tgz#a4fe54fe428ad2fd3413ca6bbd1ec8c2e277e197"
+ integrity sha512-SWxz6MbupT3ZSlL0Po4WF/KujhQaVehijR2blyRDCzk9e45EaYMVhMBn49fnRuHxtkSpXTes1GxNpVmH86Bxfw==
dependencies:
- "@jest/types" "^25.2.6"
+ "@jest/types" "^26.0.1"
ansi-regex "^5.0.0"
ansi-styles "^4.0.0"
react-is "^16.12.0"
-private@^0.1.6:
+prismjs@^1.8.4:
+ version "1.20.0"
+ resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.20.0.tgz#9b685fc480a3514ee7198eac6a3bf5024319ff03"
+ integrity sha512-AEDjSrVNkynnw6A+B1DsFkd6AVdTnp+/WoUixFRULlCLZVRZlVQMVWio/16jv7G1FscUxQxOQhWwApgbnxr6kQ==
+ optionalDependencies:
+ clipboard "^2.0.0"
+
+prismjs@~1.17.0:
+ version "1.17.1"
+ resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.17.1.tgz#e669fcbd4cdd873c35102881c33b14d0d68519be"
+ integrity sha512-PrEDJAFdUGbOP6xK/UsfkC5ghJsPJviKgnQOoxaDbBjwc8op68Quupwt1DeAFoG8GImPhiKXAvvsH7wDSLsu1Q==
+ optionalDependencies:
+ clipboard "^2.0.0"
+
+private@^0.1.8:
version "0.1.8"
resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff"
integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==
@@ -8455,16 +9639,31 @@ prop-types@15.7.2, prop-types@15.x, prop-types@^15.5.10, prop-types@^15.5.4, pro
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5"
integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==
dependencies:
- loose-envify "^1.4.0"
- object-assign "^4.1.1"
- react-is "^16.8.1"
+ loose-envify "^1.4.0"
+ object-assign "^4.1.1"
+ react-is "^16.8.1"
+
+property-information@^5.0.0:
+ version "5.5.0"
+ resolved "https://registry.yarnpkg.com/property-information/-/property-information-5.5.0.tgz#4dc075d493061a82e2b7d096f406e076ed859943"
+ integrity sha512-RgEbCx2HLa1chNgvChcx+rrCWD0ctBmGSE0M7lVm1yyv4UbvbrWoXp/BkVLZefzjrRBGW8/Js6uh/BnlHXFyjA==
+ dependencies:
+ xtend "^4.0.0"
+
+proxy-addr@~2.0.5:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf"
+ integrity sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==
+ dependencies:
+ forwarded "~0.1.2"
+ ipaddr.js "1.9.1"
prr@~1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY=
-psl@^1.1.24, psl@^1.1.28:
+psl@^1.1.28:
version "1.7.0"
resolved "https://registry.yarnpkg.com/psl/-/psl-1.7.0.tgz#f1c4c47a8ef97167dea5d6bbf4816d736e884a3c"
integrity sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ==
@@ -8511,7 +9710,7 @@ punycode@1.3.2:
resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d"
integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=
-punycode@^1.2.4, punycode@^1.4.1:
+punycode@^1.2.4:
version "1.4.1"
resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
integrity sha1-wNWmOycYgArY4esPpSachN1BhF4=
@@ -8526,6 +9725,11 @@ q@^1.1.2:
resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7"
integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=
+qs@6.7.0:
+ version "6.7.0"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc"
+ integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==
+
qs@~6.5.2:
version "6.5.2"
resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
@@ -8558,10 +9762,10 @@ querystring@0.2.0, querystring@^0.2.0:
resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=
-quick-lru@^1.0.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-1.1.0.tgz#4360b17c61136ad38078397ff11416e186dcfbb8"
- integrity sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=
+quick-lru@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f"
+ integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==
raf@^3.4.0, raf@^3.4.1:
version "3.4.1"
@@ -8590,11 +9794,21 @@ randomfill@^1.0.3:
randombytes "^2.0.5"
safe-buffer "^5.1.0"
-range-parser@^1.2.0:
+range-parser@^1.2.0, range-parser@~1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031"
integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==
+raw-body@2.4.0:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332"
+ integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==
+ dependencies:
+ bytes "3.1.0"
+ http-errors "1.7.2"
+ iconv-lite "0.4.24"
+ unpipe "1.0.0"
+
rc-align@^3.0.0-rc.0:
version "3.0.0-rc.1"
resolved "https://registry.yarnpkg.com/rc-align/-/rc-align-3.0.0-rc.1.tgz#32d1fac860d12bb85e9b8cafbbdef79f3f537674"
@@ -8660,18 +9874,30 @@ rc-util@^4.20.0:
react-lifecycles-compat "^3.0.4"
shallowequal "^1.1.0"
-react-apollo@3.1.4:
- version "3.1.4"
- resolved "https://registry.yarnpkg.com/react-apollo/-/react-apollo-3.1.4.tgz#9a882ce557cd6e4f3c9d87b066223e9b4c5d9130"
- integrity sha512-GDXTSava0wa9eWfPaVVhTFDZy06qbSxEW8JSJjd5l3mLIPwZoxdaI5EDjUr25h1XzsUJ/p3C64QHvsSiB9DrpQ==
+react-apollo@3.1.5:
+ version "3.1.5"
+ resolved "https://registry.yarnpkg.com/react-apollo/-/react-apollo-3.1.5.tgz#36692d393c47e7ccc37f0a885c7cc5a8b4961c91"
+ integrity sha512-xOxMqxORps+WHrUYbjVHPliviomefOpu5Sh35oO3osuOyPTxvrljdfTLGCggMhcXBsDljtS5Oy4g+ijWg3D4JQ==
dependencies:
"@apollo/react-common" "^3.1.4"
- "@apollo/react-components" "^3.1.4"
- "@apollo/react-hoc" "^3.1.4"
- "@apollo/react-hooks" "^3.1.4"
- "@apollo/react-ssr" "^3.1.4"
+ "@apollo/react-components" "^3.1.5"
+ "@apollo/react-hoc" "^3.1.5"
+ "@apollo/react-hooks" "^3.1.5"
+ "@apollo/react-ssr" "^3.1.5"
+
+react-code-blocks@0.0.7:
+ version "0.0.7"
+ resolved "https://registry.yarnpkg.com/react-code-blocks/-/react-code-blocks-0.0.7.tgz#a1dd20bff31596335912004aa79b503e31c9a10d"
+ integrity sha512-6z+jxiQXtg/MgWSw4U1XPnzb1wWh2gniR4HGCHwXf9CXA0iwPASBlOtT2lHM8eIz/J53bEsCdUCs4qMqe0zXNA==
+ dependencies:
+ clipboard "^2.0.4"
+ lodash.uniqueid "^4.0.1"
+ react "^16.11.0"
+ react-dom "^16.11.0"
+ react-syntax-highlighter "10.2.1"
+ styled-components "4.2.0"
-react-dom@16.13.1:
+react-dom@16.13.1, react-dom@^16.11.0:
version "16.13.1"
resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.13.1.tgz#c1bd37331a0486c078ee54c4740720993b2e0e7f"
integrity sha512-81PIMmVLnCNLO/fFOQxdQkvEq/+Hfpv24XNJfpyZhTRfO0QcmQIF/PgCa1zCOj2w1hrn12MFLyaJ/G0+Mxtfag==
@@ -8681,18 +9907,18 @@ react-dom@16.13.1:
prop-types "^15.6.2"
scheduler "^0.19.1"
-react-i18next@11.3.4:
- version "11.3.4"
- resolved "https://registry.yarnpkg.com/react-i18next/-/react-i18next-11.3.4.tgz#355df5fe5133e5e30302d166f529678100ffc968"
- integrity sha512-IRZMD7PAM3C+fJNzRbyLNi1ZD0kc3Z3obBspJjEl+9H+ME41PhVor3BpdIqv/Rm7lUoGhMjmpu42J45ooJ61KA==
+react-i18next@11.4.0:
+ version "11.4.0"
+ resolved "https://registry.yarnpkg.com/react-i18next/-/react-i18next-11.4.0.tgz#dde6bf3a695910af7a4270fea2e111bc331cf151"
+ integrity sha512-lyOZSSQkif4H9HnHN3iEKVkryLI+WkdZSEw3VAZzinZLopfYRMHVY5YxCopdkXPLEHs6S5GjKYPh3+j0j336Fg==
dependencies:
"@babel/runtime" "^7.3.1"
html-parse-stringify2 "2.0.1"
-react-is@16.8.6:
- version "16.8.6"
- resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.8.6.tgz#5bbc1e2d29141c9fbdfed456343fe2bc430a6a16"
- integrity sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==
+react-is@16.13.1, react-is@^16.6.0:
+ version "16.13.1"
+ resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
+ integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
react-is@^16.12.0, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.4, react-is@^16.8.6:
version "16.13.0"
@@ -8717,6 +9943,11 @@ react-popper@^1.3.6:
typed-styles "^0.0.7"
warning "^4.0.2"
+react-refresh@0.8.3:
+ version "0.8.3"
+ resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.8.3.tgz#721d4657672d400c5e3c75d063c4a85fb2d5d68f"
+ integrity sha512-X8jZHc7nCMjaCqoU+V2I0cOhNW+QMBwSUkeXnTi8IPe6zaRWfn60ZzvFDZqWPfmSJfjub7dDW1SP0jaHWLu/hg==
+
react-style-proptype@3.2.2:
version "3.2.2"
resolved "https://registry.yarnpkg.com/react-style-proptype/-/react-style-proptype-3.2.2.tgz#d8e998e62ce79ec35b087252b90f19f1c33968a0"
@@ -8724,6 +9955,17 @@ react-style-proptype@3.2.2:
dependencies:
prop-types "^15.5.4"
+react-syntax-highlighter@10.2.1:
+ version "10.2.1"
+ resolved "https://registry.yarnpkg.com/react-syntax-highlighter/-/react-syntax-highlighter-10.2.1.tgz#a30bf8e131c29e714a8e781ecadbace329da1530"
+ integrity sha512-oiCu5H0cv8FoBx1RfKWFJJEWARIyvl8FbOpzLtTextkN2D6mPAFjRooSyP0sU7/BqZnt7C6vF1CqrjdnEKREYw==
+ dependencies:
+ "@babel/runtime" "^7.3.1"
+ highlight.js "~9.13.0"
+ lowlight "~1.11.0"
+ prismjs "^1.8.4"
+ refractor "^2.4.1"
+
react-test-renderer@16.13.1:
version "16.13.1"
resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.13.1.tgz#de25ea358d9012606de51e012d9742e7f0deabc1"
@@ -8744,7 +9986,7 @@ react-transition-group@^2.3.1:
prop-types "^15.6.2"
react-lifecycles-compat "^3.0.4"
-react@16.13.1:
+react@16.13.1, react@^16.11.0:
version "16.13.1"
resolved "https://registry.yarnpkg.com/react/-/react-16.13.1.tgz#2e818822f1a9743122c063d6410d85c1e3afe48e"
integrity sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w==
@@ -8765,22 +10007,14 @@ reactstrap@8.4.1:
react-popper "^1.3.6"
react-transition-group "^2.3.1"
-read-pkg-up@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07"
- integrity sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=
- dependencies:
- find-up "^2.0.0"
- read-pkg "^3.0.0"
-
-read-pkg@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389"
- integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=
+read-pkg-up@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507"
+ integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==
dependencies:
- load-json-file "^4.0.0"
- normalize-package-data "^2.3.2"
- path-type "^3.0.0"
+ find-up "^4.1.0"
+ read-pkg "^5.2.0"
+ type-fest "^0.8.1"
read-pkg@^4.0.1:
version "4.0.1"
@@ -8791,6 +10025,16 @@ read-pkg@^4.0.1:
parse-json "^4.0.0"
pify "^3.0.0"
+read-pkg@^5.2.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc"
+ integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==
+ dependencies:
+ "@types/normalize-package-data" "^2.4.0"
+ normalize-package-data "^2.5.0"
+ parse-json "^5.0.0"
+ type-fest "^0.6.0"
+
"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6:
version "2.3.7"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57"
@@ -8829,11 +10073,6 @@ readdirp@~3.3.0:
dependencies:
picomatch "^2.0.7"
-realpath-native@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-2.0.0.tgz#7377ac429b6e1fd599dc38d08ed942d0d7beb866"
- integrity sha512-v1SEYUOXXdbBZK8ZuNgO4TBjamPsiSgcFr0aP+tEKpQZK8vooEUqV6nm6Cv502mX4NF2EfsnVqtNAHG+/6Ur1Q==
-
recompose@0.30.0:
version "0.30.0"
resolved "https://registry.yarnpkg.com/recompose/-/recompose-0.30.0.tgz#82773641b3927e8c7d24a0d87d65aeeba18aabd0"
@@ -8846,19 +10085,28 @@ recompose@0.30.0:
react-lifecycles-compat "^3.0.2"
symbol-observable "^1.0.4"
-redent@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/redent/-/redent-2.0.0.tgz#c1b2007b42d57eb1389079b3c8333639d5e1ccaa"
- integrity sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=
+redent@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f"
+ integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==
dependencies:
- indent-string "^3.0.0"
- strip-indent "^2.0.0"
+ indent-string "^4.0.0"
+ strip-indent "^3.0.0"
reflect.ownkeys@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/reflect.ownkeys/-/reflect.ownkeys-0.2.0.tgz#749aceec7f3fdf8b63f927a04809e90c5c0b3460"
integrity sha1-dJrO7H8/34tj+SegSAnpDFwLNGA=
+refractor@^2.4.1:
+ version "2.10.1"
+ resolved "https://registry.yarnpkg.com/refractor/-/refractor-2.10.1.tgz#166c32f114ed16fd96190ad21d5193d3afc7d34e"
+ integrity sha512-Xh9o7hQiQlDbxo5/XkOX6H+x/q8rmlmZKr97Ie1Q8ZM32IRRd3B/UxuA/yXDW79DBSXGWxm2yRTbcTVmAciJRw==
+ dependencies:
+ hastscript "^5.0.0"
+ parse-entities "^1.1.2"
+ prismjs "~1.17.0"
+
regenerate-unicode-properties@^8.1.0:
version "8.1.0"
resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz#ef51e0f0ea4ad424b77bf7cb41f3e015c70a3f0e"
@@ -8866,7 +10114,14 @@ regenerate-unicode-properties@^8.1.0:
dependencies:
regenerate "^1.4.0"
-regenerate@^1.2.1, regenerate@^1.4.0:
+regenerate-unicode-properties@^8.2.0:
+ version "8.2.0"
+ resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec"
+ integrity sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==
+ dependencies:
+ regenerate "^1.4.0"
+
+regenerate@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11"
integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==
@@ -8886,12 +10141,13 @@ regenerator-runtime@^0.13.4:
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz#d878a1d094b4306d10b9096484b33ebd55e26697"
integrity sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==
-regenerator-transform@^0.14.0:
- version "0.14.1"
- resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.1.tgz#3b2fce4e1ab7732c08f665dfdb314749c7ddd2fb"
- integrity sha512-flVuee02C3FKRISbxhXl9mGzdbWUVHubl1SMaknjxkFB1/iqpJhArQUvRxOOPEc/9tAiX0BaQ28FJH10E4isSQ==
+regenerator-transform@^0.14.2:
+ version "0.14.4"
+ resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.4.tgz#5266857896518d1616a78a0479337a30ea974cc7"
+ integrity sha512-EaJaKPBI9GvKpvUz2mz4fhx7WPgvwRLY9v3hlNHWmAuJHI13T4nwKnNvm5RWJzEdnI5g5UwtOww+S8IdoUC2bw==
dependencies:
- private "^0.1.6"
+ "@babel/runtime" "^7.8.4"
+ private "^0.1.8"
regex-not@^1.0.0, regex-not@^1.0.2:
version "1.0.2"
@@ -8914,24 +10170,15 @@ regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.3.0:
define-properties "^1.1.3"
es-abstract "^1.17.0-next.1"
-regexpp@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f"
- integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==
-
regexpp@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.0.0.tgz#dd63982ee3300e67b41c1956f850aa680d9d330e"
integrity sha512-Z+hNr7RAVWxznLPuA7DIh8UNX1j9CDrUQxskw9IrBE1Dxue2lyXT+shqEIeLUjrokxIP8CMy1WkjgG3rTsd5/g==
-regexpu-core@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-1.0.0.tgz#86a763f58ee4d7c2f6b102e4764050de7ed90c6b"
- integrity sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=
- dependencies:
- regenerate "^1.2.1"
- regjsgen "^0.2.0"
- regjsparser "^0.1.4"
+regexpp@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2"
+ integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==
regexpu-core@^4.6.0:
version "4.6.0"
@@ -8945,23 +10192,23 @@ regexpu-core@^4.6.0:
unicode-match-property-ecmascript "^1.0.4"
unicode-match-property-value-ecmascript "^1.1.0"
-regjsgen@^0.2.0:
- version "0.2.0"
- resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7"
- integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=
+regexpu-core@^4.7.0:
+ version "4.7.0"
+ resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.0.tgz#fcbf458c50431b0bb7b45d6967b8192d91f3d938"
+ integrity sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==
+ dependencies:
+ regenerate "^1.4.0"
+ regenerate-unicode-properties "^8.2.0"
+ regjsgen "^0.5.1"
+ regjsparser "^0.6.4"
+ unicode-match-property-ecmascript "^1.0.4"
+ unicode-match-property-value-ecmascript "^1.2.0"
-regjsgen@^0.5.0:
+regjsgen@^0.5.0, regjsgen@^0.5.1:
version "0.5.1"
resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.1.tgz#48f0bf1a5ea205196929c0d9798b42d1ed98443c"
integrity sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==
-regjsparser@^0.1.4:
- version "0.1.5"
- resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c"
- integrity sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=
- dependencies:
- jsesc "~0.5.0"
-
regjsparser@^0.6.0:
version "0.6.3"
resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.3.tgz#74192c5805d35e9f5ebe3c1fb5b40d40a8a38460"
@@ -8969,6 +10216,13 @@ regjsparser@^0.6.0:
dependencies:
jsesc "~0.5.0"
+regjsparser@^0.6.4:
+ version "0.6.4"
+ resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.4.tgz#a769f8684308401a66e9b529d2436ff4d0666272"
+ integrity sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==
+ dependencies:
+ jsesc "~0.5.0"
+
remove-trailing-separator@^1.0.1:
version "1.1.0"
resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
@@ -8998,7 +10252,7 @@ request-promise-core@1.1.3:
dependencies:
lodash "^4.17.15"
-request-promise-native@^1.0.7:
+request-promise-native@^1.0.8:
version "1.0.8"
resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.8.tgz#a455b960b826e44e2bf8999af64dff2bfe58cb36"
integrity sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ==
@@ -9007,33 +10261,7 @@ request-promise-native@^1.0.7:
stealthy-require "^1.1.1"
tough-cookie "^2.3.3"
-request@2.88.0:
- version "2.88.0"
- resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef"
- integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==
- dependencies:
- aws-sign2 "~0.7.0"
- aws4 "^1.8.0"
- caseless "~0.12.0"
- combined-stream "~1.0.6"
- extend "~3.0.2"
- forever-agent "~0.6.1"
- form-data "~2.3.2"
- har-validator "~5.1.0"
- http-signature "~1.2.0"
- is-typedarray "~1.0.0"
- isstream "~0.1.2"
- json-stringify-safe "~5.0.1"
- mime-types "~2.1.19"
- oauth-sign "~0.9.0"
- performance-now "^2.1.0"
- qs "~6.5.2"
- safe-buffer "^5.1.2"
- tough-cookie "~2.4.3"
- tunnel-agent "^0.6.0"
- uuid "^3.3.2"
-
-request@^2.88.0:
+request@^2.88.2:
version "2.88.2"
resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3"
integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==
@@ -9117,18 +10345,20 @@ resolve-url@^0.2.1:
resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=
-resolve@1.1.7:
- version "1.1.7"
- resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b"
- integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=
-
-resolve@1.x, resolve@^1.10.0, resolve@^1.12.0, resolve@^1.15.1, resolve@^1.3.2, resolve@^1.8.1:
+resolve@^1.10.0, resolve@^1.12.0, resolve@^1.15.1, resolve@^1.3.2, resolve@^1.8.1:
version "1.15.1"
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.1.tgz#27bdcdeffeaf2d6244b95bb0f9f4b4653451f3e8"
integrity sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==
dependencies:
path-parse "^1.0.6"
+resolve@^1.17.0:
+ version "1.17.0"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444"
+ integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==
+ dependencies:
+ path-parse "^1.0.6"
+
restore-cursor@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541"
@@ -9176,6 +10406,16 @@ rework@1.0.1:
convert-source-map "^0.3.3"
css "^2.0.0"
+rgb-regex@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1"
+ integrity sha1-wODWiC3w4jviVKR16O3UGRX+rrE=
+
+rgba-regex@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3"
+ integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=
+
rimraf@2.6.3:
version "2.6.3"
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab"
@@ -9183,7 +10423,7 @@ rimraf@2.6.3:
dependencies:
glob "^7.1.3"
-rimraf@^2.5.4, rimraf@^2.6.3:
+rimraf@^2.5.4, rimraf@^2.6.3, rimraf@^2.7.1:
version "2.7.1"
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec"
integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==
@@ -9243,16 +10483,16 @@ rxjs@^6.5.2, rxjs@^6.5.3:
dependencies:
tslib "^1.9.0"
+safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
+ integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
+
safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0:
version "5.2.0"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519"
integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==
-safe-buffer@~5.1.0, safe-buffer@~5.1.1:
- version "5.1.2"
- resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
- integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
-
safe-regex@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
@@ -9296,12 +10536,12 @@ sax@~1.2.4:
resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
-saxes@^3.1.9:
- version "3.1.11"
- resolved "https://registry.yarnpkg.com/saxes/-/saxes-3.1.11.tgz#d59d1fd332ec92ad98a2e0b2ee644702384b1c5b"
- integrity sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==
+saxes@^5.0.0:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d"
+ integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==
dependencies:
- xmlchars "^2.1.1"
+ xmlchars "^2.2.0"
scheduler@^0.19.1:
version "0.19.1"
@@ -9311,6 +10551,14 @@ scheduler@^0.19.1:
loose-envify "^1.1.0"
object-assign "^4.1.1"
+schema-utils@2.6.6, schema-utils@^2.6.6:
+ version "2.6.6"
+ resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.6.6.tgz#299fe6bd4a3365dc23d99fd446caff8f1d6c330c"
+ integrity sha512-wHutF/WPSbIi9x6ctjGGk2Hvl0VOz5l3EKEuKbjPlB30mKZUzb9A5k9yEXRX3pwyqVLPvpfZZEllaFq/M718hA==
+ dependencies:
+ ajv "^6.12.0"
+ ajv-keywords "^3.4.1"
+
schema-utils@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770"
@@ -9320,7 +10568,7 @@ schema-utils@^1.0.0:
ajv-errors "^1.0.0"
ajv-keywords "^3.1.0"
-schema-utils@^2.0.1, schema-utils@^2.6.0, schema-utils@^2.6.1:
+schema-utils@^2.6.1:
version "2.6.4"
resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.6.4.tgz#a27efbf6e4e78689d91872ee3ccfa57d7bdd0f53"
integrity sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==
@@ -9328,31 +10576,70 @@ schema-utils@^2.0.1, schema-utils@^2.6.0, schema-utils@^2.6.1:
ajv "^6.10.2"
ajv-keywords "^3.4.1"
+select@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/select/-/select-1.1.2.tgz#0e7350acdec80b1108528786ec1d4418d11b396d"
+ integrity sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0=
+
"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0:
version "5.7.1"
resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
-semver@6.x, semver@^6.0.0, semver@^6.1.2, semver@^6.3.0:
- version "6.3.0"
- resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
- integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
-
semver@7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e"
integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==
+semver@7.x, semver@^7.2.1, semver@^7.3.2:
+ version "7.3.2"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938"
+ integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==
+
+semver@^6.0.0, semver@^6.3.0:
+ version "6.3.0"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
+ integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
+
semver@^7.1.1:
version "7.1.3"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.1.3.tgz#e4345ce73071c53f336445cfc19efb1c311df2a6"
integrity sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==
+send@0.17.1:
+ version "0.17.1"
+ resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8"
+ integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==
+ dependencies:
+ debug "2.6.9"
+ depd "~1.1.2"
+ destroy "~1.0.4"
+ encodeurl "~1.0.2"
+ escape-html "~1.0.3"
+ etag "~1.8.1"
+ fresh "0.5.2"
+ http-errors "~1.7.2"
+ mime "1.6.0"
+ ms "2.1.1"
+ on-finished "~2.3.0"
+ range-parser "~1.2.1"
+ statuses "~1.5.0"
+
serialize-javascript@^2.1.2:
version "2.1.2"
resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-2.1.2.tgz#ecec53b0e0317bdc95ef76ab7074b7384785fa61"
integrity sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==
+serve-static@1.14.1:
+ version "1.14.1"
+ resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9"
+ integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==
+ dependencies:
+ encodeurl "~1.0.2"
+ escape-html "~1.0.3"
+ parseurl "~1.3.3"
+ send "0.17.1"
+
set-blocking@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
@@ -9373,6 +10660,11 @@ setimmediate@^1.0.4, setimmediate@^1.0.5:
resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=
+setprototypeof@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683"
+ integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==
+
sha.js@^2.4.0, sha.js@^2.4.8:
version "2.4.11"
resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7"
@@ -9427,6 +10719,11 @@ shebang-regex@^3.0.0:
resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
+shell-quote@1.7.2:
+ version "1.7.2"
+ resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2"
+ integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==
+
shellwords@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b"
@@ -9557,11 +10854,23 @@ source-map@0.7.3, source-map@^0.7.3:
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383"
integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==
+source-map@0.8.0-beta.0:
+ version "0.8.0-beta.0"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.8.0-beta.0.tgz#d4c1bb42c3f7ee925f005927ba10709e0d1d1f11"
+ integrity sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==
+ dependencies:
+ whatwg-url "^7.0.0"
+
source-map@^0.5.0, source-map@^0.5.6, source-map@^0.5.7:
version "0.5.7"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
+space-separated-tokens@^1.0.0:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz#85f32c3d10d9682007e917414ddc5c26d1aa6899"
+ integrity sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==
+
spawn-command@^0.0.2-1:
version "0.0.2-1"
resolved "https://registry.yarnpkg.com/spawn-command/-/spawn-command-0.0.2-1.tgz#62f5e9466981c1b796dc5929937e11c9c6921bd0"
@@ -9627,6 +10936,14 @@ ssri@^6.0.1:
dependencies:
figgy-pudding "^3.5.1"
+ssri@^7.0.0:
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/ssri/-/ssri-7.1.0.tgz#92c241bf6de82365b5c7fb4bd76e975522e1294d"
+ integrity sha512-77/WrDZUWocK0mvA5NTRQyveUf+wsrIc6vyrxpS8tVvYBcX215QbafrJR3KtkpskIzoFLqqNuuYQvxaMjXJ/0g==
+ dependencies:
+ figgy-pudding "^3.5.1"
+ minipass "^3.1.1"
+
stable@^0.1.8:
version "0.1.8"
resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf"
@@ -9642,6 +10959,20 @@ stack-utils@^1.0.1:
resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8"
integrity sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==
+stack-utils@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.2.tgz#5cf48b4557becb4638d0bc4f21d23f5d19586593"
+ integrity sha512-0H7QK2ECz3fyZMzQ8rH0j2ykpfbnd20BFtfg/SqVC2+sCTtcw0aDTGB7dk+de4U4uUeuz6nOtJcrkFFLG1B0Rg==
+ dependencies:
+ escape-string-regexp "^2.0.0"
+
+stacktrace-parser@0.1.10:
+ version "0.1.10"
+ resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz#29fb0cae4e0d0b85155879402857a1639eb6051a"
+ integrity sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==
+ dependencies:
+ type-fest "^0.7.1"
+
static-extend@^0.1.1:
version "0.1.2"
resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6"
@@ -9650,6 +10981,11 @@ static-extend@^0.1.1:
define-property "^0.2.5"
object-copy "^0.1.0"
+"statuses@>= 1.5.0 < 2", statuses@~1.5.0:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
+ integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=
+
stealthy-require@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b"
@@ -9702,13 +11038,13 @@ string-hash@1.1.3:
resolved "https://registry.yarnpkg.com/string-hash/-/string-hash-1.1.3.tgz#e8aafc0ac1855b4666929ed7dd1275df5d6c811b"
integrity sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs=
-string-length@^3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/string-length/-/string-length-3.1.0.tgz#107ef8c23456e187a8abd4a61162ff4ac6e25837"
- integrity sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA==
+string-length@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.1.tgz#4a973bf31ef77c4edbceadd6af2611996985f8a1"
+ integrity sha512-PKyXUd0LK0ePjSOnWn34V2uD6acUWev9uy0Ft05k0E8xRW+SKcA0F7eMr7h5xlzfn+4O3N+55rduYyet3Jk+jw==
dependencies:
- astral-regex "^1.0.0"
- strip-ansi "^5.2.0"
+ char-regex "^1.0.2"
+ strip-ansi "^6.0.0"
string-width@^1.0.1:
version "1.0.2"
@@ -9787,6 +11123,13 @@ string_decoder@~1.1.1:
dependencies:
safe-buffer "~5.1.0"
+strip-ansi@6.0.0, strip-ansi@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532"
+ integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==
+ dependencies:
+ ansi-regex "^5.0.0"
+
strip-ansi@^3.0.0, strip-ansi@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
@@ -9808,18 +11151,6 @@ strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0:
dependencies:
ansi-regex "^4.1.0"
-strip-ansi@^6.0.0:
- version "6.0.0"
- resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532"
- integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==
- dependencies:
- ansi-regex "^5.0.0"
-
-strip-bom@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
- integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=
-
strip-bom@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878"
@@ -9835,28 +11166,47 @@ strip-final-newline@^2.0.0:
resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad"
integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==
-strip-indent@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68"
- integrity sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=
+strip-indent@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001"
+ integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==
+ dependencies:
+ min-indent "^1.0.0"
-strip-json-comments@^3.0.1:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7"
- integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==
+strip-json-comments@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.0.tgz#7638d31422129ecf4457440009fba03f9f9ac180"
+ integrity sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w==
-style-loader@1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-1.0.0.tgz#1d5296f9165e8e2c85d24eee0b7caf9ec8ca1f82"
- integrity sha512-B0dOCFwv7/eY31a5PCieNwMgMhVGFe9w+rh7s/Bx8kfFkrth9zfTZquoYvdw8URgiqxObQKcpW51Ugz1HjfdZw==
+style-loader@1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-1.2.1.tgz#c5cbbfbf1170d076cfdd86e0109c5bba114baa1a"
+ integrity sha512-ByHSTQvHLkWE9Ir5+lGbVOXhxX10fbprhLvdg96wedFZb4NDekDPxVKv5Fwmio+QcMlkkNfuK+5W1peQ5CUhZg==
dependencies:
- loader-utils "^1.2.3"
- schema-utils "^2.0.1"
+ loader-utils "^2.0.0"
+ schema-utils "^2.6.6"
+
+styled-components@4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-4.2.0.tgz#811fbbec4d64c7189f6c7482b9eb6fefa7fefef7"
+ integrity sha512-L/LzkL3ZbBhqIVHdR7DbYujy4tqvTNRfc+4JWDCYyhTatI+8CRRQUmdaR0+ARl03DWsfKLhjewll5uNLrqrl4A==
+ dependencies:
+ "@babel/helper-module-imports" "^7.0.0"
+ "@emotion/is-prop-valid" "^0.7.3"
+ "@emotion/unitless" "^0.7.0"
+ babel-plugin-styled-components ">= 1"
+ css-to-react-native "^2.2.2"
+ memoize-one "^5.0.0"
+ prop-types "^15.5.4"
+ react-is "^16.6.0"
+ stylis "^3.5.0"
+ stylis-rule-sheet "^0.0.10"
+ supports-color "^5.5.0"
-styled-jsx@3.2.5:
- version "3.2.5"
- resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-3.2.5.tgz#0172a3e13a0d6d8bf09167dcaf32cf7102d932ca"
- integrity sha512-prEahkYwQHomUljJzXzrFnBmQrSMtWOBbXn8QeEkpfFkqMZQGshxzzp4H8ebBIsbVlHF/3+GSXMnmK/fp7qVYQ==
+styled-jsx@3.3.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-3.3.0.tgz#32335c1a3ecfc923ba4f9c056eeb3d4699006b09"
+ integrity sha512-sh8BI5eGKyJlwL4kNXHjb27/a/GJV8wP4ElRIkRXrGW3sHKOsY9Pa1VZRNxyvf3+lisdPwizD9JDkzVO9uGwZw==
dependencies:
"@babel/types" "7.8.3"
babel-plugin-syntax-jsx "6.18.0"
@@ -9867,12 +11217,21 @@ styled-jsx@3.2.5:
stylis "3.5.4"
stylis-rule-sheet "0.0.10"
-stylis-rule-sheet@0.0.10:
+stylehacks@^4.0.0:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5"
+ integrity sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==
+ dependencies:
+ browserslist "^4.0.0"
+ postcss "^7.0.0"
+ postcss-selector-parser "^3.0.0"
+
+stylis-rule-sheet@0.0.10, stylis-rule-sheet@^0.0.10:
version "0.0.10"
resolved "https://registry.yarnpkg.com/stylis-rule-sheet/-/stylis-rule-sheet-0.0.10.tgz#44e64a2b076643f4b52e5ff71efc04d8c3c4a430"
integrity sha512-nTbZoaqoBnmK+ptANthb10ZRZOGC+EmTLLUxeYIuHNkEKcmKgXX1XWKkUBT2Ac4es3NybooPe0SmvKdhKJZAuw==
-stylis@3.5.4:
+stylis@3.5.4, stylis@^3.5.0:
version "3.5.4"
resolved "https://registry.yarnpkg.com/stylis/-/stylis-3.5.4.tgz#f665f25f5e299cf3d64654ab949a57c768b73fbe"
integrity sha512-8/3pSmthWM7lsPBKv7NXkzn2Uc9W7NotcwGNpJaa3k7WMM1XDCA4MgT5k/8BIexd5ydZdboXtU90XH9Ec4Bv/Q==
@@ -9889,7 +11248,7 @@ supports-color@^2.0.0:
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=
-supports-color@^5.3.0, supports-color@^5.4.0:
+supports-color@^5.3.0, supports-color@^5.5.0:
version "5.5.0"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
@@ -9916,7 +11275,7 @@ svg-parser@^2.0.2:
resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.3.tgz#a38f2e4e5442986f7ecb554c11f1411cfcf8c2b9"
integrity sha512-fnCWiifNhK8i2Z7b9R5tbNahpxrRdAaQbnoxKlT2KrSCj9Kq/yBSgulCRgBJRhy1dPnSY5slg5ehPUnzpEcHlg==
-svgo@^1.2.2:
+svgo@^1.0.0, svgo@^1.2.2:
version "1.3.2"
resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167"
integrity sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==
@@ -9940,7 +11299,7 @@ symbol-observable@^1.0.2, symbol-observable@^1.0.4, symbol-observable@^1.1.0:
resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804"
integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==
-symbol-tree@^3.2.2:
+symbol-tree@^3.2.4:
version "3.2.4"
resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2"
integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==
@@ -9983,10 +11342,10 @@ terser-webpack-plugin@^1.4.3:
webpack-sources "^1.4.0"
worker-farm "^1.7.0"
-terser@4.6.7:
- version "4.6.7"
- resolved "https://registry.yarnpkg.com/terser/-/terser-4.6.7.tgz#478d7f9394ec1907f0e488c5f6a6a9a2bad55e72"
- integrity sha512-fmr7M1f7DBly5cX2+rFDvmGBAaaZyPrHYK4mMdHEDAdNTqXSZgSOfqsfGq2HqPGT/1V0foZZuCZFx8CHKgAk3g==
+terser@4.6.13:
+ version "4.6.13"
+ resolved "https://registry.yarnpkg.com/terser/-/terser-4.6.13.tgz#e879a7364a5e0db52ba4891ecde007422c56a916"
+ integrity sha512-wMvqukYgVpQlymbnNbabVZbtM6PN63AzqexpwJL8tbh/mRT9LE5o+ruVduAGL7D6Fpjl+Q+06U5I9Ul82odAhw==
dependencies:
commander "^2.20.0"
source-map "~0.6.1"
@@ -10050,6 +11409,16 @@ timers-browserify@^2.0.4:
dependencies:
setimmediate "^1.0.4"
+timsort@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4"
+ integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=
+
+tiny-emitter@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz#1d1a56edfc51c43e863cbb5382a72330e3555423"
+ integrity sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==
+
tmp@0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.1.0.tgz#ee434a4e22543082e294ba6201dcc6eafefa2877"
@@ -10111,6 +11480,11 @@ to-regex@^3.0.1, to-regex@^3.0.2:
regex-not "^1.0.2"
safe-regex "^1.1.0"
+toidentifier@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553"
+ integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==
+
tough-cookie@^2.3.3, tough-cookie@~2.5.0:
version "2.5.0"
resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2"
@@ -10128,14 +11502,6 @@ tough-cookie@^3.0.1:
psl "^1.1.28"
punycode "^2.1.1"
-tough-cookie@~2.4.3:
- version "2.4.3"
- resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781"
- integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==
- dependencies:
- psl "^1.1.24"
- punycode "^1.4.1"
-
tr46@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09"
@@ -10143,6 +11509,13 @@ tr46@^1.0.1:
dependencies:
punycode "^2.1.0"
+tr46@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.0.2.tgz#03273586def1595ae08fedb38d7733cee91d2479"
+ integrity sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==
+ dependencies:
+ punycode "^2.1.1"
+
traverse@0.6.6:
version "0.6.6"
resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.6.6.tgz#cbdf560fd7b9af632502fed40f918c157ea97137"
@@ -10153,16 +11526,21 @@ tree-kill@^1.2.2:
resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc"
integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==
-trim-newlines@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-2.0.0.tgz#b403d0b91be50c331dfc4b82eeceb22c3de16d20"
- integrity sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=
+trim-newlines@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.0.tgz#79726304a6a898aa8373427298d54c2ee8b1cb30"
+ integrity sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA==
triple-beam@^1.2.0, triple-beam@^1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.3.0.tgz#a595214c7298db8339eeeee083e4d10bd8cb8dd9"
integrity sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==
+tryer@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8"
+ integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==
+
ts-invariant@^0.4.0, ts-invariant@^0.4.4:
version "0.4.4"
resolved "https://registry.yarnpkg.com/ts-invariant/-/ts-invariant-0.4.4.tgz#97a523518688f93aafad01b0e80eb803eb2abd86"
@@ -10170,10 +11548,10 @@ ts-invariant@^0.4.0, ts-invariant@^0.4.4:
dependencies:
tslib "^1.9.3"
-ts-jest@25.3.0:
- version "25.3.0"
- resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-25.3.0.tgz#c12d34573cbe34d49f10567940e44fd19d1c9178"
- integrity sha512-qH/uhaC+AFDU9JfAueSr0epIFJkGMvUPog4FxSEVAtPOur1Oni5WBJMiQIkfHvc7PviVRsnlVLLY2I6221CQew==
+ts-jest@26.0.0:
+ version "26.0.0"
+ resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-26.0.0.tgz#957b802978249aaf74180b9dcb17b4fd787ad6f3"
+ integrity sha512-eBpWH65mGgzobuw7UZy+uPP9lwu+tPp60o324ASRX4Ijg8UC5dl2zcge4kkmqr2Zeuk9FwIjvCTOPuNMEyGWWw==
dependencies:
bs-logger "0.x"
buffer-from "1.x"
@@ -10181,15 +11559,15 @@ ts-jest@25.3.0:
json5 "2.x"
lodash.memoize "4.x"
make-error "1.x"
+ micromatch "4.x"
mkdirp "1.x"
- resolve "1.x"
- semver "6.x"
- yargs-parser "^18.1.1"
+ semver "7.x"
+ yargs-parser "18.x"
-ts-pnp@^1.1.2:
- version "1.1.6"
- resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.1.6.tgz#389a24396d425a0d3162e96d2b4638900fdc289a"
- integrity sha512-CrG5GqAAzMT7144Cl+UIFP7mz/iIhiy+xQ6GGcnjTezhALT02uPMRw7tgDSESgB5MsfKt55+GPWw4ir1kVtMIQ==
+ts-pnp@^1.1.6:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.2.0.tgz#a500ad084b0798f1c3071af391e65912c86bca92"
+ integrity sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==
tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3:
version "1.11.0"
@@ -10225,6 +11603,13 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0:
resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=
+type-check@^0.4.0, type-check@~0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1"
+ integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==
+ dependencies:
+ prelude-ls "^1.2.1"
+
type-check@~0.3.2:
version "0.3.2"
resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72"
@@ -10237,12 +11622,27 @@ type-detect@4.0.8, type-detect@^4.0.8:
resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c"
integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==
+type-fest@^0.13.1:
+ version "0.13.1"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934"
+ integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==
+
+type-fest@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b"
+ integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==
+
+type-fest@^0.7.1:
+ version "0.7.1"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48"
+ integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==
+
type-fest@^0.8.1:
version "0.8.1"
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d"
integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==
-type-is@^1.6.18:
+type-is@^1.6.18, type-is@~1.6.17, type-is@~1.6.18:
version "1.6.18"
resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131"
integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==
@@ -10277,10 +11677,10 @@ typedarray@^0.0.6:
resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
-typescript@3.8.3:
- version "3.8.3"
- resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.8.3.tgz#409eb8544ea0335711205869ec458ab109ee1061"
- integrity sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==
+typescript@3.9.2:
+ version "3.9.2"
+ resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.2.tgz#64e9c8e9be6ea583c54607677dd4680a1cf35db9"
+ integrity sha512-q2ktq4n/uLuNNShyayit+DTobV2ApPEo/6so68JaD5ojvc/6GClBipedB9zNWYxRSAlZXAe405Rlijzl6qDiSw==
typical@^4.0.0:
version "4.0.0"
@@ -10315,6 +11715,11 @@ unicode-match-property-value-ecmascript@^1.1.0:
resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz#5b4b426e08d13a80365e0d657ac7a6c1ec46a277"
integrity sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g==
+unicode-match-property-value-ecmascript@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz#0d91f600eeeb3096aa962b1d6fc88876e64ea531"
+ integrity sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==
+
unicode-property-aliases-ecmascript@^1.0.4:
version "1.0.5"
resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz#a9cc6cc7ce63a0a3023fc99e341b94431d405a57"
@@ -10335,6 +11740,11 @@ uniq@^1.0.1:
resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff"
integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=
+uniqs@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02"
+ integrity sha1-/+3ks2slKQaW5uFl1KWe25mOawI=
+
unique-filename@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230"
@@ -10364,6 +11774,11 @@ universalify@^0.1.0:
resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
+unpipe@1.0.0, unpipe@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
+ integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=
+
unquote@~1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544"
@@ -10407,10 +11822,12 @@ url@0.11.0, url@^0.11.0:
punycode "1.3.2"
querystring "0.2.0"
-use-subscription@1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/use-subscription/-/use-subscription-1.1.1.tgz#5509363e9bb152c4fb334151d4dceb943beaa7bb"
- integrity sha512-gk4fPTYvNhs6Ia7u8/+K7bM7sZ7O7AMfWtS+zPO8luH+zWuiGgGcrW0hL4MRWZSzXo+4ofNorf87wZwBKz2YdQ==
+use-subscription@1.4.1:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/use-subscription/-/use-subscription-1.4.1.tgz#edcbcc220f1adb2dd4fa0b2f61b6cc308e620069"
+ integrity sha512-7+IIwDG/4JICrWHL/Q/ZPK5yozEnvRm6vHImu0LKwQlmWGKeiF7mbAenLlK/cTNXrTtXHU/SFASQHzB6+oSJMQ==
+ dependencies:
+ object-assign "^4.1.1"
use@^3.1.0:
version "3.1.1"
@@ -10446,20 +11863,30 @@ util@^0.11.0:
dependencies:
inherits "2.0.3"
+utils-merge@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
+ integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=
+
uuid@^3.3.2:
version "3.4.0"
resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee"
integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==
+uuid@^7.0.3:
+ version "7.0.3"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-7.0.3.tgz#c5c9f2c8cf25dc0a372c4df1441c41f5bd0c680b"
+ integrity sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==
+
v8-compile-cache@^2.0.3:
version "2.1.0"
resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz#e14de37b31a6d194f5690d67efc4e7f6fc6ab30e"
integrity sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==
-v8-to-istanbul@^4.0.1:
- version "4.1.2"
- resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-4.1.2.tgz#387d173be5383dbec209d21af033dcb892e3ac82"
- integrity sha512-G9R+Hpw0ITAmPSr47lSlc5A1uekSYzXxTMlFxso2xoffwo4jQnzbv1p9yXIinO8UMZKfAFewaCHwWvnH4Jb4Ug==
+v8-to-istanbul@^4.1.3:
+ version "4.1.4"
+ resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-4.1.4.tgz#b97936f21c0e2d9996d4985e5c5156e9d4e49cd6"
+ integrity sha512-Rw6vJHj1mbdK8edjR7+zuJrpDtKIgNdAvTSAcpYfgMIw+u2dPDntD3dgN4XQFLU2/fvFQdzj+EeSGfd/jnY5fQ==
dependencies:
"@types/istanbul-lib-coverage" "^2.0.1"
convert-source-map "^1.6.0"
@@ -10473,6 +11900,16 @@ validate-npm-package-license@^3.0.1:
spdx-correct "^3.0.0"
spdx-expression-parse "^3.0.0"
+vary@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
+ integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=
+
+vendors@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e"
+ integrity sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==
+
verror@1.10.0:
version "1.10.0"
resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400"
@@ -10499,20 +11936,18 @@ void-elements@^2.0.1:
resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec"
integrity sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=
-w3c-hr-time@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045"
- integrity sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=
+w3c-hr-time@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd"
+ integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==
dependencies:
- browser-process-hrtime "^0.1.2"
+ browser-process-hrtime "^1.0.0"
-w3c-xmlserializer@^1.1.2:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz#30485ca7d70a6fd052420a3d12fd90e6339ce794"
- integrity sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==
+w3c-xmlserializer@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a"
+ integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==
dependencies:
- domexception "^1.0.1"
- webidl-conversions "^4.0.2"
xml-name-validator "^3.0.0"
walker@^1.0.7, walker@~1.0.5:
@@ -10537,15 +11972,20 @@ watchpack@2.0.0-beta.13:
glob-to-regexp "^0.4.1"
graceful-fs "^4.1.2"
-watchpack@^1.6.0:
- version "1.6.0"
- resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00"
- integrity sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==
+watchpack@^1.6.1:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.1.tgz#280da0a8718592174010c078c7585a74cd8cd0e2"
+ integrity sha512-+IF9hfUFOrYOOaKyfaI7h7dquUIOgyEMoQMLA7OP5FxegKA2+XdXThAZ9TU2kucfhDH7rfMHs1oPYziVGWRnZA==
dependencies:
- chokidar "^2.0.2"
+ chokidar "^2.1.8"
graceful-fs "^4.1.2"
neo-async "^2.5.0"
+web-vitals@0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/web-vitals/-/web-vitals-0.2.1.tgz#60782fa690243fe35613759a0c26431f57ba7b2d"
+ integrity sha512-2pdRlp6gJpOCg0oMMqwFF0axjk5D9WInc09RSYtqFgPXQ15+YKNQ7YnBBEqAL5jvmfH9WvoXDMb8DHwux7pIew==
+
webfontloader@1.6.28:
version "1.6.28"
resolved "https://registry.yarnpkg.com/webfontloader/-/webfontloader-1.6.28.tgz#db786129253cb6e8eae54c2fb05f870af6675bae"
@@ -10556,6 +11996,35 @@ webidl-conversions@^4.0.2:
resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad"
integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==
+webidl-conversions@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff"
+ integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==
+
+webidl-conversions@^6.0.0:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514"
+ integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==
+
+webpack-bundle-analyzer@3.6.1:
+ version "3.6.1"
+ resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.6.1.tgz#bdb637c2304424f2fbff9a950c7be42a839ae73b"
+ integrity sha512-Nfd8HDwfSx1xBwC+P8QMGvHAOITxNBSvu/J/mCJvOwv+G4VWkU7zir9SSenTtyCi0LnVtmsc7G5SZo1uV+bxRw==
+ dependencies:
+ acorn "^7.1.1"
+ acorn-walk "^7.1.1"
+ bfj "^6.1.1"
+ chalk "^2.4.1"
+ commander "^2.18.0"
+ ejs "^2.6.1"
+ express "^4.16.3"
+ filesize "^3.6.1"
+ gzip-size "^5.0.0"
+ lodash "^4.17.15"
+ mkdirp "^0.5.1"
+ opener "^1.5.1"
+ ws "^6.0.0"
+
webpack-sources@1.4.3, webpack-sources@^1.1.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1:
version "1.4.3"
resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933"
@@ -10564,16 +12033,16 @@ webpack-sources@1.4.3, webpack-sources@^1.1.0, webpack-sources@^1.4.0, webpack-s
source-list-map "^2.0.0"
source-map "~0.6.1"
-webpack@4.42.0:
- version "4.42.0"
- resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.42.0.tgz#b901635dd6179391d90740a63c93f76f39883eb8"
- integrity sha512-EzJRHvwQyBiYrYqhyjW9AqM90dE4+s1/XtCfn7uWg6cS72zH+2VPFAlsnW0+W0cDi0XRjNKUMoJtpSi50+Ph6w==
+webpack@4.43.0:
+ version "4.43.0"
+ resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.43.0.tgz#c48547b11d563224c561dad1172c8aa0b8a678e6"
+ integrity sha512-GW1LjnPipFW2Y78OOab8NJlCflB7EFskMih2AHdvjbpKMeDJqEgSx24cXXXiPS65+WSwVyxtDsJH6jGX2czy+g==
dependencies:
- "@webassemblyjs/ast" "1.8.5"
- "@webassemblyjs/helper-module-context" "1.8.5"
- "@webassemblyjs/wasm-edit" "1.8.5"
- "@webassemblyjs/wasm-parser" "1.8.5"
- acorn "^6.2.1"
+ "@webassemblyjs/ast" "1.9.0"
+ "@webassemblyjs/helper-module-context" "1.9.0"
+ "@webassemblyjs/wasm-edit" "1.9.0"
+ "@webassemblyjs/wasm-parser" "1.9.0"
+ acorn "^6.4.1"
ajv "^6.10.2"
ajv-keywords "^3.4.1"
chrome-trace-event "^1.0.2"
@@ -10584,16 +12053,16 @@ webpack@4.42.0:
loader-utils "^1.2.3"
memory-fs "^0.4.1"
micromatch "^3.1.10"
- mkdirp "^0.5.1"
+ mkdirp "^0.5.3"
neo-async "^2.6.1"
node-libs-browser "^2.2.1"
schema-utils "^1.0.0"
tapable "^1.1.3"
terser-webpack-plugin "^1.4.3"
- watchpack "^1.6.0"
+ watchpack "^1.6.1"
webpack-sources "^1.4.1"
-whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.5:
+whatwg-encoding@^1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0"
integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==
@@ -10605,7 +12074,7 @@ whatwg-fetch@3.0.0, whatwg-fetch@>=0.10.0:
resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#fc804e458cc460009b1a2b966bc8817d2578aefb"
integrity sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==
-whatwg-mimetype@^2.2.0, whatwg-mimetype@^2.3.0:
+whatwg-mimetype@^2.3.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf"
integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==
@@ -10619,12 +12088,21 @@ whatwg-url@^7.0.0:
tr46 "^1.0.1"
webidl-conversions "^4.0.2"
+whatwg-url@^8.0.0:
+ version "8.1.0"
+ resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.1.0.tgz#c628acdcf45b82274ce7281ee31dd3c839791771"
+ integrity sha512-vEIkwNi9Hqt4TV9RdnaBPNt+E2Sgmo3gePebCRgZ1R7g6d23+53zCTnuB0amKI4AXq6VM8jj2DUAa0S1vjJxkw==
+ dependencies:
+ lodash.sortby "^4.7.0"
+ tr46 "^2.0.2"
+ webidl-conversions "^5.0.0"
+
which-module@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=
-which@^1.2.9, which@^1.3.1:
+which@^1.2.9:
version "1.3.1"
resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==
@@ -10661,7 +12139,7 @@ winston@3.2.1:
triple-beam "^1.3.0"
winston-transport "^4.3.0"
-word-wrap@~1.2.3:
+word-wrap@^1.2.3, word-wrap@~1.2.3:
version "1.2.3"
resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"
integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==
@@ -10728,17 +12206,24 @@ write@1.0.3:
dependencies:
mkdirp "^0.5.1"
-ws@^7.0.0:
- version "7.2.1"
- resolved "https://registry.yarnpkg.com/ws/-/ws-7.2.1.tgz#03ed52423cd744084b2cf42ed197c8b65a936b8e"
- integrity sha512-sucePNSafamSKoOqoNfBd8V0StlkzJKL2ZAhGQinCfNQ+oacw+Pk7lcdAElecBF2VkLNZRiIb5Oi1Q5lVUVt2A==
+ws@^6.0.0:
+ version "6.2.1"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb"
+ integrity sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==
+ dependencies:
+ async-limiter "~1.0.0"
+
+ws@^7.2.3:
+ version "7.3.0"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-7.3.0.tgz#4b2f7f219b3d3737bc1a2fbf145d825b94d38ffd"
+ integrity sha512-iFtXzngZVXPGgpTlP1rBqsUK82p9tKqsWRPg5L56egiljujJT3vGAYnHANvFxBieXrTFavhzhxW52jnaWV+w2w==
xml-name-validator@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a"
integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==
-xmlchars@^2.1.1:
+xmlchars@^2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb"
integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==
@@ -10765,6 +12250,11 @@ yallist@^3.0.2:
resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
+yallist@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
+ integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
+
yaml@^1.7.2:
version "1.7.2"
resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.7.2.tgz#f26aabf738590ab61efaca502358e48dc9f348b2"
@@ -10772,12 +12262,13 @@ yaml@^1.7.2:
dependencies:
"@babel/runtime" "^7.6.3"
-yargs-parser@^10.0.0:
- version "10.1.0"
- resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8"
- integrity sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==
+yargs-parser@18.x, yargs-parser@^18.1.3:
+ version "18.1.3"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0"
+ integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==
dependencies:
- camelcase "^4.1.0"
+ camelcase "^5.0.0"
+ decamelize "^1.2.0"
yargs-parser@^13.1.1:
version "13.1.1"
@@ -10844,6 +12335,14 @@ zen-observable-ts@^0.8.20:
tslib "^1.9.3"
zen-observable "^0.8.0"
+zen-observable-ts@^0.8.21:
+ version "0.8.21"
+ resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-0.8.21.tgz#85d0031fbbde1eba3cd07d3ba90da241215f421d"
+ integrity sha512-Yj3yXweRc8LdRMrCC8nIc4kkjWecPAUVh0TI0OUrWXx6aX790vLcDlWca6I4vsyCGH3LpWxq0dJRcMOFoVqmeg==
+ dependencies:
+ tslib "^1.9.3"
+ zen-observable "^0.8.0"
+
zen-observable@^0.8.0:
version "0.8.15"
resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.8.15.tgz#96415c512d8e3ffd920afd3889604e30b9eaac15"