diff --git a/.circleci/config.yml b/.circleci/config.yml index d49a32f50..dd0d77bc6 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -63,6 +63,7 @@ build_configuration_fetch: &build_configuration_fetch command: | ./awsconfiguration.sh $DEPLOY_ENV ./buildenv.sh -e $DEPLOY_ENV -b ${LOGICAL_ENV}-${APPNAME}-buildvar + aws s3 cp s3://tc-platform-${LOGICAL_ENV}/securitymanager/${LOGICAL_ENV}-platform-ui.env ./.env lint_steps: &lint_steps # Initialization. @@ -146,6 +147,35 @@ jobs: APPNAME: "platform-ui-mvp" steps: *deploy_steps + # Test job for the cases when we don not need deployment. + e2e-test: + docker: + - image: cypress/browsers:node16.14.2-slim-chrome100-ff99-edge + steps: + - checkout + - restore_cache: + key: test-node-modules-{{ checksum "yarn.lock" }} + - run: + name: Config Git + command: git config --global url."https://git@".insteadOf git:// + - run: + name: Install Dependencies + command: yarn install + no_output_timeout: 20m + - run: + name: Install Cypress Binary + command: yarn cypress install + - run: + name: Build the application + command: yarn build + no_output_timeout: 20m + - save_cache: + key: test-node-modules-{{ checksum "yarn.lock" }} + paths: + - node_modules + - /root/.cache/Cypress + - run: yarn cy:ci + workflows: version: 2 build: @@ -171,6 +201,9 @@ workflows: ignore: - master + - e2e-test: + context : org-global + - build-prod: context : org-global filters: @@ -182,6 +215,7 @@ workflows: context : org-global requires: - build-dev + - e2e-test filters: branches: only: diff --git a/.gitignore b/.gitignore index 4d29575de..63c983693 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ # testing /coverage +.nyc_output # production /build @@ -17,7 +18,12 @@ .env.development.local .env.test.local .env.production.local +.env npm-debug.log* yarn-debug.log* yarn-error.log* + +# Editors +.editorconfig +.prettierrc diff --git a/README.md b/README.md index 4951a9a68..f3d7134a8 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,7 @@ The Platform UI is the official Topcoder web app to host all modern user interfaces to be used by all users. -All future user interfaces at Topcoder will be implemented here. -Pre-existing user interfaces will be ported to here over time until this is the only user interface any user sees when interacting with Topcoder. +All future user interfaces at Topcoder will be implemented here. Pre-existing user interfaces will be ported to here over time until this is the only user interface any user sees when interacting with Topcoder. >**NOTE:** The information in this file describes our coding standards and best practices. All new code should follow these guidelines both when coding new features as well as porting old features. Please take the time to read through this file in detail. @@ -11,6 +10,7 @@ Pre-existing user interfaces will be ported to here over time until this is the - [Local Environment Setup](#local-environment-setup) - [Deployments](#deployments) +- [Developer Center specific setup](#developer-center-contentful-api-key-and-space-id) - [Yarn Commands](#yarn-commands) # Application structure @@ -81,29 +81,37 @@ You will need to add the following line to your hosts file. The hosts file is no >% yarn start -3. Go to https://local.topcoder-dev.com:3003/ +3. Go to https://local.topcoder-dev.com:3000 + +>**NOTE**: The default port is 3000, but you can override it in your [personal config](#personal-config). ### Local SSL SSL is required for authentication to work properly. -The `yarn start` command serves the site using the cert and key in the /ssl directory. +The `yarn start` command serves the site using the cert and key in the /ssl directory, which authorize the `https://local.topcoder-dev.com`URL. + +By overriding the app to use port 443, you can use the authorized URL and trust the root CA to avoid SSL errors in the browser. + +>**NOTE:** Mac users will require running the app with elevated permissions in order to use a port lower than 500. -For easier development, it is recommended that you add this certificate to your trusted root authorities and as a trused cert in your browser. Google your browser and OS for more info. +For easier development, it is recommended that you add this certificate to your trusted root authorities and as a trused cert in your browser. Google your browser and OS for more info on how to trust cert authorities. Otherwise, you will need to override the exception each time you load the site. Firefox users may need to user an incognito browser in order to override the exception. ### Personal Config -1. Add [hostname] to src-ts/config/environments/app-host-environment.enum.ts -2. Copy an existing config from src-ts/config/environments/environment.*.config.ts -3. Rename new config environment.[hostname].config.ts -4. Rename config variable to EnvironmentConfig[HostName] -5. Set the ENV variable to AppHostEnvironment.[hostname] -6. Add the switch case for the host name to src-ts/config/environments/environment.config.ts +1. Add [hostname] to [`/src-ts/config/environments/app-host-environment.type.ts`](/src-ts/config/environments/app-host-environment.type.ts) +2. Copy an existing config from [`/src-ts/config/environments/environment.*.config.ts`](/src-ts/config/environments/environment.bsouza.config.ts) +3. Rename new config `environment.[hostname].config.ts` +4. Rename config variable to `EnvironmentConfig[HostName]` +5. Set the `ENV` variable to `[hostname]` +6. Add the switch case for the host name to [`/src-ts/config/environments/environment.config.ts`](/src-ts/config/environments/environment.config.ts) 7. Prior to starting the server, set your host name: ```% export REACT_APP_HOST_ENV=[hostname]``` +>**NOTE:** Individual tools (e.g. [Learn tool](/src-ts/tools/learn/README.md)) can have their own configuration, which can be configured the same way as the global config. + #### For further convenience 1. Copy start-ssl-*.sh @@ -117,7 +125,22 @@ The app uses CircleCI for CI/CD. The "dev" branch is auto-deployed to the dev environment: https://platform-mvp.topcoder-dev.com. -The "master" branch is auto-deployed to the production environment: https://platform-mvp.topcoder.com. +The "master" branch is auto-deployed to the production environment: https://platform-ui.topcoder.com. + +## Developer Center Contentful API Key and Space Id + +The app requires two environment variables, which contain the space id and the key used to access contentful and retrieve Thrive Articles. + +You should create a file named `.env` in the root folder, and write inside the following lines: + +```sh +REACT_APP_CONTENTFUL_EDU_SPACE_ID= +REACT_APP_CONTENTFUL_EDU_CDN_API_KEY= +``` + +We should use the same space ID and API Key as Topcoder Thrive, these are for fetching Thrive articles and videos in the landing page. + +See the [Dev Center README](/src-ts/tools/dev-center/README.md) for further instructions on setting up the Dev Center. ## yarn Commands @@ -132,7 +155,11 @@ The "master" branch is auto-deployed to the production environment: https://plat | `yarn eslint` | Run eslint against js/x files and outputs report | | `yarn eslint:fix` | Run eslint against js/x files, fixes auto-fixable issues, and outputs report | | `yarn test` | Run unit tests, watching for changes and re-running per your specifications | -| `yarn test:no-watch` | Run unit tests once, without watching for changes or re-running | +| `yarn test:no-watch` | Run unit tests once, without watching for changes or re-running | +| `yarn cy:run` | Run e2e tests once in local command with the site is running | +| `yarn cy:ci` | Run e2e tests once by circle ci | +| `yarn report:coverage`| Generate e2e coverage report in html format | +| `yarn report:coverage:text` | Generate e2e coverage report in text format | ## Folder Structure @@ -247,9 +274,10 @@ The PlatformRoute model has several useful options: | `element: JSX.Element` | The element property is the JSX element that should appear at the specified URL. | | `disabled?: boolean` | When a route is marked as disabled, it will not be registered and will the URL will return a 404. | | `hide?: boolean` | When a route is hidden, it will be registered and the URL will be available through deep-linking but will not be visible in either the Tools or Utils Selectors. This is useful for handling redirects for obsolete routes. | -| `requireAuth?: boolean` | Requiring authentication for a route means that users who are not logged in will be redirected to the Login Form when they try to access the route. | +| `authRequired?: boolean` | Requiring authentication for a route means that users who are not logged in will be redirected to the Login Form when they try to access the route. | | `route: string` | The route property is the path to the route, relative to its parent(s). | | `title: string` | The title property is the text that will appear in the Tools or Utils Selectors (this is irrelevant on hidden routes). | +| `rolesRequired: Array` | Requiring roles for a route means that users who do not own the roles will be presented with restricted page when they try to access the route. | ## Git @@ -465,8 +493,8 @@ e.g.: ``` .logo-link { svg { - width: calc($pad-xxl + $pad-xxxxl); - height: $pad-xl; + width: calc($space-xxl + $space-xxxxl); + height: $space-xl; fill: none; path { diff --git a/babel.config.js b/babel.config.js index cd5b145c6..457f10d59 100644 --- a/babel.config.js +++ b/babel.config.js @@ -50,6 +50,7 @@ module.exports = function (api) { ], ], plugins: [ + "istanbul", [ "module-resolver", { diff --git a/cypress.config.ts b/cypress.config.ts new file mode 100644 index 000000000..e622ea360 --- /dev/null +++ b/cypress.config.ts @@ -0,0 +1,19 @@ +import { defineConfig } from 'cypress' + +export default defineConfig({ + fixturesFolder: false, + video: false, + screenshotOnRunFailure: false, + defaultCommandTimeout: 10000, + e2e: { + baseUrl: 'http://localhost:3000', + specPattern: "cypress/e2e/**/*.spec.{js,jsx,ts,tsx}", + supportFile: "cypress/support/e2e.ts", + viewportHeight: 1000, + viewportWidth: 1280, + setupNodeEvents(on, config) { + require('@cypress/code-coverage/task')(on, config) + return config; + }, + }, +}) diff --git a/cypress/.eslintrc b/cypress/.eslintrc new file mode 100644 index 000000000..0f1b15145 --- /dev/null +++ b/cypress/.eslintrc @@ -0,0 +1,3 @@ +{ + "extends": ["plugin:cypress/recommended"] +} diff --git a/cypress/e2e/home/home.spec.ts b/cypress/e2e/home/home.spec.ts new file mode 100644 index 000000000..8d1f98c25 --- /dev/null +++ b/cypress/e2e/home/home.spec.ts @@ -0,0 +1,8 @@ +describe('Landing Page', () => { + + beforeEach(() => cy.visit('/')) + + it('loads landing page should be successfully', () => { + cy.get('[data-id="root"]').should('be.visible') + }) +}) diff --git a/cypress/support/commands.ts b/cypress/support/commands.ts new file mode 100644 index 000000000..7d3a21716 --- /dev/null +++ b/cypress/support/commands.ts @@ -0,0 +1,8 @@ +/// + +Cypress.on('uncaught:exception', () => { + // returning false here prevents Cypress from failing the test + return false +}) + +export {} \ No newline at end of file diff --git a/cypress/support/e2e.ts b/cypress/support/e2e.ts new file mode 100644 index 000000000..cdb3e6d83 --- /dev/null +++ b/cypress/support/e2e.ts @@ -0,0 +1,2 @@ +import '@cypress/code-coverage/support' +import './commands' \ No newline at end of file diff --git a/cypress/tsconfig.json b/cypress/tsconfig.json new file mode 100644 index 000000000..2aa16b188 --- /dev/null +++ b/cypress/tsconfig.json @@ -0,0 +1,12 @@ +{ + "extends": "../tsconfig.json", + "include": ["./**/*.ts"], + "exclude": [], + "compilerOptions": { + "types": ["cypress"], + "lib": ["es2015", "dom"], + "isolatedModules": false, + "allowJs": true, + "noEmit": true + } +} \ No newline at end of file diff --git a/package.json b/package.json index 1fa4fdc1f..bf9628928 100644 --- a/package.json +++ b/package.json @@ -3,8 +3,9 @@ "version": "0.1.0", "private": true, "scripts": { + "dev": "yarn react-app-rewired start", "start": "sh start-ssl.sh", - "start:bsouza": "sh start-ssl-bsouza.sh", + "start:bsouza": "sudo sh start-ssl-bsouza.sh", "build": "yarn react-app-rewired build", "lint": "tslint 'src-ts/**/*.{ts,tsx}' && eslint 'src*/**/*.{js,jsx,ts,tsx}'", "lint:fix": "tslint 'src-ts/**/*.{ts,tsx}' --fix && eslint 'src*/**/*.{js,jsx,ts,tsx}' --fix", @@ -13,19 +14,30 @@ "eslint": "eslint 'src/**/*.{js,jsx}'", "eslint:fix": "eslint 'src/**/*.{js,jsx}' --fix", "test": "react-scripts test --watchAll", - "test:no-watch": "react-scripts test --watchAll=false --passWithNoTests" + "test:no-watch": "react-scripts test --watchAll=false --passWithNoTests", + "cy:run": "cypress run", + "cy:ci": "start-server-and-test 'serve -s build -n -p 3000' http://localhost:3000 'cy:run'", + "report:coverage": "nyc report --reporter=html", + "report:coverage:text": "nyc report --reporter=text" }, "dependencies": { "@datadog/browser-logs": "^4.7.1", "@heroicons/react": "^1.0.6", + "@types/dompurify": "^2.3.3", + "@types/highlightjs": "^9.12.2", + "@types/marked": "4.0.3", "apexcharts": "^3.35.3", "axios": "^0.26.1", "browser-cookies": "^1.2.0", "classnames": "^2.3.1", + "contentful": "^9.1.33", "crypto-js": "^4.1.1", "customize-cra": "^1.0.0", + "dompurify": "^2.3.10", + "highlight.js": "^11.6.0", "html2canvas": "^1.4.1", "lodash": "^4.17.21", + "marked": "4.0.3", "moment": "^2.29.3", "moment-timezone": "^0.5.34", "prop-types": "^15.8.1", @@ -63,6 +75,7 @@ "@babel/preset-react": "^7.7.4", "@babel/preset-typescript": "^7.16.7", "@babel/runtime": "^7.8.7", + "@cypress/code-coverage": "^3.10.0", "@stripe/react-stripe-js": "1.7.2", "@stripe/stripe-js": "1.29.0", "@testing-library/jest-dom": "^5.14.1", @@ -71,7 +84,7 @@ "@types/axios": "^0.14.0", "@types/jest": "^27.0.1", "@types/lodash": "^4.14.182", - "@types/node": "^17.0.24", + "@types/node": "^18.7.13", "@types/reach__router": "^1.3.10", "@types/react": "^18.0.5", "@types/react-dom": "^18.0.1", @@ -90,25 +103,32 @@ "concurrently": "^5.0.1", "config": "^3.3.6", "cross-env": "^7.0.2", + "cypress": "^10.6.0", "eslint": "^8.18.0", "eslint-config-prettier": "^6.7.0", "eslint-config-react-app": "^7.0.1", "eslint-config-react-important-stuff": "^2.0.0", + "eslint-plugin-cypress": "^2.12.1", "eslint-plugin-prettier": "^3.1.1", "file-loader": "^6.2.0", "husky": "^8.0.0", "identity-obj-proxy": "^3.0.0", + "istanbul-lib-coverage": "^3.2.0", "jest": "^25.2.7", "jest-cli": "^25.2.7", "lint-staged": "^13.0.3", + "nyc": "^15.1.0", "postcss-loader": "^4.0.4", "postcss-scss": "^3.0.2", "prettier": "^2.0.4", "pretty-quick": "^2.0.1", "resolve-url-loader": "^3.1.2", "sass-loader": "^10.0.5", + "serve": "^14.0.1", + "start-server-and-test": "^1.14.0", "style-loader": "^2.0.0", "systemjs-webpack-interop": "^2.1.2", + "tslint": "^6.1.3", "webpack": "^4.41.2", "webpack-cli": "^3.3.10", "webpack-config-single-spa-react": "^1.0.3", diff --git a/public/index.html b/public/index.html index 59b04f059..da3a59318 100644 --- a/public/index.html +++ b/public/index.html @@ -32,7 +32,7 @@ -
+
- \ No newline at end of file + diff --git a/src-ts/config/environments/app-host-environment.enum.ts b/src-ts/config/environments/app-host-environment.enum.ts deleted file mode 100644 index dfbfc1551..000000000 --- a/src-ts/config/environments/app-host-environment.enum.ts +++ /dev/null @@ -1,6 +0,0 @@ -export enum AppHostEnvironment { - bsouza = 'bsouza', - default = 'default', - dev = 'dev', - prod = 'prod', -} diff --git a/src-ts/config/environments/app-host-environment.type.ts b/src-ts/config/environments/app-host-environment.type.ts new file mode 100644 index 000000000..01efb080c --- /dev/null +++ b/src-ts/config/environments/app-host-environment.type.ts @@ -0,0 +1 @@ +export type AppHostEnvironmentType = 'bsouza' | 'default' | 'dev' | 'prod' diff --git a/src-ts/config/environments/environment-config.model.ts b/src-ts/config/environments/environment-config.model.ts new file mode 100644 index 000000000..58628e7de --- /dev/null +++ b/src-ts/config/environments/environment-config.model.ts @@ -0,0 +1,8 @@ +import { GlobalConfig } from '../../lib' + +import { AppHostEnvironmentType } from './app-host-environment.type' + +export interface EnvironmentConfigModel extends GlobalConfig { + // override the ENV var to require that it's defined in the type + ENV: AppHostEnvironmentType, +} diff --git a/src-ts/config/environments/environment.bsouza.config.ts b/src-ts/config/environments/environment.bsouza.config.ts index eb117c9df..269db98cc 100644 --- a/src-ts/config/environments/environment.bsouza.config.ts +++ b/src-ts/config/environments/environment.bsouza.config.ts @@ -1,9 +1,7 @@ -import { GlobalConfig } from '../../lib' - -import { AppHostEnvironment } from './app-host-environment.enum' +import { EnvironmentConfigModel } from './environment-config.model' import { EnvironmentConfigDefault } from './environment.default.config' -export const EnvironmentConfigBsouza: GlobalConfig = { +export const EnvironmentConfigBsouza: EnvironmentConfigModel = { ...EnvironmentConfigDefault, - ENV: AppHostEnvironment.bsouza, + ENV: 'bsouza', } diff --git a/src-ts/config/environments/environment.config.ts b/src-ts/config/environments/environment.config.ts index fd0ba6c7e..b0312a180 100644 --- a/src-ts/config/environments/environment.config.ts +++ b/src-ts/config/environments/environment.config.ts @@ -1,25 +1,27 @@ -import { GlobalConfig } from '../../lib' - -import { AppHostEnvironment } from './app-host-environment.enum' +import { AppHostEnvironmentType } from './app-host-environment.type' +import { EnvironmentConfigModel } from './environment-config.model' import { EnvironmentConfigBsouza } from './environment.bsouza.config' import { EnvironmentConfigDefault } from './environment.default.config' import { EnvironmentConfigDev } from './environment.dev.config' import { EnvironmentConfigProd } from './environment.prod.config' -function getEnvironmentConfig(): GlobalConfig { +function getEnvironmentConfig(): EnvironmentConfigModel { + + const environment: AppHostEnvironmentType | undefined + = process.env.REACT_APP_HOST_ENV as AppHostEnvironmentType | undefined - switch (process.env.REACT_APP_HOST_ENV) { + switch (environment) { - case AppHostEnvironment.bsouza: + case 'bsouza': return EnvironmentConfigBsouza - case AppHostEnvironment.default: + case 'default': return EnvironmentConfigDefault - case AppHostEnvironment.dev: + case 'dev': return EnvironmentConfigDev - case AppHostEnvironment.prod: + case 'prod': return EnvironmentConfigProd default: @@ -27,7 +29,7 @@ function getEnvironmentConfig(): GlobalConfig { } } -const enviromentConfig: GlobalConfig = { +const enviromentConfig: EnvironmentConfigModel = { ...getEnvironmentConfig(), } diff --git a/src-ts/config/environments/environment.default.config.ts b/src-ts/config/environments/environment.default.config.ts index f1339ec3b..8df336dc1 100644 --- a/src-ts/config/environments/environment.default.config.ts +++ b/src-ts/config/environments/environment.default.config.ts @@ -1,10 +1,8 @@ -import { GlobalConfig } from '../../lib' - -import { AppHostEnvironment } from './app-host-environment.enum' +import { EnvironmentConfigModel } from './environment-config.model' const COMMUNITY_WEBSITE: string = 'https://www.topcoder-dev.com' -export const EnvironmentConfigDefault: GlobalConfig = { +export const EnvironmentConfigDefault: EnvironmentConfigModel = { ANALYTICS: { SEGMENT_KEY: undefined, TAG_MANAGER_ID: undefined, @@ -15,8 +13,7 @@ export const EnvironmentConfigDefault: GlobalConfig = { V3: 'https://api.topcoder-dev.com/v3', V5: 'https://api.topcoder-dev.com/v5', }, - ENV: AppHostEnvironment.default, - LEARN_SRC: 'https://fcc.topcoder-dev.com:4431', + ENV: 'default', LOGGING: { PUBLIC_TOKEN: 'puba0825671e469d16f940c5a30dc738f11', SERVICE: 'platform-ui', @@ -32,9 +29,13 @@ export const EnvironmentConfigDefault: GlobalConfig = { 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlcyI6WyJUb3Bjb2RlciBVc2VyIl0sImlzcyI6Imh0dHBzOi8vYXBpLnRvcGNvZGVyLWRldi5jb20iLCJoYW5kbGUiOiJ0ZXN0MSIsImV4cCI6MjU2MzA3NjY4OSwidXNlcklkIjoiNDAwNTEzMzMiLCJpYXQiOjE0NjMwNzYwODksImVtYWlsIjoidGVzdEB0b3Bjb2Rlci5jb20iLCJqdGkiOiJiMzNiNzdjZC1iNTJlLTQwZmUtODM3ZS1iZWI4ZTBhZTZhNGEifQ.jl6Lp_friVNwEP8nfsfmL-vrQFzOFp2IfM_HC7AwGcg', }, TOPCODER_URLS: { + API_BASE: `${COMMUNITY_WEBSITE}/api`, + BLOG_PAGE: `${COMMUNITY_WEBSITE}/blog`, CHALLENGES_PAGE: `${COMMUNITY_WEBSITE}/challenges`, GIGS_PAGE: `${COMMUNITY_WEBSITE}/gigs`, + THRIVE_PAGE: `${COMMUNITY_WEBSITE}/thrive`, USER_PROFILE: `${COMMUNITY_WEBSITE}/members`, + WP_CONTENT: `${COMMUNITY_WEBSITE}/wp-content`, }, URL: { ACCOUNTS_APP_CONNECTOR: 'https://accounts-auth0.topcoder-dev.com', diff --git a/src-ts/config/environments/environment.dev.config.ts b/src-ts/config/environments/environment.dev.config.ts index 2bebd3fdc..61c8ec1e7 100644 --- a/src-ts/config/environments/environment.dev.config.ts +++ b/src-ts/config/environments/environment.dev.config.ts @@ -1,18 +1,14 @@ -import { GlobalConfig } from '../../lib' - -import { AppHostEnvironment } from './app-host-environment.enum' +import { EnvironmentConfigModel } from './environment-config.model' import { EnvironmentConfigDefault } from './environment.default.config' -export const EnvironmentConfigDev: GlobalConfig = { +export const EnvironmentConfigDev: EnvironmentConfigModel = { ...EnvironmentConfigDefault, ANALYTICS: { SEGMENT_KEY: EnvironmentConfigDefault.ANALYTICS.SEGMENT_KEY, - TAG_MANAGER_ID: 'GTM-MXXQHG8', - // TAG_MANAGER_ID: 'GTM-W7B537Z', + TAG_MANAGER_ID: 'GTM-W7B537Z', }, DISABLED_TOOLS: [], - ENV: AppHostEnvironment.dev, - LEARN_SRC: 'https://freecodecamp.topcoder-dev.com', + ENV: 'dev', // TODO: Move stripe creds to .env file STRIPE: { ADMIN_TOKEN: diff --git a/src-ts/config/environments/environment.prod.config.ts b/src-ts/config/environments/environment.prod.config.ts index 79c9bf978..4e4bd4e6b 100644 --- a/src-ts/config/environments/environment.prod.config.ts +++ b/src-ts/config/environments/environment.prod.config.ts @@ -1,11 +1,9 @@ -import { GlobalConfig } from '../../lib' - -import { AppHostEnvironment } from './app-host-environment.enum' +import { EnvironmentConfigModel } from './environment-config.model' import { EnvironmentConfigDefault } from './environment.default.config' const COMMUNITY_WEBSITE: string = 'https://www.topcoder.com' -export const EnvironmentConfigProd: GlobalConfig = { +export const EnvironmentConfigProd: EnvironmentConfigModel = { ...EnvironmentConfigDefault, ANALYTICS: { SEGMENT_KEY: '8fCbi94o3ruUUGxRRGxWu194t6iVq9LH', @@ -13,26 +11,29 @@ export const EnvironmentConfigProd: GlobalConfig = { }, API: { FORUM_ACCESS_TOKEN: EnvironmentConfigDefault.API.FORUM_ACCESS_TOKEN, - FORUM_V2: 'https://vanilla.topcoder.com/api/v2', + FORUM_V2: 'https://discussions.topcoder.com/api/v2', V3: 'https://api.topcoder.com/v3', V5: 'https://api.topcoder.com/v5', }, - DISABLED_TOOLS: [ ], - ENV: AppHostEnvironment.prod, - LEARN_SRC: 'https://freecodecamp.topcoder.com', + DISABLED_TOOLS: [], + ENV: 'prod', // TODO: Move stripe creds to .env file STRIPE: { ADMIN_TOKEN: - 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlcyI6WyJUb3Bjb2RlciBVc2VyIiwiYWRtaW5pc3RyYXRvciJdLCJpc3MiOiJodHRwczovL2FwaS50b3Bjb2Rlci1kZXYuY29tIiwiaGFuZGxlIjoidGVzdDEiLCJleHAiOjI1NjMwNzY2ODksInVzZXJJZCI6IjQwMDUxMzMzIiwiaWF0IjoxNDYzMDc2MDg5LCJlbWFpbCI6InRlc3RAdG9wY29kZXIuY29tIiwianRpIjoiYjMzYjc3Y2QtYjUyZS00MGZlLTgzN2UtYmViOGUwYWU2YTRhIn0.wKWUe0-SaiFVN-VR_-GwgFlvWaDkSbc8H55ktb9LAVw', + 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlcyI6WyJUb3Bjb2RlciBVc2VyIiwiYWRtaW5pc3RyYXRvciJdLCJpc3MiOiJodHRwczovL2FwaS50b3Bjb2Rlci1kZXYuY29tIiwiaGFuZGxlIjoidGVzdDEiLCJleHAiOjI1NjMwNzY2ODksInVzZXJJZCI6IjQwMDUxMzMzIiwiaWF0IjoxNDYzMDc2MDg5LCJlbWFpbCI6InRlc3RAdG9wY29kZXIuY29tIiwianRpIjoiYjMzYjc3Y2QtYjUyZS00MGZlLTgzN2UtYmViOGUwYWU2YTRhIn0.wKWUe0-SaiFVN-VR_-GwgFlvWaDkSbc8H55ktb9LAVw', API_KEY: 'pk_live_m3bCBVSfkfMOEp3unZFRsHXi', API_VERSION: '2020-08-27', CUSTOMER_TOKEN: - 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlcyI6WyJUb3Bjb2RlciBVc2VyIl0sImlzcyI6Imh0dHBzOi8vYXBpLnRvcGNvZGVyLWRldi5jb20iLCJoYW5kbGUiOiJ0ZXN0MSIsImV4cCI6MjU2MzA3NjY4OSwidXNlcklkIjoiNDAwNTEzMzMiLCJpYXQiOjE0NjMwNzYwODksImVtYWlsIjoidGVzdEB0b3Bjb2Rlci5jb20iLCJqdGkiOiJiMzNiNzdjZC1iNTJlLTQwZmUtODM3ZS1iZWI4ZTBhZTZhNGEifQ.jl6Lp_friVNwEP8nfsfmL-vrQFzOFp2IfM_HC7AwGcg', + 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlcyI6WyJUb3Bjb2RlciBVc2VyIl0sImlzcyI6Imh0dHBzOi8vYXBpLnRvcGNvZGVyLWRldi5jb20iLCJoYW5kbGUiOiJ0ZXN0MSIsImV4cCI6MjU2MzA3NjY4OSwidXNlcklkIjoiNDAwNTEzMzMiLCJpYXQiOjE0NjMwNzYwODksImVtYWlsIjoidGVzdEB0b3Bjb2Rlci5jb20iLCJqdGkiOiJiMzNiNzdjZC1iNTJlLTQwZmUtODM3ZS1iZWI4ZTBhZTZhNGEifQ.jl6Lp_friVNwEP8nfsfmL-vrQFzOFp2IfM_HC7AwGcg', }, TOPCODER_URLS: { + API_BASE: `${COMMUNITY_WEBSITE}/api`, + BLOG_PAGE: `${COMMUNITY_WEBSITE}/blog`, CHALLENGES_PAGE: `${COMMUNITY_WEBSITE}/challenges`, GIGS_PAGE: `${COMMUNITY_WEBSITE}/gigs`, + THRIVE_PAGE: `${COMMUNITY_WEBSITE}/thrive`, USER_PROFILE: `${COMMUNITY_WEBSITE}/members`, + WP_CONTENT: `${COMMUNITY_WEBSITE}/wp-content`, }, URL: { ACCOUNTS_APP_CONNECTOR: 'https://accounts-auth0.topcoder.com', diff --git a/src-ts/declarations.d.ts b/src-ts/declarations.d.ts index fa09433a4..bd7a8df0c 100644 --- a/src-ts/declarations.d.ts +++ b/src-ts/declarations.d.ts @@ -22,3 +22,8 @@ declare module '*.svg' { } declare module 'tc-auth-lib' + +declare module '*.md' { + const value: string + export default value +} diff --git a/src-ts/header/logo/Logo.module.scss b/src-ts/header/logo/Logo.module.scss index 63f246fe1..c8147210a 100644 --- a/src-ts/header/logo/Logo.module.scss +++ b/src-ts/header/logo/Logo.module.scss @@ -9,8 +9,8 @@ } svg { - width: calc($pad-xxl + $pad-xxxxl); - height: $pad-xl; + width: calc($space-xxl + $space-xxxxl); + height: $space-xl; fill: none; path { diff --git a/src-ts/header/tool-selectors/tool-selectors-narrow/ToolSelectorsNarrow.module.scss b/src-ts/header/tool-selectors/tool-selectors-narrow/ToolSelectorsNarrow.module.scss index 00432f9bd..b8c5b6080 100644 --- a/src-ts/header/tool-selectors/tool-selectors-narrow/ToolSelectorsNarrow.module.scss +++ b/src-ts/header/tool-selectors/tool-selectors-narrow/ToolSelectorsNarrow.module.scss @@ -23,9 +23,9 @@ left: 0; bottom: 0; height: $content-height; - width: calc(100% - calc(2 * $pad-xxl)); + width: calc(100% - calc(2 * $space-xxl)); z-index: 100; background-color: $black-100; - padding: $pad-xxl; + padding: $space-xxl; } } diff --git a/src-ts/header/tool-selectors/tool-selectors-narrow/tool-selector-narrow/ToolSelectorNarrow.module.scss b/src-ts/header/tool-selectors/tool-selectors-narrow/tool-selector-narrow/ToolSelectorNarrow.module.scss index aa0e9d6b0..bd803c9d5 100644 --- a/src-ts/header/tool-selectors/tool-selectors-narrow/tool-selector-narrow/ToolSelectorNarrow.module.scss +++ b/src-ts/header/tool-selectors/tool-selectors-narrow/tool-selector-narrow/ToolSelectorNarrow.module.scss @@ -11,7 +11,7 @@ justify-content: space-between; align-items: center; border-top: 1px solid $black-60; - padding: $pad-lg 0; + padding: $space-lg 0; color: $tc-white; font-weight: $font-weight-medium; background-color: $black-100; diff --git a/src-ts/header/tool-selectors/tool-selectors-wide/ToolSelectorsWide.module.scss b/src-ts/header/tool-selectors/tool-selectors-wide/ToolSelectorsWide.module.scss index ba01f4de5..0ac8ef96d 100644 --- a/src-ts/header/tool-selectors/tool-selectors-wide/ToolSelectorsWide.module.scss +++ b/src-ts/header/tool-selectors/tool-selectors-wide/ToolSelectorsWide.module.scss @@ -4,7 +4,7 @@ display: flex; align-items: center; border-left: solid 1px $black-80; - padding-left: $pad-md; + padding-left: $space-md; @include ltemd { display: none; diff --git a/src-ts/header/tool-selectors/tool-selectors-wide/tool-selector-wide/ToolSelectorWide.module.scss b/src-ts/header/tool-selectors/tool-selectors-wide/tool-selector-wide/ToolSelectorWide.module.scss index 64a8efdee..a8d6a7a16 100644 --- a/src-ts/header/tool-selectors/tool-selectors-wide/tool-selector-wide/ToolSelectorWide.module.scss +++ b/src-ts/header/tool-selectors/tool-selectors-wide/tool-selector-wide/ToolSelectorWide.module.scss @@ -10,12 +10,12 @@ a { display: block; - padding: 11px $pad-md; + padding: 11px $space-md; text-align: center; } .active-indicator { - width: $pad-xxl; + width: $space-xxl; height: 2px; } diff --git a/src-ts/header/utility-selectors/UtilitySelector/ProfileSelector/profile-logged-in/ProfileLoggedIn.module.scss b/src-ts/header/utility-selectors/UtilitySelector/ProfileSelector/profile-logged-in/ProfileLoggedIn.module.scss index f0906e8b4..08edd0e71 100644 --- a/src-ts/header/utility-selectors/UtilitySelector/ProfileSelector/profile-logged-in/ProfileLoggedIn.module.scss +++ b/src-ts/header/utility-selectors/UtilitySelector/ProfileSelector/profile-logged-in/ProfileLoggedIn.module.scss @@ -1,6 +1,6 @@ @import '../../../../../lib/styles/includes'; -$overlaySquare: $pad-xxxxl; +$overlaySquare: $space-xxxxl; .profile-avatar, .overlay { diff --git a/src-ts/header/utility-selectors/UtilitySelector/ProfileSelector/profile-logged-in/profile-panel/ProfilePanel.module.scss b/src-ts/header/utility-selectors/UtilitySelector/ProfileSelector/profile-logged-in/profile-panel/ProfilePanel.module.scss index 4082c4761..1ec99c6f2 100644 --- a/src-ts/header/utility-selectors/UtilitySelector/ProfileSelector/profile-logged-in/profile-panel/ProfilePanel.module.scss +++ b/src-ts/header/utility-selectors/UtilitySelector/ProfileSelector/profile-logged-in/profile-panel/ProfilePanel.module.scss @@ -7,8 +7,8 @@ $arrowTipIconHeight: 9px; @extend .body-ultra-small; position: absolute; z-index: 1000; - top: calc($pad-xxxxl + 4px + $arrowTipIconHeight); - right: calc(-1 * $pad-xxxxl / 2); + top: calc($space-xxxxl + 4px + $arrowTipIconHeight); + right: calc(-1 * $space-xxxxl / 2); width: 168px; display: flex; flex-direction: column; @@ -16,9 +16,9 @@ $arrowTipIconHeight: 9px; background-color: $tc-white; color: $black-100; - border-radius: $pad-sm; + border-radius: $space-sm; - padding: $pad-sm $pad-lg $pad-lg; + padding: $space-sm $space-lg $space-lg; .arrow-tip { display: flex; @@ -37,7 +37,7 @@ $arrowTipIconHeight: 9px; } hr { - margin: $pad-sm 0; + margin: $space-sm 0; } .nav-item { @@ -46,7 +46,7 @@ $arrowTipIconHeight: 9px; align-items: center; gap: 4px; + .nav-item { - margin-top: $pad-sm; + margin-top: $space-sm; } .icon { diff --git a/src-ts/header/utility-selectors/UtilitySelectors.module.scss b/src-ts/header/utility-selectors/UtilitySelectors.module.scss index 6a5cf1d85..ca8faf8d1 100644 --- a/src-ts/header/utility-selectors/UtilitySelectors.module.scss +++ b/src-ts/header/utility-selectors/UtilitySelectors.module.scss @@ -3,5 +3,5 @@ .utility-selectors { display: flex; justify-content: flex-end; - min-width: calc($pad-xxl + $pad-xxxxl); + min-width: calc($space-xxl + $space-xxxxl); } diff --git a/src-ts/lib/analytics/segment-analytics/SegmentAnalytics.tsx b/src-ts/lib/analytics/segment-analytics/SegmentAnalytics.tsx index c496ba326..8d0e9e573 100644 --- a/src-ts/lib/analytics/segment-analytics/SegmentAnalytics.tsx +++ b/src-ts/lib/analytics/segment-analytics/SegmentAnalytics.tsx @@ -2,7 +2,7 @@ import { FC } from 'react' import { EnvironmentConfig } from '../../../config' -import './segement-snippet' +import './segment-snippet' const SegmentAnalytics: FC<{}> = () => { diff --git a/src-ts/lib/analytics/segment-analytics/segement-snippet.js b/src-ts/lib/analytics/segment-analytics/segment-snippet.js similarity index 100% rename from src-ts/lib/analytics/segment-analytics/segement-snippet.js rename to src-ts/lib/analytics/segment-analytics/segment-snippet.js diff --git a/src-ts/lib/avatar/Avatar.module.scss b/src-ts/lib/avatar/Avatar.module.scss index 656fb032c..94f0d723d 100644 --- a/src-ts/lib/avatar/Avatar.module.scss +++ b/src-ts/lib/avatar/Avatar.module.scss @@ -4,7 +4,7 @@ $avatar-size-sm: 32px; $border-size-sm: $border; $avatar-size-xl: 120px; -$border-size-xl: $pad-xs; +$border-size-xl: $space-xs; .avatar-container { overflow: hidden; diff --git a/src-ts/lib/breadcrumb/Breadcrumb.module.scss b/src-ts/lib/breadcrumb/Breadcrumb.module.scss index c549f9def..c93a17794 100644 --- a/src-ts/lib/breadcrumb/Breadcrumb.module.scss +++ b/src-ts/lib/breadcrumb/Breadcrumb.module.scss @@ -7,14 +7,14 @@ } .breadcrumb { - padding: $pad-md 0; + padding: $space-md 0; max-width: $xxl-min; margin: 0 auto; @include pagePaddings; @include ltemd { - padding-top: $pad-xs; - padding-bottom: $pad-xs; + padding-top: $space-xs; + padding-bottom: $space-xs; } ol { @@ -22,6 +22,18 @@ padding-left: 0px; margin: 0; + &.hidden-mobile { + @include ltemd { + display: none; + } + } + + &.show-mobile { + @include gtelg { + display: none; + } + } + >li { display: inline-flex; align-items: center; @@ -30,7 +42,7 @@ a { @extend .overline; display: block; - padding: $pad-md; + padding: $space-md; color: $black-80; cursor: pointer; @@ -46,8 +58,8 @@ &:not(:last-child)::after { content: ''; display: inline-block; - width: $pad-sm; - height: $pad-sm; + width: $space-sm; + height: $space-sm; border-style: solid; border-width: $border-xs $border-xs 0 0; border-color: $black-60; diff --git a/src-ts/lib/button/Button.tsx b/src-ts/lib/button/Button.tsx index b46279ee6..47e105056 100644 --- a/src-ts/lib/button/Button.tsx +++ b/src-ts/lib/button/Button.tsx @@ -73,6 +73,7 @@ const Button: FC = (props: ButtonProps) => { return ( + ) +} + +const MarkdownImages: React.FC = ({ + children, + length, +}) => { + const carouselRef: React.MutableRefObject = React.useRef() + + const handlePrev: (ev: any) => void = (ev: any) => { + carouselRef?.current?.slidePrev() + } + + const handleNext: (ev: any) => void = (ev: any) => { + carouselRef?.current?.slideNext() + } + + interface RenderPaginationProps { + activePage: number + onClick: (ev: any) => void + pages: Array + } + + const renderPagination: React.FC = ({ + pages, + activePage, + onClick, + }) => { + return ( +
+
+ ) + } + return children.length > 1 ? ( + // @ts-ignore + + {children.map((image, index) => ( +
+ {image} +
+ ))} +
+ ) : ( + <> +
+
{children[0]}
+
+ + ) +} + +export default MarkdownImages diff --git a/src-ts/tools/dev-center/dev-center-lib/MarkdownDoc/MarkdownLink.module.scss b/src-ts/tools/dev-center/dev-center-lib/MarkdownDoc/MarkdownLink.module.scss new file mode 100644 index 000000000..f6ada8398 --- /dev/null +++ b/src-ts/tools/dev-center/dev-center-lib/MarkdownDoc/MarkdownLink.module.scss @@ -0,0 +1,50 @@ +@import "../../styles/variables"; +@import "../../../../lib/styles/includes"; + +.linkBlock { + display: flex; + align-items: center; + margin: $space-xxl 0; + background-color: $blue-10; + border-radius: 4px; +} + +.label { + flex: none; + padding: $space-md $space-lg; + + @include font-roboto; + @include font-weight-bold; + font-size: 12px; + line-height: 16px; + letter-spacing: 1px; + color: $black-100; +} + +.divider { + flex: none; + align-self: stretch; + border: 1px solid $tc-white; +} + +.link { + flex: auto; + padding: $space-md $space-lg; + + a { + @include font-roboto; + @include font-weight-medium; + font-size: 16px; + line-height: 24px; + color: $link-blue-dark; + + word-break: break-all; + } +} + +@include ltelg { + .label, + .divider { + display: none; + } +} diff --git a/src-ts/tools/dev-center/dev-center-lib/MarkdownDoc/MarkdownLink.tsx b/src-ts/tools/dev-center/dev-center-lib/MarkdownDoc/MarkdownLink.tsx new file mode 100644 index 000000000..303162e2d --- /dev/null +++ b/src-ts/tools/dev-center/dev-center-lib/MarkdownDoc/MarkdownLink.tsx @@ -0,0 +1,24 @@ +import * as React from 'react' + +import { CopyButton } from '../CopyButton' + +import styles from './MarkdownLink.module.scss' + +interface MarkdownLinkProps { + children: React.ReactNode + href: string +} + +export const MarkdownLink: React.FC = (props) => { + const { children, href }: MarkdownLinkProps = props + return ( +
+ LINK + + {children} + +
+ ) +} + +export default MarkdownLink diff --git a/src-ts/tools/dev-center/dev-center-lib/MarkdownDoc/TableOfContents.module.scss b/src-ts/tools/dev-center/dev-center-lib/MarkdownDoc/TableOfContents.module.scss new file mode 100644 index 000000000..a7f5470f9 --- /dev/null +++ b/src-ts/tools/dev-center/dev-center-lib/MarkdownDoc/TableOfContents.module.scss @@ -0,0 +1,60 @@ +@import "../../styles/variables"; + +.nav { + position: sticky; + top: 0; + width: $side-nav-width; + height: calc(100vh); + overflow-y: auto; + + box-shadow: inset 2px 0 $black-10; +} + +.navLabel { + @include font-barlow; + @include font-weight-semibold; + font-size: 18px; + line-height: 22px; + color: inherit; + text-transform: uppercase; + + padding: 0 0 0 $space-xxxl; + margin: 0 0 $space-xxl; +} + +.navListItem { + border-left: 2px solid $black-10; + cursor: pointer; + + &::first-letter { + text-transform: capitalize; + } + + &.active, + &:hover { + border-left-color: $blue-140; + background-color: $blue-10; + + .navListItem-link { + color: $blue-140; + } + } +} + +.navListItem-link { + @include font-barlow; + @include font-weight-semibold; + font-size: 14px; + line-height: 20px; + color: $black-60; + + display: block; +} + +.navListItem-link-padding-level2 { + padding: $space-sm 0 $space-sm $space-xxxl; +} + +.navListItem-link-padding-level3 { + padding: $space-sm 0 $space-sm $space-xxxxl; +} \ No newline at end of file diff --git a/src-ts/tools/dev-center/dev-center-lib/MarkdownDoc/TableOfContents.tsx b/src-ts/tools/dev-center/dev-center-lib/MarkdownDoc/TableOfContents.tsx new file mode 100644 index 000000000..20a674635 --- /dev/null +++ b/src-ts/tools/dev-center/dev-center-lib/MarkdownDoc/TableOfContents.tsx @@ -0,0 +1,104 @@ +import * as React from 'react' + +import { TOC } from './markdownRenderer' +import styles from './TableOfContents.module.scss' + +interface TableOfContentsProps { + toc: TOC +} + +export const TableOfContents: React.FC = (props) => { + const [activeIndex, setActiveIndex]: [ + number, + React.Dispatch> + ] = React.useState(-1) + const { toc }: { toc: TOC } = props + const items: TOC = React.useMemo(() => { + return toc.filter((item) => item.level === 2 || item.level === 3) + }, [toc]) + + const navRef: React.RefObject = React.createRef() + + const findActiveIndex: () => void = React.useCallback(() => { + for (let i: number = 0; i < items.length; i++) { + const h: HTMLElement | null = document.getElementById( + items[i].headingId + ) + if ( + h && + h.offsetTop < + document.documentElement.scrollTop + + document.documentElement.clientHeight / 2 + ) { + setActiveIndex(i) + const liNodes: NodeListOf | undefined = + navRef.current?.querySelectorAll('li') + if (navRef.current && liNodes) { + navRef.current.scrollTop = + liNodes[i].offsetTop > + document.documentElement.clientHeight - 100 + ? liNodes[liNodes.length - 1].offsetTop + : 0 + } + } + } + }, [items, navRef]) + + useOnScroll({ onScroll: findActiveIndex }) + + return ( + + ) +} + +function useOnScroll({ onScroll }: { onScroll: () => void }): void { + const debounceTimer: React.MutableRefObject< + ReturnType | undefined + > = React.useRef>() + React.useEffect(() => { + const handleScroll: () => void = () => { + if (debounceTimer.current) { + clearTimeout(debounceTimer.current) + debounceTimer.current = undefined + } + debounceTimer.current = setTimeout(() => { + debounceTimer.current = undefined + onScroll() + }, 1) + } + + onScroll() + window.addEventListener('scroll', handleScroll) + return () => { + clearTimeout(debounceTimer.current) + window.removeEventListener('scroll', handleScroll) + } + }, [onScroll]) +} + +export default TableOfContents diff --git a/src-ts/tools/dev-center/dev-center-lib/MarkdownDoc/index.ts b/src-ts/tools/dev-center/dev-center-lib/MarkdownDoc/index.ts new file mode 100644 index 000000000..393c1200f --- /dev/null +++ b/src-ts/tools/dev-center/dev-center-lib/MarkdownDoc/index.ts @@ -0,0 +1,5 @@ +export * from './LayoutDocHeader' +export * from './markdownRenderer' + +export * from './MarkdownDoc' +export { default } from './MarkdownDoc' diff --git a/src-ts/tools/dev-center/dev-center-lib/MarkdownDoc/markdownRenderer/index.ts b/src-ts/tools/dev-center/dev-center-lib/MarkdownDoc/markdownRenderer/index.ts new file mode 100644 index 000000000..e622bd7c1 --- /dev/null +++ b/src-ts/tools/dev-center/dev-center-lib/MarkdownDoc/markdownRenderer/index.ts @@ -0,0 +1,2 @@ +export * from './renderer' +export * from './util' diff --git a/src-ts/tools/dev-center/dev-center-lib/MarkdownDoc/markdownRenderer/renderer.tsx b/src-ts/tools/dev-center/dev-center-lib/MarkdownDoc/markdownRenderer/renderer.tsx new file mode 100644 index 000000000..a9b1c8b46 --- /dev/null +++ b/src-ts/tools/dev-center/dev-center-lib/MarkdownDoc/markdownRenderer/renderer.tsx @@ -0,0 +1,376 @@ +// tslint:disable-next-line: no-submodule-imports +import 'highlight.js/styles/base16/tomorrow-night.css' +import _ from 'lodash' +import { marked, Renderer as MarkedRenderer } from 'marked' +import * as React from 'react' + +import MarkdownAccordion from '../MarkdownAccordion' +import MarkdownCode from '../MarkdownCode' +import styles from '../MarkdownDoc.module.scss' +import MarkdownImages from '../MarkdownImages' +import MarkdownLink from '../MarkdownLink' + +export type MarkdownString = string +export type MarkdownResult = React.ReactNode +export type TOC = Array<{ headingId: string; level: number; title: string }> + +export enum MarkdownHeaderTag { + h1 = 'h1', + h2 = 'h2', + h3 = 'h3', + h4 = 'h4', + h5 = 'h5', + h6 = 'h6', +} + +enum MarkdownParagraphTag { + p = 'p', +} +export interface MarkdownRenderOptions { + baseUrl?: string + groupBy?: MarkdownHeaderTag + highlightCode?: (code: string, lang: string) => string + sanitize?: boolean + toc?: TOC + sanitizer?(html: string): string +} + +interface MarkdownRenderer { + render( + markdown: MarkdownString, + options?: MarkdownRenderOptions + ): React.ReactNode +} + +interface MarkdownTagClassName { + code: any + codespan: any + heading: any + list: any + paragraph: any +} + +export class Renderer implements MarkdownRenderer { + static getInstance(): Renderer { + if (!this.instance) { + this.instance = new Renderer() + } + return this.instance + } + + private renderer: MarkedRenderer + static instance: Renderer + + constructor() { + this.renderer = new marked.Renderer() + } + + render( + markdown: MarkdownString, + options?: MarkdownRenderOptions + ): React.ReactNode { + markdown = markdown || '' + if (markdown.length > 100_000) { + markdown = `${markdown.slice(0, 100_000)}…` + } + + const tokens: marked.TokensList = marked.lexer(markdown) + const nodes: Array = tokens.map((token, index) => + this.parseToken(token, index, options) + ) + const children: ReturnType = this.groupBy( + nodes, + options + ).map((node) => { + if (Array.isArray(node)) { + return ( + + {React.Children.map(node, (child) => child)} + + ) + } + return node + }) + + return ( +
+ {React.Children.map(children, (child) => child)} +
+ ) + } + + // Hard to avoid due to the complexity of group by + // tslint:disable-next-line: cyclomatic-complexity + private groupBy( + nodes: Array, + options?: MarkdownRenderOptions + ): Array> { + const result: Array = [] + let group: Array = [] + let beginGroup: boolean = false + let isAppending: boolean = false + let endGroup: boolean = false + + const isH1Tag: (tagName: keyof JSX.IntrinsicElements) => boolean = ( + tagName: keyof JSX.IntrinsicElements + ) => { + return tagName === MarkdownHeaderTag.h1 + } + const isGroupByTag: ( + tagName: keyof JSX.IntrinsicElements + ) => boolean = (tagName: keyof JSX.IntrinsicElements) => { + return !!tagName && options?.groupBy === tagName + } + + for (const nodeElem of nodes) { + if (!React.isValidElement(nodeElem)) { + continue + } + + const node: React.ReactElement = nodeElem as React.ReactElement + const nodeType: React.ReactElement['type'] = node.type + + if ( + typeof nodeType === 'string' && + isGroupByTag(nodeType as keyof JSX.IntrinsicElements) + ) { + beginGroup = true + isAppending = false + } + + if ( + typeof nodeType === 'string' && + isH1Tag(nodeType as keyof JSX.IntrinsicElements) + ) { + endGroup = true + } + + if (endGroup) { + beginGroup = false + isAppending = false + endGroup = false + } + + if (beginGroup) { + if (isAppending) { + group.push(node) + } else { + group = [] + group.push(node) + result.push(group) + } + isAppending = true + endGroup = false + } else { + result.push(node) + } + } + + return result + } + + // Hard to avoid due to the complexity of parsing markdown token. + // tslint:disable-next-line: cyclomatic-complexity + private parseToken( + token: marked.Token, + index: number, + options?: MarkdownRenderOptions + ): React.ReactNode { + const isLinkBlock: (t: marked.Token) => boolean = (t: marked.Token) => { + t = t as marked.Tokens.Paragraph + if ( + t.type === 'paragraph' && + t.tokens && + t.tokens.length === 1 && + t.tokens[0].type === 'link' + ) { + return true + } + return false + } + const isCodeBlock: (t: marked.Token) => boolean = (t: marked.Token) => { + t = t as marked.Tokens.Code + if (t.type === 'code') { + return true + } + return false + } + const isImagesBlock: (t: marked.Token) => boolean = ( + t: marked.Token + ) => { + const isLineBreak: (tt: marked.Token) => boolean = ( + tt: marked.Token + ) => tt.type === 'text' && tt.text === '\n' + t = t as marked.Tokens.Paragraph + if ( + t.type === 'paragraph' && + t.tokens && + t.tokens.length !== 0 && + t.tokens + .filter((child) => !isLineBreak(child)) + .every((child) => child.type === 'image') && + t.tokens.filter((child) => !isLineBreak(child)).length >= 1 + ) { + return true + } + return false + } + + const getClassname: (t: marked.Token) => string = (t: marked.Token) => { + const classnameMapping: MarkdownTagClassName = { + code: t.lang + ? `${styles['codeBlock']} ${styles[`language-${t.lang}`]}` + : styles['codeBlock'], + codespan: styles['codeInline'], + heading: styles[`heading${t.depth}`], + list: styles[`${t.ordered ? 'orderedList' : 'unorderedList'}`], + paragraph: styles['paragraph'], + } + + return _.get(classnameMapping, t.type, '') + } + const stripTag: (htmlString: string, tagname: string) => string = ( + htmlString: string, + tagname: string + ) => { + const tagRegExp: RegExp = new RegExp( + `<${tagname}\\b[^>]*>((.|\\n)*?)`, + 'g' + ) + return htmlString.replace(tagRegExp, '$1') + } + const extractId: (htmlString: string, tagname: string, leadingIndex: number) => string = ( + htmlString: string, + tagname: string, + leadingIndex: number + ) => { + htmlString = htmlString.trim() + const tagRegExp: RegExp = new RegExp( + `<${tagname}\\b[^>]*id="(.*?)"[^>]*>((.|\\n)*?)$`, + 'g' + ) + const matches: RegExpExecArray | null = tagRegExp.exec(htmlString) + const id: string = matches ? matches[1] : '' + return `${leadingIndex}-${id}` + } + const extractTag: (htmlString: string) => string = ( + htmlString: string + ) => { + htmlString = htmlString.trim() + const tagRegExp: RegExp = + /^<([a-zA-Z0-9]+)\b[^>]*?>(.|n)*?<\/\1>$/g + const matches: RegExpExecArray | null = tagRegExp.exec(htmlString) + return matches ? matches[1] : '' + } + const removeLineBreak: (htmlString: string) => string = ( + htmlString: string + ) => { + return htmlString.replace(/\n/g, '') + } + const parserOptions: marked.MarkedOptions = { + baseUrl: options?.baseUrl, + headerIds: true, + headerPrefix: '', + highlight: options?.highlightCode, + langPrefix: '', + renderer: this.renderer, + } + const createElement: ( + element: React.ElementType, + elementProps: any + ) => React.ReactElement = ( + element: React.ElementType, + elementProps: any + ) => { + return React.createElement(element, elementProps) + } + + if (options && options.toc && token.type === 'heading') { + const h: string = marked.parser([token], parserOptions) + const level: number = token.depth + const title: string = removeLineBreak(stripTag(h, `h${level}`)) + const headingId: string = extractId(h, `h${level}`, index).trim() + + options.toc.push({ + headingId, + level, + title, + }) + } + + let html: string = marked.parser([token], parserOptions) + + if (options && options.sanitize && options.sanitizer) { + html = options.sanitizer(html) + } + + if (isLinkBlock(token)) { + token = token as marked.Tokens.Paragraph + const link: marked.Tokens.Link = token.tokens.find( + (t) => t.type === 'link' + ) as marked.Tokens.Link + return ( + + {createElement('span', { + dangerouslySetInnerHTML: { __html: html }, + })} + + ) + } else if (isCodeBlock(token)) { + token = token as marked.Tokens.Code + return ( + + {createElement('div', { + dangerouslySetInnerHTML: { __html: html }, + })} + + ) + } else if (isImagesBlock(token)) { + token = token as marked.Tokens.Paragraph + const length: number = token.tokens.filter( + (t) => t.type === 'image' + ).length + const images: Array = token.tokens + .filter((t) => t.type === 'image') + .map((t, idx) => { + return ( + + ) + }) + return {images} + } + + if (!html) { + return undefined + } + + const tag: string = extractTag(html) + if (tag) { + const isParagraphTag: boolean = tag === MarkdownParagraphTag.p + const isHeaderTag: boolean = Object.values(MarkdownHeaderTag).indexOf(tag as MarkdownHeaderTag) !== -1 + if (isParagraphTag || isHeaderTag) { + let id: string | undefined + if (isHeaderTag) { + token = token as marked.Tokens.Heading + id = extractId(html, `h${token.depth}`, index).trim() + } + return React.createElement(tag, { + className: getClassname(token), + dangerouslySetInnerHTML: { __html: stripTag(html, tag) }, + id, + }) + } + } + + return ( + + ) + } +} diff --git a/src-ts/tools/dev-center/dev-center-lib/MarkdownDoc/markdownRenderer/util.ts b/src-ts/tools/dev-center/dev-center-lib/MarkdownDoc/markdownRenderer/util.ts new file mode 100644 index 000000000..ff307e998 --- /dev/null +++ b/src-ts/tools/dev-center/dev-center-lib/MarkdownDoc/markdownRenderer/util.ts @@ -0,0 +1,51 @@ +import DOMPurify from 'dompurify' +import hljs from 'highlight.js' + +import { MarkdownHeaderTag, MarkdownRenderOptions, MarkdownString, Renderer, TOC } from './renderer' + +export function renderMarkdown( + markdown: MarkdownString, + options?: MarkdownRenderOptions +): { doc: React.ReactNode; title: string; toc: TOC } { + const renderer: Renderer = Renderer.getInstance() + const defaultOptions: MarkdownRenderOptions = { + baseUrl: '/', + groupBy: MarkdownHeaderTag.h3, + highlightCode(code: string, lang: string): string { + const language: string = hljs.getLanguage(lang) ? lang : '' + return language ? hljs.highlight(code, { language }).value : code + }, + sanitize: true, + sanitizer(html: string): string { + return DOMPurify.sanitize(html) + }, + toc: [], + } + const getTitle: (fromStr: MarkdownString) => { + s: MarkdownString; + title: string; + } = (fromStr: MarkdownString) => { + const titleRegExp: RegExp = /#[^#].*[\r\n]/ + const matches: RegExpMatchArray | null = fromStr.match(titleRegExp) + const matchStr: string = matches ? matches[0] : '' + return matchStr + ? { + s: fromStr.replace(matchStr, '').trimStart(), + title: matchStr.replace(/^#/, '').replace(/`/g, '').trim(), + } + : { title, s } + } + + const { title, s }: ReturnType = getTitle(markdown) + markdown = title ? s : markdown + + const opts: MarkdownRenderOptions = { ...defaultOptions, ...options } + const result: ReturnType = renderer.render( + markdown, + opts + ) + const { toc }: { toc: NonNullable } = + opts as { toc: NonNullable } + + return { doc: result, toc, title } +} diff --git a/src-ts/tools/dev-center/dev-center-lib/functions/copy-to-clipboard.ts b/src-ts/tools/dev-center/dev-center-lib/functions/copy-to-clipboard.ts new file mode 100644 index 000000000..2d58cf054 --- /dev/null +++ b/src-ts/tools/dev-center/dev-center-lib/functions/copy-to-clipboard.ts @@ -0,0 +1,26 @@ +export default async function copy(text: string): Promise { + try { + return await navigator.clipboard.writeText(text) + } catch (error) {} + + const activeElement: typeof document.activeElement = document.activeElement + const textArea: HTMLTextAreaElement = document.createElement('textarea') + + document.body.appendChild(textArea) + + textArea.style.height = '1px' + textArea.style.width = '1px' + textArea.style.position = 'absolute' + + textArea.value = text + textArea.focus() + textArea.select() + + document.execCommand('copy') + + if (activeElement instanceof HTMLElement) { + activeElement.focus() + } + + document.body.removeChild(textArea) +} diff --git a/src-ts/tools/dev-center/dev-center-lib/hooks/useMarkdown.ts b/src-ts/tools/dev-center/dev-center-lib/hooks/useMarkdown.ts new file mode 100644 index 000000000..6118c5744 --- /dev/null +++ b/src-ts/tools/dev-center/dev-center-lib/hooks/useMarkdown.ts @@ -0,0 +1,59 @@ +import * as React from 'react' + +import { + MarkdownResult, + MarkdownString, + renderMarkdown, + TOC +} from '../MarkdownDoc/markdownRenderer' + +export interface UseMarkdownProps { + uri: string +} + +export default function useMarkdown({ uri }: UseMarkdownProps): { + doc: MarkdownResult; + title: string; + toc: TOC; +} { + const [markdown, setMarkdown]: [ + MarkdownString, + React.Dispatch> + ] = React.useState('') + const [doc, setDoc]: [ + MarkdownResult, + React.Dispatch> + ] = React.useState() + const [toc, setToc]: [TOC, React.Dispatch>] = + React.useState([]) + const [title, setTitle]: [ + string, + React.Dispatch> + ] = React.useState('') + + React.useEffect(() => { + setMarkdown('') + setDoc(undefined) + setToc([]) + setTitle('') + + fetch(uri) + .then((response) => response.text()) + .then((text) => { + setMarkdown(text) + }) + .catch(() => {}) + }, [uri]) + + React.useEffect(() => { + if (markdown) { + const result: ReturnType = + renderMarkdown(markdown) + setDoc(result.doc) + setToc(result.toc) + setTitle(result.title) + } + }, [markdown]) + + return { doc, title, toc } +} diff --git a/src-ts/tools/dev-center/dev-center-pages/community-app/getting-started/GettingStartedGuide.md b/src-ts/tools/dev-center/dev-center-pages/community-app/getting-started/GettingStartedGuide.md new file mode 100644 index 000000000..8d0b61dbd --- /dev/null +++ b/src-ts/tools/dev-center/dev-center-pages/community-app/getting-started/GettingStartedGuide.md @@ -0,0 +1,1439 @@ +# Community app + +The community app is the web application that is a main part of the Topcoder website, including things like profile and challenge listings. +This document covers the Windows 10, Linux and MacOS setup of the development environment in detail. + +## Build the community app on Windows 10 + +### Install Visual Studio Community 2013 + +[https://my.visualstudio.com/Downloads?q=visual%20studio%202013](https://my.visualstudio.com/Downloads?q=visual%20studio%202013) + +or a premium version: + +[https://visualstudio.microsoft.com/vs/older-downloads](https://visualstudio.microsoft.com/vs/older-downloads) + +by clicking Donwload button for "Visual Studio 2013 and Other Products" + +When installing + +* You can uncheck the "Join the Visual Studio Experience Improvement Program" +* You only need to check "Microsoft Foundation Classes for C++" on the optional features selection screen + +![](./images/VSCommunity0.png) + +### Install VS Code + +[https://code.visualstudio.com](https://code.visualstudio.com) + +You can use the default options when installing VS Code. + + +### Install Git + +[https://git-scm.com/download/win](https://git-scm.com/download/win) + +When installing: + +* Check checkbox for "Add a Git Bash Profile to Windows Terminal" (step 3) +* Use VS Code as Git's default editor (step 5) +* Checkout as-is commit as-is (step 10) +* Enable both experimental options (step 15) + +![](./images/Git1.png) + +### Install Python 2.7.18 + +[https://www.python.org/downloads/release/python-2718/](https://www.python.org/downloads/release/python-2718/) + +You can install with the default options (shown below) + +![](./images/Python1.png) + + +### Install NVM + +After Git has been installed, run the "Git Bash" program from your start menu. + +This will load the Git Bash command line, which is what we will use for all command line work going forward. + +You will install NVM (https://github.com/nvm-sh/nvm) using this command. You can copy / paste this onto the Git Bash command line and hit "Enter" to run it: + +```sh +curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash +``` + +### Edit the aliases file + +The Git Bash program uses an "aliases" file for some initialisation of the shell. We need to make changes to it so that: + +* Python can be executed +* NVM works as expected + +Open `C:\Program Files\Git\etc\profile.d\aliases.sh` in an explorer. + +We will add these 3 lines underneath the `alias ll='ls -l'` line: + +```sh +alias python='winpty C:\\Python27\\python.exe' + +export NVM_DIR="$HOME/.nvm" +[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" +``` + +You will need to grant VS Code admin privileges to save the file once the edits are done. + +The file should look like this: + +```sh +# some good standards, which are not used if the user +# creates his/her own .bashrc/ .bash_profile + +# --show-control-chars: help showing Korean or accented characters +alias ls='ls -F --color=auto --show-control-chars' +alias ll='ls -l' +alias python='winpty C:\\Python27\\python.exe' + +export NVM_DIR="$HOME/.nvm" +[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm + +case "$TERM" in +xterm*) + # The following programs are known to require a Win32 Console + # for interactive usage, therefore let’s launch them through + # when run inside `mintty` + for name in node ipython php php5 psql python2.7 + do + case "$(type -p "$name" .exe 2>/dev/null)" in + ''|/usr/bin/*) continue;; + esac + alias $name="winpty $name.exe” + done + ;; +esac +``` + +#### Aliases Validation + +To validate the aliases changes, you will restart Git Bash, which will cause it to read in the new changes. You should be able to execute these commands without error: + +```terminal +python --version +``` + + +```terminal +nvm --version +``` + +The output should look like this: + +```terminal +copilot@DESKTOP-CEFAE6N MINGW64 ~ +$ python --version +Python 2.7.18 + +copilot@DESKTOP-CEFAE6N MINGW64 ~ +$ nvm --version +0.39.1 + +copilot@DESKTOP-CEFAE6N MINGW64 ~ +$ +``` + +### Hosts file update + +Open the file `C:\Windows\System32\drivers\etc\hosts` in VS Code. We will add these two lines to the end of the file: + +```sh +127.0.0.1 local.topcoder-dev.com +127.0.0.1 local.topcoder.com +``` + +You will need to save the file using admin privileges. The final file should look like this: + +```sh +# Copyright (c) 1993-2000 Microsoft Corp. +# +# This is a sample HOSTS file used by Microsoft TCP/IP for Windows +# +# This file contains the mappings of iP addresses to host names. +# entry should be kept on an individual line. The IP address should +# be placed in the first column followed by the corresponding hosts +# The IP address and the host name should be separated by at least +# space. +# +# Additionaly, comments (such as these) may be inserted on individual +# lines or following the machine name denoted by a '#' symbol. +# +# For example: +# +# 102.54.94.97 rhino.acme.com # source server +# 38.25.63.10 x.acme.com # x client host + +# localhost name resolution is handled within DNS itself. +# 127.0.0.1 localhost +# ::1 localhost +127.0.0.1 local.topcoder-dev.com +127.0.0.1 local.topcoder.com +``` + +### Install the proxy and run it + +We need to proxy `https` requests through a local proxy since we don't have a valid SSL key. To do this, we use the `local-ssl-proxy` package. You can install this in the Git Bash application using this command. + +* `npm i -g local-ssl-proxy` You only have to run this once to install the package +* `local-ssl-proxy -n local.topcoder-dev.com -s 443 -t 3000` Every time you want to run the proxy or work on the community app, you will need to run. You will need to grant the proxy admin access. + +**NOTE** - You should run the proxy in a *separate* Git Bash window, to ensure it's always running. + +```terminal +copilot@DESKTOP-CEFAE6N MINGW64 +$ pm i -g local-ss1-proxy +npm WARN deprecated nomnom@1.8.1: Package no longer supported. contact support@npmjs.com for more info. +npm WARN notice [SECURITY] underscore has the following vulnerability: 1 high. Go here for more details: https://github.com/advisories?query=underscore - Run `npm i npm@latest -g` to upgrade your pm version, and then `npm audit` to get more info. +c:\users\copilot\.num\versions\node\v8.11.2\bin\local-ss1-proxy +-> +C:\Users\copilot\.nvm\versions\node\v8.11.2\bin\node_modules\local-ssl-proxy\bin\local-ssl-proxy + local-ss1-proxv@1.3.0 +added 18 packages in 3.321s + +copilot@DESKTOP-CEFAE6N MINGW64 ~ +$ local-ss1-proxy -n local.topcoder-dev.com -s 443 -t 3000 +Started proxy: https://local.topcoder-dev.com: 443 -> http://local.topcoder-dev.com:3000 +``` + +### Check out the code + +Now that all dependencies are set up, we can check out the code. Note that this command will check out the community-app source code into a directory named `community-app`. + +Run this command on the Git Bash command line: + +```terminal +git clone https://github.com/topcoder-platform/community-app.git +``` + +```terminal +copilot@DESKTOP-CEFAE6N MINGW64 +$ git clone https://github.com/topcoder-platform/community-app.git +Cloning into 'community-app'... +remote: Enumerating objects: 88177, done. +remote: Counting objects: 100% (981/981),done. +remote: Compressing objects: 100% (445/445), done. +remote: Total 88177 (delta 535), reused 905 (delta 485), pack-reused 87196 +Receiving objects: 100% (88177/88177), 135.06 MiB | 8.73 MiB/s, done. +Resolving deltas: 100% (58839/58839). done. +hint: core.useBuiltinFSMonitor=true is deprecated;please set core.fsmonitor=true instead +hint: Disable this message with "git config advice.useCoreFSMonitorConfig flase" +warning: the following paths have collided (e.g. case-sensitive paths on a case-insensitive filesystem) and only one from the same colliding group is in the working three: + + 'docs/contentful/Animations.md' + 'docs/contentful/animations.md' + 'docs/contentful/Viewport.md' + 'docs/contentful/viewport.md' + +copilot@DESKTOP-CEFAE6N MINGW64 ~ +$ +``` + +### Build the code + +Now that we have the code, we can build it on the Git Bash command line. The first `cd community-app` command just changes us to the directory we created above, after the code was cloned. + +* `cd community-app` +* `nvm use` will warn you to install v8.11.2 +* `nvm install v8.11.2` + +```terminal +copilot@DESKTOP-CEFAE6N MINGW64 +$ nvm use +Found '/c/Users/copilot/community-app/.nvmrc' with version +N/A: version "V8.11.2 -> N/A" is not yet installed. + +You need to run "nvm install v8.11.2" to install it before using it. + +copilot@DESKTOP-CEFAE6N MINGW64 ~/community-app (develop) +$ nvm install v8.11.2 +Downloading and installing node v8.11.2... +Downloading https://nodejs.org/dist/v8.11.2/node-v8.11.2-win-x64.zip... +######################################################################### 100.0% +Computing checksum with sha256sum +Checksums matched!Now using node v8.11.2 (npm v5.6.0) +Creating default alias: default -> v8.11.2 + +copilot@DESKTOP-CEFAE6N MINGW64 ~/community-app (develop) +$ node --version +v8.11.2 +``` + + +Once we have the proper Node version installed (8.11.2), we will install the dependencies: + +**NOTE** this is a command that will take a long time and will build numerous dependencies. This is the command that is most likely to fail. If you have trouble here, make sure to copy / paste the entire output of the command into the forum so the copilot can help. + +```terminal +npm i +``` + +```terminal +> sharp@o.20.8 install c:\users\copilot\community-app\node_modules\sharp +(node install/libvips && node install/d11-copy && prebuild-install)I1 (node-gyp rebuild && node install/d11-copy) + +info sharp Downloading https://github.com/lovell/sharp-libvips/releases/download/v8.6.1/libvips-8.6.1-win32-x64.tar.gz +info sharp creating c:\users\copilot\community-app\node_modules\sharp\build\Release +info sharp Copying DLLs from C:\Users\copilot\community-app\node_modules \sharp\vendor\lib to c:\users\copilot\community-app\node_modules\sharp\build\Release + +> core-js@2. 6.11 postinstall c:\Users\copilot\community-app\node _modules\core-js +> node -e "try{require('./postinstall'>}catch(e)(]" + +Thank you for using core-js (https://github.com/zloirock/core-js) for polyfilling Javascript standard library! + +The project needs your help! Please consider supporting of core-js on Open collective or Patreon: +> https://opencollective.com/core-js +> https://www.patreon.com/zloirock + +Also, the author of core-js (https://github.com/zloirock) is looking for a good job -) + +note-1: Pursfiedufreet;pasalhsalyssFea/ka)community-app/lnode_modules.lcore-js-pure +> core-js@2.6.11 postinstall c:\users\copilot\community-app\node_modules \tc-ui \node_modules\attr-accept \node_modules \core-js +> node -e "try{require('./postinstall ')}catch(e) {} + +> husky@4. 2.5 postinstall c:\Users\copilot\community-app\node_modules \husky +> opencollective-postinstall I| exit 0 + +Thank you for using husky! +If you rely on this package, please consider supporting our open collective: +> https://opencollective.com/husky/donate + +> node-sass4.14.1 postinstall c:\users\copilot\community-app\node_modules\node-sass +> node scripts/build.js + +Binary found at C:\Users\copilot\community-app\node_modules\node-sass\vendor\win32-x64-57\binding.node +Testing binary +Binary is fine +(node: 3828) MaxListenersExceededwarning: Possible EventEmitter memory leak detected. 11 SIGINT listeners added. Use emitter.setMaxListeners () to increase limit + +> community-app@1.0.0 postinstall c:\Users\copilot\community-app +> rimraf node _modules/navigation-component/node_modules/topcoder-react-utils && rimraf node_modules/topcoder-react-ui-kit/node_modules/topcoder-react-utils + +npm WARN optional SKIPTING OPTZONAL DEPENDENCY: Fsevents@2. 1. 3 (node, nodules watchpack\node modules\fsevent:) +npm WARN notsup SKIPPING.OPTIONAL DEPENDENCY: Unsupported platform for fsevents@2.1.3: wanted {"os":"darwin", "arch", "any"} (current: {"os":"win32":"arch":"x64"}) +npm WARN optional SKIPTING OPTZONAL DEPENDENCY: Fsevents@2. 1. 3 (node, nodules\fsevent:) +npm WARN notup SKIPPING.OPTIONAL DEPENDENCY: Unsupported platform for fsevents@2.1.3: wanted {"os":"darwin", "arch", "any"} (current: {"os":"win32":"arch":"x64"}) + +added 2976 packages in 488.193s + +copilot@DESKTOP-CEFAE6N MINGW64 ~/community-app (develop) +$ +``` + +With the dependencies now successfully installed, we can build the code. You can do this whenever you want to rebuild the app as you make changes to it. + +* `npm run clean` - This command cleans up any previous builds +* `source env.sh` - This command sets the environmental variables - **IMPORTANT**: before executing this command, ask admin for the env.sh file, then paste it into root folder of community-app +* `./node_modules/.bin/webpack --env=development --progress --profile --colors` - This command builds the app +* `npm run` - This command will start the web server + +```terminal +copilot@DESKTOP-CEFAE6N MINGW64 ~ +$ cd community-app + +copilot@DESKTOP-CEFAE6N MINGW64 ~/community-app (develop) +$ npm run clean +> community-app@1.0.0 clean C:\Users\copilot\community-app +> rimraf build + +copilot@DESKTOP-CEFAE6N MINGW64 ~/community-app (develop) +$ export NODE_CONFIG_ENV=development + +copilot@DESKTOP-CEFAE6N MINGW64 ~/community-app (develop) +$ ./node_modules/.bin/webpack--env=development --progress--profile --colors 36% building 221/255 modules 34 active ...app\node_modules\object-assign\index.js +``` + + +### Validation + +To validate, we'll run Chrome without web security to avoid it complaining about the local proxy redirects. + +Open Chrome and paste the linkf from below, or open a new Git Bash prompt and run: + +* `"C:\Program Files\Google\Chrome\Application\chrome.exe" --disable-web-security --disable-gpu --disable-features=IsolateOrigins,site-per-process --user-data-dir="C://ChromeDev"` + +Paste this link: + +[https://accounts-auth0.topcoder-dev.com/?retUrl=https://local.topcoder-dev.com](https://accounts-auth0.topcoder-dev.com/?retUrl=https://local.topcoder-dev.com) + +Once Chrome is running, you should be able to open this link and login with a test user. + +* Sample test user: `jgasperMobile12` / `Appirio123` + + + +![](./images/InitialLoginInChrome.png) + + +You will need to tell Chrome to ignore the self-signed certificate warning by clicking the "Proceed to local.topcoder-dev.com" link + +![](./images/PrivateConnectionWarning.png) + +After successful login, you should see: + +**Chrome browser** + +![](./images/SuccessfulLogin.png) + +**Git bash prompt running the server** + +```terminal + in App + in Router + in StaticRouter + in Provider +Warning: componentwillmount has been renamed, and is not recommended for use. See https://fb/me/react-unsafe-component-lifecycles for details. + +* Move code from componentwillMount to componentDidMount (preferred in most cases) or the constructor +please update the following components: Switch + in Switch + in div + in Routes + in Connect (Routes) + in Route + in withouter (connect (Routes)) + in div + in App + in Router + in StaticRouter + in Provider + +::ffff:127.0.0.1 > 200 GET / 4023.838 ms - https://local.topcoder-dev.com/Mozilla/5.0 (windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) chrome/102/0/0/0 Safari/537.36 + +::ffff:127.0.0.1 > 200 GET /api/cdn/public/static-assets/main-1655784239000.Css6.177 ms- https://local.topcoder-dev.com/Mozilla/5.0 (windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) chrome/102/0/0/0 Safari/537.36 + +::ffff:127.0.0.1 > 200 GET /api/cdn/public/static-assets/main-1655784239000.Css6.177 ms- https://local.topcoder-dev.com/Mozilla/5.0 (windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) chrome/102/0/0/0 Safari/537.36 + +::ffff:127.0.0.1 > 200 GET /api/cdn/public/static-assets/main-1655784239000.Css6.177 ms- https://local.topcoder-dev.com/Mozilla/5.0 (windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) chrome/102/0/0/0 Safari/537.36 + +::ffff:127.0.0.1 > 200 GET /api/cdn/public/static-assets/main-1655784239000.Css6.177 ms- https://local.topcoder-dev.com/Mozilla/5.0 (windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) chrome/102/0/0/0 Safari/537.36 + +::ffff:127.0.0.1 > 200 GET /api/cdn/public/static-assets/main-1655784239000.Css6.177 ms- https://local.topcoder-dev.com/Mozilla/5.0 (windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) chrome/102/0/0/0 Safari/537.36 + +::ffff:127.0.0.1 > 200 GET /api/cdn/public/static-assets/main-1655784239000.Css6.177 ms- https://local.topcoder-dev.com/Mozilla/5.0 (windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) chrome/102/0/0/0 Safari/537.36 +::ffff:127.0.0.1 > 200 GET /api +/cdn/public/static-assets/main-1655784239000.Css6.177 ms- https://local.topcoder-dev.com/Mozilla/5.0 (windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) chrome/102/0/0/0 Safari/537.36 + +::ffff: 127.0.0.1 > Authenticated as: ("https://topcoder-dev.com/roles": ["Topcoder User"], . "https: //topc oder-dev.com/userId": "88778088". ."https://topcoder-dev.com/handle" "copilot" ev.com/user_id": "autho|88778088" "https://topcoder-dev.com/tcsso" "https://topcoder "88778088) 83dddf57fe737e45425da484c€6 d26e262b44810ba944668c61f8f42f47e94" lockIP ': false, "nickname' "copilot "https://topcoder-dev.com/active".true,"https://topcoder-dev.com/l "name" "copilot@topcoder.com "picture" "https://s.g avatar.com/avatar/5dzf2479df25f71bb56e3cbc160714c6?5=480&r=pg&d=https%3A%2F%2Fcdn.autho. com%2Favatars Egm.pna,iss" "updated_at' ''2022-06-21T04:08:23.9202" +"email" "copilot@topcoder.com' "sub" "autho|88778088" "aud": "email verified +::ffff:127.0.0.1 > 200 GET / 4023.838 ms - https://local.topcoder-dev.com/Mozilla/5.0 (windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) chrome/102/0/0/0 Safari/537.36 + +::ffff:127.0.0.1 > Reauth scheduled in 86367.528 seconds +::ffff:127.0.0.1 > 200 POST /community-app-assets/api/logger 0.854 ms - https://local.topcoder-dev.com/Mozilla/5.0 (windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) chrome/102/0/0/0 Safari/537.36 +``` + +You can also access a link on the community app page, like the one for the challenge listings: + +![](./images/ChallengeListing.png) + +## Build the community app on Linux + +This documentation covers Ubuntu 22, as that is a fairly common Linux distribution. The steps should be easy enough to follow for any Debian based distro, but you may need to make changes for certain things. Other distros can follow the flow, but the individual commands and steps may differ, especially for installing the prerequisites. + +### Install VS Code + +VS Code can be installed directly from the `Ubuntu Software` application that's in the Ubuntu favourites by default. + +![](./images/VSCode1.png) + +### Open the terminal + +To open the terminal, click "Activities" and search for "Terminal". It would probably be a good idea to add the Terminal app to your favourites as it will be used extensively in these instructions. + +### Install curl and wget + +Curl is a basic network utility used when install prerequisites. + +* Open the Terminal app +* Run `sudo apt install curl` + +```terminal +copilot@topcoder-desktop:$ sudo apt install curl +[sudo] password for copilot: +Reading package lists... Done +Building dependency tree... Done +Reading state information... Done +The following additional packages will be installed: + libcur14 +The following NEW packages will be installed: + curl +The following packages will be upgraded: + libcurl4 +1 to upgrade, 1 to newly install, 0 to remove and 153 not to upgrade +Need to get 194 kB/484 kB of archives +After this operation, 454 kB of additional disk space will be used. +Do you want to continue? [Y/n] Y +Get:1 http://au.archive.ubuntu.com/ubuntu jammy-updates/main amd64 curl amd64 7.81.0-1ubuntu1.2 [194 kB] +Fetched 194 kB in 1s (372 kB/s) +(Reading database ... 160751 files and directories currently installed.) +Preparing to unpack .../libcur14 7.81.0-1ubuntu1.2_amd64.deb ... +Unpacking libcurl4: amd64 (7.81.0-1ubuntu1.2) over (7.81.0-1) ... +Selecting previously unselected package curl. +Preparing to unpack .../curl_7.81.0-1ubuntu1.2_amd64. deb ... +Unpacking curl (7.81.0-1ubuntu1.2) ... +Setting up libcurl4:amd64 (7.81.0-1ubuntu1.2) ... +Setting up curl (7.81.0-1ubuntu1.2) ... +Processing triggers for man-db(2.10.2-1) ... +Processing triggers for libc-bin(2.35-Oubuntu3) ... +``` + +wget is used to download files from the internet. It may already be installed, but it doesn't hurt to make sure. + +* Open the Terminal app +* Run `sudo apt install wget` + +```terminal +copilot@topcoder-desktop:$ sudo apt install wget +[sudo] password for copilot: +Reading package lists... Done +Building dependency tree... Done +Reading state information... Done +wet is already the newest version (1.21.2-2ubuntul). +wet set to manually installed. +0 to upgrade, 0 to newly install, 0 to remove and 153 not to upgrade. +``` + +### Install build tools + +Standard build tools are necessary when building the community app dependencies. We can just install the `build-essential` package in Ubuntu: + +* Open the Terminal app +* Run `sudo apt install build-essential` + +```terminal +Setting up libctf-nobfdo:amd64(2.38-3ubuntu1) ... +Setting up libfakeroot:amd64(1.28-1ubuntu1) ... +Setting up libasan6: amd64 (11.2.0-19ubuntu1) ... +Setting up fakeroot (1.28-1ubuntu1) ... +update-alternatives: using /usr/bin/fakeroot-sysv to provide /usr/bin/fakeroot (fakeroot) in auto mode ... +Setting up libtirpc-dev:amd64(1.3.2-2build1) ... +Setting up rpcsvc-proto(1.4.2-Oubuntu6) ... +Setting up make (4.3-4.1build1) ... +Setting up libquadmatho:amd64(12-20220319-1ubuntu1) ... +Setting up libatomic1:amd64 (12-20220319-1ubuntu1) ... +Setting up libdpkg-perl(1.21.1ubuntu2.1) ... +Setting up libubsan1:amd64 (12-20220319-1ubuntu1) ... +Setting up libnsl-dev:amd64(1.3.0-2build2) ... +Setting up libcrypt-dev:amd64(1:4.4.27-1) ... +Setting up libbinutils:amd64(2.38-3ubuntu1) ... +Setting up libc-dev-bin(2.35-Oubuntu3) ... +Setting up libalgorithm-diff-xs-perl(0.04-6build3) ... +setting up libesan0:am64 (12-20220319-1ubuntu1) ... +Setting up libitm1:am64 (12-20220319-1ubuntu1) ... +Setting up libc-devtools (2.35-0ubuntu3) ... +Setting up libalgorithm-merge-perl(0.08-3) ... +Setting up libtsan0:amd64 (11.2.0-19ubuntu1) ... +Setting up libctf0:amd64 (2.38-3ubuntu1) ... +Setting up libgcc-11-dev:am64 (11.2.0-19ubuntu1) ... +Setting up libc6-dev:am64 (2.35-@ubuntu3) ... +Setting up binutils-x86-64-linux-gnu (2.38-3ubuntu1) ... +Setting up binutils (2.38-3ubuntu1) ... +Setting up dpkg-dev(1.21.1ubuntu2.1) ... +Setting up libstdc++-11-dev:amd64 (11.2.0-19ubuntu1) ... +Setting up gcc-11 (11.2.0-19ubuntu1) ... +Setting Up g++-11 (11.2.0-19ubuntu1) ... +Setting up gcc (4:11.2.0-1ubuntu1) ... +Setting up g++ (4:11.2.0-1ubuntu1) ... +update-alternatives: using /usr/bin/g++ to provide /usr/bin/c++ (C++) in auto mode ... +Setting up build-essential (12.9ubuntu3) ... +Processing triggers for man-db(2.10.2-1) ... +Processing triggers for libc-bin(2.35-0ubuntu3) ... +``` + +### Install Chrome + +Chrome is a good default browser to use when developing the community app. To install it, we will run the following commands from the Terminal app: + +* `wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb` This downloads Chrome +* `sudo dpkg -i google-chrome-stable_current_amd64.deb` This installs Chrome + + +```terminal +copilot@topcoder-desktop:$ wgethttps://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb +--2022-06-23 14:34:46-- https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb +Resolving dl.google.com (dl.google.com)... 142.250.70.238, 2404:6800:4015:803::200e +Connecting to dl.google.com (dl.google.com)|142.250.70.238|:443... connected. +HTTP request sent, awaiting response... 200 OK +Length: 85757216 (82M) [application/x-debian-package] +saving to: 'google-chrome-stable_current_amd64.deb' + +google-chrome-stable_cu100%[==============================>] 81.78M 13.0MB/s in 6.35 + +2022-06-23 14:34:54 (13.0 MB/s) - 'google-chrome-stable_current_and64.deb' saved [85757216/85757216] + +copilot@topcoder-desktop:$ sudo dpkg -i google-chrome-stable_current_amd64.deb +[sudo] password for copilot: +Selecting previously unselected package google-chrome-stable. +(Reading database ... 160758 files and directories currently installed.) +Preparing to unpack google-chrome-stable current_amd64.deb ... +Unpacking google-chrome-stable (103.0.5060.53-1) ... +Setting up google-chrome-stable (103.0.5060.53-1) ... +update-alternatives: ustng /usr/btn/google-chrome-stable to provide /usr/bin/x-www-browser (x-www-browser) in auto mode +update-alternatives: using /usr/bin/google-chrome-stable to provide /usr/bin/gnome-www-browser (gnome-www-browser) in auto mode +update-alternatives: ustng /usr/btn/google-chrome-stable to provide /usr/bin/google-chrome (google-chrome) in auto mode +Processing triggers for mailcap(3.70+nmulubuntu1) ... +Processing triggers for gnome-menus(3.36.0-1ubuntu3) ... +Processing triggers for desktop-ftle-utils(0.26-1ubuntu3) ... +Processing triggers for man-db (2.10.2-1) ... + +``` + +### Install Git + +Git can be installed directly from the terminal. + +* Open the Terminal app +* Run `sudo apt install git` + +```terminal +copilot@topcoder-desktop:$ sudo apt install git +[sudo] password for copilot: +Reading package lists... Done +Building dependency tree... Done +Reading state information... Done +The following additional packages will be installed: + git-man liberror-perl +Suggested packages: + git-daemon-run | git-daemon-sysvinit git-doc git-email git-gut gitk gitweb + git-cvs git-mediawiki git-svn +The following NEW packages will be installed: + git git-man liberror-perl +0 to upgrade, 3 to newly install, 0 to remove and 154 not to upgrade +Need to get 4,108 kB of archives. +After this operation, 20.9 MB of additional disk space will be used. +Do you want to continue? [Y/n] Y +Get:1 http://au.archive.ubuntu.com/ubuntu jammy/main amd64 liberror-perl all 0.17029-1 [26.5 kB] +Get:2 http://au.archive.ubuntu.com/ubuntu jammy-updates/main amd64 git-man all 1:2.34.1-1ubuntu1.2 [952 kB] +Get:3 http://au.archive.ubuntu.com/ubuntu jammy-updates/main amd64 git amd64 1:2.34.1-1ubuntu1.2 [3,130 kB] +Fetched 4,108 kB in 2s (1,785 kB/s) +Selecting previously unselected package liberror-perl. +(Reading database ... 159766 ftles and directories currently installed.) +Preparing to unpack .../liberror-perl_0.17029-1_all.deb ... +Unpacking liberror-perl (0.17029-1) ... +Selecting previously unselected package git-man. +Preparing to unpack .../git-man 1%3a2.34.1-1ubuntu1.2 all.deb ... +Progress: [23%] [#############.....................................] +Selecting previously unselected package git.........................] ] +Preparing to unpack .../git_1%3a2.34.1-1ubuntu1.2_amd64.deb ........] +Unpacking git (1:2.34.1-1ubuntu1.2) ... +Setting up liberror-perl (0.17029-1) ...............................] +Setting up git-man(1:2.34.1-1ubuntu1.2) ............................] +Setting up git (1:2.34.1-1ubuntu1.2) ...............................] +Processing triggers for man-db(2.10.2-1) ...........................] + +``` + +### Install nvm + +The Node Version Manager [https://github.com/nvm-sh/nvm](https://github.com/nvm-sh/nvm) is used to make sure our version of Node and npm match the deployment environment. + +To install nsm run this command: + +* Open the Terminal app +* `curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash` + +```terminal +copilot@topcoder-desktop:$ curl-o-https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash +% Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed +100 15037 100 15037 0 0 27922 0 --:--:-- --:--:-- --:--:-- 27922 + +=> Downloading nvm from git to '/home/copilot/.nvm' +=> Cloning into '/home/copilot/.nvm'... +remote: Enumerating objects: 355, done. +remote: Counting objects: 100% (355/355), done. +remote: Compressing objects: 100% (302/302), done. +remote: Total 355 (delta 39), reused 170 (delta 28), pack-reused 0 +Receiving objects: 100% (355/355), 228.98 KiB | 1.55 MB/s, done. +Resolving deltas: 100% (39/39), done. +* (HEAD detached at FETCH HEAD) + master +=> Compressing and cleaning up git repository + +=> Appending nvm source string to /home/copilot/.bashrc +=> Appending bash completion source string to /home/copilot/.bashrc +=> Close and reopen your terminal to start using nvm or run the following to use it now: + +export NVM _DIR= "SHOME/.nvm" +[ -s "SNVM DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm +[ -s "SNVM DIR/bash_completion" ] && \. "$NVM DIR/bash_completion" # This loads nvm bash_completion + +``` + +Note that after you have installed nvm you will need to restart your terminal app to ensure the new settings are loaded in. + +You can test nvm by running: + +* `nvm --version` in the terminal + +```terminal +copilot@topcoder-desktop:$ nvm --version +0.39.1 +``` + +### Install python 2.7.18 + +To install python 2.7.18, we first have to add the correct repository to pull it from for Ubuntu. + +We will run these commands in the Terminal app: + +* `sudo apt-add-repository universe` +* `sudo apt update` + +```terminal +copilot@topcoder-desktop:$ sudo apt-add-repository universe +[sudo] password for copilot: +Adding component(s) 'universe' to all repositories. +Press [ENTER] to continue or Ctrl-c to cancel. +Hit:1 http://au.archive.ubuntu.com/ubuntu jammy InRelease +Hit:2 http://au.archive.ubuntu.com/ubuntu jammy-updates InRelease +Hit:3 http://au.archive.ubuntu.com/ubuntu jammy-backportsInRelease +Get:4 https: //dl.google.com/linux/chrome/deb stable InRelease [1,811 B] +Get:5 http://security.ubuntu.com/ubuntu jammy-security InRelease [110 kB] +Get:6 https://dl.google.com/linux/chrome/deb stable/main amd64 Packages [1,078 B] +Fetched 113 kB in 2s (67.9 kB/s) +Reading package lists... Done + +copilot@topcoder-desktop:$ sudo apt update +Hit:1 http://au.archive.ubuntu.com/ubuntu jammy InRelease +Hit:2 http://au.archive.ubuntu.com/ubuntu jammy-updates InRelease +Hit:3 http://au.archive.ubuntu.com/ubuntu jammy-backports InRelease +Hit:4 https: //dl.google.com/linux/chrome/deb stable InRelease +Get:5 http://security.ubuntu.com/ubuntu jammy-security InRelease [110 kB] +Fetched 110 kB in 1s (75.8 kB/s) +Reading package lists... Done +Building dependency tree... Done +Reading state information... Done +153 packages can be upgraded. Run 'apt list --upgradable' to see them. +``` + +Then, we can install python 2.7.18: + +* `sudo apt install python2` + +```terminal +20.8 kB] +Get:4 http://au.archive.ubuntu.com/ubuntu jammy/universe amd64 libpython2.7-stdlib amd64 2.7.18 +-13ubuntul [1,977 kB] +Get:5 http://au.archive.ubuntu.com/ubuntu jammy/universe amd64 python2.7 amd64 2.7.18-13ubuntu1 [250 kB] +Get:6 http://au.archive.ubuntu.com/ubuntu jammy/universe amd64 libpython2-stdlib amd64 2.7.18-3 [7,432 B] +Get:7 http://au.archive.ubuntu.com/ubuntu jammy/universe amd64 python2 amd64 2.7.18-3 [9,098 B] +Fetched 4,009 kB in 0s (13.9 MB/s) +Selecting previously unselected package libpython2.7-minimal:amd64 +(Reading database ... 160871 files and directories currently installed.) +Preparing to unpack .../0-libpython2.7-minimal_2.7.18-13ubuntu1_amd64.deb ... +Unpacking libpython2.7-minimal:amd64 (2.7.18-13ubuntu1) ... +Selecting previously unselected package python2.7-minimal. +Preparing to unpack .../1-python2.7-minimal_2.7.18-13ubuntu1_amd64.deb ... +Unpacking python2.7-minimal (2.7.18-13ubuntu1) ... +Selecting previously unselected package python2-minimal. +Preparing to unpack .../2-python2-minimal_2.7.18-3_amd64.deb +Unpacking python2-minimal (2.7.18-3) ... +Selecting previously unselected package libpython2.7-stdlib:amd64. +Preparing to unpack .../3-libpythonz.7-stdlib_2.7.18-13ubuntu1_amd64.deb ... +Unpacking libpython2.7-stdlib:amd64 (2.7.18-13ubuntu1) ... +Selecting previously unselected package python2.7. +Preparing to unpack .../4-python2.7_2.7.18-13ubuntu1_amd64.deb ... +Unpacking python2.7 (2.7.18-13ubuntu1) ... +Selecting previously unselected package libpython2-stdlib:amd64. +Preparing to unpack .../5-libpython2-stdlib_2.7.18-3_amd64.deb ... +Unpacking libpython2-stdlib:amd64 (2.7.18-3) ... +Setting up libpython2.7-mintmal:amd64 (2.7.18-13ubuntu1) ... +Setting up python2.7-minimal (2.7.18-13ubuntu1) ... +Linking and byte-comptling packages for runtime python2.7... +Setting up python2-minimal (2.7.18-3) ... +Selecting previously unselected package python2. +(Reading database ... 161614 files and directories currently installed.) +Preparing to unpack .../python2 2.7.18-3_amd64.deb ... +Unpacking python2 (2.7.18-3) ... +Setting up libpython2.7-stdlib:amd64 (2.7.18-13ubuntu1) ... +Setting up python2.7 (2.7.18-13ubuntu1) ... +setting up libpython2-stdlib:amd64 (2.7.18-3) ... +Setting up python2 (2.7.18-3) ... +Processing triggers for desktop-file-utils (0.26-1ubuntu3) ... +Processing triggers for gnome-menus(3.36.0-1ubuntu3) ... +Processing triggers for man-db(2.10.2-1) ... +Processing triggers for mailcap(3.70+nmu1ubuntu1) ... +``` + +### Hosts file update + +We need to edit `/etc/hosts` to add a couple of entries. We will add these two lines to the end of the file: + +``` +127.0.0.1 local.topcoder-dev.com +127.0.0.1 local.topcoder.com +``` + +To do this, open up the file in VSCode: + +* `code /etc/hosts` + +Add the lines above and then save the file, using `sudo` + +```ini +127.0.0.1 localhost +127.0.1.1 copilot-desktop +# The following lines are desirable for IPv6 capable hosts +::1 ip6-localhost ip6-loopback +fe00: :0 ip6-localnet +ff00: :0 ip6-mcastprefix +ff02: :1 ip6-allnodes +ff02::2 ip6-allrouters +127.0.0.1 local.topcoder-dev.com +127.0.0.1 local.topcoder.com +``` + +### Install the initial node version + +The community app requires Node 8.11.2. You can install it by running this command: + +* `nvm install v8.11.2` + +```terminal +copilot@topcoder-desktop:$ nvm install v8.11.2 +Downloading and installing node v8.11.2. +Downloading https://nodeis.org/dist/v8.11.2/node-v8.11.2-linux-x64.tar.xz... +#################################################################################### 100.0% +Computing checksum with sha256sum +Checksums matched! +Now using node v8.11.2 (npm v5.6.0) +Creating default alias: default -> v8.11.2 +``` + +### Install the proxy and run it + +We need to proxy `https` requests through a local proxy since we don't have a valid SSL key. To do this, we use the `local-ssl-proxy` package. You can install this in the Terminal app using these commands: + +* `npm i -g local-ssl-proxy` You only have to run this once to install the package + +**NOTE** - You should run the proxy in a *separate* Terminal window or tab, to ensure it's always running. +* `local-ssl-proxy -n local.topcoder-dev.com -s 3001 -t 3000` Every time you want to run the proxy or work on the community app, you will need to run this command + +```terminal +copilot@topcoder-desktop:$ local-ssl-proxy -n local.topcoder-dev.com -s 3001 -t 3000 +Started proxy: https://local.topcoder-dev.com:3001 -> http://local.topcoder-dev.com:3000 +``` + +### Check out the code + +Now that all dependencies are set up, we can check out the code. Note that this command will check out the community-app source code into a directory named `community-app`. + +Run this command on the Git Bash command line (you can open a Linux terminal or VS Code terminal and run these commands directly): + +```terminal +git clone https://github.com/topcoder-platform/community-app.git +``` + +```terminal +copilot@topcoder-desktop:$ git clone https://github.com/topcoder-platform/community-app.git +Cloning into 'community-app' +remote: Enumerating objects: 88298, done. +remote: Counting objects: 100% (1102/1102), done. +remote: Compressing objects: 100% (524/524), done. +remote: Total 88298 (delta 585), reused 998 (delta 523), pack-reused 87196 +Receiving objects: 100% (88298/88298), +135.19 MB | 3.38 MiB/s, done. +Resolving deltas: 100% (58896/58896), +done. +``` + +### Build and run the code + +Now that we have the code, we can build it on the Terminal command line. The first `cd community-app` command just changes us to the directory we created above, after the code was cloned. + +* `cd community-app` +* `nvm use` will warn you to install v8.11.2 + +```terminal +copilot@topcoder-desktop:$ cd community-app +copilot@topcoder-desktop:~/community-app$ nvm use +Found '/home/copilot/community-app/.nvmrc' with version +Now using node v8.11.2 (npm v5.6.0) +``` + + +Once we have the proper Node version installed (8.11.2), we will install the dependencies: + +**NOTE** this is a command that will take a long time and will build numerous dependencies. This is the command that is most likely to fail. If you have trouble here, make sure to copy / paste the entire output of the command into the forum so the copilot can help. + +* `npm i` + +**NOTE** - If this appears to be stuck, try deleting the `package-lock.json` file and starting `npm i` again. The `package-lock.json` will get regenerated as the modules are installed. + +```terminal +npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@^1.0.0 (node_modules/chokidar/node_module +s/fsevents): +npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents01.2.13: wanted {"os": "darwin", "arch": "any"} (current: {"os": "Linux", "arch": "x64"}) +npm WARN optional SKIPPING OPTIONAL DEPENDENCY: sevents@~2.3.2 (node_modules/watchpack/node_modules/chokidar/node modules/fsevents): +npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents02.3.2: wanted {"os": "darwin", "arch": "any"] (current: {"os": "Linux",, "arch": "x64"}) +npm WARN @optimizely/js-sdk-datafile-manager@0.9.5 requires a peer of @react-native-async-storage/ +async-storage@^1.2.0 but none is installed. You must install peer dependencies yourself. +npm WARN @optimizely/js-sdk-event-processor@0.9.5 requires a peer of @react-native-community/netinfo@5.9.4 but none is installed. You must install peer dependencies yourself. +npm WARN @optimizely/js-sdk-event-processor@0.9.5 requtres a peer of dreact-native-async-storage/async-storage@^1.2.0 but none is installed. You must install peer dependencies yourself. +npm WARN draft-js-markdown-shortcuts-plugin@0.3.0 requires a peer of draft-js-plugins-editor@~2.00-rc.1 || 2.0.0-rc2 || 2.0.0-rc1 || 2.0.0-beta12 but none is installed. You must install peer dependencies yourself. +npm WARN draft-is-markdown-shortcuts-plugin@0.3.0 requtres a peer of react@^15.0.0 but none is installed. You must install peer dependencies yourself. +npm WARN draft-js-markdown-shortcuts-plugin@0.3.0 requires a peer of react-dom@^15.0.0 but none is installed. You must install peer dependencies yourself. +npm WARN react-addons-css-transition-group@15.6.2 requires a peer of react@^15.4.2 but none is installed. You must install peer dependencies vourself. +npm WARN react-css-super-themr@2.3.0 requtres a peer of react@^0.14.0 || ^15.0.0-0 but none is installed. You must install peer dependencies yourself. +npm WARN react-dock@0.3.o requires a peer of @types/react@^16.3.18 but none is installed. You must install peer dependencies yourself. +npm WARN react-hot-loader04.13.0 requtres a peer of @types/react@^15.0.0 || ^16.0.0 || ^17.0.0 but none is installed. You must install peer dependencies yourself +npm WARN react-slick@0.15.4 requires a peer of react@^0.14.0 || ^15.0.1 but none is installed. You must install peer dependencies yourself. +npm WARN react-slick@0.15.4 requires a peer of react-dom@^0.14.0 || ^15.0.1 but none is installed. You must install peer dependencies vourself. +npm WARN redux-devtools-dock-monitor@1.2.0 requires a peer of @types/react@^16.3.18 but none is installed. You must install peer dependencies vourself. +npm WARN slick-carousel@1.8.1 requires a peer of jquery@»=1.8.0 but none is installed. You must install peer dependencies ourself. +npm WARN update-browserslist-db1.0.3 requires a peer of browserslist@»= 4.21.0 but none is installed. You must install peer dependencies yourself. + +added 6 packages in 297.525s +``` + +With the dependencies now successfully installed, we can build the code. You can do this whenever you want to rebuild the app as you make changes to it. + +* `npm run clean` - This command cleans up any previous builds +* `source env.sh` - This command sets the environmental variables - **IMPORTANT**: before executing this command, ask admin for the env.sh file, then paste it into root folder of community-app +* `npm run build` - This command builds the app +* `npm run start` - This command will start the web server + +```terminal + ModuleConcatenation bailout: Module is not an ECMAScript module + [29] 24712ms -> factory:305ms building:274ms = 25291ms + [3] ./src/assets/fonts/opensans/opensans-italic-webfont.eot92 bytes {0} [built] + ModuleConcatenation bailout: Module is not an ECMAScript module + [29] 24712ms -> factory: 305ms building:274Ms = 25291ms + [4] ./src/assets/fonts/opensans/opensans-semibold-webfont.eot92 bytes {0} [built] + ModuleConcatenation bailout: Module is not an ECMAScript module + [29] 24712ms -> factory: 305ms building:274Ms = 25291ms + [5] ./src/assets/fonts/opensans/opensans-semibolditalic-webfont.eot92bytes{0}[built] + ModuleConcatenation bailout: Module is not an ECMAScript module + [29] 24712ms -> factory:305ms building:274Ms = 25291ms + [6] ./src/assets/fonts/opensans/opensans-bold-webfont.eot92 bytes {0} [built] + ModuleConcatenation ballot: Module is not an ECMAScript module + [29] 24712ms -> factory: 305ms butlding:274Ms = 25291ms + [7] ./src/assets/fonts/opensans/opensans-bolditalic-webfont.eot92 bytes {0} [built] + ModuleConcatenation ballout: Module is not an ECMAScript module + [29] 24712ms -> factory: 305ms butlding:274Ms = 25291ms + [8] ./sc/assets/fonts/opensans/opensans-extrabold-webfont.eot92 bytes {0] [built] + ModuleConcatenation ballout: Module is not an ECMAScript module + [29] 24712ms -> factory: 305ms butlding:274Ms = 25291ms + [9] ./src/assets/fonts/opensans/opensans-extraboldttaltc-webfont.eot92 bytes {0] [bullt] + ModuleConcatenation batlout: Module is not an ECMAScript module + [29] 24712ms -> factory:305ms butlding:274Ms = 25291ms + [10] ./src/assets/fonts/Akkurat/WiproAkkuratTT-Light.eot 92 bytes {0} [butlt] + ModuleConcatenation batlout: Module is not an ECMAScript module + [29] 24712ms -> factory:305ms butlding:274Ms = 25291ms + [11] ./src/assets/fonts/Akkurat/WiproAkkuratTTRegular.eot92 bytes {0} [butlt] + ModuleConcatenation batlout: Module is not an ECMAScript module + [29] 24712ms -> factory:305ms butlding: 274Ms = 25291ms + [12] ./src/assets/fonts/Akkurat/AkkuratMonoMono.eot 92 bytes {0} [built] + ModuleConcatenation batlout: Module is not an ECMAScript module + [29] 24712ms -> factory:305ms building: 274Ms = 25291ms + [13] ./src/assets/fonts/Akkurat/WiproAkkuratTT-Bold.eot92 bytes {0} [built] + ModuleConcatenation batlout: Module is not an ECMAScript module + [29] 24712ms -> factory:305ms building: 274Ms = 25291ms + [29] ./node modules/css-loader??ref--7-1!./node modules/postcss-loader/lib??ref--7-2!./node modules/resolve-url-loader!./nodemodules/sass-loader/dist/cjs.js??ref--7-41./src/styles/global.sess + 42.5 KiB {0} [built] + ModuleConcatenation batlout: Module is not an ECMAScript module + factory: 3ms building: 24709Ms = 24712ms + + 125 hidden modules +``` + +### Validation + +To validate, we'll run Chrome without web security to avoid it complaining about the local proxy redirects. + +Open a new Terminal app window and run: + +* `google-chrome --disable-web-security --disable-gpu --disable-features=IsolateOrigins,site-per-process --user-data-dir="~/ChromeDev"` + +Once Chrome is running, you should be able to open this link and login with a test user: + +https://accounts-auth0.topcoder-dev.com/?retUrl=https://local.topcoder-dev.com:3001 +* Sample test user: `jgasperMobile12` / `Appirio123` + +![](./images/InitialLoginInChrome.png) + +You will need to tell Chrome to ignore the self-signed certificate warning by clicking the "Proceed to local.topcoder-dev.com" link + +![](./images/PrivateConnectionWarning.png) + +After successful login, you should see: + +**Chrome browser** + +![](./images/SuccessfulLogin.png) + +**Terminal app running the server** + +```terminal +Gecko) Chrome/103.0.5060.53 Safari/537.36 + +::ffff: 127.0.0.1 > 200 GET /api/cdn/public/static-assets/fonts/35675c89f974f7811eeaf07e2dd5ba3.woff2.737 ms 25020 https: //local.topcoder-dev.com: 3001/api/cdn/public/static-assets/main-1655963662307.css Mozilla/5.0 (X11; Linux x86 64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.53 Safari/537.36 + +::ffff: 127.0.0.1 > 200 GET /api/cdn/public/static-assets/fonts/816d43bc217485bc52e309cd1b356880.woff4.249 ms 24576 https: //local.topcoder-dev.com: 3001/api/cdn/public/static-assets/main-1655963662307.css Mozilla/5.0 (X11; Linux x86 64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.53 Safari/537.36 + +::ffff: 127.0.0.1 > 200 GET /api/cdn/public/static-assets/fonts/8b18d656824460ad37616723e493bcd.woff4.674 ms 24808 https: //local.topcoder-dev.com: 3001/api/cdn/public/static-assets/main-1655963662307.c5s Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.53 Safari/ 537.36 + +::ffff: 127.0.0.1 > 200 GET /api/cdn/public/static-assets/main-1655963662307.js 8.031 ms - https://local.topcoder-dev.com: 3001/ Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) chrome/103.0.5060.53 Safari/537.36 + +::ffff:127.0.0.1 > Authenticated as: ("https: //topcoder-dev.com/roles": ["Topcoder User"], "https://topcoder-dev.com/userId": "88778088", "https://topcoder-dev.com/handle": "copilot", "https://topcoder-dev.com/user id": "autho|88778088","https://topcoder-dev.com/tesso":"88778088|83dddf57fe737e45425da484ce6d26e262644810ba944668C61f8f42f47eg4". "https://topcoder-dev.com/active": true, "https://topcoder-dev.com/blockIP": false, "nickname": "copilot" "name": "copilot@topcoder.com", "picture": "https: //s.gravatar.com/avatar/5d2f2479df25f71bb56e3cbc160714c6?s=480&r=pg&d=https%3A%2F%2Fcdn.autho.com2Favatars%2Fjm.png", "updated at": "2022-06-23T06:11:06.5917", "email": "copilot@topcoder.com", "email verified": true, "iss":"https://auth.topcoder-dev.com/", "sub": "autho|88778088", "aud": "BXWXUWnilVUPdN01t2Se29Tw2ZYNGZVH", "iat":1655964672, "exp":1656051072, "nonce": "YVhusxhrSzlack5MMlByUXROb3FnTlBRMmdOdFZlMFN2c0VNczBXRlEwMw==", "userId": 88778088, "handle": "copilot", +"roles" : ["Topcoder User"]} + +::ffff: 127.0.0.1 > 200 POST /community-app-assets/api/logger 1.438 ms - https://local.topcoder-dev.com:3001/ Mozilla/5.0 (X11; Linux x86 64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.53 Safari/537.36 + +::ffff: 127.0.0.1 > Reauth scheduled in 86339.804 seconds +::ffff:127.0.0.1 200 POST /community-app-assets/api/logger 0.508 mS - https://local.topcoder-dev.com:3001/ Mozilla/5.0 (X11; Linux x86 64) AppleWebKit/537.36 (KHTML, like Gecko) chrome/103.0.5060.53 Safari/537.36 +``` + +You can also access a link on the community app page, like the one for the challenge listings: + +![](./images/ChallengeListing.png) + +## Build the community app on Mac + +### Install XCode + +XCode can be installed directly from the Mac App Store. Note that XCode is a large application and will take up a lot of disk space. + +[https://apps.apple.com/au/app/xcode/id497799835?mt=12](https://apps.apple.com/au/app/xcode/id497799835?mt=12) + +![](./images/XCode1.png) + +### Install XCode command line tools + +When XCode launches for the first time, it *should* install the necessary command line tools. You can validate in the XCode preferences. Alternatively, when you install Homebrew in the next step it will also install the command line tools. + +![](./images/XCode2.png) + +### Install VSCode + +VSCode is the recommended IDE for Topcoder platform development. You can download it here: + +[https://code.visualstudio.com/Download](https://code.visualstudio.com/Download) + +### Open the terminal + +To open the terminal, click "Launchpad" and search for "Terminal". It would probably be a good idea to add the Terminal app to your macOS dock as it will be used extensively in these instructions. + +### Install homebrew + +Homebrew is a package manager for developers on macOS. It can be used to easily install dependencies. + +[https://brew.sh](https://brew.sh) + + +We can install it by: + +* Open the Terminal app +* Run `/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"` +* Enter your macOS account password, when prompted +* Copy and paste the commands that Homebrew outputs at the end of the installation to ensure `brew` is registered properly. + +```terminal +Last login: Wed Jul 6 16:33:40 on console +copilot@topcoder-Virtual-Machine ~ % /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" + +==> Checking for 'sudo' access (which may request your password)... +Password: +==> This script will install: +/opt/homebrew/bin/brew +/opt/homebrew/share/doc/homebrew +/opt/homebrew/share/man/man1/brew.1 +/opt/homebrew/share/zsh/site-functions/_brew +/opt/homebrew/etc/bash_completion.d/brew +/opt/homebrew +==> The following new directories will be created: +/opt/homebrew/bin +/opt/homebrew/etc +/opt/homebrew/include +/opt/homebrew/lib +/opt/homebrew/sbin +/opt/homebrew/share +/opt/homebrew/var +/opt/homebrew/opt +/opt/homebrew/share/zsh +/opt/homebrew/share/zsh/site-functions +/opt/homebrew/var/homebrew +/opt/homebrew/var/homebrew/linked +/opt/homebrew/Cellar +/opt/homebrew/Caskroom +/opt/homebrew/Frameworks +==> The Xcode Command Line Tools will be installed. + +Press RETURN/ENTER to continue or any other key to abort: +==> /usr/bin/sudo /usr/bin/install -d -o root -g wheel -m 0755 /opt/homebrew +==> /usr/bin/sudo /bin/mkdir -p /opt/homebrew/bin /opt/homebrew/etc /opt/homebrew/include /opt/homebrew/lib /opt/homebrew/sbin /opt/homebrew/share /opt/homebrew/varopt/homebrew/opt/opt/homebrew/share/zsh/opt/homebrew/share/zsh/site-functions/opt/homebrew/var/homebrew/opt/homebrew/var/homebrew/linked/opt/homebrew/Cellar/opt/homebrew/Caskroom/opt/homebrew/Frameworks +==> /usr/bin/sudo /bin/chmod ugarwx /opt/homebrew/bin /opt/homebrew/etc /opt/homebrew/include /opt/homebrew/lib /opt/homebrew/sbin /opt/homebrew/share /opt/homebrew/var /opt/homebrew/opt /opt/homebrew/share/zsh /opt/homebrew/share/zsh/site-functions /opt/homebrew/var/homebrew /opt/homebrew/var/homebrew/linked /opt/homebrew/Cellar +/opt/homebrew/Caskroom/opt/homebrew/Frameworks +==> /usr/bin/sudo /bin/chmod go-w/opt/homebrew/share/zsh/opt/homebrew/share/zsh/site-functions +==> /usr/bin/sudo /usr/sbin/chown copilot /opt/homebrew/bin /opt/homebrew/etc /opt/homebrew/include /opt/homebrew/lib /opt/homebrew/sbin /opt/homebrew/share /opt +/homebrew/var/opt/homebrew/opt/opt/homebrew/share/zsh/opt/homebrew/share/zsh/site-functions/opt/homebrew/var/homebrew/opt/homebrew/var/homebrew/linked/opt/homebrew/Cellar/opt/homebrew/Caskroom/opt/homebrew/Frameworks +==> /usr/bin/sudo /usr/bin/chgrp admin /opt/homebrew/bin /opt/homebrew/etc /opt/homebrew/include /opt/homebrew/lib /opt/homebrew/sbin /opt/homebrew/share /opt/homebrew/var/opt/homebrew/opt/opt/homebrew/share/zsh/opt/homebrew/share/zsh/site-functions/opt/homebrew/var/homebrew/opt/homebrew/var/homebrew/linked/opt/homebrew/Cellar/opt/homebrew/Caskroom/opt/homebrew/Frameworks +==> /usr/bin/sudo /usr/sbin/chown -R copilot:admin /opt/homebrew +==> /usr/bin/sudo /bin/mkdir -p /Users/copilot/Library/Caches/Homebrew +==> /usr/bin/sudo /bin/chmod g+rwx /Users/copilot/Library/Caches/Homebrew +==> /usr/bin/sudo /usr/sbin/chown -R copilot /Users/copilot/Library/Caches/Homebrew +==> Searching online for the Command Line Tools +==> /sr/bin/sudo /usr/bin/touch /tmp/.com.apple.dt.CommandLineTools.installondemand.in-progress +``` + +### Install Chrome + +Chrome is a good default browser to use when developing the community app. You can download it and install it from [https://www.google.com/chrome/](https://www.google.com/chrome/) + +### Install nvm + +The Node Version Manager [https://github.com/nvm-sh/nvm](https://github.com/nvm-sh/nvm) is used to make sure our version of Node and npm match the deployment environment. + +To install nvm run this command: + +* Open the Terminal app +* `brew install nvm` +* `mkdir ~/.nvm` +* Follow the steps to edit your `~/.zshrc` file shown at the end of the installation. You can do this using VSCode. + +```terminal +Last login: Thu Jul 7 16:40:44 on ttys000 +copilot@topcoder-Virtual-Machine ~ % brew install nvm +==> Downloading https://ghcr.io/v2/homebrew/core/nvm/manifests/0.39.1_ +######################################################### 100.0% +==>Downloadinghttps://ghcr.io/v2/homebrew/core/nvm/blobs/sha256:6014c8a2bf9421 +==>Downloadingfromhttps://pkg-containers.githubusercontent.com/ghcr1/blobs/sh +######################################################### 100.0% +==> Pouring nvm--@.39.1_1.all.bottle.tar.gz +==> Caveats +Please note that upstream has asked us to make explicit managing +nvm via Homebrew is unsupported by them and you should check any +problems against the standard nvm install method prior to reporting. + +You should create NVM's working directory if it doesn't exist: + + mkdir~/.nvm + +Add the following to ~/.zshrc or your desired shell +configuration file: + + export NVM DIR="$HOME/.nvm" + [ -s "/opt/homebrew/opt/nvm/nvm.sh" ] && \. "/opt/homebrew/opt/nvm/nvm.sh" # This loads nvm + [ -s "/opt/homebrew/opt/nvm/etc/bash completion.d/nvm" ] && \. "/opt/homebrew/opt/nvm/etc/bash completion.d/nvm" # This loads nvm bash completion + +You can set $NVM_DIR to any location, but leaving it unchanged from +/opt/homebrew/opt/nvm will destroy any nvm-installed Node installations +upon upgrade/reinstall. + +Type `nvm help` for further information. +==> Summary + /opt/homebrew/Cellar/nvm/0.39.1_1: 9 files, 184.1KB +==> Running 'brew cleanup nvm +Disable this behaviour by setting HOMEBREW_NO_INSTALL_CLEANUP. +Hide these hints with HOMEBREW NO ENV HINTS (see "man brew') + +``` + +```sh +export NVM DIR="$HOME/.nvm" +[ -s "/opt/homebrew/opt/nvm/nvm.sh" ] && \. "/opt/homebrew/opt/nvm/nvm.sh" # This loads nvm +[ -s "/opt/homebrew/opt/nvm/etc/bash completion.d/nvm" ] && \. "/opt/homebrew/opt/nvm/etc/bash completion.d/nvm" # This loads nvm bash completion +``` + +Note that after you have installed `nvm` and updated your `.zshrc` file you will need to restart your terminal app to ensure the new settings are loaded in. + +You can test nvm by running: + +* `nvm --version` in the terminal + +```terminal +Last login: Fri Jul 8 14:10:49 on ttys000 +copilot@topcoder-Virtual-Machine ~ % nvm --version +0.39.1 +``` +### Install python 2.7.18 + +You will need Python 2 to run community app. If you are on newer macOS versions, it comes with Python 3 by default, but this will *not* work with community app. + +To install Python 2 on new macOS versions (12+): + +* Install the Python env manager: + * `brew install pyenv` + +```terminal +Last login: Fri Jul 8 14:10:59 on ttys000 +copilot@topcoder-Virtual-Machine ~ % brew install pyenv +==> Downloading https://ghcr.io/v2/homebrew/core/m4/manifests/1.4.19 +######################################################### 100.0% +==> Downloading https://ghcr.io/v2/homebrew/core/m4/blobs/sha256:89fa0d7d946f7c +==> Downloading from https://pkg-containers.githubusercontent.com/ghcr1/blobs/sh +######################################################### 100.0% +==> Downloadinghttps://ghcr.io/v2/homebrew/corelautoconf/manifests/2.71 +######################################################### 100.0% +==> Downloading https://ghcr.io/v2/homebrew/core/autoconf/blobs/sha256:a3d366c98 +==> Downloading from https://pkg-containers.githubusercontent.com/ghcr1/blobs/sh +######################################################### 100.0% +==> Downloading https://ghcr.io/v2/homebrew/core/ca-certificates/manifests/2022- +#=#=# +``` + +* Install Python 2: + * `pyenv install 2.7.18` + +```terminal +Last login: Fri Jul 8 14:13:11 on ttys000 +copilot@topcoder-Virtual-Machine ~ % pyenv install 2.7.18 +python-build: use openssl01.1 from homebrew +python-build: use readline from homebrew +Downloading Python-2.7.18.tar.xz. +=> https://www.python.org/ftp/python/2.7.18/Python-2.7.18.tar.xz +Installing Python-2.7.18. +patching file configure +patching file configure.ac +patching file setup.py +patching file Mac/Tools/pythonw.c +patching file setup.py +patching file Doc/library/ctypes.rst +patching file Lib/test/test_str.py +patching file Lib/test/test_unicode.py +patching file Modules/_ctypes/_ctypes.c +patching file Modules/_ctypes/callproc.c +patching file Modules/_ctypes/ctypes.h +patching file Modules/_ctypes/callproc.c +patching file setup.py +patching file Mac/Modules/qt/setup.py +patching file setup.py +python-build: use readline from homebrew +python-build: use zlib from xcode sdk +``` + +* Tell the community app where to find the Python 2 version. You'll need to either set this in your `.zshrc` file or run it whenever you want to build the community app: + * `export PYTHON=$HOME/.pyenv/versions/2.7.18/bin/python` + * `export PATH=$PATH:$HOME/.pyenv/versions/2.7.18/bin` + +```sh +export NVM DIR="$HOME/.nvm" +[ -s "/opt/homebrew/opt/nvm/nvm.sh" ] && \. "/opt/homebrew/opt/nvm/nvm.sh" # This loads nvm +[ -s "/opt/homebrew/opt/nvm/etc/bash completion.d/nvm" ] && \. "/opt/homebrew/opt/nvm/etc/bash completion.d/nvm" # This loads nvm bash completion +export PYTHON=$HOME/.pyenv/versions/2.7.18/bin/python +export PATH=$PATH: $HOME/.pyenv/versions/2.7.18/bin +``` + +### Hosts file update + +We need to edit `/etc/hosts` to add a couple of entries. The goal is that `local.topcoder-dev.com` will point to our local machine, to aid in login. + +We will add these two lines to the end of the file: + +```ini +127.0.0.1 local.topcoder-dev.com +127.0.0.1 local.topcoder.com +``` + +To do this, open up the `/etc/hosts` file in VSCode: + +Add the lines above and then save the file, using `sudo` + +```sh +## +# Host Database +# +# localhost is used to configure the loopback interface +# when the system is booting. Do not change this entry. +## +127.0.0.1 localhost +255.255.255.255 broadcasthost +::1 localhost +127.0.0.1 local.topcoder-dev.com +127.0.0.1 local.topcoder.com +``` + +### Install the initial node version + +The community app requires Node 8.11.2. You can install it by running this command: + +* `nvm install v8.11.2` + +```terminal +Last login: Fri Jul 8 14:14:18 on ttys001 +copilot@topcoder-Virtual-Machine ~ % nvm install v8.11.2 +Downloading +and installing node v8.11.2. +Downloading https://nodejs.org/dist/v8.11.2/node-v8.11.2-darwin-x64.tar.xz.. +####################################### 71.4% +``` + +### Install the proxy and run it + +We need to proxy `https` requests through a local proxy since we don't have a valid SSL key. To do this, we use the `local-ssl-proxy` package. You can install this in the Terminal app using these commands. + +* `npm i -g local-ssl-proxy` You only have to run this once to install the package +* `local-ssl-proxy -n local.topcoder-dev.com -s 3001 -t 3000` Every time you want to run the proxy or work on the community app, you will need to run this command + +**NOTE** - You should run the proxy in a *separate* Terminal window or tab, to ensure it's always running. + +```terminal +Last login: Fri Jul 8 14:18:14 on ttys000 +copilot@topcoder-Virtual-Machine ~ % pm i -9 local-ssl-proxy +npm WARN deprecated nomnom@1.8.1: Package no longer supported. Contact support@npmjs.com for more info. +npm WARN notice [SECURITY] underscore has the following vulnerability: 1 high. Go here for more details: https://github.com/advisories?query=underscore - Run npm i npm@latest -g to upgrade your pm version, and then `npm audit` to get more info. +/Users/copilot/.nvm/versions/node/v8.11.2/bin/local-ssl-proxy -> /Users/copilot/.nvm/versions/node/v8.11.2/lib/node_modules/local-ssl-proxy/bin/local-ssl-proxy ++ local-ssl-proxy@1.3.0 +added 18 packages in 3.944s +``` + +```terminal +copilot@topcoder-Virtual-Machine ~ % local-ssl-proxy -n local.topcoder-dev.com +Started proxy: https://local.topcoder-dev.com:3001 > http://local.topcoder-dev.com:3000 +``` +### Check out the code + +Now that all dependencies are set up, we can check out the code. Note that this command will check out the community-app source code into a directory named `community-app`. + +Run this command on the Git Bash command line: + +`git clone https://github.com/topcoder-platform/community-app.git` + +```terminal +Last login: Fri Jul 8 14:19:26 on ttys000 +copilot@topdcoder-Virtual-Machine ~ % git clone https://github.com/topcoder-platform/community-app.git +Cloning into 'community-app'... +remote: Enumerating objects: 88794, done. +remote: Counting objects: 100% (1606/1606), done. +remote: Compressing objects: 100% (678/678), done +Receiving objects: 47% (41734/88794), 79.68 MiB | 19.17 MiB/s +``` + +### Build and run the code + +Now that we have the code, we can build it on the Terminal command line. The first `cd community-app` command just changes us to the directory we created above, after the code was cloned. + +* `cd community-app` +* `nvm use` will warn you to install v8.11.2 + +```terminal +Last login: Fri Jul 8 14:41:06 on ttys001 +copilot@topcoder-Virtual-Machine ~ % cd community-app +copilot@topcoder-Virtual-Machine community-app % nvm use +Found '/Users/copilot/community-app/.nvmrc' with version +Now using node v8.11.2 (npm v5.6.0) +copilot@topcoder-Virtual-Machine community-app % +``` + +Once we have the proper Node version installed (8.11.2), we will install the dependencies: + +**NOTE** this is a command that will take a long time and will build numerous dependencies. This is the command that is most likely to fail. If you have trouble here, make sure to copy / paste the entire output of the command into the forum so the copilot can help. + +* `npm i` + +**NOTE** - If this appears to be stuck, try deleting the `package-lock.json` file and starting `npm i` again. The `package-lock.json` will get regenerated as the modules are installed. + +```terminal +Last login: Fri Jul 8 14:41:06 on ttys001 +copilot@topcoder-Virtual-Machine ~ % cd community-app +copilot@topcoder-Virtual-Machine community-app % nvm use +Found '/Users/copilot/community-app/.nvmrc' with version +Now using node v8.11.2 (npm v5.6.0) +copilot@topcoder-Virtual-Machine community-app % npm i +((▋▋▋▋▋▋▋▋▋▋▋▋▋▋ )): loadIdealTree:loadAllDepsIntoIdealTree: sill install loadIdealTree +``` + +With the dependencies now successfully installed, we can build the code. You can do this whenever you want to rebuild the app as you make changes to it. + +* `npm run clean` This command cleans up any previous builds: +* `source env.sh` This command sets the environmental variables: +* `npm run build:dev` This command builds the app +* `npm run dev` This command will start the web server + +```terminal +cd Last login: Fri Jul 8 15:01:47 on ttys004 +copilot@topcoder-Virtual-Machine ~ % cd community-app +copilot@topcoder-Virtual-Machine community-app % npm run clean +sour +> community-app1.0.0 clean /Users/copilot/community-app +> rimraf build + +copilot@topcoder-Virtual-Machine community-app % source env.sh +copilot@topcoder-Virtual-Machine community-app % npm run build + +> community-app©1.0.0 build /Users/copilot/community-app +> npm run clean && ./node_modules/.bin/webpack --env=production --progress --profile --colors --display-optimization-bailout + +> community-app1.0.0 clean /Users/copilot/community-app +> rimraf build +67% building 1394/1448 modules 54 active ...core-js/modules/es7.reflect.metadata.js +``` + +```terminal + ModuleConcatenation bailout: Module is not an ECMAScript module + [29] 24712ms -> factory:305ms building:274ms = 25291ms + [3] ./src/assets/fonts/opensans/opensans-italic-webfont.eot92 bytes {0} [built] + ModuleConcatenation bailout: Module is not an ECMAScript module + [29] 24712ms -> factory: 305ms building:274Ms = 25291ms + [4] ./src/assets/fonts/opensans/opensans-semibold-webfont.eot92 bytes {0} [built] + ModuleConcatenation bailout: Module is not an ECMAScript module + [29] 24712ms -> factory: 305ms building:274Ms = 25291ms + [5] ./src/assets/fonts/opensans/opensans-semibolditalic-webfont.eot92bytes{0}[built] + ModuleConcatenation bailout: Module is not an ECMAScript module + [29] 24712ms -> factory:305ms building:274Ms = 25291ms + [6] ./src/assets/fonts/opensans/opensans-bold-webfont.eot92 bytes {0} [built] + ModuleConcatenation ballot: Module is not an ECMAScript module + [29] 24712ms -> factory: 305ms butlding:274Ms = 25291ms + [7] ./src/assets/fonts/opensans/opensans-bolditalic-webfont.eot92 bytes {0} [built] + ModuleConcatenation ballout: Module is not an ECMAScript module + [29] 24712ms -> factory: 305ms butlding:274Ms = 25291ms + [8] ./sc/assets/fonts/opensans/opensans-extrabold-webfont.eot92 bytes {0] [built] + ModuleConcatenation ballout: Module is not an ECMAScript module + [29] 24712ms -> factory: 305ms butlding:274Ms = 25291ms + [9] ./src/assets/fonts/opensans/opensans-extraboldttaltc-webfont.eot92 bytes {0] [bullt] + ModuleConcatenation batlout: Module is not an ECMAScript module + [29] 24712ms -> factory:305ms butlding:274Ms = 25291ms + [10] ./src/assets/fonts/Akkurat/WiproAkkuratTT-Light.eot 92 bytes {0} [butlt] + ModuleConcatenation batlout: Module is not an ECMAScript module + [29] 24712ms -> factory:305ms butlding:274Ms = 25291ms + [11] ./src/assets/fonts/Akkurat/WiproAkkuratTTRegular.eot92 bytes {0} [butlt] + ModuleConcatenation batlout: Module is not an ECMAScript module + [29] 24712ms -> factory:305ms butlding: 274Ms = 25291ms + [12] ./src/assets/fonts/Akkurat/AkkuratMonoMono.eot 92 bytes {0} [built] + ModuleConcatenation batlout: Module is not an ECMAScript module + [29] 24712ms -> factory:305ms building: 274Ms = 25291ms + [13] ./src/assets/fonts/Akkurat/WiproAkkuratTT-Bold.eot92 bytes {0} [built] + ModuleConcatenation batlout: Module is not an ECMAScript module + [29] 24712ms -> factory:305ms building: 274Ms = 25291ms + [29] ./node modules/css-loader??ref--7-1!./node modules/postcss-loader/lib??ref--7-2!./node modules/resolve-url-loader!./nodemodules/sass-loader/dist/cjs.js??ref--7-41./src/styles/global.sess + 42.5 KiB {0} [built] + ModuleConcatenation batlout: Module is not an ECMAScript module + factory: 3ms building: 24709Ms = 24712ms + + 125 hidden modules +``` + +### Validation + +To validate, we'll run Chrome without web security to avoid it complaining about the local proxy redirects. + +Open a new Terminal app window and run: + +* `/Applications/Google\Chrome.app/Contents/MacOS/Google\Chrome --disable-web-security --ignore-certificate-errors --user-data-dir=/tmp/` + +Once Chrome is running, you should be able to open this link and login with a test user. + +* Sample test user: `jgasperMobile12` / `Appirio123` + +[https://accounts-auth0.topcoder-dev.com/?retUrl=https://local.topcoder-dev.com:3001](https://accounts-auth0.topcoder-dev.com/?retUrl=https://local.topcoder-dev.com:3001) + + +You will need to tell Chrome to ignore the self-signed certificate warning by clicking the "Proceed to local.topcoder-dev.com" link + +After successful login, you should see: + +**Chrome browser** + +![](./images/SuccessfulLogin.png) + +**Validation** + +You can also access a link on the community app page, like the one for the challenge listings: + +![](./images/ChallengeListing.png) + diff --git a/src-ts/tools/dev-center/dev-center-pages/community-app/getting-started/GettingStartedGuide.module.scss b/src-ts/tools/dev-center/dev-center-pages/community-app/getting-started/GettingStartedGuide.module.scss new file mode 100644 index 000000000..b22277ed9 --- /dev/null +++ b/src-ts/tools/dev-center/dev-center-pages/community-app/getting-started/GettingStartedGuide.module.scss @@ -0,0 +1,24 @@ +@import '../../../styles/variables'; +@import '../../../../../lib/styles/includes'; + +.contentLayout { + width: 100%; + padding-bottom: 0; + + .contentLayout-outer { + width: 100%; + + .contentLayout-inner { + width: 100%; + overflow: visible; + } + } +} + +@include ltelg { + .contentLayout { + .contentLayout-outer { + padding: 0 $space-lg; + } + } +} \ No newline at end of file diff --git a/src-ts/tools/dev-center/dev-center-pages/community-app/getting-started/GettingStartedGuide.tsx b/src-ts/tools/dev-center/dev-center-pages/community-app/getting-started/GettingStartedGuide.tsx new file mode 100644 index 000000000..e3c1c5b40 --- /dev/null +++ b/src-ts/tools/dev-center/dev-center-pages/community-app/getting-started/GettingStartedGuide.tsx @@ -0,0 +1,29 @@ +import * as React from 'react' + +import { Breadcrumb, BreadcrumbItemModel, ContentLayout } from '../../../../../lib' +import useMarkdown from '../../../dev-center-lib/hooks/useMarkdown' +import MarkdownDoc from '../../../dev-center-lib/MarkdownDoc' +import LayoutDocHeader from '../../../dev-center-lib/MarkdownDoc/LayoutDocHeader' +import { toolTitle } from '../../../DevCenter' + +import gettingStartedGuide from './GettingStartedGuide.md' +import styles from './GettingStartedGuide.module.scss' + +export const GettingStartedGuide: React.FC = () => { + const { doc, toc, title }: ReturnType = useMarkdown({ uri: gettingStartedGuide }) + const breadcrumb: Array = React.useMemo(() => [ + { name: toolTitle, url: '/dev-center' }, + { name: title, url: '#' }, + ], [title]) + + return ( + + + + + + + ) +} + +export default GettingStartedGuide diff --git a/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/DevCenterLandingPage.module.scss b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/DevCenterLandingPage.module.scss new file mode 100644 index 000000000..3ffc5d9e4 --- /dev/null +++ b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/DevCenterLandingPage.module.scss @@ -0,0 +1,7 @@ +@import '../../../../../lib/styles/includes'; + +.container { + flex: 99 1 auto; + display: flex; + flex-direction: column; +} \ No newline at end of file diff --git a/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/DevCenterLandingPage.tsx b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/DevCenterLandingPage.tsx new file mode 100644 index 000000000..20198fa76 --- /dev/null +++ b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/DevCenterLandingPage.tsx @@ -0,0 +1,19 @@ +import { FC } from 'react' + +import { DevCenterArticlesection } from './dev-center-articles-section' +import { DevCenterGetStarted } from './dev-center-get-started' +import { DevCenterHeader } from './dev-center-header' +import styles from './DevCenterLandingPage.module.scss' + +const DevCenter: FC = () => { + + return ( +
+ + + +
+ ) +} + +export default DevCenter diff --git a/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-articles-section/ArticleCard/ArticleCard.module.scss b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-articles-section/ArticleCard/ArticleCard.module.scss new file mode 100644 index 000000000..f96f5894c --- /dev/null +++ b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-articles-section/ArticleCard/ArticleCard.module.scss @@ -0,0 +1,91 @@ +@import '../../../../../../../lib/styles/includes'; + +.outerContainer{ + border-radius: 8px; + position: relative; + background-size: 100% 100%; + overflow: hidden; + + @include ltemd{ + background-size: cover; + } + + .innerContainer { + width: 100%; + height: 100%; + background: linear-gradient(180deg, rgba(0, 0, 0, 0) 30.21%, #000000 100%); + + .playButton { + width: 38px; + height: 38px; + color: $tc-white; + position: absolute; + left: calc(50% - 19px); + top: calc(50% - 19px); + } + + .container { + padding-left: $space-xxl; + padding-right: $space-xxl; + padding-bottom: $space-xxl; + position: absolute; + bottom: 0px; + width: 100%; + + .topLine { + display: flex; + flex-direction: row; + justify-content: space-between; + margin-bottom: 14px; + align-items: center; + } + + .author { + opacity: 0.72; + text-transform: capitalize; + display: block; + margin-bottom: $space-lg; + } + + .summary { + @include font-weight-normal; + display: block; + white-space: nowrap; + overflow: hidden; + margin-bottom: $space-lg; + text-overflow: ellipsis; + } + + .readMore { + font-weight: 700; + font-size: 16px; + line-height: 16px; + text-transform: uppercase; + } + + + } + + + } +} + +.mainArticle { + + @include ltemd{ + aspect-ratio: 4 / 3; + } +} + +.smallArticle { + aspect-ratio: 4 /3; + + @include ltemd{ + width: 100%; + max-height: 240px; + } +} + +.mainArticle:hover, .smallArticle:hover{ + cursor: pointer; +} diff --git a/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-articles-section/ArticleCard/ArticleCard.tsx b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-articles-section/ArticleCard/ArticleCard.tsx new file mode 100644 index 000000000..fb5b04e41 --- /dev/null +++ b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-articles-section/ArticleCard/ArticleCard.tsx @@ -0,0 +1,170 @@ +import classNames from 'classnames' +import { FC } from 'react' + +import { EnvironmentConfig } from '../../../../../../../config' +import { IconSolid } from '../../../../../../../lib' +import { DevCenterTag } from '../../dev-center-tag' +import { isThriveArticle } from '../Articles' +import { BlogPost, ThriveArticle } from '../models' + +import styles from './ArticleCard.module.scss' + +interface ArticleCardProps { + article: ThriveArticle | BlogPost + className?: string + isMain: boolean +} + +interface ArticleDetails { + author: string + image: string + isThrive: boolean + isVideo: boolean + summary: string + tagText: string + url: string +} + +function openArticle(url: string): void { + window.open( + url, + '_blank' // This is what makes it open in a new window. + ) +} + +function getTagText(isThrive: boolean, isVideo: boolean): string { + return isThrive + ? isVideo + ? 'Thrive Video' + : 'Thrive Article' + : 'Success Story' +} + +function getArticleContent( + article: ThriveArticle | BlogPost, + isThrive: boolean +): string { + return isThrive ? article.content : article.contentSnippet +} + +function getArticleDetails(article: ThriveArticle | BlogPost): ArticleDetails { + const isThrive: boolean = isThriveArticle(article) + const isVideo: boolean = isThrive && article.type === 'Video' + + const tagText: string = getTagText(isThrive, isVideo) + + const content: string = getArticleContent(article, isThrive) + const regex: RegExp = /(<([^>]+)>)/gi + const summary: string = content.replace(regex, '') // Remove html from the content string + const url: string = isThrive + ? `${EnvironmentConfig.TOPCODER_URLS.THRIVE_PAGE}/articles/${article.slug}` + : article.link + const author: string = !isThrive ? article.creator : '' + const image: string = isThrive + ? article.featuredImage.fields.file.url + : article.featuredImage + + return { + author, + image, + isThrive, + isVideo, + summary, + tagText, + url, + } +} + +function getOuterClass(isMain: boolean, className: string): string { + return classNames( + className, + styles.outerContainer, + isMain ? styles.mainArticle : styles.smallArticle + ) +} + +const ArticleCard: FC = ({ + article, + isMain, + className = '', +}) => { + const outerClass: string = getOuterClass(isMain, className) + const { + isThrive, + isVideo, + tagText, + summary, + url, + author, + image, + }: ArticleDetails = getArticleDetails(article) + + return ( +
+
openArticle(url)} + > + {isThrive && isVideo && ( + + )} +
+
+ + {isThrive && ( + + {article.readTime} + + )} +
+ {isMain ? ( +

+ {article.title} +

+ ) : ( +

+ {article.title} +

+ )} + {!isThrive && ( + + {author} + + )} + {isMain && ( + <> + + {summary} + + + READ MORE + + + )} +
+
+
+ ) +} + +export default ArticleCard diff --git a/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-articles-section/ArticleCard/index.tsx b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-articles-section/ArticleCard/index.tsx new file mode 100644 index 000000000..12a947a8f --- /dev/null +++ b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-articles-section/ArticleCard/index.tsx @@ -0,0 +1 @@ +export { default as ArticleCard } from './ArticleCard' diff --git a/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-articles-section/Articles.ts b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-articles-section/Articles.ts new file mode 100644 index 000000000..3e7a45277 --- /dev/null +++ b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-articles-section/Articles.ts @@ -0,0 +1,27 @@ +import { EnvironmentConfig } from '../../../../../../config' + +import { BlogPost, ThriveArticle } from './models' + +/** Check if the article is a BlogPost or a ThriveArticle */ +export function isThriveArticle(article: BlogPost | ThriveArticle): article is ThriveArticle { + return (article as ThriveArticle).readTime !== undefined +} + +/** This is the default image to be used for blog posts that do not provide an url to the hero image */ +const DEFAULT_BLOG_IMAGE: string = `${EnvironmentConfig.TOPCODER_URLS.WP_CONTENT}/uploads/2017/04/SRM_Blog.png` + +/** Get the blog with the given url, or return undefined if the blog couldn't be fetched */ +export async function getBlog(url: string): Promise { + try { + const response: Response = await fetch(`${EnvironmentConfig.TOPCODER_URLS.API_BASE}/blog?limit=200`) + const data: Array = await response.json() + const blog: BlogPost = data.filter(x => x.link === url)[0] + // If the returned data do not contain the URL to the image, use the default one + if (!blog.featuredImage) { + blog.featuredImage = DEFAULT_BLOG_IMAGE + } + return blog + } catch (e) { + return undefined + } +} diff --git a/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-articles-section/CardSection/CardSection.module.scss b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-articles-section/CardSection/CardSection.module.scss new file mode 100644 index 000000000..09a0f9b48 --- /dev/null +++ b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-articles-section/CardSection/CardSection.module.scss @@ -0,0 +1,102 @@ +@import '../../../../../../../lib/styles/includes'; + +.container { + width: 100%; + justify-content: center; + + .innerContainer { + display: grid; + grid-template-columns: 2fr 1fr 1fr; + grid-template-rows: 1fr 1fr; + gap: 32px; + + @include xl{ + grid-template-columns: 1fr 1fr; + grid-template-rows: 2fr 1fr 1fr; + max-width: 812px; + margin: auto; + } + + @include lg{ + grid-template-columns: 1fr 1fr; + grid-template-rows: 2fr 1fr 1fr; + } + + @include ltemd{ + display: flex; + flex-direction: column; + max-width: 400px; + margin: auto; + } + + .mainItem { + grid-row: 1 / span 2; + grid-column: 1; + + @include xl{ + grid-row: 1 ; + grid-column: 1 / span 2; + } + + @include lg{ + grid-row: 1 ; + grid-column: 1 / span 2; + } + } + .item2 { + grid-row: 1; + grid-column: 2; + + @include xl{ + grid-row: 2; + grid-column: 1; + } + @include lg{ + grid-row: 2; + grid-column: 1; + } + } + .item3 { + grid-row: 1; + grid-column: 3; + + @include xl{ + grid-row: 2; + grid-column: 2; + } + @include lg{ + grid-row: 2; + grid-column: 2; + } + } + + .item4 { + grid-row: 2; + grid-column: 2; + + @include xl{ + grid-row: 3; + grid-column: 1; + } + @include lg{ + grid-row: 3; + grid-column: 1; + } + } + .item5 { + grid-row: 2; + grid-column: 3; + + @include xl{ + grid-row: 3; + grid-column: 2; + } + @include lg{ + grid-row: 3; + grid-column: 2; + } + } + } +} + + diff --git a/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-articles-section/CardSection/CardSection.tsx b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-articles-section/CardSection/CardSection.tsx new file mode 100644 index 000000000..61f883a0c --- /dev/null +++ b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-articles-section/CardSection/CardSection.tsx @@ -0,0 +1,62 @@ +import { ContentfulClientApi, createClient } from 'contentful' +import { FC, useEffect, useState } from 'react' + +import { ArticleCard } from '../ArticleCard' +import { getBlog } from '../Articles' +import { ArticlesUrl, defaultBlogs } from '../articles.config' +import { ArticleType, BlogPost, ThriveArticle } from '../models' + +import styles from './CardSection.module.scss' + +const CardSection: FC = () => { + const [articles, setArticles]: [ + Array, + React.Dispatch>> + ] = useState>([]) + + useEffect(() => { + const client: ContentfulClientApi = createClient({ + accessToken: process.env.REACT_APP_CONTENTFUL_EDU_CDN_API_KEY ?? '', + space: process.env.REACT_APP_CONTENTFUL_EDU_SPACE_ID ?? '', + }) + Promise.all( + ArticlesUrl.map(async (articleUrl, idx) => { + switch (articleUrl.type) { + case ArticleType.Thrive: + const response: { fields: ThriveArticle } = + await client.getEntry(articleUrl.url) + return response.fields + case ArticleType.Blog: + const blog: BlogPost = + (await getBlog(articleUrl.url)) ?? + defaultBlogs[idx] + return blog + } + }) + ).then((arr) => setArticles(arr)) + }, []) + + const articleStyles: Array = [ + styles.mainItem, + styles.item2, + styles.item3, + styles.item4, + styles.item5, + ] + + return ( +
+
+ {articles.map((article, index) => ( + + ))} +
+
+ ) +} + +export default CardSection diff --git a/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-articles-section/CardSection/index.tsx b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-articles-section/CardSection/index.tsx new file mode 100644 index 000000000..7fbf1e523 --- /dev/null +++ b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-articles-section/CardSection/index.tsx @@ -0,0 +1 @@ +export { default as CardSection } from './CardSection' diff --git a/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-articles-section/DevCenterArticlesSection.module.scss b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-articles-section/DevCenterArticlesSection.module.scss new file mode 100644 index 000000000..d1f561e98 --- /dev/null +++ b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-articles-section/DevCenterArticlesSection.module.scss @@ -0,0 +1,26 @@ +@import '../../../../../../lib/styles/includes'; + +.container { + background-color: $black-5; + width: 100%; + height: fit-content; + padding: 80px 0px; + margin-top: 64px; + + @include ltemd { + padding: 40px 0px; + } + + .title { + @include font-black-100; + font-weight: 500; + font-size: 44px; + line-height: 44px; + margin-bottom: $space-xxxxl; + + @include ltemd { + font-size: 27px; + line-height: 28px; + } + } +} diff --git a/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-articles-section/DevCenterArticlesSection.tsx b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-articles-section/DevCenterArticlesSection.tsx new file mode 100644 index 000000000..477ec7cf2 --- /dev/null +++ b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-articles-section/DevCenterArticlesSection.tsx @@ -0,0 +1,19 @@ +import { FC } from 'react' + +import { ContentLayout } from '../../../../../../lib' + +import { CardSection } from './CardSection' +import styles from './DevCenterArticlesSection.module.scss' + +const DevCenterArticlesection: FC = () => { + return ( +
+ +

Success Stories And Articles

+ +
+
+ ) +} + +export default DevCenterArticlesection diff --git a/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-articles-section/articles.config.ts b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-articles-section/articles.config.ts new file mode 100644 index 000000000..f23128596 --- /dev/null +++ b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-articles-section/articles.config.ts @@ -0,0 +1,82 @@ +import { EnvironmentConfig } from '../../../../../../config' + +import { ArticleEntry, ArticleType, BlogPost } from './models' + +/** + * This array defiens which thirive articles and blog pasts should be shown. + * The first element in the array will be the main article. + * For Thrive Articles, the url should be the Contentful ID. + * For Blog Posts, the url is the url linking to the post on topcoder.com + * Example + * { + * type: ArticleType.Blog, + * url: `${EnvironmentConfig.TOPCODER_URLS.BLOG_PAGE}/talent-as-a-service-taas-a-brilliant-solution-to-the-talent-gap/`, + * } + * { + * type: ArticleType.Thrive, + * url: '6KP9iCELCsLWTSWirplWs2', + * } + */ +export const ArticlesUrl: Array = [ + { + type: ArticleType.Thrive, + url: '6KP9iCELCsLWTSWirplWs2', + }, + { + type: ArticleType.Thrive, + url: '1afUuuZVt1JI14iRkAIqba', + }, + { + type: ArticleType.Thrive, + url: 'puRqAymWv7hjjyHyunGK2', + }, + { + type: ArticleType.Thrive, + url: '6yZJ8xSYTEqVJhMeQyA7BA', + }, + { + type: ArticleType.Thrive, + url: '3QOvaHaSxjF26owDurtfKZ', + }, +] + +/** + * This array contains the default blog posts to be shown if the ones specified above are not available. + */ +export const defaultBlogs: Array = [ + { + contentSnippet: 'In light of the incredible speed of innovation, specialized tech talent has never been more critical to business success. Yet access to that talent remains frustratingly difficult for many companies. According to the Society for Human Resources Management, 83% of businesses are having trouble recruiting suitable candidates for their open positions, particularly when it comes […]\nThe post Talent as a Service (TaaS): A Brilliant Solution to the Talent Gap appeared first on Topcoder.', + creator: 'Kiran Hampapura', + featuredImage: `${EnvironmentConfig.TOPCODER_URLS.WP_CONTENT}/uploads/2019/11/taashero.jpg`, + link: `${EnvironmentConfig.TOPCODER_URLS.BLOG_PAGE}/talent-as-a-service-taas-a-brilliant-solution-to-the-talent-gap/`, + title: 'Talent as a Service (TaaS): A Brilliant Solution to the Talent Gap', + }, + { + contentSnippet: 'Can our Topcoder accounts be hacked? Can our well-earned cash be stolen away through the platform? Can customers suffer from intellectual theft? These sensitive questions belong to a discussion on a beyond-interesting topic: security. Honoring Topcoder’s security themed month, we want to raise awareness on what cyber security means for members and customers. We turned […]\nThe post Securing A Safe Work System For Members And Customers With John Wheeler - The Topcoder Nation Show #18 appeared first on Topcoder.', + creator: 'mahestro', + featuredImage: `${EnvironmentConfig.TOPCODER_URLS.WP_CONTENT}/uploads/2022/07/00-tcn-show-18-john-wheeler.png`, + link: `${EnvironmentConfig.TOPCODER_URLS.BLOG_PAGE}/securing-a-safe-work-system-for-members-and-customers-with-john-wheeler-the-topcoder-nation-show-18/`, + title: 'Securing A Safe Work System For Members And Customers With John Wheeler – The Topcoder Nation Show #18', + }, + { + contentSnippet: 'Job opportunities, upskilling, and mentoring are traits that identify the endeavor that this young gentleman is leading in Africa. Meet Abiodun (), born and raised in Lagos; he aims to close the gap between the tech talent in his region and opportunities, leveraging Topcoder as a medium to make it happen. Abiodun loves live music […]\nThe post Building A Tech Community In Africa With Code_Abbey – The Topcoder Nation Show #17 appeared first on Topcoder.', + creator: 'mahestro', + featuredImage: `${EnvironmentConfig.TOPCODER_URLS.WP_CONTENT}/uploads/2022/06/00-tcn-show-17-code_abby-and-gigs-in-africa.png`, + link: `${EnvironmentConfig.TOPCODER_URLS.BLOG_PAGE}/building-a-tech-community-in-africa-with-code_abbey-the-topcoder-nation-show-17/`, + title: 'Building A Tech Community In Africa With Code_Abbey – The Topcoder Nation Show #17', + }, + { + contentSnippet: 'CellPhoneService We just need to do the calculations described in the statement. One part of the calculations that may be tricky for beginners is the fee per each started minute of a call. If we have a call that takes S seconds, the number of minutes we’ll paying for can be computed by dividing S […]\nThe post Single Round Match 833 Editorials appeared first on Topcoder.', + creator: 'misof', + featuredImage: `${EnvironmentConfig.TOPCODER_URLS.WP_CONTENT}/uploads/2017/04/SRM_Blog.png`, + link: `${EnvironmentConfig.TOPCODER_URLS.BLOG_PAGE}/single-round-match-833-editorials/`, + title: 'Single Round Match 833 Editorials', + }, + { + contentSnippet: 'TwoDimensionalSort Imagine that we label rows of the board A to Z from top to bottom. If we got each rook X into its row X, the board would surely be sorted. With N rooks we can always achieve that in at most 2*N moves. In the first N moves we’ll move some rooks horizontally […]\nThe post TCO22 Round 3 Editorial appeared first on Topcoder.', + creator: 'misof', + featuredImage: `${EnvironmentConfig.TOPCODER_URLS.WP_CONTENT}/uploads/2017/04/SRM_Blog.png`, + link: `${EnvironmentConfig.TOPCODER_URLS.BLOG_PAGE}/tco22-round-3-editorial/`, + title: 'TCO22 Round 3 Editorial', + }, +] diff --git a/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-articles-section/index.tsx b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-articles-section/index.tsx new file mode 100644 index 000000000..14d02b39b --- /dev/null +++ b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-articles-section/index.tsx @@ -0,0 +1 @@ +export { default as DevCenterArticlesection } from './DevCenterArticlesSection' diff --git a/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-articles-section/models/articleentry.model.ts b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-articles-section/models/articleentry.model.ts new file mode 100644 index 000000000..56d91937a --- /dev/null +++ b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-articles-section/models/articleentry.model.ts @@ -0,0 +1,10 @@ +/** The type of the objects used to specy which articles should be shown inside articles.config.ts */ +export interface ArticleEntry { + type: ArticleType, + url: string, +} + +export enum ArticleType { + Blog = 'blog', + Thrive = 'thrive', +} diff --git a/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-articles-section/models/blogpost.model.ts b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-articles-section/models/blogpost.model.ts new file mode 100644 index 000000000..69d249f4a --- /dev/null +++ b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-articles-section/models/blogpost.model.ts @@ -0,0 +1,8 @@ +/** The type of the blog post retrieved from the api */ +export interface BlogPost { + contentSnippet: string + creator: string + featuredImage: string + link: string + title: string +} diff --git a/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-articles-section/models/index.ts b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-articles-section/models/index.ts new file mode 100644 index 000000000..e612c6a52 --- /dev/null +++ b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-articles-section/models/index.ts @@ -0,0 +1,3 @@ +export * from './articleentry.model' +export * from './blogpost.model' +export * from './thrivearticle.model' diff --git a/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-articles-section/models/thrivearticle.model.ts b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-articles-section/models/thrivearticle.model.ts new file mode 100644 index 000000000..47e84b5d4 --- /dev/null +++ b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-articles-section/models/thrivearticle.model.ts @@ -0,0 +1,10 @@ +/** The type of the Thrive Articles retrieved from Contentful */ +export interface ThriveArticle { + content: string + contentAuthor: Array<{ fields: { name: string; }; }> + featuredImage: { fields: { file: { url: string; }; title: string; }; } + readTime: string + slug: string + title: string + type?: string +} diff --git a/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-card/DevCenterCard.module.scss b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-card/DevCenterCard.module.scss new file mode 100644 index 000000000..f13b28ca3 --- /dev/null +++ b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-card/DevCenterCard.module.scss @@ -0,0 +1,59 @@ +@import '../../../../../../lib/styles/includes'; + +.card { + background-color: $black-5; + width: 100%; + position: relative; + border-radius: 8px; + overflow: hidden; + + .cornerImage { + position: absolute; + top: 0px; + right: 0px; + opacity: 0.1; + } + + .cardContainer { + margin-left: $space-xxxl; + margin-top: $space-xxxl; + margin-bottom: $space-xl; + display: flex; + flex-direction: row; + gap: $space-lg; + + + @include ltemd { + margin-top: $space-xl; + margin-left: $space-xl; + gap: 14px; + } + + .titleSection { + display: flex; + flex-direction: column; + + .title { + font-size: 32px; + line-height: 34px; + @include font-weight-medium; + + margin-bottom: $space-sm; + + @include ltemd { + font-size: 22px; + line-height: 24px; + } + } + + .summary { + margin-bottom: $space-lg; + + @include ltemd { + font-size: 14px; + line-height: 20px; + } + } + } + } +} \ No newline at end of file diff --git a/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-card/DevCenterCard.tsx b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-card/DevCenterCard.tsx new file mode 100644 index 000000000..8fb46f93f --- /dev/null +++ b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-card/DevCenterCard.tsx @@ -0,0 +1,34 @@ +import classNames from 'classnames' +import { FC } from 'react' + +import styles from './DevCenterCard.module.scss' + +interface DevCenterCardProps { + button?: any + className?: string + cornerIcon: any + description: string + icon: any + title: string + titleClass: string +} + +const DevCenterCard: FC = ({ icon, cornerIcon, title, titleClass, description, button, className= '' }) => { + + return ( +
+
{cornerIcon}
+
+ {icon} +
+

{title}

+ {description} + {button && button} +
+
+ +
+ ) +} + +export default DevCenterCard diff --git a/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-card/index.tsx b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-card/index.tsx new file mode 100644 index 000000000..07368b6e7 --- /dev/null +++ b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-card/index.tsx @@ -0,0 +1 @@ +export { default as DevCenterCard } from './DevCenterCard' diff --git a/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-get-started/DevCenterGetStarted.module.scss b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-get-started/DevCenterGetStarted.module.scss new file mode 100644 index 000000000..e673bc8f9 --- /dev/null +++ b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-get-started/DevCenterGetStarted.module.scss @@ -0,0 +1,13 @@ +@import '../../../../../../lib/styles/includes'; + +.title { + @include font-black-100; + font-weight: 500; + font-size: 44px; + line-height: 44px; + + @include ltemd { + font-size: 27px; + line-height: 28px; + } +} diff --git a/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-get-started/DevCenterGetStarted.tsx b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-get-started/DevCenterGetStarted.tsx new file mode 100644 index 000000000..e8af5157e --- /dev/null +++ b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-get-started/DevCenterGetStarted.tsx @@ -0,0 +1,17 @@ +import { FC } from 'react' + +import { ContentLayout } from '../../../../../../lib' + +import styles from './DevCenterGetStarted.module.scss' +import { GetStartedCardsContainer } from './GetStartedCardsContainer' + +const DevCenterGetStarted: FC = () => { + return ( + +

Getting Started

+ +
+ ) +} + +export default DevCenterGetStarted diff --git a/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-get-started/GetStartedCardsContainer/GetStartedCardsContainer.module.scss b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-get-started/GetStartedCardsContainer/GetStartedCardsContainer.module.scss new file mode 100644 index 000000000..33dc5923f --- /dev/null +++ b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-get-started/GetStartedCardsContainer/GetStartedCardsContainer.module.scss @@ -0,0 +1,38 @@ +@import '../../../../../../../lib/styles/includes'; + +.container { + display: flex; + flex-direction: row; + justify-content: center; + margin-top: $space-xxxxl; + gap: $space-xxxxl; + + @include ltemd { + flex-direction: column; + align-items: center; + margin-top: $space-xxl; + } + + .communityTitle { + background: $tc-grad15; + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; + } + + .apiTitle { + background: $tc-grad14; + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; + } + + .comingSoon { + color: $blue-140; + } + + .button { + width: 125px; + } +} + diff --git a/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-get-started/GetStartedCardsContainer/GetStartedCardsContainer.tsx b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-get-started/GetStartedCardsContainer/GetStartedCardsContainer.tsx new file mode 100644 index 000000000..b16310abf --- /dev/null +++ b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-get-started/GetStartedCardsContainer/GetStartedCardsContainer.tsx @@ -0,0 +1,32 @@ +import { FC } from 'react' + +import { Button } from '../../../../../../../lib' +import { ApiCornerIcon, ApiIcon, CommunityAppCornerIcon, CommunityAppIcon } from '../../../../../assets/i' +import { DevCenterCard } from '../../dev-center-card' + +import styles from './GetStartedCardsContainer.module.scss' + +const GetStartedCardsContainer: FC = () => { + return ( +
+ } + icon={} + title ='Community App' + titleClass={styles.communityTitle} + description='Learn about Topcoder Community App and run started code.' + button={
+ ) +} + +export default GetStartedCardsContainer diff --git a/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-get-started/GetStartedCardsContainer/index.tsx b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-get-started/GetStartedCardsContainer/index.tsx new file mode 100644 index 000000000..046aded7b --- /dev/null +++ b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-get-started/GetStartedCardsContainer/index.tsx @@ -0,0 +1 @@ +export { default as GetStartedCardsContainer } from './GetStartedCardsContainer' diff --git a/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-get-started/index.tsx b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-get-started/index.tsx new file mode 100644 index 000000000..7d7e5a09a --- /dev/null +++ b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-get-started/index.tsx @@ -0,0 +1 @@ +export { default as DevCenterGetStarted } from './DevCenterGetStarted' diff --git a/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-header/DevCenterCarousel/DevCenterCarousel.module.scss b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-header/DevCenterCarousel/DevCenterCarousel.module.scss new file mode 100644 index 000000000..fe502f57e --- /dev/null +++ b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-header/DevCenterCarousel/DevCenterCarousel.module.scss @@ -0,0 +1,16 @@ +@import '../../../../../../../lib/styles/includes'; + +.container { + background: $black-5; + width: 624px; + border-radius: 8px; + overflow: hidden; + + @include md { + width: 100%; + } + + @include ltesm { + width: 100%; + } +} diff --git a/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-header/DevCenterCarousel/DevCenterCarousel.tsx b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-header/DevCenterCarousel/DevCenterCarousel.tsx new file mode 100644 index 000000000..36c4f11a3 --- /dev/null +++ b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-header/DevCenterCarousel/DevCenterCarousel.tsx @@ -0,0 +1,24 @@ +import { FC } from 'react' +import Carousel from 'react-elastic-carousel' + +import { CarouselContent } from '../carousel-content.config' +import { DevCenterCarouselItem } from '../DevCenterCarouselItem' + +import './carouselStyle.css' +import styles from './DevCenterCarousel.module.scss' + +const DevCenterCarousel: FC = () => { + return ( +
+ + {CarouselContent.map((item, key) => )} + +
+ ) +} + +export default DevCenterCarousel diff --git a/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-header/DevCenterCarousel/carouselStyle.css b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-header/DevCenterCarousel/carouselStyle.css new file mode 100644 index 000000000..ec326ee00 --- /dev/null +++ b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-header/DevCenterCarousel/carouselStyle.css @@ -0,0 +1,29 @@ +button.rec-dot{ + box-shadow: none; + background-color: #AAAAAA; + width: 12px; + height: 12px; +} + +button.rec-dot:hover, button.rec-dot:active, button.rec-dot:focus, button.rec-dot_active { + border: 2.2px solid #06D6A0; + background-color: transparent; + box-shadow: none; + width: 18px; + height: 18px; +} + +.rec .rec-slider-container{ + width: 100%; + margin: 0; +} + +.rec .rec-item-wrapper { + padding: 0; +} + +.rec .rec-pagination { + align-items: center; + margin-bottom: 24px; + min-height: 30px; +} diff --git a/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-header/DevCenterCarousel/index.tsx b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-header/DevCenterCarousel/index.tsx new file mode 100644 index 000000000..d71748fa1 --- /dev/null +++ b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-header/DevCenterCarousel/index.tsx @@ -0,0 +1 @@ +export { default as DevCenterCarousel } from './DevCenterCarousel' diff --git a/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-header/DevCenterCarouselItem/DevCenterCarouselItem.module.scss b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-header/DevCenterCarouselItem/DevCenterCarouselItem.module.scss new file mode 100644 index 000000000..0bade3403 --- /dev/null +++ b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-header/DevCenterCarouselItem/DevCenterCarouselItem.module.scss @@ -0,0 +1,38 @@ +@import '../../../../../../../lib/styles/includes'; + +.card { + padding-left: $space-xxl; + padding-right: $space-xxl; + width: 100%; + + @include ltemd { + padding-left: $space-lg; + padding-right: $space-lg; + } + + .titleContainer{ + margin-top: $space-xxxxl; + + @include ltemd { + margin-top: $space-xxl; + } + + .headline { + font-weight: 500; + font-size: 26px; + + text-align: left; + margin-bottom: $space-xs; + } + + .summary { + text-align: left; + display: block; + } + } + + .image { + margin-top: $space-xxl; + pointer-events: none; + } +} diff --git a/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-header/DevCenterCarouselItem/DevCenterCarouselItem.tsx b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-header/DevCenterCarouselItem/DevCenterCarouselItem.tsx new file mode 100644 index 000000000..ac6b67ffe --- /dev/null +++ b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-header/DevCenterCarouselItem/DevCenterCarouselItem.tsx @@ -0,0 +1,22 @@ +import classNames from 'classnames' +import React, {FC} from 'react' + +import { DevCenterTag } from '../../dev-center-tag' +import { CarouselItem } from '../carousel-content.config' + +import styles from './DevCenterCarouselItem.module.scss' + +const DevCenterCarouselItem: FC<{ item: CarouselItem }> = ({item}) => { + return ( +
+
+ {item.isNewFeature && } +

{item.headline}

+ {item.summary} +
+ +
+ ) +} + +export default DevCenterCarouselItem diff --git a/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-header/DevCenterCarouselItem/index.tsx b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-header/DevCenterCarouselItem/index.tsx new file mode 100644 index 000000000..a3575ed8a --- /dev/null +++ b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-header/DevCenterCarouselItem/index.tsx @@ -0,0 +1 @@ +export {default as DevCenterCarouselItem} from './DevCenterCarouselItem' diff --git a/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-header/DevCenterHeader.module.scss b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-header/DevCenterHeader.module.scss new file mode 100644 index 000000000..a65eeb536 --- /dev/null +++ b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-header/DevCenterHeader.module.scss @@ -0,0 +1,70 @@ +@import '../../../../../../lib/styles/includes'; + +.outerContainer { + width: 100%; + min-height: 535px; + background-image: url("Header BG.png"); + background-size: 100% 535px; + background-repeat: no-repeat; + + @include ltemd { + background-size: 100% 400px; + } + + .innerContainer { + display: flex; + width: 100%; + justify-content: space-evenly; + + @include lg { + flex-direction: column; + align-items: center; + margin-bottom: 32px; + + } + + @include ltemd { + flex-direction: column; + align-items: center; + + margin-bottom: 32px; + } + + .leftContent { + + .title { + @include font-tc-white; + font-size: 80px; + line-height: 72px; + padding-top: 88px; + + @include ltemd { + font-size: 42px; + line-height: 40px; + padding-top: $space-xxl; + } + } + + .subtitle { + margin-top: $space-xxl; + display: block; + @include font-tc-white; + line-height: 20px; + letter-spacing: 0.5px; + text-transform: capitalize; + @include font-weight-medium; + } + } + + .rightContent { + margin-top: $space-xxxxl; + + @include ltemd { + text-align: center; + align-items: center; + width: 100%; + } + } + } +} + diff --git a/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-header/DevCenterHeader.tsx b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-header/DevCenterHeader.tsx new file mode 100644 index 000000000..3cdbd0921 --- /dev/null +++ b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-header/DevCenterHeader.tsx @@ -0,0 +1,29 @@ +import classNames from 'classnames' +import { FC } from 'react' + +import { ContentLayout } from '../../../../../../lib' + +import DevCenterCarousel from './DevCenterCarousel/DevCenterCarousel' +import styles from './DevCenterHeader.module.scss' + +const DevCenterHeader: FC<{}> = () => { + return ( +
+ +
+
+

+ TopCoder
+ Developer Center +

+ Let's build together with millions of Topcoder developers around the world. +
+
+ +
+
+
+
) +} + +export default DevCenterHeader diff --git a/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-header/Header BG.png b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-header/Header BG.png new file mode 100644 index 000000000..ae4b95c4b Binary files /dev/null and b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-header/Header BG.png differ diff --git a/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-header/carousel-content.config.ts b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-header/carousel-content.config.ts new file mode 100644 index 000000000..969ee18c3 --- /dev/null +++ b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-header/carousel-content.config.ts @@ -0,0 +1,28 @@ +import CodeImage from '../../../../carousel-images/Code.png' + +/** + * This is the interface implemented by the data + * of every item in the Carousel + */ +export interface CarouselItem { + headline: string + image: string + isNewFeature?: boolean + summary: string +} + +/** + * Each item in the array represent a screen of the carousel and should contain: + * - headline: the title of the screen + * - summary: a short description of what is represented in this screen + * - image: the link to the image to be shown in this screen + * - isNewFeature: true if the screen should have the "NEW FEATURE" tag, false otherwise + */ +export const CarouselContent: Array = [ + { + headline: 'Introducing new feature: API Explorer (Coming soon)', + image: CodeImage, + isNewFeature: true, + summary: 'Now You Can Try Topcoder API Methods Without Writing Code.', + }, + ] diff --git a/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-header/index.tsx b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-header/index.tsx new file mode 100644 index 000000000..d9a2d51dc --- /dev/null +++ b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-header/index.tsx @@ -0,0 +1 @@ +export { default as DevCenterHeader } from './DevCenterHeader' diff --git a/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-tag/DevCenterTag.module.scss b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-tag/DevCenterTag.module.scss new file mode 100644 index 000000000..90e52f2f1 --- /dev/null +++ b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-tag/DevCenterTag.module.scss @@ -0,0 +1,19 @@ +@import '../../../../../../lib/styles/includes'; + +.tag { + background-color: $green-140; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + padding: 3px 3px; + + width: fit-content; + height: 16px; + + border-radius: 2px; + + .text { + @include font-weight-medium; + } +} diff --git a/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-tag/DevCenterTag.tsx b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-tag/DevCenterTag.tsx new file mode 100644 index 000000000..07baa5394 --- /dev/null +++ b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-tag/DevCenterTag.tsx @@ -0,0 +1,18 @@ +import classNames from 'classnames' +import { FC } from 'react' + +import styles from './DevCenterTag.module.scss' + +interface TagProps { + text: string +} + +const DevCenterTag: FC = ({ text }) => { + return ( +
+ {text} +
+ ) +} + +export default DevCenterTag diff --git a/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-tag/index.tsx b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-tag/index.tsx new file mode 100644 index 000000000..b421408d9 --- /dev/null +++ b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-tag/index.tsx @@ -0,0 +1 @@ +export { default as DevCenterTag } from './DevCenterTag' diff --git a/src-ts/tools/dev-center/dev-center.routes.tsx b/src-ts/tools/dev-center/dev-center.routes.tsx new file mode 100644 index 000000000..db049250a --- /dev/null +++ b/src-ts/tools/dev-center/dev-center.routes.tsx @@ -0,0 +1,24 @@ +import { PlatformRoute } from '../../lib' + +import GettingStartedGuide from './dev-center-pages/community-app/getting-started/GettingStartedGuide' +import DevCenterLandingPage from './dev-center-pages/community-app/landing-page/DevCenterLandingPage' +import DevCenter, { toolTitle } from './DevCenter' + +export const devCenterRoutes: Array = [ + { + children: [ + { + element: , + route: '/getting-started', + }, + { + element: , + route: '/', + }, + ], + element: , + memberOnly: true, + route: '/dev-center', + title: toolTitle, + }, +] diff --git a/src-ts/tools/dev-center/images/ChallengeListing.png b/src-ts/tools/dev-center/images/ChallengeListing.png new file mode 100644 index 000000000..4202c237a Binary files /dev/null and b/src-ts/tools/dev-center/images/ChallengeListing.png differ diff --git a/src-ts/tools/dev-center/images/Git1.png b/src-ts/tools/dev-center/images/Git1.png new file mode 100644 index 000000000..90a6e4c2d Binary files /dev/null and b/src-ts/tools/dev-center/images/Git1.png differ diff --git a/src-ts/tools/dev-center/images/InitialLoginInChrome.png b/src-ts/tools/dev-center/images/InitialLoginInChrome.png new file mode 100755 index 000000000..12265b0a2 Binary files /dev/null and b/src-ts/tools/dev-center/images/InitialLoginInChrome.png differ diff --git a/src-ts/tools/dev-center/images/PrivateConnectionWarning.png b/src-ts/tools/dev-center/images/PrivateConnectionWarning.png new file mode 100644 index 000000000..310a88318 Binary files /dev/null and b/src-ts/tools/dev-center/images/PrivateConnectionWarning.png differ diff --git a/src-ts/tools/dev-center/images/Python1.png b/src-ts/tools/dev-center/images/Python1.png new file mode 100644 index 000000000..16f5ca355 Binary files /dev/null and b/src-ts/tools/dev-center/images/Python1.png differ diff --git a/src-ts/tools/dev-center/images/SuccessfulLogin.png b/src-ts/tools/dev-center/images/SuccessfulLogin.png new file mode 100644 index 000000000..d39e2f085 Binary files /dev/null and b/src-ts/tools/dev-center/images/SuccessfulLogin.png differ diff --git a/src-ts/tools/dev-center/images/VSCode1.png b/src-ts/tools/dev-center/images/VSCode1.png new file mode 100755 index 000000000..090403c1c Binary files /dev/null and b/src-ts/tools/dev-center/images/VSCode1.png differ diff --git a/src-ts/tools/dev-center/images/VSCommunity0.png b/src-ts/tools/dev-center/images/VSCommunity0.png new file mode 100644 index 000000000..fe973857d Binary files /dev/null and b/src-ts/tools/dev-center/images/VSCommunity0.png differ diff --git a/src-ts/tools/dev-center/images/XCode1.png b/src-ts/tools/dev-center/images/XCode1.png new file mode 100755 index 000000000..9e5ce1495 Binary files /dev/null and b/src-ts/tools/dev-center/images/XCode1.png differ diff --git a/src-ts/tools/dev-center/images/XCode2.png b/src-ts/tools/dev-center/images/XCode2.png new file mode 100755 index 000000000..994838b29 Binary files /dev/null and b/src-ts/tools/dev-center/images/XCode2.png differ diff --git a/src-ts/tools/dev-center/index.ts b/src-ts/tools/dev-center/index.ts new file mode 100644 index 000000000..c2175953e --- /dev/null +++ b/src-ts/tools/dev-center/index.ts @@ -0,0 +1 @@ +export * from './dev-center.routes' diff --git a/src-ts/tools/dev-center/styles/_variables.scss b/src-ts/tools/dev-center/styles/_variables.scss new file mode 100644 index 000000000..a4ba615cd --- /dev/null +++ b/src-ts/tools/dev-center/styles/_variables.scss @@ -0,0 +1,3 @@ +@import "../../../lib/styles/includes"; + +$side-nav-width: 353px; diff --git a/src-ts/tools/gamification-admin/GamificationAdmin.tsx b/src-ts/tools/gamification-admin/GamificationAdmin.tsx new file mode 100644 index 000000000..860b2c3ae --- /dev/null +++ b/src-ts/tools/gamification-admin/GamificationAdmin.tsx @@ -0,0 +1,25 @@ +import { FC, useContext } from 'react' +import { Outlet, Routes } from 'react-router-dom' + +import { + routeContext, + RouteContextData, +} from '../../lib' + +export const toolTitle: string = 'Gamification Admin' + +const GamificationAdmin: FC<{}> = () => { + + const { getChildRoutes }: RouteContextData = useContext(routeContext) + + return ( + <> + + + {getChildRoutes(toolTitle)} + + + ) +} + +export default GamificationAdmin diff --git a/src-ts/tools/gamification-admin/gamification-admin.routes.tsx b/src-ts/tools/gamification-admin/gamification-admin.routes.tsx new file mode 100644 index 000000000..5b8a60acd --- /dev/null +++ b/src-ts/tools/gamification-admin/gamification-admin.routes.tsx @@ -0,0 +1,34 @@ +import { PlatformRoute, UserRole } from '../../lib' + +import GamificationAdmin, { toolTitle } from './GamificationAdmin' +import BadgeDetailPage from './pages/badge-detail/BadgeDetailPage' +import BadgeListingPage from './pages/badge-listing/BadgeListingPage' +import CreateBadgePage from './pages/create-badge/CreateBadgePage' + +export const baseUrl: string = '/gamification-admin' +export const rolesRequired: Array = [UserRole.gamificationAdmin] + +export const gamificationAdminRoutes: Array = [ + { + authRequired: true, + children: [ + { + element: , + route: '/', + }, + { + element: , + route: '/create-badge', + }, + { + element: , + route: '/badge-detail', + }, + ], + element: , + hidden: true, + rolesRequired, + route: baseUrl, + title: toolTitle, + }, +] diff --git a/src-ts/tools/gamification-admin/index.ts b/src-ts/tools/gamification-admin/index.ts new file mode 100644 index 000000000..0c0f156bc --- /dev/null +++ b/src-ts/tools/gamification-admin/index.ts @@ -0,0 +1 @@ +export * from './gamification-admin.routes' diff --git a/src-ts/tools/gamification-admin/pages/badge-detail/BadgeDetailPage.module.scss b/src-ts/tools/gamification-admin/pages/badge-detail/BadgeDetailPage.module.scss new file mode 100644 index 000000000..7da13b030 --- /dev/null +++ b/src-ts/tools/gamification-admin/pages/badge-detail/BadgeDetailPage.module.scss @@ -0,0 +1,17 @@ +.contentLayout { + width: 100%; + padding-bottom: 0; + + .contentLayout-outer { + width: 100%; + + .contentLayout-inner { + width: 100%; + overflow: visible; + } + } +} + +.container { + display: flex; +} diff --git a/src-ts/tools/gamification-admin/pages/badge-detail/BadgeDetailPage.tsx b/src-ts/tools/gamification-admin/pages/badge-detail/BadgeDetailPage.tsx new file mode 100644 index 000000000..4923e6c95 --- /dev/null +++ b/src-ts/tools/gamification-admin/pages/badge-detail/BadgeDetailPage.tsx @@ -0,0 +1,30 @@ +import { FC, useMemo } from 'react' + +import { Breadcrumb, BreadcrumbItemModel, ContentLayout } from '../../../../lib' +import { baseUrl } from '../../gamification-admin.routes' +import { toolTitle } from '../../GamificationAdmin' + +import styles from './BadgeDetailPage.module.scss' + +const BadgeDetailPage: FC = () => { + const breadcrumb: Array = useMemo(() => [ + { name: toolTitle, url: baseUrl }, + { name: 'badge detail', url: '#' }, + ], []) + + return ( + + +
+ +
+
+ ) +} + +export default BadgeDetailPage diff --git a/src-ts/tools/gamification-admin/pages/badge-listing/BadgeListingPage.module.scss b/src-ts/tools/gamification-admin/pages/badge-listing/BadgeListingPage.module.scss new file mode 100644 index 000000000..7da13b030 --- /dev/null +++ b/src-ts/tools/gamification-admin/pages/badge-listing/BadgeListingPage.module.scss @@ -0,0 +1,17 @@ +.contentLayout { + width: 100%; + padding-bottom: 0; + + .contentLayout-outer { + width: 100%; + + .contentLayout-inner { + width: 100%; + overflow: visible; + } + } +} + +.container { + display: flex; +} diff --git a/src-ts/tools/gamification-admin/pages/badge-listing/BadgeListingPage.tsx b/src-ts/tools/gamification-admin/pages/badge-listing/BadgeListingPage.tsx new file mode 100644 index 000000000..04fca91ee --- /dev/null +++ b/src-ts/tools/gamification-admin/pages/badge-listing/BadgeListingPage.tsx @@ -0,0 +1,23 @@ +import { FC } from 'react' + +import { ContentLayout } from '../../../../lib' + +import styles from './BadgeListingPage.module.scss' + +const BadgeListingPage: FC = () => { + + return ( + +
+ +
+
+ ) +} + +export default BadgeListingPage diff --git a/src-ts/tools/gamification-admin/pages/create-badge/CreateBadgePage.module.scss b/src-ts/tools/gamification-admin/pages/create-badge/CreateBadgePage.module.scss new file mode 100644 index 000000000..7da13b030 --- /dev/null +++ b/src-ts/tools/gamification-admin/pages/create-badge/CreateBadgePage.module.scss @@ -0,0 +1,17 @@ +.contentLayout { + width: 100%; + padding-bottom: 0; + + .contentLayout-outer { + width: 100%; + + .contentLayout-inner { + width: 100%; + overflow: visible; + } + } +} + +.container { + display: flex; +} diff --git a/src-ts/tools/gamification-admin/pages/create-badge/CreateBadgePage.tsx b/src-ts/tools/gamification-admin/pages/create-badge/CreateBadgePage.tsx new file mode 100644 index 000000000..020b7f8eb --- /dev/null +++ b/src-ts/tools/gamification-admin/pages/create-badge/CreateBadgePage.tsx @@ -0,0 +1,30 @@ +import { FC, useMemo } from 'react' + +import { Breadcrumb, BreadcrumbItemModel, ContentLayout } from '../../../../lib' +import { baseUrl } from '../../gamification-admin.routes' +import { toolTitle } from '../../GamificationAdmin' + +import styles from './CreateBadgePage.module.scss' + +const CreateBadgePage: FC = () => { + const breadcrumb: Array = useMemo(() => [ + { name: toolTitle, url: baseUrl }, + { name: 'create badge', url: '#' }, + ], []) + + return ( + + +
+ +
+
+ ) +} + +export default CreateBadgePage diff --git a/src-ts/tools/index.ts b/src-ts/tools/index.ts index 365eba6ab..c4c7be5c9 100644 --- a/src-ts/tools/index.ts +++ b/src-ts/tools/index.ts @@ -6,6 +6,7 @@ export { default as toolsRoutes, } from './tools.routes' export { ChallengeMetadataName, dashboardRoute as routeRootCustomer, + messageGetUnreadCountAsync, workContext, WorkDetailDetails, WorkDetailDetailsPane, diff --git a/src-ts/tools/learn/README.md b/src-ts/tools/learn/README.md new file mode 100644 index 000000000..c29536baf --- /dev/null +++ b/src-ts/tools/learn/README.md @@ -0,0 +1,50 @@ +# Instructions for Running the Learn Tool Locally + +## Learn Config + +The Learn tool has its own configuration defined in the [/src-ts/tools/learn/learn-config](/src-ts/tools/learn/learn-config/learn.config.ts) directory. + +The default configuration expects both the FCC Client and API to be running locally. In most cases, developers probably won't want to run both locally. + +>**See** [/src-ts/tools/learn/learn-config/learn.bsouza.config.ts](/src-ts/tools/learn/learn-config/learn.bsouza.config.ts) for an example of how to override the FCC source URLs to use the dev env config. + +>**See** the [main app README](/README.md#personal-config) for instructions for creating a personal config. + +## Freecodecamp app + +Currently, the only provider we use is Freecodecamp (FCC). + +We run the FCC app seperately and embed it in an iframe in the Platform UI app. + +Repo: https://github.com/topcoder-platform/freeCodeCamp + +### Run FCC Locally + +FCC has a great README for setting up the app locally: https://github.com/topcoder-platform/freeCodeCamp/blob/dev/docs/how-to-setup-freecodecamp-locally.md. + +FCC uses the following ports: + +| APP | PORT | SSL PROXY | +| --- | ---- | --- | +| API | 3000 | 44311 | +| CLIENT | 8000 | 4431 | + +### Override Platform UI Port + +Platform UI runs on port 3000 by default, so you will need to override it so that it doesn't conflict with the FCC API. + +>**NOTE:** It's highly recommended that you use port 443 for convenience. + +>**See** [Main App README #local-ssl](/README.md#local-ssl) for more info about local SSL. + +>**See** [/ssl README](/ssl/README.md) for more info about self-signed certs. + +### Add Local FQDN to Hosts file + +In order to use passthrough authentication between the Platform UI and the FCC app, both apps need to use the same domain so they can read each other's cookies. + +So you'll need to add the following to your hosts file to use the `topcoder-dev.com` domain. + +``` +127.0.0.1 fcc.topcoder-dev.com +``` diff --git a/src-ts/tools/learn/course-certificate/certificate-view/CertificateView.module.scss b/src-ts/tools/learn/course-certificate/certificate-view/CertificateView.module.scss index 8e0777cc5..2a70f940c 100644 --- a/src-ts/tools/learn/course-certificate/certificate-view/CertificateView.module.scss +++ b/src-ts/tools/learn/course-certificate/certificate-view/CertificateView.module.scss @@ -1,8 +1,8 @@ @import '../../../../lib/styles/includes'; .wrap { - padding-top: $pad-xxxxl; - padding-bottom: calc($pad-xxxxl + $pad-xs); + padding-top: $space-xxxxl; + padding-bottom: calc($space-xxxxl + $space-xs); flex: 99 1 auto; display: flex; @@ -16,7 +16,7 @@ width: 100%; justify-content: center; - gap: $pad-xxxxl; + gap: $space-xxxxl; @include ltemd { flex-direction: column; @@ -29,7 +29,7 @@ flex-direction: column; align-items: center; - gap: $pad-sm; + gap: $space-sm; &:last-child { margin-top: auto; @@ -63,7 +63,7 @@ align-items: center; justify-content: center; - padding: $pad-sm; + padding: $space-sm; &:hover { background: transparent; diff --git a/src-ts/tools/learn/course-certificate/certificate-view/CertificateView.tsx b/src-ts/tools/learn/course-certificate/certificate-view/CertificateView.tsx index 465c19982..ead6c3bab 100644 --- a/src-ts/tools/learn/course-certificate/certificate-view/CertificateView.tsx +++ b/src-ts/tools/learn/course-certificate/certificate-view/CertificateView.tsx @@ -66,7 +66,11 @@ const CertificateView: FC = (props: CertificateViewProps) const { certification: certificate, ready: certificateReady, - }: AllCertificationsProviderData = useAllCertifications(props.provider, course?.certificationId) + }: AllCertificationsProviderData = useAllCertifications( + props.provider, + course?.certificationId, + {enabled: !!course?.certificationId} + ) const ready: boolean = useMemo(() => ( completedCertificateReady && courseReady && certificateReady @@ -142,7 +146,7 @@ const CertificateView: FC = (props: CertificateViewProps) <> - {readyAndCompletedCertification && ( + {ready && readyAndCompletedCertification && (
{!props.hideActions && ( diff --git a/src-ts/tools/learn/course-certificate/certificate-view/action-button/ActionButton.module.scss b/src-ts/tools/learn/course-certificate/certificate-view/action-button/ActionButton.module.scss index e962a416f..a80e1bf89 100644 --- a/src-ts/tools/learn/course-certificate/certificate-view/action-button/ActionButton.module.scss +++ b/src-ts/tools/learn/course-certificate/certificate-view/action-button/ActionButton.module.scss @@ -11,7 +11,7 @@ align-items: center; justify-content: center; - padding: $pad-sm; + padding: $space-sm; cursor: pointer; diff --git a/src-ts/tools/learn/course-certificate/certificate-view/certificate/Certificate.module.scss b/src-ts/tools/learn/course-certificate/certificate-view/certificate/Certificate.module.scss index f8086d64f..025b44e2b 100644 --- a/src-ts/tools/learn/course-certificate/certificate-view/certificate/Certificate.module.scss +++ b/src-ts/tools/learn/course-certificate/certificate-view/certificate/Certificate.module.scss @@ -8,7 +8,7 @@ .details { width: 55%; - padding: calc($pad-mx + $pad-lg); + padding: calc($space-mx + $space-lg); display: flex; flex-direction: column; @@ -23,7 +23,7 @@ font-size: 48px; line-height: 50px; color: $tc-black; - margin-top: $pad-sm; + margin-top: $space-sm; } h1 { @@ -78,13 +78,13 @@ } .username { - margin-top: calc($pad-mx + $pad-sm); + margin-top: calc($space-mx + $space-sm); } .tc-handle { color: $turq-140; - margin-top: $pad-xl; + margin-top: $space-xl; } .badges { @@ -131,7 +131,7 @@ .divider { width: $border; background: $black-10; - margin: 0 $pad-xxxxl; + margin: 0 $space-xxxxl; } .vendor { @@ -144,7 +144,7 @@ } .vendor-logo { - margin-top: $pad-sm; + margin-top: $space-sm; display: flex; justify-content: flex-end; diff --git a/src-ts/tools/learn/course-certificate/certificate-view/certificate/certificate-bg-pattern/CertificateBgPattern.tsx b/src-ts/tools/learn/course-certificate/certificate-view/certificate/certificate-bg-pattern/CertificateBgPattern.tsx index f1d2196b7..82fdb7c1a 100644 --- a/src-ts/tools/learn/course-certificate/certificate-view/certificate/certificate-bg-pattern/CertificateBgPattern.tsx +++ b/src-ts/tools/learn/course-certificate/certificate-view/certificate/certificate-bg-pattern/CertificateBgPattern.tsx @@ -1,10 +1,12 @@ import classNames from 'classnames' import { FC } from 'react' +import { LearnCertificateTrackType } from '../../../../learn-lib' + import styles from './CertificateBgPattern.module.scss' interface CertificateBgPatternProps { - type: 'QA'|'DEV'|'DATASCIENCE'|'DESIGN' + type: LearnCertificateTrackType } const CertificateBgPattern: FC = (props: CertificateBgPatternProps) => { diff --git a/src-ts/tools/learn/course-certificate/certificate-view/certificate/course-card/CourseCard.module.scss b/src-ts/tools/learn/course-certificate/certificate-view/certificate/course-card/CourseCard.module.scss index 502595bf2..f15f09a95 100644 --- a/src-ts/tools/learn/course-certificate/certificate-view/certificate/course-card/CourseCard.module.scss +++ b/src-ts/tools/learn/course-certificate/certificate-view/certificate/course-card/CourseCard.module.scss @@ -1,7 +1,7 @@ @import '../../../../../../lib/styles/includes'; .wrap { - border-radius: $pad-sm; + border-radius: $space-sm; width: 100%; width: 264px; background: rgba($tc-white, 0.12); @@ -22,21 +22,21 @@ } .course-title { - margin-top: $pad-lg; + margin-top: $space-lg; } .top-wrap { background: url(./wave-bg.png) 0 0 no-repeat; background-size: 264px 600px; - padding: $pad-xxl; + padding: $space-xxl; min-height: 264px; } .details { display: flex; align-items: center; - padding: $pad-xxl; - gap: calc($pad-sm + $border); + padding: $space-xxl; + gap: calc($space-sm + $border); svg { @include icon-xl; diff --git a/src-ts/tools/learn/course-completed/CourseCompletedPage.module.scss b/src-ts/tools/learn/course-completed/CourseCompletedPage.module.scss index cfad1aa06..b2509ea56 100755 --- a/src-ts/tools/learn/course-completed/CourseCompletedPage.module.scss +++ b/src-ts/tools/learn/course-completed/CourseCompletedPage.module.scss @@ -8,7 +8,7 @@ .main-wrap { height: calc($content-height - $breadcrumb-height); width: 100%; - margin-bottom: -$pad-lg; + margin-bottom: -$space-lg; background: $tc-white; display: flex; @@ -17,7 +17,7 @@ @include ltemd { flex-direction: column; - gap: $pad-lg; + gap: $space-lg; height: auto; } } @@ -27,7 +27,7 @@ display: flex; flex-direction: column; - padding-left: $pad-xxxxl; + padding-left: $space-xxxxl; overflow: auto; @include ltemd { @@ -36,7 +36,7 @@ } .content-wrap { - padding: $pad-mx 0 $pad-xxxxl; + padding: $space-mx 0 $space-xxxxl; position: relative; flex: 1; @include contentWidth; @@ -44,11 +44,11 @@ margin: 0 auto; p { - margin-top: $pad-xxl; + margin-top: $space-xxl; } :global(.body-large) { - margin-bottom: $pad-xxl; + margin-bottom: $space-xxl; } @include ltemd { @@ -59,8 +59,8 @@ .btns-wrap { display: flex; align-items: center; - gap: $pad-lg $pad-sm; - margin-top: $pad-xxl; + gap: $space-lg $space-sm; + margin-top: $space-xxl; flex-wrap: wrap; } diff --git a/src-ts/tools/learn/course-details/CourseDetailsPage.module.scss b/src-ts/tools/learn/course-details/CourseDetailsPage.module.scss index 888f729db..96aa7ad71 100644 --- a/src-ts/tools/learn/course-details/CourseDetailsPage.module.scss +++ b/src-ts/tools/learn/course-details/CourseDetailsPage.module.scss @@ -2,8 +2,8 @@ @import '../../../lib/styles/includes'; .wrap { - padding: $pad-mx 0 $pad-xxxxl; - gap: $pad-xxxxl; + padding: $space-mx 0 $space-xxxxl; + gap: $space-xxxxl; position: relative; flex: 1; @@ -36,7 +36,7 @@ flex: 1 1 auto; .text { @extend .body-main; - margin-top: $pad-xxl; + margin-top: $space-xxl; } } @@ -45,20 +45,20 @@ flex: 1 1 auto; .text { @extend .body-main; - margin-top: $pad-xxl; + margin-top: $space-xxl; } p { - margin: $pad-sm 0; + margin: $space-sm 0; } } .coming-soon { - margin-top: $pad-xxxxl; + margin-top: $space-xxxxl; } .credits-link { - padding-bottom: $pad-xxl; + padding-bottom: $space-xxl; a { @extend .quote-small; @@ -70,7 +70,7 @@ } svg { @include icon-md; - margin-left: $pad-xs; + margin-left: $space-xs; flex: 0 0 auto; } } diff --git a/src-ts/tools/learn/course-details/course-curriculum/CourseCurriculum.module.scss b/src-ts/tools/learn/course-details/course-curriculum/CourseCurriculum.module.scss index b50f79730..9cbed4ef2 100644 --- a/src-ts/tools/learn/course-details/course-curriculum/CourseCurriculum.module.scss +++ b/src-ts/tools/learn/course-details/course-curriculum/CourseCurriculum.module.scss @@ -2,18 +2,18 @@ .wrap { background: $tc-grad15; - padding: $pad-xxxxl; - border-radius: $pad-sm; + padding: $space-xxxxl; + border-radius: $space-sm; color: $tc-white; display: flex; flex-direction: column; - gap: $pad-xxl; + gap: $space-xxl; @include ltelg { - padding: $pad-lg; - gap: $pad-lg; + padding: $space-lg; + gap: $space-lg; } } @@ -23,7 +23,7 @@ svg { @include icon-size(60); - margin-right: $pad-sm; + margin-right: $space-sm; path { fill: url(#lh-paint-02); } @@ -31,7 +31,7 @@ } .bottom-link { - margin-top: $pad-xxxxl; + margin-top: $space-xxxxl; } .course-outline { diff --git a/src-ts/tools/learn/course-details/course-curriculum/CourseCurriculum.tsx b/src-ts/tools/learn/course-details/course-curriculum/CourseCurriculum.tsx index 66ea12f75..5aa882224 100644 --- a/src-ts/tools/learn/course-details/course-curriculum/CourseCurriculum.tsx +++ b/src-ts/tools/learn/course-details/course-curriculum/CourseCurriculum.tsx @@ -175,7 +175,11 @@ const CourseCurriculum: FC = (props: CourseCurriculumProp />
- +
{isCompleted && ( diff --git a/src-ts/tools/learn/course-details/course-curriculum/curriculum-summary/CurriculumSummary.module.scss b/src-ts/tools/learn/course-details/course-curriculum/curriculum-summary/CurriculumSummary.module.scss index 3bad4fdda..180ef3eae 100644 --- a/src-ts/tools/learn/course-details/course-curriculum/curriculum-summary/CurriculumSummary.module.scss +++ b/src-ts/tools/learn/course-details/course-curriculum/curriculum-summary/CurriculumSummary.module.scss @@ -2,21 +2,21 @@ @import '../../../../../lib/styles/includes'; .wrap { - padding: $pad-xxl; - border-radius: $pad-sm; + padding: $space-xxl; + border-radius: $space-sm; background: $tc-white; display: flex; flex-direction: column; - gap: $pad-lg; + gap: $space-lg; @include ltelg { - padding: $pad-lg; - gap: $pad-sm; + padding: $space-lg; + gap: $space-sm; } @include ltemd { - gap: $pad-lg; + gap: $space-lg; } } @@ -31,17 +31,17 @@ .summary { display: flex; - gap: $pad-lg; + gap: $space-lg; align-items: center; justify-content: space-between; flex-wrap: wrap; @include ltelg { - gap: $pad-sm; + gap: $space-sm; } @include ltemd { justify-content: center; - gap: $pad-lg; + gap: $space-lg; } } diff --git a/src-ts/tools/learn/course-details/promo-course/PromoCourse.module.scss b/src-ts/tools/learn/course-details/promo-course/PromoCourse.module.scss index 4720f307c..284f61825 100644 --- a/src-ts/tools/learn/course-details/promo-course/PromoCourse.module.scss +++ b/src-ts/tools/learn/course-details/promo-course/PromoCourse.module.scss @@ -3,21 +3,21 @@ .wrap { background: $black-5; - border-radius: $pad-sm; + border-radius: $space-sm; - padding: $pad-xxxxl; - gap: $pad-xxxxl; + padding: $space-xxxxl; + gap: $space-xxxxl; display: flex; flex-direction: column; @include ltemd { - padding: $pad-lg; - gap: $pad-sm; + padding: $space-lg; + gap: $space-sm; } } .text-content { > *:not(:first-child) { - margin-top: $pad-sm; + margin-top: $space-sm; } h4 { @@ -26,7 +26,7 @@ } .course-path-steps { - margin-top: $pad-sm; + margin-top: $space-sm; svg { width: 100%; display: block; @@ -38,7 +38,7 @@ @include ltemd { display: flex; flex-direction: column; - gap: $pad-lg; + gap: $space-lg; align-items: stretch; } } \ No newline at end of file diff --git a/src-ts/tools/learn/free-code-camp/FreeCodeCamp.module.scss b/src-ts/tools/learn/free-code-camp/FreeCodeCamp.module.scss index e611ae16c..abf59cf76 100644 --- a/src-ts/tools/learn/free-code-camp/FreeCodeCamp.module.scss +++ b/src-ts/tools/learn/free-code-camp/FreeCodeCamp.module.scss @@ -8,7 +8,7 @@ .main-wrap { height: calc($content-height - $breadcrumb-height); width: 100%; - margin-bottom: -$pad-lg; + margin-bottom: -$space-lg; background: $tc-white; display: flex; @@ -17,7 +17,7 @@ @include ltemd { flex-direction: column; - gap: $pad-lg; + gap: $space-lg; height: auto; flex: 99 1 auto; margin-bottom: 0; @@ -29,12 +29,12 @@ display: flex; flex-direction: column; - padding-left: $pad-xxxxl; + padding-left: $space-xxxxl; hr { - margin-left: $pad-xxxxl; - margin-right: $pad-xxxxl; - width: calc(100% - 2 * $pad-xxxxl); + margin-left: $space-xxxxl; + margin-right: $space-xxxxl; + width: calc(100% - 2 * $space-xxxxl); } @include ltemd { @@ -42,9 +42,9 @@ flex: 1 1 auto; hr { - margin-left: $pad-lg; - margin-right: $pad-lg; - width: calc(100% - 2 * $pad-lg); + margin-left: $space-lg; + margin-right: $space-lg; + width: calc(100% - 2 * $space-lg); } } } @@ -75,5 +75,5 @@ .course-outline-title { @extend .body-main-bold; flex: 0 0 auto; - margin-bottom: $pad-xl; + margin-bottom: $space-xl; } \ No newline at end of file diff --git a/src-ts/tools/learn/free-code-camp/FreeCodeCamp.tsx b/src-ts/tools/learn/free-code-camp/FreeCodeCamp.tsx index 0208cd571..7552abd1f 100644 --- a/src-ts/tools/learn/free-code-camp/FreeCodeCamp.tsx +++ b/src-ts/tools/learn/free-code-camp/FreeCodeCamp.tsx @@ -45,15 +45,15 @@ import { TitleNav } from './title-nav' const FreeCodeCamp: FC<{}> = () => { const { - profile, initialized: profileReady, + isLoggedIn, + profile, }: ProfileContextData = useContext(profileContext) - const isLoggedIn: boolean = !!profile const navigate: NavigateFunction = useNavigate() const routeParams: Params = useParams() - const providerParam: string = routeParams.provider ?? '' + const [certificationParam, setCourseParam]: [string, Dispatch>] = useState(routeParams.certification ?? '') const [moduleParam, setModuleParam]: [string, Dispatch>] = useState(routeParams.module ?? '') const [lessonParam, setLessonParam]: [string, Dispatch>] = useState(routeParams.lesson ?? '') @@ -62,6 +62,7 @@ const FreeCodeCamp: FC<{}> = () => { certificationProgress: certificateProgress, setCertificateProgress, ready: progressReady, + refetch: refetchProgress, }: UserCertificationProgressProviderData = useUserCertificationProgress( profile?.userId, routeParams.provider, @@ -178,7 +179,8 @@ const FreeCodeCamp: FC<{}> = () => { lesson.course.certificationId, lesson.course.id, currentLesson - ).then(setCertificateProgress) + ) + .then(setCertificateProgress) } else { // TODO: remove this delay!! // TEMP_FIX: delay this api call to allow for previous "completeLesson" call to write in the api @@ -193,10 +195,11 @@ const FreeCodeCamp: FC<{}> = () => { } } - function handleFccLessonComplete(): void { + function handleFccLessonComplete(challengeUuid: string): void { const currentLesson: { [key: string]: string } = { lesson: lessonParam, module: moduleParam, + uuid: challengeUuid, } if (certificateProgress) { userCertificationProgressUpdateAsync( @@ -283,6 +286,32 @@ const FreeCodeCamp: FC<{}> = () => { setCertificateProgress, ]) + useEffect(() => { + if (courseDataReady && courseData) { + const moduleParamData: LearnModule = courseData.modules.find(m => m.key === moduleParam) ?? courseData.modules[0] + const lessonParamExists: boolean = !!moduleParamData?.lessons.find(l => l.dashedName === lessonParam) + + if (!lessonParamExists) { + const lessonPath: string = getLessonPathFromModule( + providerParam, + certificationParam, + moduleParamData.key, + moduleParamData.lessons[0].dashedName, + ) + + navigate(lessonPath) + } + } + }, [ + certificationParam, + courseData, + courseDataReady, + lessonParam, + moduleParam, + navigate, + providerParam, + ]) + useEffect(() => { const certificationPath: string = routeParams.certification ?? '' const modulePath: string = routeParams.module ?? '' @@ -297,7 +326,7 @@ const FreeCodeCamp: FC<{}> = () => { if (lessonPath !== lessonParam) { setLessonParam(lessonPath) } - // eslint-disable-next-line react-hooks/exhaustive-deps + // eslint-disable-next-line react-hooks/exhaustive-deps }, [ // DO NOT UPDATE THIS DEPS ARRAY!! // we do not care about changes to the other deps @@ -334,7 +363,10 @@ const FreeCodeCamp: FC<{}> = () => { {lesson && (
- + isOpen && refetchProgress()} + >
{courseData?.title} diff --git a/src-ts/tools/learn/free-code-camp/fcc-frame/FccFrame.tsx b/src-ts/tools/learn/free-code-camp/fcc-frame/FccFrame.tsx index 43127f620..7ccb16d3c 100755 --- a/src-ts/tools/learn/free-code-camp/fcc-frame/FccFrame.tsx +++ b/src-ts/tools/learn/free-code-camp/fcc-frame/FccFrame.tsx @@ -1,6 +1,6 @@ import { FC, memo, MutableRefObject, useEffect, useRef } from 'react' -import { EnvironmentConfig } from '../../../../config' +import { LearnConfig } from '../../learn-config' import { LearnLessonMeta } from '../../learn-lib' import styles from './FccFrame.module.scss' @@ -17,7 +17,7 @@ interface FccFrameProps { lesson?: LearnLessonMeta onFccLastLessonNavigation: () => void onFccLessonChange: (path: string) => void - onFccLessonComplete: () => void + onFccLessonComplete: (challengeUuid: string) => void } const FccFrame: FC = (props: FccFrameProps) => { @@ -33,14 +33,14 @@ const FccFrame: FC = (props: FccFrameProps) => { } if (!frameIsReady.current) { - Object.assign(frameRef.current, { src: `${EnvironmentConfig.LEARN_SRC}/${props.lesson.lessonUrl}` }) + Object.assign(frameRef.current, { src: `${LearnConfig.CLIENT}/${props.lesson.lessonUrl}` }) } else { frameRef.current.contentWindow.postMessage(JSON.stringify({ data: { path: `/${lessonUrl}` }, event: 'fcc:url:update', }), '*') } - // eslint-disable-next-line react-hooks/exhaustive-deps + // eslint-disable-next-line react-hooks/exhaustive-deps }, [ lessonUrl, ]) @@ -52,18 +52,24 @@ const FccFrame: FC = (props: FccFrameProps) => { const handleEvent: (event: any) => void = (event: any) => { const { data: jsonData, origin }: { data: string, origin: string } = event - if (origin.indexOf(EnvironmentConfig.LEARN_SRC) === -1) { + if (origin.indexOf(LearnConfig.CLIENT) === -1) { return } - const { event: eventName, data }: { data: { path: string }, event: string } = JSON.parse(jsonData) + const { event: eventName, data }: { + data: { + meta: { id: string }, + path: string, + }, + event: string, + } = JSON.parse(jsonData) if (eventName === 'fcc:nav:last-challenge') { onFccLastLessonNavigation() } if (eventName === 'fcc:challenge:completed') { - onFccLessonComplete() + onFccLessonComplete(data?.meta?.id) } if (eventName === 'fcc:challenge:ready') { diff --git a/src-ts/tools/learn/free-code-camp/title-nav/TitleNav.module.scss b/src-ts/tools/learn/free-code-camp/title-nav/TitleNav.module.scss index 2c230a33a..9b7d6a249 100755 --- a/src-ts/tools/learn/free-code-camp/title-nav/TitleNav.module.scss +++ b/src-ts/tools/learn/free-code-camp/title-nav/TitleNav.module.scss @@ -4,12 +4,12 @@ display: flex; align-items: center; @include pagePaddings; - padding-top: $pad-lg; + padding-top: $space-lg; padding-bottom: 0; @include ltemd { flex-direction: column; - gap: $pad-sm; + gap: $space-sm; } } @@ -20,7 +20,7 @@ display: flex; align-items: center; - gap: $pad-sm; + gap: $space-sm; :global(.overline) { white-space: nowrap; diff --git a/src-ts/tools/learn/learn-config/index.ts b/src-ts/tools/learn/learn-config/index.ts new file mode 100644 index 000000000..c7fcedcee --- /dev/null +++ b/src-ts/tools/learn/learn-config/index.ts @@ -0,0 +1 @@ +export { default as LearnConfig } from './learn.config' diff --git a/src-ts/tools/learn/learn-config/learn-config.model.ts b/src-ts/tools/learn/learn-config/learn-config.model.ts new file mode 100644 index 000000000..783fe51ff --- /dev/null +++ b/src-ts/tools/learn/learn-config/learn-config.model.ts @@ -0,0 +1,4 @@ +export interface LearnConfigModel { + API: string + CLIENT: string +} diff --git a/src-ts/tools/learn/learn-config/learn.bsouza.config.ts b/src-ts/tools/learn/learn-config/learn.bsouza.config.ts new file mode 100644 index 000000000..ab591ccaa --- /dev/null +++ b/src-ts/tools/learn/learn-config/learn.bsouza.config.ts @@ -0,0 +1,9 @@ +import { LearnConfigModel } from './learn-config.model' +import { LearnConfigDefault } from './learn.default.config' +import { LearnConfigDev } from './learn.dev.config' + +export const LearnConfigBsouza: LearnConfigModel = { + ...LearnConfigDev, + // API: LearnConfigDefault.API, + CLIENT: LearnConfigDefault.CLIENT, +} diff --git a/src-ts/tools/learn/learn-config/learn.config.ts b/src-ts/tools/learn/learn-config/learn.config.ts new file mode 100644 index 000000000..64706fc50 --- /dev/null +++ b/src-ts/tools/learn/learn-config/learn.config.ts @@ -0,0 +1,31 @@ +import { EnvironmentConfig } from '../../../config' + +import { LearnConfigModel } from './learn-config.model' +import { LearnConfigBsouza } from './learn.bsouza.config' +import { LearnConfigDefault } from './learn.default.config' +import { LearnConfigDev } from './learn.dev.config' +import { LearnConfigProd } from './learn.prod.config' + +function getConfig(): LearnConfigModel { + + switch (EnvironmentConfig.ENV) { + + case 'bsouza': + return LearnConfigBsouza + + case 'dev': + return LearnConfigDev + + case 'prod': + return LearnConfigProd + + default: + return LearnConfigDefault + } +} + +const LearnConfig: LearnConfigModel = { + ...getConfig(), +} + +export default LearnConfig diff --git a/src-ts/tools/learn/learn-config/learn.default.config.ts b/src-ts/tools/learn/learn-config/learn.default.config.ts new file mode 100644 index 000000000..36ca36697 --- /dev/null +++ b/src-ts/tools/learn/learn-config/learn.default.config.ts @@ -0,0 +1,6 @@ +import { LearnConfigModel } from './learn-config.model' + +export const LearnConfigDefault: LearnConfigModel = { + API: 'http://localhost:3001/v5/learning-paths', + CLIENT: 'https://fcc.topcoder-dev.com:4431', +} diff --git a/src-ts/tools/learn/learn-config/learn.dev.config.ts b/src-ts/tools/learn/learn-config/learn.dev.config.ts new file mode 100644 index 000000000..8ee03c5fe --- /dev/null +++ b/src-ts/tools/learn/learn-config/learn.dev.config.ts @@ -0,0 +1,6 @@ +import { LearnConfigModel } from './learn-config.model' + +export const LearnConfigDev: LearnConfigModel = { + API: 'https://api.topcoder-dev.com/v5/learning-paths', + CLIENT: 'https://freecodecamp.topcoder-dev.com', +} diff --git a/src-ts/tools/learn/learn-config/learn.prod.config.ts b/src-ts/tools/learn/learn-config/learn.prod.config.ts new file mode 100644 index 000000000..ab162a8f8 --- /dev/null +++ b/src-ts/tools/learn/learn-config/learn.prod.config.ts @@ -0,0 +1,6 @@ +import { LearnConfigModel } from './learn-config.model' + +export const LearnConfigProd: LearnConfigModel = { + API: 'https://api.topcoder.com/v5/learning-paths', + CLIENT: 'https://freecodecamp.topcoder.com', +} diff --git a/src-ts/tools/learn/learn-lib/all-certifications-provider/all-certifications-functions/all-certifications.store.ts b/src-ts/tools/learn/learn-lib/all-certifications-provider/all-certifications-functions/all-certifications.store.ts index e42c28e5f..c10906b3b 100755 --- a/src-ts/tools/learn/learn-lib/all-certifications-provider/all-certifications-functions/all-certifications.store.ts +++ b/src-ts/tools/learn/learn-lib/all-certifications-provider/all-certifications-functions/all-certifications.store.ts @@ -1,5 +1,4 @@ -import { xhrGetAsync } from '../../../../../lib/functions' -import { getPath } from '../../learn-url.config' +import { learnUrlGet, learnXhrGetAsync } from '../../functions' import { LearnCertification } from './learn-certification.model' @@ -7,9 +6,11 @@ export function getAsync( providerName: string = 'freeCodeCamp', certificationId?: string ): Promise> { - return xhrGetAsync>(getPath( + + const url: string = learnUrlGet( 'certifications', ...(certificationId ? [certificationId] : []), `?providerName=${providerName}` - )) + ) + return learnXhrGetAsync>(url) } diff --git a/src-ts/tools/learn/learn-lib/all-certifications-provider/all-certifications-functions/learn-certification.model.ts b/src-ts/tools/learn/learn-lib/all-certifications-provider/all-certifications-functions/learn-certification.model.ts index 9e3ab5aa4..9fecdd7dd 100644 --- a/src-ts/tools/learn/learn-lib/all-certifications-provider/all-certifications-functions/learn-certification.model.ts +++ b/src-ts/tools/learn/learn-lib/all-certifications-provider/all-certifications-functions/learn-certification.model.ts @@ -1,9 +1,11 @@ +import { LearnModelBase } from '../../functions' + import { LearnCertificateTrackType } from './learn-certificate-track-type' -export interface LearnCertification { +export interface LearnCertification extends LearnModelBase { category: string certification: string - certType: 'certification'|'course-completion' + certType: 'certification' | 'course-completion' completionHours: number id: string key: string diff --git a/src-ts/tools/learn/learn-lib/all-certifications-provider/all-certifications.provider.tsx b/src-ts/tools/learn/learn-lib/all-certifications-provider/all-certifications.provider.tsx index c68739ee4..5bbb14210 100644 --- a/src-ts/tools/learn/learn-lib/all-certifications-provider/all-certifications.provider.tsx +++ b/src-ts/tools/learn/learn-lib/all-certifications-provider/all-certifications.provider.tsx @@ -34,11 +34,22 @@ export function useAllCertifications( allCertificationsGetAsync(provider, certificationId) .then((certifications) => { + const certs: { + certification: LearnCertification; + certifications?: undefined; + } | { + certification?: undefined; + certifications: Array; + } = certificationId + ? { + certification: certifications as unknown as LearnCertification, + } + : { + certifications: [...certifications], + } setState((prevState) => ({ ...prevState, - ...(certificationId ? { certification: certifications as unknown as LearnCertification } : { - certifications: [...certifications], - }), + ...certs, certificationsCount: certifications.length, loading: false, ready: true, diff --git a/src-ts/tools/learn/learn-lib/collapsible-pane/CollapsiblePane.module.scss b/src-ts/tools/learn/learn-lib/collapsible-pane/CollapsiblePane.module.scss index 0b2d658f2..dbc0ded06 100644 --- a/src-ts/tools/learn/learn-lib/collapsible-pane/CollapsiblePane.module.scss +++ b/src-ts/tools/learn/learn-lib/collapsible-pane/CollapsiblePane.module.scss @@ -27,13 +27,13 @@ .pane-outline { width: 32px; height: 100%; - border-radius: 0 $pad-lg $pad-lg 0; - padding: $pad-lg 0; + border-radius: 0 $space-lg $space-lg 0; + padding: $space-lg 0; background: $blue-140; display: flex; align-items: center; - gap: $pad-sm; + gap: $space-sm; color: $tc-white; @@ -54,8 +54,8 @@ @include ltemd { width: 100%; height: auto; - padding: $pad-sm $pad-lg; - border-radius: 0 0 $pad-lg $pad-lg; + padding: $space-sm $space-lg; + border-radius: 0 0 $space-lg $space-lg; margin-top: -1px; svg { @@ -66,7 +66,7 @@ .content { background: $tc-grad15; - padding: $pad-lg; + padding: $space-lg; color: $tc-white; overflow: auto; diff --git a/src-ts/tools/learn/learn-lib/collapsible-pane/CollapsiblePane.tsx b/src-ts/tools/learn/learn-lib/collapsible-pane/CollapsiblePane.tsx index 3742fecb0..e73399a51 100644 --- a/src-ts/tools/learn/learn-lib/collapsible-pane/CollapsiblePane.tsx +++ b/src-ts/tools/learn/learn-lib/collapsible-pane/CollapsiblePane.tsx @@ -1,4 +1,5 @@ import classNames from 'classnames' +import { noop } from 'lodash' import { Dispatch, FC, ReactNode, SetStateAction, useCallback, useState } from 'react' import { IconSolid } from '../../../../lib' @@ -7,16 +8,19 @@ import styles from './CollapsiblePane.module.scss' interface CollapsiblePaneProps { children: ReactNode + onToggle?: (isOpen: boolean) => void position?: 'to-left'|'to-right' title: string } const CollapsiblePane: FC = (props: CollapsiblePaneProps) => { + const {onToggle = noop}: CollapsiblePaneProps = props const [isOpen, setIsOpen]: [boolean, Dispatch>] = useState(false) const toggle: () => void = useCallback(() => { - setIsOpen(open => !open) - }, []) + setIsOpen(!isOpen) + onToggle(!isOpen) + }, [isOpen, onToggle]) return (
span { @@ -25,8 +25,8 @@ :global(.status-checkbox) { margin-top: 0; - width: $pad-xxl; - height: $pad-xxl; + width: $space-xxl; + height: $space-xxl; &:global(.completed) { color: $turq-75; @@ -38,20 +38,20 @@ display: inline-block; color: $blue-140; background: $tc-white; - padding: calc($border + $border-xs) $pad-xs; + padding: calc($border + $border-xs) $space-xs; border-radius: $border; text-transform: uppercase; line-height: 10px; - margin-top: $pad-xs; - margin-right: calc($pad-sm + $border); + margin-top: $space-xs; + margin-right: calc($space-sm + $border); @include ltemd { - margin-right: $pad-xs; + margin-right: $space-xs; } } .chevron { margin-left: auto; - width: $pad-xxl; + width: $space-xxl; flex: 0 0 auto; svg { @include icon-xxl; @@ -65,16 +65,16 @@ .content { margin-left: 34px; - padding-right: $pad-xxxxl; + padding-right: $space-xxxxl; @include ltemd { - padding-right: $pad-xxl; + padding-right: $space-xxl; } } .short-desc { - margin-top: $pad-sm; + margin-top: $space-sm; } .summary { @@ -89,7 +89,7 @@ width: 1px; height: 14px; background: $tc-white; - margin: 0 calc($pad-sm + $border); + margin: 0 calc($space-sm + $border); } } @@ -101,19 +101,23 @@ svg { width: 14px; height: 14px; - margin-right: calc($pad-xs + $border); + margin-right: calc($space-xs + $border); } } @include ltemd { - margin-top: $pad-md; + margin-top: $space-md; } } .list { display: flex; - gap: $pad-xs $pad-sm; + gap: calc($space-xs + $border) $space-sm; flex-wrap: wrap; - margin-top: $pad-sm; + margin-top: $space-sm; + + > li:global(.full-width) { + width: 100%; + } } diff --git a/src-ts/tools/learn/learn-lib/course-outline/collapsible-item/CollapsibleItem.tsx b/src-ts/tools/learn/learn-lib/course-outline/collapsible-item/CollapsibleItem.tsx index 36f23db12..2d91608c2 100644 --- a/src-ts/tools/learn/learn-lib/course-outline/collapsible-item/CollapsibleItem.tsx +++ b/src-ts/tools/learn/learn-lib/course-outline/collapsible-item/CollapsibleItem.tsx @@ -52,14 +52,36 @@ const CollapsibleItem: FC = (props: CollapsibleItemProps) !!progress?.completedLessons.find(l => l.dashedName === key) ) - const listItem: (item: any, isActive?: boolean) => ReactNode = (item: any, isActive?: boolean) => ( + const stepLabel: (item: any, isActive: boolean, stepCount: string, label?: string) => ReactNode = + (item: any, isActive: boolean, stepCount: string, label?: string) => ( ) + const renderListItem: (item: any) => ReactNode = (item: any) => { + const isActive: boolean = props.itemId?.(item) === props.active + const stepCount: string = item.dashedName.match(/^step-(\d+)$/i)?.[1] + const label: ReactNode = stepLabel(item, isActive, stepCount, !stepCount && item.title) + const key: string = props.itemId?.(item) ?? item.title + + return ( +
  • + {props.path ? ( + + {label} + + ) : label} +
  • + ) + } + return (
    @@ -93,13 +115,7 @@ const CollapsibleItem: FC = (props: CollapsibleItemProps)
      - {props.items.map((it) => ( -
    • - {props.path ? ( - {listItem(it, props.itemId?.(it) === props.active)} - ) : (listItem(it, props.itemId?.(it) === props.active))} -
    • - ))} + {props.items.map(renderListItem)}
    )} diff --git a/src-ts/tools/learn/learn-lib/course-outline/step-icon/StepIcon.module.scss b/src-ts/tools/learn/learn-lib/course-outline/step-icon/StepIcon.module.scss index 5b9afe08b..1b331837e 100755 --- a/src-ts/tools/learn/learn-lib/course-outline/step-icon/StepIcon.module.scss +++ b/src-ts/tools/learn/learn-lib/course-outline/step-icon/StepIcon.module.scss @@ -1,25 +1,46 @@ @import '../../../../../lib/styles/includes'; .step-wrap { - width: 20px; - height: 20px; - border-radius: 50%; - display: flex; - align-items: center; - justify-content: center; + align-items: flex-start; + color: $black-20; + + .icon { + @include icon-xl; + border-radius: 50%; + flex: 0 0 auto; + + display: flex; + align-items: center; + justify-content: center; + + overflow: hidden; - overflow: hidden; + color: $blue-140; - color: $blue-140; + background: $black-40; - background: $black-40; + > svg { + margin: -1 * $border; + } + } + + .label { + margin-left: $space-sm; + } - &:global(.completed) { + &:global(.completed) .icon { background: $turq-75; } + &:global(.completed.has-icon) .icon { + background: transparent; + color: $turq-75; + } &:global(.active) { - background: $tc-white; + color: $tc-white; + .icon { + background: $tc-white; + } } } \ No newline at end of file diff --git a/src-ts/tools/learn/learn-lib/course-outline/step-icon/StepIcon.tsx b/src-ts/tools/learn/learn-lib/course-outline/step-icon/StepIcon.tsx index c8d6f7117..78c8ac9b8 100755 --- a/src-ts/tools/learn/learn-lib/course-outline/step-icon/StepIcon.tsx +++ b/src-ts/tools/learn/learn-lib/course-outline/step-icon/StepIcon.tsx @@ -1,12 +1,15 @@ import classNames from 'classnames' -import { FC } from 'react' +import { FC, ReactNode } from 'react' + +import { IconSolid } from '../../../../../lib' import styles from './StepIcon.module.scss' interface StepIconProps { active?: boolean completed?: boolean - index: number + index: string + label?: string } const StepIcon: FC = (props: StepIconProps) => { @@ -14,12 +17,35 @@ const StepIcon: FC = (props: StepIconProps) => { styles['step-wrap'], props.completed && 'completed', props.active && 'active', + props.label && props.completed && 'has-icon', ) + + function getIconContent(): ReactNode { + return ( + <> + {props.label && props.completed && ( + + )} + + {!props.label && ( + + {props.index} + + )} + + ) + } + return (
    - - {props.index} + + {getIconContent()} + {props.label && ( + + {props.label} + + )}
    ) } diff --git a/src-ts/tools/learn/learn-lib/course-title/CourseTitle.module.scss b/src-ts/tools/learn/learn-lib/course-title/CourseTitle.module.scss index 7fc781d7b..1bb06110f 100644 --- a/src-ts/tools/learn/learn-lib/course-title/CourseTitle.module.scss +++ b/src-ts/tools/learn/learn-lib/course-title/CourseTitle.module.scss @@ -3,18 +3,18 @@ .wrap { display: flex; - gap: $pad-lg; + gap: $space-lg; align-items: center; @include ltelg { - gap: $pad-sm; + gap: $space-sm; } @include ltemd { &:global(.xl) { flex-direction: column; text-align: center; - gap: $pad-lg; + gap: $space-lg; } } @@ -54,13 +54,13 @@ color: #767676; display: block; &:global(.lg) { - margin-top: $pad-sm; + margin-top: $space-sm; } } @include ltemd { :global(.quote-small.xl) { - margin-top: $pad-sm; + margin-top: $space-sm; } } } diff --git a/src-ts/tools/learn/learn-lib/courses-provider/courses-functions/course.store.ts b/src-ts/tools/learn/learn-lib/courses-provider/courses-functions/course.store.ts index 188007aed..91975316a 100755 --- a/src-ts/tools/learn/learn-lib/courses-provider/courses-functions/course.store.ts +++ b/src-ts/tools/learn/learn-lib/courses-provider/courses-functions/course.store.ts @@ -1,11 +1,12 @@ -import { xhrGetAsync } from '../../../../../lib/functions' -import { getPath } from '../../learn-url.config' +import { learnUrlGet, learnXhrGetAsync } from '../../functions' import { LearnCourse } from './learn-course.model' -export function getCourseAsync(provider: string, certification: string): Promise { - return xhrGetAsync>(getPath( - 'courses', - `?certification=${certification}&provider=${provider}`, - )).then(courses => courses[0]) +export function getAsync(provider: string, certification: string): + Promise { + + const url: string = learnUrlGet('courses', `?certification=${certification}&provider=${provider}`) + + return learnXhrGetAsync>(url) + .then(courses => courses[0]) } diff --git a/src-ts/tools/learn/learn-lib/courses-provider/courses-functions/index.ts b/src-ts/tools/learn/learn-lib/courses-provider/courses-functions/index.ts index 44fa2a116..e6c6a0a63 100755 --- a/src-ts/tools/learn/learn-lib/courses-provider/courses-functions/index.ts +++ b/src-ts/tools/learn/learn-lib/courses-provider/courses-functions/index.ts @@ -1,2 +1,2 @@ -export * from './course.store' +export { getAsync as courseGetAsync } from './course.store' export * from './learn-course.model' diff --git a/src-ts/tools/learn/learn-lib/courses-provider/courses-functions/learn-course.model.ts b/src-ts/tools/learn/learn-lib/courses-provider/courses-functions/learn-course.model.ts index 45ae3ddb4..34a4e2442 100644 --- a/src-ts/tools/learn/learn-lib/courses-provider/courses-functions/learn-course.model.ts +++ b/src-ts/tools/learn/learn-lib/courses-provider/courses-functions/learn-course.model.ts @@ -1,6 +1,7 @@ +import { LearnModelBase } from '../../functions' import { LearnModule } from '../../lesson-provider' -export interface LearnCourse { +export interface LearnCourse extends LearnModelBase { certification: string certificationId: string estimatedCompletionTime: { diff --git a/src-ts/tools/learn/learn-lib/courses-provider/courses.provider.tsx b/src-ts/tools/learn/learn-lib/courses-provider/courses.provider.tsx index 8b8ebe630..5c001c51f 100644 --- a/src-ts/tools/learn/learn-lib/courses-provider/courses.provider.tsx +++ b/src-ts/tools/learn/learn-lib/courses-provider/courses.provider.tsx @@ -1,6 +1,6 @@ import { Dispatch, SetStateAction, useEffect, useState } from 'react' -import { getCourseAsync } from './courses-functions' +import { courseGetAsync } from './courses-functions' import { CoursesProviderData } from './courses-provider-data.model' export function useCourses(provider: string, certification?: string): CoursesProviderData { @@ -32,7 +32,7 @@ export function useCourses(provider: string, certification?: string): CoursesPro loading: true, })) - getCourseAsync(provider, certification) + courseGetAsync(provider, certification) .then((course) => { if (!mounted) { return diff --git a/src-ts/tools/learn/learn-lib/curriculum-summary/CurriculumSummary.module.scss b/src-ts/tools/learn/learn-lib/curriculum-summary/CurriculumSummary.module.scss index 7f78294e3..73b93dfb4 100644 --- a/src-ts/tools/learn/learn-lib/curriculum-summary/CurriculumSummary.module.scss +++ b/src-ts/tools/learn/learn-lib/curriculum-summary/CurriculumSummary.module.scss @@ -3,7 +3,7 @@ .summary { display: flex; - gap: $pad-lg; + gap: $space-lg; align-items: center; flex-wrap: wrap; } @@ -37,11 +37,11 @@ .stat-item { display: flex; - gap: $pad-xs; + gap: $space-xs; align-items: center; > :global(.sub) { display: flex; - gap: $pad-xs; + gap: $space-xs; align-items: flex-end; } } diff --git a/src-ts/tools/learn/learn-lib/functions/index.ts b/src-ts/tools/learn/learn-lib/functions/index.ts new file mode 100644 index 000000000..a91806c85 --- /dev/null +++ b/src-ts/tools/learn/learn-lib/functions/index.ts @@ -0,0 +1,7 @@ +export * from './learn.model.base' +export { get as learnUrlGet } from './learn-url.functions' +export { + getAsync as learnXhrGetAsync, + postAsync as learnXhrPostAsync, + putAsync as learnXhrPutAsync, +} from './learn-xhr.functions' diff --git a/src-ts/tools/learn/learn-lib/functions/learn-url.functions.ts b/src-ts/tools/learn/learn-lib/functions/learn-url.functions.ts new file mode 100755 index 000000000..492d60c5d --- /dev/null +++ b/src-ts/tools/learn/learn-lib/functions/learn-url.functions.ts @@ -0,0 +1,10 @@ +import { LearnConfig } from '../../learn-config' + +export function get(...parts: Array): string { + return [ + LearnConfig.API, + ...parts, + ] + .filter(Boolean) + .join('/') +} diff --git a/src-ts/tools/learn/learn-lib/functions/learn-xhr.functions.ts b/src-ts/tools/learn/learn-lib/functions/learn-xhr.functions.ts new file mode 100644 index 000000000..fd3430aee --- /dev/null +++ b/src-ts/tools/learn/learn-lib/functions/learn-xhr.functions.ts @@ -0,0 +1,34 @@ +import { AxiosInstance, AxiosRequestConfig } from 'axios' + +import { xhrCreateInstance, xhrGetAsync, xhrPostAsync, xhrPutAsync } from '../../../../lib' + +import { create as learnCreate } from './learn.factory' + +const learnXhrInstance: AxiosInstance = xhrCreateInstance() + +// handle all created and updated dates +learnXhrInstance.interceptors.response + .use((response) => { + + if (response.data?.hasOwnProperty('createdAt')) { + response.data = learnCreate(response.data) + + } else if (response.data?.constructor?.name === 'Array') { + response.data = response.data + .map((item: any) => learnCreate(item)) + } + + return response + }) + +export async function getAsync(url: string): Promise { + return xhrGetAsync(url, learnXhrInstance) +} + +export async function postAsync(url: string, data: T, config?: AxiosRequestConfig): Promise { + return xhrPostAsync(url, data, config, learnXhrInstance) +} + +export async function putAsync(url: string, data: T, config?: AxiosRequestConfig): Promise { + return xhrPutAsync(url, data, config, learnXhrInstance) +} diff --git a/src-ts/tools/learn/learn-lib/functions/learn.factory.ts b/src-ts/tools/learn/learn-lib/functions/learn.factory.ts new file mode 100644 index 000000000..8d9d19830 --- /dev/null +++ b/src-ts/tools/learn/learn-lib/functions/learn.factory.ts @@ -0,0 +1,16 @@ +interface LearnResponseModel { + createdAt?: string | Date + updatedAt?: string | Date +} + +export function create(item: T): T { + + if (typeof item?.createdAt === 'string') { + item.createdAt = new Date(item.createdAt) + } + if (typeof item?.updatedAt === 'string') { + item.updatedAt = new Date(item.updatedAt) + } + + return item +} diff --git a/src-ts/tools/learn/learn-lib/functions/learn.model.base.ts b/src-ts/tools/learn/learn-lib/functions/learn.model.base.ts new file mode 100644 index 000000000..9356cdf7b --- /dev/null +++ b/src-ts/tools/learn/learn-lib/functions/learn.model.base.ts @@ -0,0 +1,4 @@ +export interface LearnModelBase { + createdAt: Date + updatedAt: Date +} diff --git a/src-ts/tools/learn/learn-lib/learn-url.config.ts b/src-ts/tools/learn/learn-lib/learn-url.config.ts deleted file mode 100755 index bd7b41d02..000000000 --- a/src-ts/tools/learn/learn-lib/learn-url.config.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { EnvironmentConfig } from '../../../config' - -export function getPath(...parts: Array): string { - return [learnPath, ...parts].filter(Boolean).join('/') -} - -const learnPath: string = `${EnvironmentConfig.API.V5}/learning-paths` diff --git a/src-ts/tools/learn/learn-lib/lesson-provider/lesson.provider.tsx b/src-ts/tools/learn/learn-lib/lesson-provider/lesson.provider.tsx index 0e692a798..3a42f0a11 100644 --- a/src-ts/tools/learn/learn-lib/lesson-provider/lesson.provider.tsx +++ b/src-ts/tools/learn/learn-lib/lesson-provider/lesson.provider.tsx @@ -1,6 +1,6 @@ import { Dispatch, SetStateAction, useEffect, useState } from 'react' -import { getCourseAsync } from '../courses-provider/courses-functions' +import { courseGetAsync } from '../courses-provider' import { LearnLesson } from './learn-lesson.model' import { LearnModule } from './learn-module.model' @@ -35,43 +35,45 @@ export function useLessonProvider( loading: true, })) - getCourseAsync(provider, course).then((courseData) => { - if (!mounted) { - return - } + courseGetAsync(provider, course) + .then((courseData) => { - const moduleData: LearnModule|undefined = courseData?.modules.find(m => m.key === module) - const lessonData: LearnLesson|undefined = moduleData?.lessons.find(l => l.dashedName === lesson) + if (!mounted) { + return + } - const lessonUrl: string = [ - 'learn', - courseData?.key ?? course, - module, - lesson, - ].filter(Boolean).join('/') + const moduleData: LearnModule | undefined = courseData?.modules.find(m => m.key === module) + const lessonData: LearnLesson | undefined = moduleData?.lessons.find(l => l.dashedName === lesson) - setState((prevState) => ({ - ...prevState, - lesson: lessonData && { - ...lessonData, - course: { - certification: courseData?.certification ?? '', - certificationId: courseData?.certificationId ?? '', - id: courseData?.id ?? '', - title: courseData?.title ?? '', - }, - lessonUrl, - module: { - dashedName: moduleData?.meta.dashedName ?? '', - title: moduleData?.meta.name ?? '', + const lessonUrl: string = [ + 'learn', + courseData?.key ?? course, + module, + lesson, + ].filter(Boolean).join('/') + + setState((prevState) => ({ + ...prevState, + lesson: lessonData && { + ...lessonData, + course: { + certification: courseData?.certification ?? '', + certificationId: courseData?.certificationId ?? '', + id: courseData?.id ?? '', + title: courseData?.title ?? '', + }, + lessonUrl, + module: { + dashedName: moduleData?.meta.dashedName ?? '', + title: moduleData?.meta.name ?? '', + }, }, - }, - loading: false, - ready: true, - })) - }) + loading: false, + ready: true, + })) + }) - return () => {mounted = false} + return () => { mounted = false } }, [provider, course, module, lesson]) return state diff --git a/src-ts/tools/learn/learn-lib/my-course-card/completed/Completed.module.scss b/src-ts/tools/learn/learn-lib/my-course-card/completed/Completed.module.scss index 6b00d9739..f651dc58e 100644 --- a/src-ts/tools/learn/learn-lib/my-course-card/completed/Completed.module.scss +++ b/src-ts/tools/learn/learn-lib/my-course-card/completed/Completed.module.scss @@ -3,10 +3,10 @@ .wrap { background: $tc-white; - padding: $pad-xxl; - border-radius: $pad-sm; + padding: $space-xxl; + border-radius: $space-sm; @include ltelg { - padding: $pad-lg; + padding: $space-lg; } } @@ -15,7 +15,7 @@ align-items: flex-start; flex-wrap: wrap; - margin-bottom: $pad-lg; + margin-bottom: $space-lg; } .completed-status { @@ -26,7 +26,7 @@ &:before { content: ""; display: inline-block; - margin: 2px $pad-sm -2px; + margin: 2px $space-sm -2px; width: 1px; height: 16px; background: $black-60; @@ -39,10 +39,10 @@ .buttons-wrap { display: flex; align-items: center; - gap: $pad-sm; + gap: $space-sm; flex-wrap: wrap; @include ltemd { - gap: $pad-lg; + gap: $space-lg; } } diff --git a/src-ts/tools/learn/learn-lib/my-course-card/in-progress/InProgress.module.scss b/src-ts/tools/learn/learn-lib/my-course-card/in-progress/InProgress.module.scss index 2b59ac2b2..1b525b6fd 100644 --- a/src-ts/tools/learn/learn-lib/my-course-card/in-progress/InProgress.module.scss +++ b/src-ts/tools/learn/learn-lib/my-course-card/in-progress/InProgress.module.scss @@ -3,18 +3,18 @@ .wrap { background: $tc-white; - padding: $pad-lg $pad-xxl; - border-radius: $pad-sm; + padding: $space-lg $space-xxl; + border-radius: $space-sm; display: flex; &.large { - padding: $pad-xxxxl; + padding: $space-xxxxl; } @include ltelg { &, &.large { - padding: $pad-lg; + padding: $space-lg; } } @@ -30,7 +30,7 @@ display: flex; flex-direction: column; align-items: flex-start; - gap: $pad-lg; + gap: $space-lg; } .line { @@ -40,7 +40,7 @@ width: 100%; @include ltelg { flex-wrap: wrap; - gap: $pad-lg; + gap: $space-lg; } } @@ -52,7 +52,7 @@ &:before { content: ""; display: inline-block; - margin: 2px $pad-sm -2px; + margin: 2px $space-sm -2px; width: 1px; height: 16px; background: $black-60; @@ -65,10 +65,10 @@ .summary { display: flex; align-items: center; - margin-top: $pad-lg; + margin-top: $space-lg; width: 100%; justify-content: space-between; - gap: $pad-lg; + gap: $space-lg; @include ltemd { flex-direction: column; align-items: flex-start; @@ -86,14 +86,14 @@ height: 100%; width: 1px; background: $black-10; - margin: 0 calc($pad-mx + $pad-sm); + margin: 0 calc($space-mx + $space-sm); } &-inner { display: flex; flex-direction: column; align-items: flex-start; - gap: $pad-sm; + gap: $space-sm; p { display: -webkit-box; @@ -103,14 +103,14 @@ } :global(.button) { - margin-top: $pad-sm; + margin-top: $space-sm; } } @include ltemd { flex-direction: column; &:before { - margin: $pad-xxl 0; + margin: $space-xxl 0; width: 100%; height: 1px; } diff --git a/src-ts/tools/learn/learn-lib/resource-provider-provider/resource-provider-functions/resource-provider.model.ts b/src-ts/tools/learn/learn-lib/resource-provider-provider/resource-provider-functions/resource-provider.model.ts index fb2dcebc3..df6ca66b2 100755 --- a/src-ts/tools/learn/learn-lib/resource-provider-provider/resource-provider-functions/resource-provider.model.ts +++ b/src-ts/tools/learn/learn-lib/resource-provider-provider/resource-provider-functions/resource-provider.model.ts @@ -1,4 +1,6 @@ -export interface ResourceProvider { +import { LearnModelBase } from '../../functions' + +export interface ResourceProvider extends LearnModelBase { attributionStatement: string id: string name: string diff --git a/src-ts/tools/learn/learn-lib/resource-provider-provider/resource-provider-functions/resource-provider.store.ts b/src-ts/tools/learn/learn-lib/resource-provider-provider/resource-provider-functions/resource-provider.store.ts index e93341bd7..f845874d3 100755 --- a/src-ts/tools/learn/learn-lib/resource-provider-provider/resource-provider-functions/resource-provider.store.ts +++ b/src-ts/tools/learn/learn-lib/resource-provider-provider/resource-provider-functions/resource-provider.store.ts @@ -1,10 +1,9 @@ -import { xhrGetAsync } from '../../../../../lib/functions' -import { getPath } from '../../learn-url.config' +import { learnUrlGet, learnXhrGetAsync } from '../../functions' import { ResourceProvider } from './resource-provider.model' -export function getResourceProvidersAsync(): Promise|undefined> { - return xhrGetAsync>(getPath( - 'providers' - )) +export function getResourceProvidersAsync(): Promise | undefined> { + + const url: string = learnUrlGet('providers') + return learnXhrGetAsync>(url) } diff --git a/src-ts/tools/learn/learn-lib/user-certifications-provider/user-certification-progress-provider-data.model.ts b/src-ts/tools/learn/learn-lib/user-certifications-provider/user-certification-progress-provider-data.model.ts index 2f75dbe98..b3f523dd4 100755 --- a/src-ts/tools/learn/learn-lib/user-certifications-provider/user-certification-progress-provider-data.model.ts +++ b/src-ts/tools/learn/learn-lib/user-certifications-provider/user-certification-progress-provider-data.model.ts @@ -4,5 +4,6 @@ export interface UserCertificationProgressProviderData { certificationProgress?: LearnUserCertificationProgress loading: boolean ready: boolean + refetch: () => void, setCertificateProgress: (progess: LearnUserCertificationProgress) => void, } diff --git a/src-ts/tools/learn/learn-lib/user-certifications-provider/user-certification-progress.provider.tsx b/src-ts/tools/learn/learn-lib/user-certifications-provider/user-certification-progress.provider.tsx index 2b0991b04..8a951e979 100644 --- a/src-ts/tools/learn/learn-lib/user-certifications-provider/user-certification-progress.provider.tsx +++ b/src-ts/tools/learn/learn-lib/user-certifications-provider/user-certification-progress.provider.tsx @@ -1,49 +1,60 @@ -import { Dispatch, SetStateAction, useEffect, useState } from 'react' +import { Dispatch, MutableRefObject, SetStateAction, useCallback, useEffect, useRef, useState } from 'react' import { UserCertificationProgressProviderData } from './user-certification-progress-provider-data.model' import { LearnUserCertificationProgress, userCertificationProgressGetAsync } from './user-certifications-functions' export function useUserCertificationProgress(userId?: number, provider?: string, certification?: string): UserCertificationProgressProviderData { + const callCounter: MutableRefObject = useRef(0) function setCertificateProgress(progress: LearnUserCertificationProgress): void { setState((prevState) => ({ ...prevState, certificationProgress: progress })) + callCounter.current++ } + const fetchProgress: () => void = useCallback(() => { + if (!userId) { + return + } + + const currentCallCounter: number = ++callCounter.current + + userCertificationProgressGetAsync(userId, provider, certification) + .then((myCertifications) => { + // if another call to fetchProgress or to setCertificateProgress + // was made before we got the api response + // return, and do not update state + if (callCounter.current !== currentCallCounter) { + return + } + + setState((prevState) => ({ + ...prevState, + certificationProgress: myCertifications.find(c => c.certification === certification), + loading: false, + ready: true, + })) + }) + }, [certification, provider, userId]) + const [state, setState]: [UserCertificationProgressProviderData, Dispatch>] = useState({ certificationProgress: undefined, loading: false, ready: false, + refetch: fetchProgress, setCertificateProgress, }) useEffect(() => { - setState((prevState) => ({ ...prevState, loading: true, })) - if (!userId) { - return - } - - userCertificationProgressGetAsync(userId, provider, certification) - .then((myCertifications) => { - setState((prevState) => ({ - ...prevState, - certificationProgress: myCertifications.find(c => c.certification === certification), - loading: false, - ready: true, - })) - }) - }, [ - certification, - provider, - userId, - ]) + fetchProgress() + }, [certification, fetchProgress]) return state } diff --git a/src-ts/tools/learn/learn-lib/user-certifications-provider/user-certifications-functions/learn-user-certification-progress.model.ts b/src-ts/tools/learn/learn-lib/user-certifications-provider/user-certifications-functions/learn-user-certification-progress.model.ts index f218dfd15..88100541b 100644 --- a/src-ts/tools/learn/learn-lib/user-certifications-provider/user-certifications-functions/learn-user-certification-progress.model.ts +++ b/src-ts/tools/learn/learn-lib/user-certifications-provider/user-certifications-functions/learn-user-certification-progress.model.ts @@ -1,7 +1,9 @@ +import { LearnModelBase } from '../../functions' + import { LearnModuleProgress } from './learn-module-progress.model' import { UserCertificationProgressStatus } from './user-certification-progress-status.enum' -export interface LearnUserCertificationProgress { +export interface LearnUserCertificationProgress extends LearnModelBase { academicHonestyPolicyAcceptedAt?: number, certification: string certificationId: string diff --git a/src-ts/tools/learn/learn-lib/user-certifications-provider/user-certifications-functions/user-certification-progress.store.ts b/src-ts/tools/learn/learn-lib/user-certifications-provider/user-certifications-functions/user-certification-progress.store.ts index 660960090..f570da701 100755 --- a/src-ts/tools/learn/learn-lib/user-certifications-provider/user-certifications-functions/user-certification-progress.store.ts +++ b/src-ts/tools/learn/learn-lib/user-certifications-provider/user-certifications-functions/user-certification-progress.store.ts @@ -1,33 +1,38 @@ -import { xhrGetAsync, xhrPostAsync, xhrPutAsync } from '../../../../../lib/functions' -import { getPath } from '../../learn-url.config' +import { learnUrlGet, learnXhrGetAsync, learnXhrPostAsync, learnXhrPutAsync } from '../../functions' import { LearnUserCertificationProgress } from './learn-user-certification-progress.model' import { UserCertificationUpdateProgressActions } from './user-certification-update-progress-actions.enum' +const certProgressPath: string = 'certification-progresses' + export function getAsync(userId: number, provider?: string, certification?: string): Promise> { - return xhrGetAsync>(getPath( - 'certification-progresses', - [ - `?userId=${userId}`, - provider && `provider=${provider}`, - certification && `certification=${certification}`, - ].filter(Boolean).join('&'), - )) + + const params: string = [ + `?userId=${userId}`, + provider && `provider=${provider}`, + certification && `certification=${certification}`, + ] + .filter(Boolean) + .join('&') + + const url: string = learnUrlGet(certProgressPath, params) + + return learnXhrGetAsync>(url) } export function startAsync(userId: number, certificationId: string, courseId: string, data: any): Promise { - return xhrPostAsync<{}, LearnUserCertificationProgress>(getPath( - 'certification-progresses', - `${userId}`, - certificationId, - courseId, - ), {}, {params: data}) + + const url: string = learnUrlGet(certProgressPath, `${userId}`, certificationId, courseId) + return learnXhrPostAsync<{}, LearnUserCertificationProgress>(url, {}, { params: data }) } -export function updateAsync(certificationProgressId: string, action: UserCertificationUpdateProgressActions, data: any): Promise { - return xhrPutAsync<{}, LearnUserCertificationProgress>(getPath( - 'certification-progresses', - certificationProgressId, - action - ), {}, {params: data}) +export function updateAsync( + certificationProgressId: string, + action: UserCertificationUpdateProgressActions, + data: any +): Promise { + + const url: string = learnUrlGet(certProgressPath, certificationProgressId, action) + + return learnXhrPutAsync<{}, LearnUserCertificationProgress>(url, {}, { params: data }) } diff --git a/src-ts/tools/learn/learn-lib/user-certifications-provider/user-certifications-provider-data.model.ts b/src-ts/tools/learn/learn-lib/user-certifications-provider/user-certifications-provider-data.model.ts index 807a60252..ad1d645d5 100755 --- a/src-ts/tools/learn/learn-lib/user-certifications-provider/user-certifications-provider-data.model.ts +++ b/src-ts/tools/learn/learn-lib/user-certifications-provider/user-certifications-provider-data.model.ts @@ -1,8 +1,8 @@ import { LearnUserCertificationProgress } from './user-certifications-functions' export interface UserCertificationsProviderData { - completed: Array - inProgress: Array + inProgress: ReadonlyArray diff --git a/src-ts/tools/learn/learn-lib/user-certifications-provider/user-certifications.provider.tsx b/src-ts/tools/learn/learn-lib/user-certifications-provider/user-certifications.provider.tsx index e8e4b965b..f1ef3dad1 100644 --- a/src-ts/tools/learn/learn-lib/user-certifications-provider/user-certifications.provider.tsx +++ b/src-ts/tools/learn/learn-lib/user-certifications-provider/user-certifications.provider.tsx @@ -50,12 +50,16 @@ export function useUserCertifications(): UserCertificationsProviderData { return } - const completed: Array = myCertifications + const completed: ReadonlyArray = myCertifications .filter(c => c.status === UserCertificationProgressStatus.completed) .map(c => c as UserCertificationCompleted) - const inProgress: Array = myCertifications + .sort((a, b) => b.updatedAt.getTime() - a.updatedAt.getTime()) + + const inProgress: ReadonlyArray = myCertifications .filter(c => c.status === UserCertificationProgressStatus.inProgress) .map(c => c as UserCertificationInProgress) + .sort((a, b) => b.updatedAt.getTime() - a.updatedAt.getTime()) + setState((prevState) => ({ ...prevState, completed, diff --git a/src-ts/tools/learn/learn-lib/user-completed-certifications-provider/user-completed-certifications-functions/user-completed-certification.model.ts b/src-ts/tools/learn/learn-lib/user-completed-certifications-provider/user-completed-certifications-functions/user-completed-certification.model.ts index 22aac9318..d3a97e55c 100644 --- a/src-ts/tools/learn/learn-lib/user-completed-certifications-provider/user-completed-certifications-functions/user-completed-certification.model.ts +++ b/src-ts/tools/learn/learn-lib/user-completed-certifications-provider/user-completed-certifications-functions/user-completed-certification.model.ts @@ -1,12 +1,13 @@ import { LearnCertificateTrackType } from '../../all-certifications-provider' +import { LearnModelBase } from '../../functions' import { UserCertificationProgressStatus } from '../../user-certifications-provider' -export interface LearnUserCompletedCertification { +export interface LearnUserCompletedCertification extends LearnModelBase { certification: string, certificationId: string, certificationTitle: string, certificationTrackType: LearnCertificateTrackType, - certType: 'certification'|'course-completion', + certType: 'certification' | 'course-completion', completedDate: string, provider: string, providerUrl: string diff --git a/src-ts/tools/learn/learn-lib/user-completed-certifications-provider/user-completed-certifications-functions/user-completed-certification.store.ts b/src-ts/tools/learn/learn-lib/user-completed-certifications-provider/user-completed-certifications-functions/user-completed-certification.store.ts index 7c445ead7..5a8388b13 100644 --- a/src-ts/tools/learn/learn-lib/user-completed-certifications-provider/user-completed-certifications-functions/user-completed-certification.store.ts +++ b/src-ts/tools/learn/learn-lib/user-completed-certifications-provider/user-completed-certifications-functions/user-completed-certification.store.ts @@ -1,11 +1,9 @@ -import { xhrGetAsync } from '../../../../../lib/functions' -import { getPath } from '../../learn-url.config' +import { learnUrlGet, learnXhrGetAsync } from '../../functions' import { LearnUserCompletedCertification } from './user-completed-certification.model' export function getAsync(userId: number): Promise> { - return xhrGetAsync>(getPath( - 'completed-certifications', - `${userId}`, - )) + + const url: string = learnUrlGet('completed-certifications', `${userId}`) + return learnXhrGetAsync>(url) } diff --git a/src-ts/tools/learn/learn-lib/wave-hero/WaveHero.module.scss b/src-ts/tools/learn/learn-lib/wave-hero/WaveHero.module.scss index 7a38181e5..996cb752a 100755 --- a/src-ts/tools/learn/learn-lib/wave-hero/WaveHero.module.scss +++ b/src-ts/tools/learn/learn-lib/wave-hero/WaveHero.module.scss @@ -8,42 +8,42 @@ overflow: hidden; padding-bottom: 40px; @include ltelg { - background-size: 100vw $pad-lg, auto; - padding-bottom: $pad-lg; + background-size: 100vw $space-lg, auto; + padding-bottom: $space-lg; } &:global(.light) { background: url('./learn-welcome-bg-curve-white.png') repeat-x center bottom , $tc-grad15; background-size: 1440px 40px, auto; @include ltelg { - background-size: 100vw $pad-lg, auto; + background-size: 100vw $space-lg, auto; } } } &-inner { - padding: calc($pad-xxxxl + $pad-sm) 0 $pad-lg; + padding: calc($space-xxxxl + $space-sm) 0 $space-lg; @include contentWidth; @include ltelg { - padding-bottom: $pad-mx; + padding-bottom: $space-mx; } @include ltemd { - padding-top: $pad-xxl; - padding-bottom: $pad-xxl; + padding-top: $space-xxl; + padding-bottom: $space-xxl; } } &-content { display: flex; - gap: calc($pad-mx * 2); + gap: calc($space-mx * 2); color: $tc-white; @include ltelg { - gap: $pad-mx; + gap: $space-mx; } @include ltemd { - gap: $pad-xxl; + gap: $space-xxl; flex-direction: column; } } @@ -54,6 +54,6 @@ &-text { @extend .body-medium-normal; - margin-top: $pad-xxl; + margin-top: $space-xxl; } } diff --git a/src-ts/tools/learn/my-learning/MyLearning.module.scss b/src-ts/tools/learn/my-learning/MyLearning.module.scss index c0a505fd7..4f24c8cd7 100755 --- a/src-ts/tools/learn/my-learning/MyLearning.module.scss +++ b/src-ts/tools/learn/my-learning/MyLearning.module.scss @@ -27,7 +27,7 @@ svg { @include icon-size(60); - margin-right: $pad-sm; + margin-right: $space-sm; @include ltemd { @include icon-size(38); } @@ -35,8 +35,8 @@ } .courses-area { - padding: $pad-xxxxl 0; - gap: $pad-lg; + padding: $space-xxxxl 0; + gap: $space-lg; display: flex; flex-direction: column; position: relative; @@ -45,17 +45,17 @@ } @include ltemd { - gap: $pad-xxl; + gap: $space-xxl; } } .cards-wrap { display: flex; - gap: $pad-xxl; + gap: $space-xxl; flex-wrap: wrap; > * { - flex: 0 1 calc(50% - calc($pad-xxl / 2)); + flex: 0 1 calc(50% - calc($space-xxl / 2)); } @include ltemd { diff --git a/src-ts/tools/learn/my-learning/hero-card/HeroCard.module.scss b/src-ts/tools/learn/my-learning/hero-card/HeroCard.module.scss index e7160be73..9cc12d4cc 100755 --- a/src-ts/tools/learn/my-learning/hero-card/HeroCard.module.scss +++ b/src-ts/tools/learn/my-learning/hero-card/HeroCard.module.scss @@ -3,27 +3,27 @@ .wrap { background: $black-5; - border-radius: $pad-sm; - padding: $pad-xxl; + border-radius: $space-sm; + padding: $space-xxl; color: $black-100; display: flex; flex-direction: column; - gap: $pad-sm; + gap: $space-sm; width: 100%; :global(.button.link) { white-space: initial; } @include ltelg { - padding: $pad-lg; + padding: $space-lg; } } .line { display: flex; align-items: center; - gap: $pad-sm; + gap: $space-sm; justify-content: flex-end; @include ltelg { flex-direction: column; diff --git a/src-ts/tools/learn/welcome/WelcomePage.module.scss b/src-ts/tools/learn/welcome/WelcomePage.module.scss index b841fd5ce..c00834ead 100644 --- a/src-ts/tools/learn/welcome/WelcomePage.module.scss +++ b/src-ts/tools/learn/welcome/WelcomePage.module.scss @@ -13,19 +13,19 @@ } .courses-section { - padding: $pad-xxxxl 0; + padding: $space-xxxxl 0; position: relative; @include ltemd { - padding-top: $pad-xxl; + padding-top: $space-xxl; } } .courses-list { - margin-top: $pad-lg; + margin-top: $space-lg; flex-wrap: wrap; - gap: $pad-lg; + gap: $space-lg; display: grid; grid-template-columns: repeat(4, 1fr); @@ -44,6 +44,6 @@ } @include ltemd { - margin-top: $pad-xxl; + margin-top: $space-xxl; } } \ No newline at end of file diff --git a/src-ts/tools/learn/welcome/courses-card/CoursesCard.module.scss b/src-ts/tools/learn/welcome/courses-card/CoursesCard.module.scss index a5e4f500d..019b1ea12 100644 --- a/src-ts/tools/learn/welcome/courses-card/CoursesCard.module.scss +++ b/src-ts/tools/learn/welcome/courses-card/CoursesCard.module.scss @@ -2,10 +2,10 @@ .wrap { background: $black-5; - border-radius: $pad-sm; - padding: $pad-xxl; + border-radius: $space-sm; + padding: $space-xxl; - gap: $pad-lg; + gap: $space-lg; display: flex; flex-direction: column; @@ -22,7 +22,7 @@ } @include ltemd { - padding: $pad-lg; + padding: $space-lg; } } diff --git a/src-ts/tools/learn/welcome/courses-card/CoursesCard.tsx b/src-ts/tools/learn/welcome/courses-card/CoursesCard.tsx index 7ddbeec37..29c461d0a 100644 --- a/src-ts/tools/learn/welcome/courses-card/CoursesCard.tsx +++ b/src-ts/tools/learn/welcome/courses-card/CoursesCard.tsx @@ -14,8 +14,8 @@ import styles from './CoursesCard.module.scss' interface CoursesCardProps { certification: LearnCertification - userCompletedCertifications: Array - userInProgressCertifications: Array + userCompletedCertifications: ReadonlyArray + userInProgressCertifications: ReadonlyArray } const CoursesCard: FC = (props: CoursesCardProps) => { diff --git a/src-ts/tools/learn/welcome/progress-block/ProgressBlock.module.scss b/src-ts/tools/learn/welcome/progress-block/ProgressBlock.module.scss index ad8703417..167346070 100644 --- a/src-ts/tools/learn/welcome/progress-block/ProgressBlock.module.scss +++ b/src-ts/tools/learn/welcome/progress-block/ProgressBlock.module.scss @@ -3,16 +3,16 @@ .wrap { background: $black-5; - border-radius: $pad-sm; - padding: $pad-xxl; + border-radius: $space-sm; + padding: $space-xxl; color: $black-100; display: flex; flex-direction: column; - gap: $pad-lg; + gap: $space-lg; width: 100%; @include ltemd { - padding: $pad-lg; + padding: $space-lg; } } diff --git a/src-ts/tools/learn/welcome/progress-block/ProgressBlock.tsx b/src-ts/tools/learn/welcome/progress-block/ProgressBlock.tsx index 79c3c0667..a2e26e023 100644 --- a/src-ts/tools/learn/welcome/progress-block/ProgressBlock.tsx +++ b/src-ts/tools/learn/welcome/progress-block/ProgressBlock.tsx @@ -13,8 +13,8 @@ import styles from './ProgressBlock.module.scss' interface ProgressBlockProps { allCertifications: Array ready: boolean - userCompletedCertifications: Array - userInProgressCertifications: Array + userCompletedCertifications: ReadonlyArray + userInProgressCertifications: ReadonlyArray } const ProgressBlock: FC = (props: ProgressBlockProps) => { diff --git a/src-ts/tools/learn/welcome/progress-block/no-progress/NoProgress.module.scss b/src-ts/tools/learn/welcome/progress-block/no-progress/NoProgress.module.scss index 3b1d99bb5..4348badf1 100644 --- a/src-ts/tools/learn/welcome/progress-block/no-progress/NoProgress.module.scss +++ b/src-ts/tools/learn/welcome/progress-block/no-progress/NoProgress.module.scss @@ -2,7 +2,7 @@ @import '../../../../../lib/styles/includes'; .wrap { - gap: $pad-lg; + gap: $space-lg; display: grid; color: $black-100; grid-template-areas: 'icon title' 'icon text'; @@ -33,6 +33,6 @@ .content-text { @extend .body-medium-normal; - margin-top: -1*$pad-sm; + margin-top: -1*$space-sm; grid-area: text; } diff --git a/src-ts/tools/learn/welcome/progress-block/progress-action/ProgressAction.module.scss b/src-ts/tools/learn/welcome/progress-block/progress-action/ProgressAction.module.scss index d00ffc894..f07899529 100644 --- a/src-ts/tools/learn/welcome/progress-block/progress-action/ProgressAction.module.scss +++ b/src-ts/tools/learn/welcome/progress-block/progress-action/ProgressAction.module.scss @@ -5,16 +5,16 @@ align-items: center; justify-content: space-between; flex-wrap: wrap; - gap: $pad-lg; + gap: $space-lg; svg { @include icon-mx; - margin-right: $pad-xs; + margin-right: $space-xs; } } .title { display: flex; align-items: center; - gap: $pad-md; + gap: $space-md; } diff --git a/src-ts/tools/learn/welcome/progress-block/progress-action/ProgressAction.tsx b/src-ts/tools/learn/welcome/progress-block/progress-action/ProgressAction.tsx index 22b1e134e..3eb8997ec 100644 --- a/src-ts/tools/learn/welcome/progress-block/progress-action/ProgressAction.tsx +++ b/src-ts/tools/learn/welcome/progress-block/progress-action/ProgressAction.tsx @@ -15,8 +15,8 @@ import styles from './ProgressAction.module.scss' interface ProgressActionProps { allCertifications: Array - userCompletedCertifications: Array - userInProgressCertifications: Array + userCompletedCertifications: ReadonlyArray + userInProgressCertifications: ReadonlyArray } const ProgressAction: FC = (props: ProgressActionProps) => { @@ -45,47 +45,72 @@ const ProgressAction: FC = (props: ProgressActionProps) => }, {} as unknown as { [key: string]: LearnCertification }) ), [allCertifications]) - return ( - <> - {!!myInProgressCertifications.length && ( + // we only want to display the last course that was acted upon + const mostRecentIsCompleted: boolean = myCompletedCertifications?.[0]?.updatedAt > (myInProgressCertifications?.[0]?.updatedAt || 0) + + function renderInProgress(): JSX.Element { + + // if the most recently acted upon course is completed and not in progress, + // or there are no courses in progress, don't show this block + if (mostRecentIsCompleted || !myInProgressCertifications.length) { + return <> + } + + const courseToDisplay: UserCertificationInProgress = myInProgressCertifications[0] + + return ( + <>

    In progress

    {allMyLearningsLink}
    - )} - {myInProgressCertifications - .map((cert) => ( - - ))} - {!!myCompletedCertifications.length && ( + + + ) + } + + function renderCompleted(): JSX.Element { + + // if the most recently acted upon course is in progress rather than completed, + // or there are no completed courses, don't show this block + if (!mostRecentIsCompleted || !myCompletedCertifications.length) { + return <> + } + + const certToDisplay: UserCertificationCompleted = myCompletedCertifications[0] + + return ( + <>

    Congratulations!

    - {!myInProgressCertifications.length && ( - - {allMyLearningsLink} - - )} + + {allMyLearningsLink} +
    - )} - {myCompletedCertifications - .map((cert) => ( - - ))} + + + ) + } + + return ( + <> + {renderInProgress()} + {renderCompleted()} {allMyLearningsLink} diff --git a/src-ts/tools/tools.routes.ts b/src-ts/tools/tools.routes.ts index 3da5c58aa..ac46044f5 100644 --- a/src-ts/tools/tools.routes.ts +++ b/src-ts/tools/tools.routes.ts @@ -1,5 +1,7 @@ import { PlatformRoute } from '../lib' +import { devCenterRoutes } from './dev-center' +import { gamificationAdminRoutes } from './gamification-admin' import { learnRoutes } from './learn' import { workRoutes } from './work' @@ -7,7 +9,9 @@ const toolRoutes: Array = [ // NOTE: these will be displayed in the order they are defined in this array // TODO: support ordering ...workRoutes, + ...devCenterRoutes, ...learnRoutes, + ...gamificationAdminRoutes, ] export default toolRoutes diff --git a/src-ts/tools/work/work-detail-details/work-detail-details-pane/WorkDetailDetailsPane.module.scss b/src-ts/tools/work/work-detail-details/work-detail-details-pane/WorkDetailDetailsPane.module.scss index 9a7812781..c54378ae7 100644 --- a/src-ts/tools/work/work-detail-details/work-detail-details-pane/WorkDetailDetailsPane.module.scss +++ b/src-ts/tools/work/work-detail-details/work-detail-details-pane/WorkDetailDetailsPane.module.scss @@ -4,7 +4,7 @@ display: flex; align-items: flex-end; cursor: pointer; - margin: $pad-xxl 0 $pad-xxxl 0; + margin: $space-xxl 0 $space-xxxl 0; .header-content { flex: 1; @@ -18,8 +18,8 @@ .link { color: $link-blue-dark; cursor: pointer; - margin-left: $pad-md; - margin-top: $pad-xs; + margin-left: $space-md; + margin-top: $space-xs; text-transform: none; &:hover { @@ -41,14 +41,14 @@ } .detail { - margin-bottom: $pad-xxl; + margin-bottom: $space-xxl; white-space: pre-wrap; @include font-black-100; .title { @include font-barlow; display: flex; - padding-bottom: $pad-sm; + padding-bottom: $space-sm; } .content { diff --git a/src-ts/tools/work/work-detail-details/work-detail-details-sidebar/WorkDetailDetailsSidebar.module.scss b/src-ts/tools/work/work-detail-details/work-detail-details-sidebar/WorkDetailDetailsSidebar.module.scss index 2536a40e1..a6ec4f180 100644 --- a/src-ts/tools/work/work-detail-details/work-detail-details-sidebar/WorkDetailDetailsSidebar.module.scss +++ b/src-ts/tools/work/work-detail-details/work-detail-details-sidebar/WorkDetailDetailsSidebar.module.scss @@ -2,10 +2,10 @@ .wrap { min-width: 323px; - padding-left: $pad-xxxxl; + padding-left: $space-xxxxl; border-left: $border-xs solid $black-10; - margin-left: $pad-xxxxl; + margin-left: $space-xxxxl; color: $black-100; } @@ -16,7 +16,7 @@ font-size: 14px; line-height: 14px; color: $turq-160; - margin-top: $pad-lg; + margin-top: $space-lg; cursor: pointer; text-transform: uppercase; } diff --git a/src-ts/tools/work/work-detail-header/WorkDetailHeader.module.scss b/src-ts/tools/work/work-detail-header/WorkDetailHeader.module.scss index 832a7d686..da0f5723b 100644 --- a/src-ts/tools/work/work-detail-header/WorkDetailHeader.module.scss +++ b/src-ts/tools/work/work-detail-header/WorkDetailHeader.module.scss @@ -4,12 +4,12 @@ display: flex; justify-content: space-between; align-items: center; - padding: $pad-xxxxl 0 $pad-xxl; - margin: 0 0 $pad-xxl; + padding: $space-xxxxl 0 $space-xxl; + margin: 0 0 $space-xxl; border-bottom: $border solid $black-10; .heading { - margin-right: $pad-xxxxl; + margin-right: $space-xxxxl; color: $black-100; } } diff --git a/src-ts/tools/work/work-detail-solutions/WorkDetailSolutions.module.scss b/src-ts/tools/work/work-detail-solutions/WorkDetailSolutions.module.scss index 1e911e4a5..ee673fe44 100644 --- a/src-ts/tools/work/work-detail-solutions/WorkDetailSolutions.module.scss +++ b/src-ts/tools/work/work-detail-solutions/WorkDetailSolutions.module.scss @@ -2,15 +2,15 @@ .wrap { display: block; - padding-bottom: $pad-xxxxl; + padding-bottom: $space-xxxxl; } .header { @include font-black-100; @include font-roboto; - margin-bottom: $pad-lg; + margin-bottom: $space-lg; p { - margin-top: $pad-sm; + margin-top: $space-sm; } } diff --git a/src-ts/tools/work/work-detail-solutions/work-solutions-list/WorkSolutionsList.module.scss b/src-ts/tools/work/work-detail-solutions/work-solutions-list/WorkSolutionsList.module.scss index 31cd92c3f..92fdc7755 100644 --- a/src-ts/tools/work/work-detail-solutions/work-solutions-list/WorkSolutionsList.module.scss +++ b/src-ts/tools/work/work-detail-solutions/work-solutions-list/WorkSolutionsList.module.scss @@ -14,8 +14,8 @@ align-items: center; justify-content: center; min-height: 507px; - padding: $pad-lg; + padding: $space-lg; text-align: center; background-color: $black-5; - border-radius: $pad-sm; + border-radius: $space-sm; } diff --git a/src-ts/tools/work/work-detail-solutions/work-solutions-list/work-solutions-list-item/WorkSolutionsListItem.module.scss b/src-ts/tools/work/work-detail-solutions/work-solutions-list/work-solutions-list-item/WorkSolutionsListItem.module.scss index 8f60d0f15..4a0212abf 100644 --- a/src-ts/tools/work/work-detail-solutions/work-solutions-list/work-solutions-list-item/WorkSolutionsListItem.module.scss +++ b/src-ts/tools/work/work-detail-solutions/work-solutions-list/work-solutions-list-item/WorkSolutionsListItem.module.scss @@ -8,10 +8,10 @@ display: flex; align-items: center; - gap: $pad-lg; + gap: $space-lg; position: relative; - padding: $pad-lg 0; + padding: $space-lg 0; border-top: $border-xs solid $black-10; &:last-child { @@ -33,7 +33,7 @@ .name { margin-right: auto; span + span { - margin-left: $pad-xs; + margin-left: $space-xs; } } } diff --git a/src-ts/tools/work/work-detail-summary/WorkDetailHighlights/WorkDetailHighlights.module.scss b/src-ts/tools/work/work-detail-summary/WorkDetailHighlights/WorkDetailHighlights.module.scss index f5a870e1b..8292041de 100644 --- a/src-ts/tools/work/work-detail-summary/WorkDetailHighlights/WorkDetailHighlights.module.scss +++ b/src-ts/tools/work/work-detail-summary/WorkDetailHighlights/WorkDetailHighlights.module.scss @@ -1,12 +1,12 @@ @import '../../../../lib/styles/includes'; @import '../../../../lib/styles/typography'; -$icon-size: calc($pad-xxl * 2); +$icon-size: calc($space-xxl * 2); .highlights-container { display: grid; grid-template-columns: repeat(5, 1fr); - margin-bottom: $pad-xxl; + margin-bottom: $space-xxl; .highlight { display: flex; @@ -15,7 +15,7 @@ $icon-size: calc($pad-xxl * 2); align-items: center; text-align: center; margin-right: calc($border-xs * -1); - padding: $pad-lg; + padding: $space-lg; border-left: $border-xs solid $black-10; border-right: $border-xs solid $black-10; @@ -33,7 +33,7 @@ $icon-size: calc($pad-xxl * 2); h4 { border: none; - padding: $pad-xl 0 0 0; + padding: $space-xl 0 0 0; } .info { diff --git a/src-ts/tools/work/work-detail-summary/WorkDetailProgress/WorkDetailProgress.module.scss b/src-ts/tools/work/work-detail-summary/WorkDetailProgress/WorkDetailProgress.module.scss index 27bed7650..ebd3a3a28 100644 --- a/src-ts/tools/work/work-detail-summary/WorkDetailProgress/WorkDetailProgress.module.scss +++ b/src-ts/tools/work/work-detail-summary/WorkDetailProgress/WorkDetailProgress.module.scss @@ -1,20 +1,20 @@ @import "../../../../lib/styles/includes"; .progress-container { - margin-bottom: calc($pad-lg + $pad-xxl); - padding: $pad-lg $pad-xxl $pad-xxl; - border-radius: $pad-sm; + margin-bottom: calc($space-lg + $space-xxl); + padding: $space-lg $space-xxl $space-xxl; + border-radius: $space-sm; @extend .bg-black-5; h3 { - margin-bottom: $pad-lg; + margin-bottom: $space-lg; color: $black-100; } .progress { display: flex; justify-content: space-between; - margin-top: calc($pad-lg + $pad-xxl); - margin-left: calc($pad-xxxxl - $border); + margin-top: calc($space-lg + $space-xxl); + margin-left: calc($space-xxxxl - $border); } } diff --git a/src-ts/tools/work/work-detail-summary/WorkDetailProgress/WorkDetailProgressItem/WorkDetailProgressItem.module.scss b/src-ts/tools/work/work-detail-summary/WorkDetailProgress/WorkDetailProgressItem/WorkDetailProgressItem.module.scss index 9e9786f3d..00e16e768 100644 --- a/src-ts/tools/work/work-detail-summary/WorkDetailProgress/WorkDetailProgressItem/WorkDetailProgressItem.module.scss +++ b/src-ts/tools/work/work-detail-summary/WorkDetailProgress/WorkDetailProgressItem/WorkDetailProgressItem.module.scss @@ -1,6 +1,6 @@ @import "../../../../../lib/styles/includes"; -$dot-size: calc($pad-lg + $pad-xxl); +$dot-size: calc($space-lg + $space-xxl); .progress-bar-list-item { position: relative; @@ -12,9 +12,9 @@ $dot-size: calc($pad-lg + $pad-xxl); .label { display: block; - margin-top: $pad-sm; + margin-top: $space-sm; margin-left: calc(-1 * calc($dot-size + 3px)); - width: calc(4 * $pad-xxxxl); + width: calc(4 * $space-xxxxl); text-align: center; color: $black-60; @@ -24,7 +24,7 @@ $dot-size: calc($pad-lg + $pad-xxl); .date { display: block; - margin-top: $pad-xs; + margin-top: $space-xs; } } @@ -34,9 +34,9 @@ $dot-size: calc($pad-lg + $pad-xxl); justify-content: center; width: $dot-size; height: $dot-size; - margin-bottom: $pad-sm; + margin-bottom: $space-sm; @extend .bg-black-10; - border: $pad-xs solid $black-20; + border: $space-xs solid $black-20; border-radius: 50%; box-sizing: border-box; color: $black-60; @@ -46,10 +46,10 @@ $dot-size: calc($pad-lg + $pad-xxl); content: ''; display: block; position: absolute; - top: $pad-lg; + top: $space-lg; left: $dot-size; width: 100%; - height: $pad-sm; + height: $space-sm; @extend .bg-black-20; } diff --git a/src-ts/tools/work/work-detail-summary/WorkTransferredStatus/WorkTransferredStatus.module.scss b/src-ts/tools/work/work-detail-summary/WorkTransferredStatus/WorkTransferredStatus.module.scss index be9b55857..b9538fbfe 100644 --- a/src-ts/tools/work/work-detail-summary/WorkTransferredStatus/WorkTransferredStatus.module.scss +++ b/src-ts/tools/work/work-detail-summary/WorkTransferredStatus/WorkTransferredStatus.module.scss @@ -1,20 +1,20 @@ @import "../../../../lib/styles/includes"; .wrap { - margin-bottom: calc($pad-lg + $pad-xxl); - padding: $pad-lg $pad-xxl $pad-xxl; - border-radius: $pad-sm; + margin-bottom: calc($space-lg + $space-xxl); + padding: $space-lg $space-xxl $space-xxl; + border-radius: $space-sm; @extend .bg-black-5; color: $black-100; h3 { - margin-bottom: $pad-lg; + margin-bottom: $space-lg; color: $black-100; } } .line { + .line { - margin-top: $pad-lg; + margin-top: $space-lg; } } diff --git a/src-ts/tools/work/work-lib/work-provider/index.ts b/src-ts/tools/work/work-lib/work-provider/index.ts index 2dffd9f32..15c9d74eb 100644 --- a/src-ts/tools/work/work-lib/work-provider/index.ts +++ b/src-ts/tools/work/work-lib/work-provider/index.ts @@ -1,3 +1,4 @@ +export { messageGetUnreadCountAsync } from './message-functions' export * from './work-context-data.model' export * from './work-functions' export * from './work.context' diff --git a/src-ts/tools/work/work-lib/work-provider/message-functions/index.ts b/src-ts/tools/work/work-lib/work-provider/message-functions/index.ts index dfe2f2caa..0396d9081 100644 --- a/src-ts/tools/work/work-lib/work-provider/message-functions/index.ts +++ b/src-ts/tools/work/work-lib/work-provider/message-functions/index.ts @@ -1 +1,4 @@ -export { getAndSetForWorkItemsAsync as messageGetAndSetForWorkItemsAsync } from './message.functions' +export { + getAndSetForWorkItemsAsync as messageGetAndSetForWorkItemsAsync, + getUnreadCountAsync as messageGetUnreadCountAsync, +} from './message.functions' diff --git a/src-ts/tools/work/work-lib/work-provider/message-functions/message.functions.ts b/src-ts/tools/work/work-lib/work-provider/message-functions/message.functions.ts index 4873f5eb4..dbd73b742 100644 --- a/src-ts/tools/work/work-lib/work-provider/message-functions/message.functions.ts +++ b/src-ts/tools/work/work-lib/work-provider/message-functions/message.functions.ts @@ -1,3 +1,4 @@ +import { logError } from '../../../../../lib' import { Work, WorkStatus } from '../work-functions' import { GetUnreadMessageCountResponse, messageStoreGetUnreadCountAsync } from './message-store' @@ -28,3 +29,13 @@ export async function getAndSetForWorkItemsAsync(workItems: Array, handle: return work }) } + +export async function getUnreadCountAsync(workId: string, handle: string): Promise { + try { + const response: GetUnreadMessageCountResponse = await messageStoreGetUnreadCountAsync(workId, handle) + return response.messageCount + } catch (err: any) { + logError(err) + return undefined + } +} diff --git a/src-ts/tools/work/work-lib/work-provider/work-context-data.model.ts b/src-ts/tools/work/work-lib/work-provider/work-context-data.model.ts index cccfeb383..0db9630f3 100644 --- a/src-ts/tools/work/work-lib/work-provider/work-context-data.model.ts +++ b/src-ts/tools/work/work-lib/work-provider/work-context-data.model.ts @@ -4,6 +4,7 @@ export interface WorkContextData { error?: string hasWork: boolean initialized: boolean - refresh: () => void + messagesInitialized: boolean + remove: (workId: string, work: Array) => void work: Array } diff --git a/src-ts/tools/work/work-lib/work-provider/work-functions/work-by-status.model.ts b/src-ts/tools/work/work-lib/work-provider/work-functions/work-by-status.model.ts index 20eab768a..9512ed1aa 100644 --- a/src-ts/tools/work/work-lib/work-provider/work-functions/work-by-status.model.ts +++ b/src-ts/tools/work/work-lib/work-provider/work-functions/work-by-status.model.ts @@ -2,5 +2,6 @@ import { Work } from './work-store' export interface WorkByStatus { count: number + messageCount: number results: ReadonlyArray } diff --git a/src-ts/tools/work/work-lib/work-provider/work-functions/work-factory/work.factory.ts b/src-ts/tools/work/work-lib/work-provider/work-functions/work-factory/work.factory.ts index 8fcc7b53a..af613f1b6 100644 --- a/src-ts/tools/work/work-lib/work-provider/work-functions/work-factory/work.factory.ts +++ b/src-ts/tools/work/work-lib/work-provider/work-functions/work-factory/work.factory.ts @@ -210,7 +210,7 @@ export function create(challenge: Challenge, workPrices: WorkPricesType): Work { description: getDescription(challenge, type), draftStep: getDraftStep(challenge, status), id: challenge.id, - messageCount: Number((Math.random() * 10).toFixed(0)), // TODO: real message count + messageCount: undefined, participantsCount: challenge.numOfRegistrants, progress: getProgress(challenge, status), solutionsCount: challenge.numOfSubmissions, diff --git a/src-ts/tools/work/work-lib/work-provider/work-functions/work.functions.ts b/src-ts/tools/work/work-lib/work-provider/work-functions/work.functions.ts index 9c245cee7..ddf6a24f3 100644 --- a/src-ts/tools/work/work-lib/work-provider/work-functions/work.functions.ts +++ b/src-ts/tools/work/work-lib/work-provider/work-functions/work.functions.ts @@ -1,4 +1,3 @@ -// import { messageGetAndSetForWorkItemsAsync } from '../../functions' import { PaymentMethodResult, Stripe, StripeCardNumberElement } from '@stripe/stripe-js' import { Page, UserProfile } from '../../../../../lib' @@ -101,27 +100,19 @@ export async function deleteAsync(workId: string): Promise { return workStoreDeleteAsync(workId) } -export async function getAllAsync(profile: UserProfile): Promise> { +export async function getAllAsync(profile: UserProfile, pageNumber: number): Promise> { // TODO: actual pagination and sorting const page: Page = { - number: 1, + number: pageNumber, size: 100, sort: { direction: 'desc', fieldName: 'created', }, } - let work: Array = [] - let nextSet: Array = await getPageAsync((profile as UserProfile).handle, page) - while (nextSet.length > 0) { - work = work.concat(nextSet) - page.number += 1 - nextSet = await getPageAsync((profile as UserProfile).handle, page) - } - - return work + return getPageAsync(profile.handle, page) } export async function getByWorkIdAsync(workId: string): Promise { @@ -129,13 +120,13 @@ export async function getByWorkIdAsync(workId: string): Promise { } export function getGroupedByStatus(work: ReadonlyArray): { [status: string]: WorkByStatus } { - const output: { [status: string]: WorkByStatus } = {} Object.entries(WorkStatusFilter) .forEach(([key, value]) => { const results: ReadonlyArray = workStoreGetFilteredByStatus(work, WorkStatusFilter[key as keyof typeof WorkStatusFilter]) output[key] = { count: results.length, + messageCount: results.reduce((partialSum, a) => partialSum + (a.messageCount ?? 0), 0), results, } }) @@ -176,17 +167,7 @@ async function getPageAsync(handle: string, page: Page): Promise> { const challenges: Array = await workStoreGetAsync(handle, page) // run it through the factory and filter out deleted and non-self-service - const workItems: Array = challenges + return challenges .map(challenge => workFactoryCreate(challenge, workGetPricesConfig())) .filter(work => work.status !== WorkStatus.deleted && work.type !== WorkType.unknown) - - return workItems - - /* - TODO: add this data back to the work object when the bug is fixed: - https://topcoder.atlassian.net/browse/PROD-1860 - Unread Messages count from API don't match embedded forum widget - // get and set the messages counts and return - return messageGetAndSetForWorkItemsAsync(workItems, handle) - */ } diff --git a/src-ts/tools/work/work-lib/work-provider/work.context.tsx b/src-ts/tools/work/work-lib/work-provider/work.context.tsx index fc6acbf61..346f3b48a 100644 --- a/src-ts/tools/work/work-lib/work-provider/work.context.tsx +++ b/src-ts/tools/work/work-lib/work-provider/work.context.tsx @@ -5,7 +5,8 @@ import { WorkContextData } from './work-context-data.model' export const defaultWorkContextData: WorkContextData = { hasWork: false, initialized: false, - refresh: () => undefined, + messagesInitialized: false, + remove: () => undefined, work: [], } diff --git a/src-ts/tools/work/work-lib/work-provider/work.provider.tsx b/src-ts/tools/work/work-lib/work-provider/work.provider.tsx index 2dfb523e1..0e34bf95c 100644 --- a/src-ts/tools/work/work-lib/work-provider/work.provider.tsx +++ b/src-ts/tools/work/work-lib/work-provider/work.provider.tsx @@ -2,6 +2,7 @@ import { Dispatch, FC, ReactNode, SetStateAction, useContext, useEffect, useStat import { logError, profileContext, ProfileContextData, UserProfile } from '../../../../lib' +import { messageGetUnreadCountAsync } from './message-functions' import { WorkContextData } from './work-context-data.model' import { Work, workGetAllAsync, } from './work-functions' import { default as workContext, defaultWorkContextData } from './work.context' @@ -20,17 +21,79 @@ export const WorkProvider: FC<{ children: ReactNode }> = ({ children }: { childr return } + function remove(workId: string, work: Array): void { + const workList: Array = [...work] + const removedItemIndex: number = workList.findIndex(item => item.id === workId) + // if we didn't find the removed index, just return + if (!removedItemIndex) { + return + } + workList.splice(removedItemIndex, 1) + setWorkContextData({ + ...workContextData, + hasWork: !!workList.length, + initialized: true, + work: workList, + }) + } + async function getAndSetWork(): Promise { try { - const work: Array = await workGetAllAsync(profile as UserProfile) + const safeProfile: UserProfile = profile as UserProfile + + let pageNumber: number = 1 + let nextSet: Array = await workGetAllAsync(safeProfile, pageNumber++) + const contextData: WorkContextData = { - hasWork: !!work.length, + ...defaultWorkContextData, + hasWork: !!nextSet.length, initialized: true, - refresh: getAndSetWork, - work, + remove, + work: nextSet, } - setWorkContextData(contextData) + + // if we don't have any work, set the context and return + if (!nextSet.length) { + contextData.messagesInitialized = true + setWorkContextData(contextData) + return + } + + // get the rest of the pages, and update the list + // after each response + let output: Array = [] + let messageContextData: WorkContextData = { ...contextData } + while (nextSet.length > 0) { + output = output.concat(nextSet) + messageContextData = { + ...messageContextData, + work: output, + } + setWorkContextData(messageContextData) + nextSet = await workGetAllAsync(safeProfile, pageNumber++) + } + + // now that the work list is initialized, + // set all the message counts individually in the background. + const promises: Array> = output + .map(item => { + return messageGetUnreadCountAsync(item.id, safeProfile.handle) + .then(messageCount => { + item.messageCount = messageCount + return item + }) + .catch(() => item) + }) + + Promise.all(promises) + .then(results => { + setWorkContextData({ + ...contextData, + messagesInitialized: true, + work: results, + }) + }) } catch (error: any) { logError(error) @@ -38,7 +101,8 @@ export const WorkProvider: FC<{ children: ReactNode }> = ({ children }: { childr ...defaultWorkContextData, error: error.response?.data?.result?.content || error.message || error, initialized: true, - refresh: getAndSetWork, + messagesInitialized: true, + remove, } setWorkContextData(contextData) } @@ -47,7 +111,7 @@ export const WorkProvider: FC<{ children: ReactNode }> = ({ children }: { childr getAndSetWork() }, [ profile, - workContextData.initialized, + workContextData, ]) return ( diff --git a/src-ts/tools/work/work-lib/work-status-item/WorkStatusItem.module.scss b/src-ts/tools/work/work-lib/work-status-item/WorkStatusItem.module.scss index faf3609ff..6802ffdff 100644 --- a/src-ts/tools/work/work-lib/work-status-item/WorkStatusItem.module.scss +++ b/src-ts/tools/work/work-lib/work-status-item/WorkStatusItem.module.scss @@ -20,7 +20,7 @@ display: inline-block; width: 10px; height: 10px; - margin-right: $pad-xs; + margin-right: $space-xs; border-radius: 50px; border: 2px solid transparent; } diff --git a/src-ts/tools/work/work-login-prompt/WorkLoginPrompt.module.scss b/src-ts/tools/work/work-login-prompt/WorkLoginPrompt.module.scss index 624b83c04..a758e8f35 100644 --- a/src-ts/tools/work/work-login-prompt/WorkLoginPrompt.module.scss +++ b/src-ts/tools/work/work-login-prompt/WorkLoginPrompt.module.scss @@ -11,13 +11,13 @@ display: flex; justify-content: center; align-items: center; - margin-top: $pad-mx; - font-size: $pad-lg; - line-height: $pad-lg; + margin-top: $space-mx; + font-size: $space-lg; + line-height: $space-lg; .separator { - margin-left: $pad-lg; - margin-right: $pad-lg; + margin-left: $space-lg; + margin-right: $space-lg; } } } diff --git a/src-ts/tools/work/work-self-service/intake-forms/bug-hunt/deliverables-info-card/DeliverablesInfoCard.module.scss b/src-ts/tools/work/work-self-service/intake-forms/bug-hunt/deliverables-info-card/DeliverablesInfoCard.module.scss index 8e0f979f2..78ef62c6d 100644 --- a/src-ts/tools/work/work-self-service/intake-forms/bug-hunt/deliverables-info-card/DeliverablesInfoCard.module.scss +++ b/src-ts/tools/work/work-self-service/intake-forms/bug-hunt/deliverables-info-card/DeliverablesInfoCard.module.scss @@ -12,13 +12,13 @@ .column { &:first-child { @include ltemd { - padding-bottom: $pad-lg; + padding-bottom: $space-lg; } } @include gtemd { flex: 50%; - padding-right: $pad-mxx; + padding-right: $space-mxx; } } @@ -34,7 +34,7 @@ } .exampleImg { - padding: $pad-xs $border; + padding: $space-xs $border; max-height: 100% } @@ -43,5 +43,5 @@ line-height: 22px; text-transform: uppercase; font-weight: 600; - padding-bottom: $pad-sm; + padding-bottom: $space-sm; } diff --git a/src-ts/tools/work/work-self-service/intake-forms/review/Review.module.scss b/src-ts/tools/work/work-self-service/intake-forms/review/Review.module.scss index b822774c6..3a6967d9e 100644 --- a/src-ts/tools/work/work-self-service/intake-forms/review/Review.module.scss +++ b/src-ts/tools/work/work-self-service/intake-forms/review/Review.module.scss @@ -3,37 +3,37 @@ .review-container { .content { - padding: 0 $pad-xxxxl; - margin-top: $pad-xxl; + padding: 0 $space-xxxxl; + margin-top: $space-xxl; display: grid; grid-template-columns: 1fr 562px; column-gap: 24px; @include ltemd { grid-template-columns: 1fr; - padding: 0 $pad-lg; + padding: 0 $space-lg; } .left { flex: 1; border-top: 2px solid $black-10; - padding-top: $pad-xxl; + padding-top: $space-xxl; } .right { flex-basis: 32%; .payment-form-wrapper { border: 2px solid $black-20; border-radius: 8px; - padding: $pad-xxl; + padding: $space-xxl; @include ltemd { - padding: $pad-xl; + padding: $space-xl; } .form-header { text-align: center; - padding-bottom: $pad-xxl; + padding-bottom: $space-xxl; border-bottom: 1px solid $black-20; - margin-bottom: $pad-xxl; + margin-bottom: $space-xxl; .price { color: $teal-120; - margin-bottom: $pad-sm; + margin-bottom: $space-sm; } .label { @extend .overline; @@ -47,6 +47,6 @@ } .button-wrapper { - margin: 0 $pad-xxxxl $pad-xxxxl $pad-xxxxl; + margin: 0 $space-xxxxl $space-xxxxl $space-xxxxl; } } diff --git a/src-ts/tools/work/work-self-service/intake-forms/support-info-card/SupportInfoCard.module.scss b/src-ts/tools/work/work-self-service/intake-forms/support-info-card/SupportInfoCard.module.scss index b975e5e64..1058abe2c 100644 --- a/src-ts/tools/work/work-self-service/intake-forms/support-info-card/SupportInfoCard.module.scss +++ b/src-ts/tools/work/work-self-service/intake-forms/support-info-card/SupportInfoCard.module.scss @@ -1,5 +1,5 @@ @import '../../../../../lib/styles/includes'; .supportButton { - padding-top: $pad-lg; + padding-top: $space-lg; } \ No newline at end of file diff --git a/src-ts/tools/work/work-service-price/WorkServicePrice.module.scss b/src-ts/tools/work/work-service-price/WorkServicePrice.module.scss index 2513dce44..d07266f40 100644 --- a/src-ts/tools/work/work-service-price/WorkServicePrice.module.scss +++ b/src-ts/tools/work/work-service-price/WorkServicePrice.module.scss @@ -2,18 +2,18 @@ .container { - margin-top: $pad-xl; + margin-top: $space-xl; .iconWrapper { height: 48; width: 48; - margin: 0 $pad-lg $pad-lg $pad-lg; + margin: 0 $space-lg $space-lg $space-lg; background: $tc-grad12; border-radius: 24px; svg { @include icon-xl; - margin: $pad-md; + margin: $space-md; color: $tc-white; } } @@ -53,7 +53,7 @@ .stickerPrice { color: $black-80; text-decoration: line-through; - margin-right: $pad-xs; + margin-right: $space-xs; } .separator { @@ -68,7 +68,7 @@ } .help { - margin-left: $pad-sm; + margin-left: $space-sm; color: $turq-160; } } \ No newline at end of file diff --git a/src-ts/tools/work/work-service-price/WorkServicePrice.tsx b/src-ts/tools/work/work-service-price/WorkServicePrice.tsx index 6705f3a37..2082b065f 100644 --- a/src-ts/tools/work/work-service-price/WorkServicePrice.tsx +++ b/src-ts/tools/work/work-service-price/WorkServicePrice.tsx @@ -1,7 +1,6 @@ import { FC } from 'react' -import { IconOutline, textFormatMoneyLocaleString } from '../../../lib/index' -import { Tooltip } from '../../../lib/tooltip' +import { IconOutline, textFormatMoneyLocaleString, Tooltip } from '../../../lib' import styles from './WorkServicePrice.module.scss' diff --git a/src-ts/tools/work/work-table/WorkTable.tsx b/src-ts/tools/work/work-table/WorkTable.tsx index 4ed11f0b4..2e3a07d06 100644 --- a/src-ts/tools/work/work-table/WorkTable.tsx +++ b/src-ts/tools/work/work-table/WorkTable.tsx @@ -8,6 +8,7 @@ import { RouteContextData, Table, TableColumn, + tabNavItemBadgeSet, TabsNavbar, TabsNavItem, } from '../../../lib' @@ -19,11 +20,10 @@ import { WorkContextData, workGetGroupedByStatus, workGetStatusFilter, - WorkIntakeFormRoutes, WorkStatus, WorkStatusFilter, } from '../work-lib' -import { dashboardRoute, selfServiceStartRoute, workDetailRoute } from '../work.routes' +import { workDashboardRoute, workDetailOrDraftRoute } from '../work.routes' import { workDashboardTabs } from './work-nav.config' import { WorkNoResults } from './work-no-results' @@ -31,19 +31,28 @@ import { WorkListColumnField, workListColumns } from './work-table.config' const WorkTable: FC<{}> = () => { - const workContextData: WorkContextData = useContext(workContext) - const { hasWork, work, initialized }: WorkContextData = workContextData - + const { + hasWork, + initialized, + messagesInitialized, + work, + }: WorkContextData = useContext(workContext) const { rootLoggedInRoute }: RouteContextData = useContext(routeContext) const [statusGroups, setStatusGroups]: [{ [status: string]: WorkByStatus } | undefined, Dispatch>] = useState<{ [status: string]: WorkByStatus }>() - const [tabs, setTabs]: [ReadonlyArray, Dispatch>>] + const [tabs, setTabs]: [ + ReadonlyArray, + Dispatch>>, + ] = useState>([...workDashboardTabs]) - const [columns, setColumns]: [ReadonlyArray>, Dispatch>>] + const [columns, setColumns]: [ + ReadonlyArray>, + Dispatch>>>, + ] = useState>>([...workListColumns]) const { statusKey }: Readonly> = useParams() @@ -64,18 +73,13 @@ const WorkTable: FC<{}> = () => { // init the status groups and set the tab badges initializeStatusGroups(initialized, work, setStatusGroups, tabs, setTabs) - // if the status filter is all, just set the default columns - if (workStatusFilter === WorkStatusFilter.all) { - setColumns([...workListColumns]) - return - } + // init the columns based on the status + initializeColumns(workStatusFilter, setColumns) - const filteredColumns: Array> = [...workListColumns] - filteredColumns.splice(workListColumns.findIndex(c => c.label === WorkListColumnField.status), 1) - setColumns(filteredColumns) // eslint-disable-next-line react-hooks/exhaustive-deps }, [ initialized, + messagesInitialized, // tabs change every render so we can't make it a dependency // tabs, work, @@ -94,27 +98,20 @@ const WorkTable: FC<{}> = () => { } function onChangeTab(active: string): void { - navigate(`${dashboardRoute}/${active}`) + navigate(workDashboardRoute(active)) } - function viewWorkDetails(selectedWork: Work): void { - - const isDraft: boolean = selectedWork.status === WorkStatus.draft + function viewSelectedWork(selectedWork: Work): void { - // TODO: move the tabs definition to src-ts - // so we don't have to hard-code this tab id - let url: string = workDetailRoute(selectedWork.id, selectedWork.status === WorkStatus.ready ? 'solutions' : undefined) - - if (isDraft) { - if (selectedWork.draftStep) { - url = `${WorkIntakeFormRoutes[selectedWork.type][selectedWork.draftStep]}/${selectedWork.id}` - } else { - cacheChallengeId(selectedWork.id) - url = selfServiceStartRoute - } + // if this is a draft and there is no step saved + // for the work, cache its ID so we can go back + // to the beginning + if (selectedWork.status === WorkStatus.draft && !selectedWork.draftStep) { + cacheChallengeId(selectedWork.id) } - navigate(url) + // go to the specified step + navigate(workDetailOrDraftRoute(selectedWork)) } // define the tabs so they can be displayed on various results @@ -154,7 +151,7 @@ const WorkTable: FC<{}> = () => { ) @@ -168,6 +165,30 @@ const WorkTable: FC<{}> = () => { export default WorkTable +function initializeColumns( + workStatusFilter: WorkStatusFilter, + setColumns: Dispatch>>>, +): void { + + // set the columns that should appear by status + const filteredColumns: Array> = [...workListColumns] + + if (workStatusFilter === WorkStatusFilter.draft) { + // if this is the draft status, remove the messages column + filteredColumns.splice(filteredColumns.findIndex(c => c.label === WorkListColumnField.messages), 1) + } else if (workStatusFilter !== WorkStatusFilter.all) { + // if this isn't the draft or all status, remove the action button + filteredColumns.splice(filteredColumns.findIndex(c => c.type === 'action'), 1) + } + + // if this is status-specific, remove the status columm + if (workStatusFilter !== WorkStatusFilter.all) { + filteredColumns.splice(filteredColumns.findIndex(c => c.label === WorkListColumnField.status), 1) + } + + setColumns(filteredColumns) +} + function initializeStatusGroups( initialized: boolean, work: ReadonlyArray, @@ -192,14 +213,9 @@ function initializeStatusGroups( .includes(WorkStatusFilter[tab.id as keyof typeof WorkStatusFilter])) .forEach(tab => { const info: WorkByStatus = groups[tab.id] - if (!!info.count) { - tab.badges = [ - { - count: info.count, - type: 'info', - }, - ] - } + tab.badges = tab.badges || [] + tabNavItemBadgeSet(tab.badges, 'info', info.count) + tabNavItemBadgeSet(tab.badges, 'important', info.messageCount) }) setTabs(badgedTabs) } diff --git a/src-ts/tools/work/work-table/work-badge-renderer/WorkBadgeRenderer.module.scss b/src-ts/tools/work/work-table/work-badge-renderer/WorkBadgeRenderer.module.scss index c49ea2e2a..6c10a15af 100644 --- a/src-ts/tools/work/work-table/work-badge-renderer/WorkBadgeRenderer.module.scss +++ b/src-ts/tools/work/work-table/work-badge-renderer/WorkBadgeRenderer.module.scss @@ -1,26 +1,31 @@ @use '../../../../lib/styles/typography'; @import '../../../../lib/styles/includes'; -.badge { - @extend .medium-subtitle; - display: inline-flex; - padding: 0 $border; - border-radius: $pad-sm; - color: $tc-white; - min-width: 24px; - text-align: center; - align-items: center; +.badge-container { + display: flex; justify-content: center; - &.unread-messages{ - background-color: $red-100; - } - - &.no-unread-messages{ - background-color: $black-80; - } - - &.items { - background-color: $blue-100; + .badge { + @extend .medium-subtitle; + display: inline-flex; + padding: 0 $border; + border-radius: $space-sm; + color: $tc-white; + min-width: 24px; + text-align: center; + align-items: center; + justify-content: center; + + &.unread-messages{ + background-color: $red-100; + } + + &.no-unread-messages{ + background-color: $black-80; + } + + &.items { + background-color: $blue-100; + } } } diff --git a/src-ts/tools/work/work-table/work-badge-renderer/WorkBadgeRenderer.tsx b/src-ts/tools/work/work-table/work-badge-renderer/WorkBadgeRenderer.tsx index 0c5aa8df3..e08f5993a 100644 --- a/src-ts/tools/work/work-table/work-badge-renderer/WorkBadgeRenderer.tsx +++ b/src-ts/tools/work/work-table/work-badge-renderer/WorkBadgeRenderer.tsx @@ -21,8 +21,10 @@ function WorkBadgeRenderer(props: WorkBadgeRendererProps): JSX.Element { : 'unread-messages') return ( -
    - {props.count} +
    +
    + {props.count} +
    ) } diff --git a/src-ts/tools/work/work-table/work-delete-button-renderer/WorkDeleteButtonRenderer.tsx b/src-ts/tools/work/work-table/work-delete-button-renderer/WorkDeleteButtonRenderer.tsx index ccae34210..f6310c379 100644 --- a/src-ts/tools/work/work-table/work-delete-button-renderer/WorkDeleteButtonRenderer.tsx +++ b/src-ts/tools/work/work-table/work-delete-button-renderer/WorkDeleteButtonRenderer.tsx @@ -23,7 +23,7 @@ function WorkDeleteButtonRenderer(work: Work): JSX.Element | undefined { async function deleteWork(): Promise { toggleConfirmation() await workDeleteAsync(work.id) - await workContextData.refresh() + await workContextData.remove(work.id, workContextData.work) toast.success('Your draft work has been deleted.') } diff --git a/src-ts/tools/work/work-table/work-table-title-renderer/WorkTableTitleRenderer.module.scss b/src-ts/tools/work/work-table/work-table-title-renderer/WorkTableTitleRenderer.module.scss index aec733c8d..759aff46c 100644 --- a/src-ts/tools/work/work-table/work-table-title-renderer/WorkTableTitleRenderer.module.scss +++ b/src-ts/tools/work/work-table/work-table-title-renderer/WorkTableTitleRenderer.module.scss @@ -7,7 +7,7 @@ svg { min-width: 32px; - margin-right: $pad-lg; + margin-right: $space-lg; } .work-table-title { diff --git a/src-ts/tools/work/work-table/work-table.config.tsx b/src-ts/tools/work/work-table/work-table.config.tsx index 486340667..667b375e9 100644 --- a/src-ts/tools/work/work-table/work-table.config.tsx +++ b/src-ts/tools/work/work-table/work-table.config.tsx @@ -1,21 +1,20 @@ import { TableColumn } from '../../../lib' import { Work } from '../work-lib' -// import { WorkBadgeRenderer } from './work-badge-renderer' +import { WorkBadgeRenderer } from './work-badge-renderer' import { WorkDeleteButtonRenderer } from './work-delete-button-renderer' import { WorkStatusRenderer } from './work-status-renderer' import { WorkTableTitleRenderer } from './work-table-title-renderer' -/* TODO: uncomment this when the messages are back up -as part of PROD-1860 function messageBadgeRenderer(work: Work): JSX.Element { return WorkBadgeRenderer({ count: work.messageCount, type: 'messages', }) -} */ +} export enum WorkListColumnField { + messages = 'Messages', status = 'Status', } @@ -54,17 +53,12 @@ export const workListColumns: ReadonlyArray> = [ propertyName: 'cost', type: 'money', }, - /* - TODO: add this column back when the bug is fixed: - https://topcoder.atlassian.net/browse/PROD-1860 - Unread Messages count from API don't match embedded forum widget { - label: 'Messages', + label: WorkListColumnField.messages, renderer: messageBadgeRenderer, tooltip: 'Messages pending response', type: 'element', }, - */ { renderer: WorkDeleteButtonRenderer, type: 'action', diff --git a/src-ts/tools/work/work-thank-you/WorkThankYou.module.scss b/src-ts/tools/work/work-thank-you/WorkThankYou.module.scss index 4cd41cbc0..362dbf608 100644 --- a/src-ts/tools/work/work-thank-you/WorkThankYou.module.scss +++ b/src-ts/tools/work/work-thank-you/WorkThankYou.module.scss @@ -9,7 +9,7 @@ .contentContainer { p { - padding: $pad-xxl; + padding: $space-xxl; } } } diff --git a/src-ts/tools/work/work-type-banner/WorkTypeBanner.module.scss b/src-ts/tools/work/work-type-banner/WorkTypeBanner.module.scss index be9107fee..7df6c0752 100644 --- a/src-ts/tools/work/work-type-banner/WorkTypeBanner.module.scss +++ b/src-ts/tools/work/work-type-banner/WorkTypeBanner.module.scss @@ -5,7 +5,7 @@ flex-direction: row; align-items: flex-start; padding: 0px 0px 0px 0px; - gap: $pad-xxl; + gap: $space-xxl; height: 104px; @@ -148,22 +148,22 @@ display: flex; flex-direction: column; align-items: flex-start; - padding: $pad-lg 0px; + padding: $space-lg 0px; color: $tc-white; position: static; - left: $pad-xxxxl; + left: $space-xxxxl; top: 0px; /* Inside auto layout */ flex: none; order: 0; flex-grow: 1; - margin: 0px $pad-xxxl; + margin: 0px $space-xxxl; @include ltemd { - margin: 0px $pad-lg; - padding: $pad-sm 0px; + margin: 0px $space-lg; + padding: $space-sm 0px; } .heroHeader { @@ -188,10 +188,10 @@ display: flex; flex-direction: row; align-items: flex-start; - margin-right: $pad-lg; + margin-right: $space-lg; position: static; - width: $pad-mx; + width: $space-mx; left: 0px; top: 0px; } @@ -201,7 +201,7 @@ display: flex; flex-direction: column; align-items: flex-start; - row-gap: $pad-lg; + row-gap: $space-lg; padding: 0px; position: static; @@ -221,12 +221,12 @@ } .heroHeaderTitle { - height: $pad-xxxxl; + height: $space-xxxxl; font-family: 'Barlow Condensed'; font-style: normal; font-weight: 600; font-size: 34px; - line-height: $pad-xxxxl; + line-height: $space-xxxxl; text-transform: uppercase; color: #FFFFFF; @@ -238,18 +238,18 @@ @include ltemd { font-size: 28px; - line-height: $pad-xxxxl; + line-height: $space-xxxxl; width: 288px; } } .heroHeaderSubtitle { - height: $pad-xxl; + height: $space-xxl; font-family: 'Roboto'; font-style: normal; font-weight: 700; font-size: 16px; - line-height: $pad-xxl; + line-height: $space-xxl; color: #FFFFFF; /* Inside auto layout */ @@ -260,7 +260,7 @@ @include ltemd { font-size: 14px; - line-height: $pad-xl; + line-height: $space-xl; width: 288px; height: 60px; } @@ -280,7 +280,7 @@ font-style: normal; font-weight: normal; font-size: 24px; - line-height: $pad-xxxxl; + line-height: $space-xxxxl; /* or 133% */ /* gray/white */ @@ -288,7 +288,7 @@ /* Inside auto layout */ order: 1; - margin: $pad-lg 0px; + margin: $space-lg 0px; flex: none; align-self: stretch; flex-grow: 0; diff --git a/src-ts/tools/work/work.routes.tsx b/src-ts/tools/work/work.routes.tsx index b6972d750..71aa38fa7 100644 --- a/src-ts/tools/work/work.routes.tsx +++ b/src-ts/tools/work/work.routes.tsx @@ -2,7 +2,8 @@ import { Navigate } from 'react-router-dom' import { contactSupportPath, PlatformRoute } from '../../lib' -import { dashboardTitle, default as Work, toolTitle } from './Work' +import { dashboardTitle, default as WorkComponent, toolTitle } from './Work' +import { Work, WorkIntakeFormRoutes, WorkStatus } from './work-lib' import { WorkLoginPrompt } from './work-login-prompt' import { WorkNotLoggedIn } from './work-not-logged-in' import { @@ -20,7 +21,29 @@ export const selfServiceRootRoute: string = '/self-service' export const selfServiceStartRoute: string = `${selfServiceRootRoute}/wizard` export const dashboardRoute: string = `${rootRoute}/dashboard` -export function workDetailRoute(workId: string, tab?: string): string { +export function workDashboardRoute(active: string): string { +return `${dashboardRoute}/${active}` +} + +export function workDetailOrDraftRoute(selectedWork: Work): string { + + // if this isn't a draft, just go to the detail + if (selectedWork.status !== WorkStatus.draft) { + // TODO: move the tabs definition to src-ts + // so we don't have to hard-code the 'solutions' tab id + return workDetailRoute(selectedWork.id, selectedWork.status === WorkStatus.ready ? 'solutions' : undefined) + } + + // if we have a draft step, go to it + if (!!selectedWork.draftStep) { + return `${WorkIntakeFormRoutes[selectedWork.type][selectedWork.draftStep]}/${selectedWork.id}` + } + + // return the base route + return selfServiceStartRoute +} + +export function workDetailRoute(workId: string, tab?: 'solutions' | 'messages'): string { return `${selfServiceRootRoute}/work-items/${workId}${!!tab ? `\?tab=${tab}` : ''}` } @@ -49,7 +72,7 @@ export const workRoutes: Array = [ route: ':statusKey', }, ], - element: , + element: , hidden: true, route: dashboardRoute, title: dashboardTitle, diff --git a/src-ts/utils/settings/account/Account.module.scss b/src-ts/utils/settings/account/Account.module.scss index 436c67e9b..d4174753b 100644 --- a/src-ts/utils/settings/account/Account.module.scss +++ b/src-ts/utils/settings/account/Account.module.scss @@ -2,8 +2,8 @@ :global(.account-settings-modal) { h2 { - margin-bottom: $pad-xxl; - padding: 0 0 $pad-xxl; + margin-bottom: $space-xxl; + padding: 0 0 $space-xxl; border-bottom: 1px solid $black-10; } @@ -12,11 +12,11 @@ .cards { display: grid; grid-template-columns: repeat(3, 1fr); - column-gap: $pad-xxl; - margin: $pad-xxl 0 0; + column-gap: $space-xxl; + margin: $space-xxl 0 0; @include ltemd { grid-template-columns: 1fr; - row-gap: $pad-xxl; + row-gap: $space-xxl; } } diff --git a/src/actions/work.js b/src/actions/work.js index 40e77ac6d..604ddce87 100644 --- a/src/actions/work.js +++ b/src/actions/work.js @@ -1,6 +1,5 @@ import { ACTIONS } from "../constants"; import workService from "../services/work"; -import challengeService from "../services/challenge"; export const getWork = (id) => { return { @@ -58,10 +57,3 @@ export const setIsSavingSurveyDone = (value) => { payload: value, }; }; - -export const getForumNotifications = (workId, profile) => { - return { - type: ACTIONS.WORK.GET_FORUM_NOTIFICATIONS, - payload: challengeService.getForumNotifications(workId, profile), - }; -}; diff --git a/src/constants/index.js b/src/constants/index.js index 529431d06..1ca82c4b2 100644 --- a/src/constants/index.js +++ b/src/constants/index.js @@ -643,10 +643,6 @@ export const ACTIONS = { SAVE_SURVEY_SUCCESS: "SAVE_SURVEY_SUCCESS", SAVE_SURVEY_ERROR: "SAVE_SURVEY_ERROR", SET_IS_SAVING_SURVEY_DONE: "SET_IS_SAVING_SURVEY_DONE", - GET_FORUM_NOTIFICATIONS: "GET_FORUM_NOTIFICATIONS", - GET_FORUM_NOTIFICATIONS_PENDING: "GET_FORUM_NOTIFICATIONS_PENDING", - GET_FORUM_NOTIFICATIONS_SUCCESS: "GET_FORUM_NOTIFICATIONS_SUCCESS", - GET_FORUM_NOTIFICATIONS_ERROR: "GET_FORUM_NOTIFICATIONS_ERROR", }, }; diff --git a/src/reducers/work.js b/src/reducers/work.js index 8b8cd88bf..43a46f459 100644 --- a/src/reducers/work.js +++ b/src/reducers/work.js @@ -10,7 +10,6 @@ const initialState = { isLoadingWork: false, isLoadingSolutions: false, isSavingSurveyDone: false, - forumNotifications: null, }; const workReducer = (state = initialState, action) => { @@ -115,16 +114,6 @@ const workReducer = (state = initialState, action) => { ...state, isSavingSurveyDone: action.payload, }; - case ACTIONS.WORK.GET_FORUM_NOTIFICATIONS_PENDING: - return { - ...state, - forumNotifications: null, - }; - case ACTIONS.WORK.GET_FORUM_NOTIFICATIONS_SUCCESS: - return { - ...state, - forumNotifications: action.payload, - }; default: return state; } diff --git a/src/routes/WorkItems/index.jsx b/src/routes/WorkItems/index.jsx index 0e493053c..e404653db 100644 --- a/src/routes/WorkItems/index.jsx +++ b/src/routes/WorkItems/index.jsx @@ -26,13 +26,13 @@ import { downloadSolution, saveSurvey, setIsSavingSurveyDone, - getForumNotifications, } from "../../actions/work"; import { toggleSupportModal } from "../../actions/form"; import { Breadcrumb, ChallengeMetadataName, + messageGetUnreadCountAsync, TabsNavbar, WorkDetailDetails, WorkDetailHeader, @@ -55,7 +55,6 @@ const WorkItem = ({ isLoadingWork, isLoadingSolutions, isSavingSurveyDone, - forumNotifications, getWork, getSummary, getDetails, @@ -64,13 +63,13 @@ const WorkItem = ({ downloadSolution, saveSurvey, setIsSavingSurveyDone, - getForumNotifications, }) => { const { workItemId } = useParams() const [selectedTab, setSelectedTab] = useState("summary"); const [showSurvey, setShowSurvey] = useState(false); + const [messageCount, setMessageCount] = useState(undefined) const { profile } = useContext(profileContext) const navigate = useNavigate() @@ -132,17 +131,22 @@ const WorkItem = ({ ]); useEffect(() => { + if (!work) { return; } - if (selectedTab === "messaging") { - getForumNotifications(work.id, profile); + async function getMessageCount() { + const messages = await messageGetUnreadCountAsync(work.id, profile.handle) + setMessageCount(messages); } + + getMessageCount() + .catch(err => console.error(err)) + }, [ work, selectedTab, - getForumNotifications, profile, ]); @@ -185,8 +189,8 @@ const WorkItem = ({ id: "messaging", title: "Messages", badges: [ - forumNotifications?.unreadNotifications && { - count: +forumNotifications?.unreadNotifications, + messageCount && { + count: messageCount, type: "info", }, ].filter(Boolean), @@ -207,7 +211,7 @@ const WorkItem = ({ work, solutionsCount, isReviewPhaseEnded, - forumNotifications, + messageCount, ] ); @@ -324,7 +328,6 @@ const mapStateToProps = (state) => { isLoadingWork, isLoadingSolutions, isSavingSurveyDone, - forumNotifications, } = state.work; return { @@ -333,7 +336,6 @@ const mapStateToProps = (state) => { isLoadingWork, isLoadingSolutions, isSavingSurveyDone, - forumNotifications, }; }; @@ -346,7 +348,6 @@ const mapDispatchToProps = { downloadSolution, saveSurvey, setIsSavingSurveyDone, - getForumNotifications, toggleSupportModal, }; diff --git a/src/services/challenge.js b/src/services/challenge.js index 76b58ebf1..127ef9506 100644 --- a/src/services/challenge.js +++ b/src/services/challenge.js @@ -114,28 +114,11 @@ export async function activateChallenge(challengeId) { return response; } -/** - * Get Forum notifications - * @param {String} challengeId challenge id - */ -export async function getForumNotifications(challengeId, profile) { - const response = await xhrGetAsync( - `${config.VANILLA_FORUM_API}/groups/${challengeId}/member/${profile.handle}?access_token=${config.VANILLA_ACCESS_TOKEN}` - ); - - const res = await response.json(); - return { - ...res, - challengeId, - }; -} - const output = { getChallengeDetails, getIntakeFormChallenges, createChallenge, patchChallenge, - getForumNotifications, }; export default output diff --git a/start-ssl-bsouza.sh b/start-ssl-bsouza.sh index 4d0091e80..97893e0db 100644 --- a/start-ssl-bsouza.sh +++ b/start-ssl-bsouza.sh @@ -1,2 +1,4 @@ export REACT_APP_HOST_ENV=bsouza +export PORT=443 +export NVM_DIR=~/.nvm sh ./start-ssl.sh diff --git a/start-ssl.sh b/start-ssl.sh index 3c8a5e296..3a0319aef 100644 --- a/start-ssl.sh +++ b/start-ssl.sh @@ -2,7 +2,6 @@ export HTTPS=true export SSL_CRT_FILE=ssl/server.crt export SSL_KEY_FILE=ssl/server.key export HOST=local.topcoder-dev.com -export PORT=3003 -source ~/.nvm/nvm.sh +source $NVM_DIR/nvm.sh nvm use yarn react-app-rewired start diff --git a/tsconfig.json b/tsconfig.json index 3e85a71cd..fab3b432e 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -29,6 +29,7 @@ "src-ts" ], "exclude": [ - "**/*.test.*" + "**/*.test.*", + ".env" ] -} \ No newline at end of file +} diff --git a/tslint.json b/tslint.json index d1b0db4d6..0aa8caf3b 100644 --- a/tslint.json +++ b/tslint.json @@ -9,7 +9,8 @@ "src-ts/**/*" ], "exclude": [ - "src-ts/**/*.test*" + "src-ts/**/*.test*", + ".env" ], "rules": { "array-type": [ @@ -174,4 +175,4 @@ "check-type" ] } -} \ No newline at end of file +} diff --git a/webpack.config.js b/webpack.config.js deleted file mode 100644 index 7f0c21090..000000000 --- a/webpack.config.js +++ /dev/null @@ -1,135 +0,0 @@ -/* global __dirname process */ -const webpack = require("webpack"); -const webpackMerge = require("webpack-merge"); -const singleSpaDefaults = require("webpack-config-single-spa-react"); -const path = require("path"); -const autoprefixer = require("autoprefixer"); -const _ = require("lodash"); -const config = require("config"); - -const cssLocalIdent = - process.env.APPMODE === "production" - ? "[hash:base64:6]" - : "self_service_[path][name]___[local]___[hash:base64:6]"; - -module.exports = (webpackConfigEnv) => { - const defaultConfig = singleSpaDefaults({ - orgName: "topcoder", - projectName: "platform-ui", - webpackConfigEnv, - }); - - return webpackMerge.smart(defaultConfig, { - // to reduce size of bundle - externals: { - "react": "react", - "react-dom": "react-dom", - }, - output: { - // path: path.resolve(__dirname, 'dist'), - publicPath: "self-service-app", - }, - // modify the webpack config however you'd like to by adding to this object - module: { - rules: [ - { - /* Loads SCSS stylesheets. */ - test: /\.scss/, - use: [ - "style-loader", - { - loader: "css-loader", - options: { - modules: { - localIdentName: cssLocalIdent, - auto: true, - }, - }, - }, - { - loader: "postcss-loader", - options: { - postcssOptions: { - plugins: [autoprefixer], - }, - }, - }, - "resolve-url-loader", - { - loader: "sass-loader", - options: { - sourceMap: true, - }, - }, - ], - }, - { - test: /\.svg$/, - oneOf: [ - { - exclude: [/node_modules/], - loader: "babel-loader", - }, - { - exclude: [/node_modules/], - loader: require.resolve("file-loader", { paths: [__dirname] }), - }, - ], - }, - { - /* Loads raster images */ - test: /\.(gif|jpe?g|png|pdf)$/, - exclude: [/node_modules/, /[/\\]assets[/\\]fonts/], - loader: "file-loader", - options: { - outputPath: "icons", - }, - }, - { - test: /\.(js|jsx|ts|tsx)$/, - exclude: /(node_modules|bower_components)/, - loader: "babel-loader", - options: { - presets: [ - "@babel/env", - "@babel/preset-react", - "@babel/preset-typescript", - ] - } - }, - ], - }, - resolve: { - alias: { - styles: path.resolve(__dirname, "src/styles"), - actions: path.resolve(__dirname, "src/actions"), - assets: path.resolve(__dirname, "src/assets"), - components: path.resolve(__dirname, "src/components"), - hooks: path.resolve(__dirname, "src/hooks"), - utils: path.resolve(__dirname, "src/utils"), - constants: path.resolve(__dirname, "src/constants"), - selectors: path.resolve(__dirname, "src/selectors"), - services: path.resolve(__dirname, "src/services"), - thunks: path.resolve(__dirname, "src/thunks"), - hoc: path.resolve(__dirname, "src/hoc"), - }, - extensions: [".ts", ".tsx", ".js", ".jsx"] - }, - plugins: [ - new webpack.DefinePlugin({ - "process.env": { - ..._.mapValues(config, (value) => JSON.stringify(value)), - APPENV: JSON.stringify(process.env.REACT_APP_HOST_ENV), - REACT_APP_HOST_ENV: JSON.stringify(process.env.REACT_APP_HOST_ENV), - APPMODE: JSON.stringify(process.env.APPMODE), - }, - }), - // ignore moment locales to reduce bundle size by 64kb gzipped - // see solution details https://stackoverflow.com/questions/25384360/how-to-prevent-moment-js-from-loading-locales-with-webpack/25426019#25426019 - new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/), - new webpack.ProvidePlugin({ - "React": "react", - }) - ], - }); -}; diff --git a/yarn.lock b/yarn.lock index 6a54f5164..301fcda10 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,11 @@ # yarn lockfile v1 +"@adobe/css-tools@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.0.1.tgz#b38b444ad3aa5fedbb15f2f746dcd934226a12dd" + integrity sha512-+u76oB43nOHrF4DDWRLWDCtci7f3QJoEBigemIdIeTi1ODqjx6Tad9NCVnPRwewWlKkVab5PlK8DCtPTyX7S8g== + "@ampproject/remapping@^2.1.0": version "2.2.0" resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" @@ -26,26 +31,26 @@ dependencies: "@babel/highlight" "^7.18.6" -"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.18.6": - version "7.18.8" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.18.8.tgz#2483f565faca607b8535590e84e7de323f27764d" - integrity sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ== +"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.18.8": + version "7.18.13" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.18.13.tgz#6aff7b350a1e8c3e40b029e46cbe78e24a913483" + integrity sha512-5yUzC5LqyTFp2HLmDoxGQelcdYgSpP9xsnMWBphAscOdFrHSAVbLNzWiy32sVNDqJRDiJK6klfDnAgu6PAGSHw== "@babel/core@^7.1.0", "@babel/core@^7.11.1", "@babel/core@^7.12.3", "@babel/core@^7.16.0", "@babel/core@^7.7.2", "@babel/core@^7.7.5", "@babel/core@^7.8.0": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.18.6.tgz#54a107a3c298aee3fe5e1947a6464b9b6faca03d" - integrity sha512-cQbWBpxcbbs/IUredIPkHiAGULLV8iwgNRMFzvbhEXISp4f3rUUXE5+TIw6KwUWUR3DwyI6gmBRnmAtYaWehwQ== + version "7.18.13" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.18.13.tgz#9be8c44512751b05094a4d3ab05fc53a47ce00ac" + integrity sha512-ZisbOvRRusFktksHSG6pjj1CSvkPkcZq/KHD45LAkVP/oiHJkNBZWfpvlLmX8OtHDG8IuzsFlVRWo08w7Qxn0A== dependencies: "@ampproject/remapping" "^2.1.0" "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.18.6" - "@babel/helper-compilation-targets" "^7.18.6" - "@babel/helper-module-transforms" "^7.18.6" - "@babel/helpers" "^7.18.6" - "@babel/parser" "^7.18.6" - "@babel/template" "^7.18.6" - "@babel/traverse" "^7.18.6" - "@babel/types" "^7.18.6" + "@babel/generator" "^7.18.13" + "@babel/helper-compilation-targets" "^7.18.9" + "@babel/helper-module-transforms" "^7.18.9" + "@babel/helpers" "^7.18.9" + "@babel/parser" "^7.18.13" + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.18.13" + "@babel/types" "^7.18.13" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" @@ -53,20 +58,20 @@ semver "^6.3.0" "@babel/eslint-parser@^7.16.3": - version "7.18.2" - resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.18.2.tgz#e14dee36c010edfb0153cf900c2b0815e82e3245" - integrity sha512-oFQYkE8SuH14+uR51JVAmdqwKYXGRjEXx7s+WiagVjqQ+HPE+nnwyF2qlVG8evUsUHmPcA+6YXMEDbIhEyQc5A== + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.18.9.tgz#255a63796819a97b7578751bb08ab9f2a375a031" + integrity sha512-KzSGpMBggz4fKbRbWLNyPVTuQr6cmCcBhOyXTw/fieOVaw5oYAwcAj4a7UKcDYCPxQq+CG1NCDZH9e2JTXquiQ== dependencies: eslint-scope "^5.1.1" eslint-visitor-keys "^2.1.0" semver "^6.3.0" -"@babel/generator@^7.18.6", "@babel/generator@^7.18.7", "@babel/generator@^7.4.0", "@babel/generator@^7.7.2": - version "7.18.7" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.18.7.tgz#2aa78da3c05aadfc82dbac16c99552fc802284bd" - integrity sha512-shck+7VLlY72a2w9c3zYWuE1pwOKEiQHV7GTUbSnhyl5eu3i04t30tBY82ZRWrDfo3gkakCFtevExnxbkf2a3A== +"@babel/generator@^7.18.13", "@babel/generator@^7.4.0", "@babel/generator@^7.7.2": + version "7.18.13" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.18.13.tgz#59550cbb9ae79b8def15587bdfbaa388c4abf212" + integrity sha512-CkPg8ySSPuHTYPJYo7IRALdqyjM9HCbt/3uOBEFbzyGVP6Mn8bwFPB0jX6982JVNBlYzM1nnPkfjuXSOPtQeEQ== dependencies: - "@babel/types" "^7.18.7" + "@babel/types" "^7.18.13" "@jridgewell/gen-mapping" "^0.3.2" jsesc "^2.5.1" @@ -78,34 +83,34 @@ "@babel/types" "^7.18.6" "@babel/helper-builder-binary-assignment-operator-visitor@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.6.tgz#f14d640ed1ee9246fb33b8255f08353acfe70e6a" - integrity sha512-KT10c1oWEpmrIRYnthbzHgoOf6B+Xd6a5yhdbNtdhtG7aO1or5HViuf1TQR36xY/QprXA5nvxO6nAjhJ4y38jw== + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz#acd4edfd7a566d1d51ea975dff38fd52906981bb" + integrity sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw== dependencies: "@babel/helper-explode-assignable-expression" "^7.18.6" - "@babel/types" "^7.18.6" + "@babel/types" "^7.18.9" -"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.6.tgz#18d35bfb9f83b1293c22c55b3d576c1315b6ed96" - integrity sha512-vFjbfhNCzqdeAtZflUFrG5YIFqGTqsctrtkZ1D/NB0mDW9TwW3GmmUepYY4G9wCET5rY5ugz4OGTcLd614IzQg== +"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz#69e64f57b524cde3e5ff6cc5a9f4a387ee5563bf" + integrity sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg== dependencies: - "@babel/compat-data" "^7.18.6" + "@babel/compat-data" "^7.18.8" "@babel/helper-validator-option" "^7.18.6" browserslist "^4.20.2" semver "^6.3.0" -"@babel/helper-create-class-features-plugin@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.6.tgz#6f15f8459f3b523b39e00a99982e2c040871ed72" - integrity sha512-YfDzdnoxHGV8CzqHGyCbFvXg5QESPFkXlHtvdCkesLjjVMT2Adxe4FGUR5ChIb3DxSaXO12iIOCWoXdsUVwnqw== +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.18.9": + version "7.18.13" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.13.tgz#63e771187bd06d234f95fdf8bd5f8b6429de6298" + integrity sha512-hDvXp+QYxSRL+23mpAlSGxHMDyIGChm0/AwTfTAAK5Ufe40nCsyNdaYCGuK91phn/fVu9kqayImRDkvNAgdrsA== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-environment-visitor" "^7.18.6" - "@babel/helper-function-name" "^7.18.6" - "@babel/helper-member-expression-to-functions" "^7.18.6" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.18.9" + "@babel/helper-member-expression-to-functions" "^7.18.9" "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-replace-supers" "^7.18.6" + "@babel/helper-replace-supers" "^7.18.9" "@babel/helper-split-export-declaration" "^7.18.6" "@babel/helper-create-regexp-features-plugin@^7.18.6": @@ -116,24 +121,22 @@ "@babel/helper-annotate-as-pure" "^7.18.6" regexpu-core "^5.1.0" -"@babel/helper-define-polyfill-provider@^0.3.1": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz#52411b445bdb2e676869e5a74960d2d3826d2665" - integrity sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA== +"@babel/helper-define-polyfill-provider@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.2.tgz#bd10d0aca18e8ce012755395b05a79f45eca5073" + integrity sha512-r9QJJ+uDWrd+94BSPcP6/de67ygLtvVy6cK4luE6MOuDsZIdoaPBnfSpbO/+LTifjPckbKXRuI9BB/Z2/y3iTg== dependencies: - "@babel/helper-compilation-targets" "^7.13.0" - "@babel/helper-module-imports" "^7.12.13" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/traverse" "^7.13.0" + "@babel/helper-compilation-targets" "^7.17.7" + "@babel/helper-plugin-utils" "^7.16.7" debug "^4.1.1" lodash.debounce "^4.0.8" resolve "^1.14.2" semver "^6.1.2" -"@babel/helper-environment-visitor@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.6.tgz#b7eee2b5b9d70602e59d1a6cad7dd24de7ca6cd7" - integrity sha512-8n6gSfn2baOY+qlp+VSzsosjCVGFqWKmDF0cCWOybh52Dw3SEyoWR1KrhMJASjLwIEkkAufZ0xvr+SxLHSpy2Q== +"@babel/helper-environment-visitor@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" + integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== "@babel/helper-explode-assignable-expression@^7.18.6": version "7.18.6" @@ -142,13 +145,13 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-function-name@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.18.6.tgz#8334fecb0afba66e6d87a7e8c6bb7fed79926b83" - integrity sha512-0mWMxV1aC97dhjCah5U5Ua7668r5ZmSC2DLfH2EZnf9c3/dHZKiFa5pRLMH5tjSl471tY6496ZWk/kjNONBxhw== +"@babel/helper-function-name@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz#940e6084a55dee867d33b4e487da2676365e86b0" + integrity sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A== dependencies: "@babel/template" "^7.18.6" - "@babel/types" "^7.18.6" + "@babel/types" "^7.18.9" "@babel/helper-hoist-variables@^7.18.6": version "7.18.6" @@ -157,33 +160,33 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-member-expression-to-functions@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.6.tgz#44802d7d602c285e1692db0bad9396d007be2afc" - integrity sha512-CeHxqwwipekotzPDUuJOfIMtcIHBuc7WAzLmTYWctVigqS5RktNMQ5bEwQSuGewzYnCtTWa3BARXeiLxDTv+Ng== +"@babel/helper-member-expression-to-functions@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz#1531661e8375af843ad37ac692c132841e2fd815" + integrity sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg== dependencies: - "@babel/types" "^7.18.6" + "@babel/types" "^7.18.9" -"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.16.0", "@babel/helper-module-imports@^7.18.6": +"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.16.0", "@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== dependencies: "@babel/types" "^7.18.6" -"@babel/helper-module-transforms@^7.18.6": - version "7.18.8" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.18.8.tgz#4f8408afead0188cfa48672f9d0e5787b61778c8" - integrity sha512-che3jvZwIcZxrwh63VfnFTUzcAM9v/lznYkkRxIBGMPt1SudOKHAEec0SIRCfiuIzTcF7VGj/CaTT6gY4eWxvA== +"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz#5a1079c005135ed627442df31a42887e80fcb712" + integrity sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g== dependencies: - "@babel/helper-environment-visitor" "^7.18.6" + "@babel/helper-environment-visitor" "^7.18.9" "@babel/helper-module-imports" "^7.18.6" "@babel/helper-simple-access" "^7.18.6" "@babel/helper-split-export-declaration" "^7.18.6" "@babel/helper-validator-identifier" "^7.18.6" "@babel/template" "^7.18.6" - "@babel/traverse" "^7.18.8" - "@babel/types" "^7.18.8" + "@babel/traverse" "^7.18.9" + "@babel/types" "^7.18.9" "@babel/helper-optimise-call-expression@^7.18.6": version "7.18.6" @@ -192,31 +195,31 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.6.tgz#9448974dd4fb1d80fefe72e8a0af37809cd30d6d" - integrity sha512-gvZnm1YAAxh13eJdkb9EWHBnF3eAub3XTLCZEehHT2kWxiKVRL64+ae5Y6Ivne0mVHmMYKT+xWgZO+gQhuLUBg== +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz#4b8aea3b069d8cb8a72cdfe28ddf5ceca695ef2f" + integrity sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w== -"@babel/helper-remap-async-to-generator@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.6.tgz#fa1f81acd19daee9d73de297c0308783cd3cfc23" - integrity sha512-z5wbmV55TveUPZlCLZvxWHtrjuJd+8inFhk7DG0WW87/oJuGDcjDiu7HIvGcpf5464L6xKCg3vNkmlVVz9hwyQ== +"@babel/helper-remap-async-to-generator@^7.18.6", "@babel/helper-remap-async-to-generator@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz#997458a0e3357080e54e1d79ec347f8a8cd28519" + integrity sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-environment-visitor" "^7.18.6" - "@babel/helper-wrap-function" "^7.18.6" - "@babel/types" "^7.18.6" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-wrap-function" "^7.18.9" + "@babel/types" "^7.18.9" -"@babel/helper-replace-supers@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.18.6.tgz#efedf51cfccea7b7b8c0f00002ab317e7abfe420" - integrity sha512-fTf7zoXnUGl9gF25fXCWE26t7Tvtyn6H4hkLSYhATwJvw2uYxd3aoXplMSe0g9XbwK7bmxNes7+FGO0rB/xC0g== +"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.18.9.tgz#1092e002feca980fbbb0bd4d51b74a65c6a500e6" + integrity sha512-dNsWibVI4lNT6HiuOIBr1oyxo40HvIVmbwPUm3XZ7wMh4k2WxrxTqZwSqw/eEmXDS9np0ey5M2bz9tBmO9c+YQ== dependencies: - "@babel/helper-environment-visitor" "^7.18.6" - "@babel/helper-member-expression-to-functions" "^7.18.6" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-member-expression-to-functions" "^7.18.9" "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/traverse" "^7.18.6" - "@babel/types" "^7.18.6" + "@babel/traverse" "^7.18.9" + "@babel/types" "^7.18.9" "@babel/helper-simple-access@^7.18.6": version "7.18.6" @@ -225,12 +228,12 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-skip-transparent-expression-wrappers@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.6.tgz#7dff00a5320ca4cf63270e5a0eca4b268b7380d9" - integrity sha512-4KoLhwGS9vGethZpAhYnMejWkX64wsnHPDwvOsKWU6Fg4+AlK2Jz3TyjQLMEPvz+1zemi/WBdkYxCD0bAfIkiw== +"@babel/helper-skip-transparent-expression-wrappers@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.9.tgz#778d87b3a758d90b471e7b9918f34a9a02eb5818" + integrity sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw== dependencies: - "@babel/types" "^7.18.6" + "@babel/types" "^7.18.9" "@babel/helper-split-export-declaration@^7.18.6": version "7.18.6" @@ -239,6 +242,11 @@ dependencies: "@babel/types" "^7.18.6" +"@babel/helper-string-parser@^7.18.10": + version "7.18.10" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz#181f22d28ebe1b3857fa575f5c290b1aaf659b56" + integrity sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw== + "@babel/helper-validator-identifier@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz#9c97e30d31b2b8c72a1d08984f2ca9b574d7a076" @@ -249,24 +257,24 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== -"@babel/helper-wrap-function@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.18.6.tgz#ec44ea4ad9d8988b90c3e465ba2382f4de81a073" - integrity sha512-I5/LZfozwMNbwr/b1vhhuYD+J/mU+gfGAj5td7l5Rv9WYmH6i3Om69WGKNmlIpsVW/mF6O5bvTKbvDQZVgjqOw== +"@babel/helper-wrap-function@^7.18.9": + version "7.18.11" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.18.11.tgz#bff23ace436e3f6aefb61f85ffae2291c80ed1fb" + integrity sha512-oBUlbv+rjZLh2Ks9SKi4aL7eKaAXBWleHzU89mP0G6BMUlRxSckk9tSIkgDGydhgFxHuGSlBQZfnaD47oBEB7w== dependencies: - "@babel/helper-function-name" "^7.18.6" - "@babel/template" "^7.18.6" - "@babel/traverse" "^7.18.6" - "@babel/types" "^7.18.6" + "@babel/helper-function-name" "^7.18.9" + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.18.11" + "@babel/types" "^7.18.10" -"@babel/helpers@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.18.6.tgz#4c966140eaa1fcaa3d5a8c09d7db61077d4debfd" - integrity sha512-vzSiiqbQOghPngUYt/zWGvK3LAsPhz55vc9XNN0xAl2gV4ieShI2OQli5duxWHD+72PZPTKAcfcZDE1Cwc5zsQ== +"@babel/helpers@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.18.9.tgz#4bef3b893f253a1eced04516824ede94dcfe7ff9" + integrity sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ== dependencies: "@babel/template" "^7.18.6" - "@babel/traverse" "^7.18.6" - "@babel/types" "^7.18.6" + "@babel/traverse" "^7.18.9" + "@babel/types" "^7.18.9" "@babel/highlight@^7.18.6": version "7.18.6" @@ -277,10 +285,10 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.18.6", "@babel/parser@^7.18.8", "@babel/parser@^7.4.3": - version "7.18.8" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.8.tgz#822146080ac9c62dac0823bb3489622e0bc1cbdf" - integrity sha512-RSKRfYX20dyH+elbJK2uqAkVyucL+xXzhqlMD5/ZXx+dAAwpyB7HsvnHe/ZUGOF+xLr5Wx9/JoXVTj6BQE2/oA== +"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.18.10", "@babel/parser@^7.18.13", "@babel/parser@^7.4.3": + version "7.18.13" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.13.tgz#5b2dd21cae4a2c5145f1fbd8ca103f9313d3b7e4" + integrity sha512-dgXcIfMuQ0kgzLB2b9tRZs7TTFFaGM2AbtA4fJgUUYukzGH4jwsS7hzQHEGs67jdehpm22vkgKwvbU+aEflgwg== "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": version "7.18.6" @@ -289,23 +297,23 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.6.tgz#b4e4dbc2cd1acd0133479918f7c6412961c9adb8" - integrity sha512-Udgu8ZRgrBrttVz6A0EVL0SJ1z+RLbIeqsu632SA1hf0awEppD6TvdznoH+orIF8wtFFAV/Enmw9Y+9oV8TQcw== +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz#a11af19aa373d68d561f08e0a57242350ed0ec50" + integrity sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-skip-transparent-expression-wrappers" "^7.18.6" - "@babel/plugin-proposal-optional-chaining" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" + "@babel/plugin-proposal-optional-chaining" "^7.18.9" -"@babel/plugin-proposal-async-generator-functions@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.6.tgz#aedac81e6fc12bb643374656dd5f2605bf743d17" - integrity sha512-WAz4R9bvozx4qwf74M+sfqPMKfSqwM0phxPTR6iJIi8robgzXwkEgmeJG1gEKhm6sDqT/U9aV3lfcqybIpev8w== +"@babel/plugin-proposal-async-generator-functions@^7.18.10": + version "7.18.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.10.tgz#85ea478c98b0095c3e4102bff3b67d306ed24952" + integrity sha512-1mFuY2TOsR1hxbjCo4QL+qlIjV07p4H4EUYw2J/WCqsvFV6V9X9z9YhXbWndc/4fw+hYGlDT7egYxliMp5O6Ew== dependencies: - "@babel/helper-environment-visitor" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-remap-async-to-generator" "^7.18.6" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-remap-async-to-generator" "^7.18.9" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-proposal-class-properties@^7.16.0", "@babel/plugin-proposal-class-properties@^7.18.6": @@ -326,13 +334,13 @@ "@babel/plugin-syntax-class-static-block" "^7.14.5" "@babel/plugin-proposal-decorators@^7.16.4": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.18.6.tgz#68e9fd0f022b944f84a8824bb28bfaee724d2595" - integrity sha512-gAdhsjaYmiZVxx5vTMiRfj31nB7LhwBJFMSLzeDxc7X4tKLixup0+k9ughn0RcpBrv9E3PBaXJW7jF5TCihAOg== + version "7.18.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.18.10.tgz#788650d01e518a8a722eb8b3055dd9d73ecb7a35" + integrity sha512-wdGTwWF5QtpTY/gbBtQLAiCnoxfD4qMbN87NYZle1dOZ9Os8Y6zXcKrIaOU8W+TIvFUWVGG9tUgNww3CjXRVVw== dependencies: - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-replace-supers" "^7.18.6" + "@babel/helper-create-class-features-plugin" "^7.18.9" + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-replace-supers" "^7.18.9" "@babel/helper-split-export-declaration" "^7.18.6" "@babel/plugin-syntax-decorators" "^7.18.6" @@ -344,12 +352,12 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-dynamic-import" "^7.8.3" -"@babel/plugin-proposal-export-namespace-from@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.6.tgz#1016f0aa5ab383bbf8b3a85a2dcaedf6c8ee7491" - integrity sha512-zr/QcUlUo7GPo6+X1wC98NJADqmy5QTFWWhqeQWiki4XHafJtLl/YMGkmRB2szDD2IYJCCdBTd4ElwhId9T7Xw== +"@babel/plugin-proposal-export-namespace-from@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz#5f7313ab348cdb19d590145f9247540e94761203" + integrity sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" "@babel/plugin-proposal-json-strings@^7.18.6": @@ -360,12 +368,12 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/plugin-proposal-logical-assignment-operators@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.6.tgz#3b9cac6f1ffc2aa459d111df80c12020dfc6b665" - integrity sha512-zMo66azZth/0tVd7gmkxOkOjs2rpHyhpcFo565PUP37hSp6hSd9uUKIfTDFMz58BwqgQKhJ9YxtM5XddjXVn+Q== +"@babel/plugin-proposal-logical-assignment-operators@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz#8148cbb350483bf6220af06fa6db3690e14b2e23" + integrity sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" "@babel/plugin-proposal-nullish-coalescing-operator@^7.16.0", "@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6": @@ -384,16 +392,16 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-proposal-object-rest-spread@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.6.tgz#ec93bba06bfb3e15ebd7da73e953d84b094d5daf" - integrity sha512-9yuM6wr4rIsKa1wlUAbZEazkCrgw2sMPEXCr4Rnwetu7cEW1NydkCWytLuYletbf8vFxdJxFhwEZqMpOx2eZyw== +"@babel/plugin-proposal-object-rest-spread@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.9.tgz#f9434f6beb2c8cae9dfcf97d2a5941bbbf9ad4e7" + integrity sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q== dependencies: - "@babel/compat-data" "^7.18.6" - "@babel/helper-compilation-targets" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/compat-data" "^7.18.8" + "@babel/helper-compilation-targets" "^7.18.9" + "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.18.6" + "@babel/plugin-transform-parameters" "^7.18.8" "@babel/plugin-proposal-optional-catch-binding@^7.18.6": version "7.18.6" @@ -403,13 +411,13 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-proposal-optional-chaining@^7.16.0", "@babel/plugin-proposal-optional-chaining@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.6.tgz#46d4f2ffc20e87fad1d98bc4fa5d466366f6aa0b" - integrity sha512-PatI6elL5eMzoypFAiYDpYQyMtXTn+iMhuxxQt5mAXD4fEmKorpSI3PHd+i3JXBJN3xyA6MvJv7at23HffFHwA== +"@babel/plugin-proposal-optional-chaining@^7.16.0", "@babel/plugin-proposal-optional-chaining@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz#e8e8fe0723f2563960e4bf5e9690933691915993" + integrity sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-skip-transparent-expression-wrappers" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-proposal-private-methods@^7.16.0", "@babel/plugin-proposal-private-methods@^7.18.6": @@ -515,7 +523,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@^7.0.0", "@babel/plugin-syntax-jsx@^7.12.13", "@babel/plugin-syntax-jsx@^7.17.12", "@babel/plugin-syntax-jsx@^7.18.6": +"@babel/plugin-syntax-jsx@^7.0.0", "@babel/plugin-syntax-jsx@^7.17.12", "@babel/plugin-syntax-jsx@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz#a8feef63b010150abd97f1649ec296e849943ca0" integrity sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q== @@ -608,40 +616,40 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-block-scoping@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.6.tgz#b5f78318914615397d86a731ef2cc668796a726c" - integrity sha512-pRqwb91C42vs1ahSAWJkxOxU1RHWDn16XAa6ggQ72wjLlWyYeAcLvTtE0aM8ph3KNydy9CQF2nLYcjq1WysgxQ== +"@babel/plugin-transform-block-scoping@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.9.tgz#f9b7e018ac3f373c81452d6ada8bd5a18928926d" + integrity sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-classes@^7.18.6": - version "7.18.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.8.tgz#7e85777e622e979c85c701a095280360b818ce49" - integrity sha512-RySDoXdF6hgHSHuAW4aLGyVQdmvEX/iJtjVre52k0pxRq4hzqze+rAVP++NmNv596brBpYmaiKgTZby7ziBnVg== +"@babel/plugin-transform-classes@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.9.tgz#90818efc5b9746879b869d5ce83eb2aa48bbc3da" + integrity sha512-EkRQxsxoytpTlKJmSPYrsOMjCILacAjtSVkd4gChEe2kXjFCun3yohhW5I7plXJhCemM0gKsaGMcO8tinvCA5g== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-environment-visitor" "^7.18.6" - "@babel/helper-function-name" "^7.18.6" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.18.9" "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-replace-supers" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-replace-supers" "^7.18.9" "@babel/helper-split-export-declaration" "^7.18.6" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.6.tgz#5d15eb90e22e69604f3348344c91165c5395d032" - integrity sha512-9repI4BhNrR0KenoR9vm3/cIc1tSBIo+u1WVjKCAynahj25O8zfbiE6JtAtHPGQSs4yZ+bA8mRasRP+qc+2R5A== +"@babel/plugin-transform-computed-properties@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz#2357a8224d402dad623caf6259b611e56aec746e" + integrity sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-destructuring@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.6.tgz#a98b0e42c7ffbf5eefcbcf33280430f230895c6f" - integrity sha512-tgy3u6lRp17ilY8r1kP4i2+HDUwxlVqq3RTc943eAWSzGgpU1qhiKpqZ5CMyHReIYPHdo3Kg8v8edKtDqSVEyQ== +"@babel/plugin-transform-destructuring@^7.18.9": + version "7.18.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.13.tgz#9e03bc4a94475d62b7f4114938e6c5c33372cbf5" + integrity sha512-TodpQ29XekIsex2A+YJPj5ax2plkGa8YYY6mFjCohk/IG9IY42Rtuj1FuDeemfg2ipxIFLzPeA83SIBnlhSIow== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-transform-dotall-regex@^7.18.6", "@babel/plugin-transform-dotall-regex@^7.4.4": version "7.18.6" @@ -651,12 +659,12 @@ "@babel/helper-create-regexp-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-duplicate-keys@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.6.tgz#e6c94e8cd3c9dd8a88144f7b78ae22975a7ff473" - integrity sha512-NJU26U/208+sxYszf82nmGYqVF9QN8py2HFTblPT9hbawi8+1C5a9JubODLTGFuT0qlkqVinmkwOD13s0sZktg== +"@babel/plugin-transform-duplicate-keys@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz#687f15ee3cdad6d85191eb2a372c4528eaa0ae0e" + integrity sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-transform-exponentiation-operator@^7.18.6": version "7.18.6" @@ -667,35 +675,35 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-flow-strip-types@^7.16.0": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.18.6.tgz#6d3dd9f9c0fe13349428569fef00b31310bb3f9f" - integrity sha512-wE0xtA7csz+hw4fKPwxmu5jnzAsXPIO57XnRwzXP3T19jWh1BODnPGoG9xKYwvAwusP7iUktHayRFbMPGtODaQ== + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.18.9.tgz#5b4cc521426263b5ce08893a2db41097ceba35bf" + integrity sha512-+G6rp2zRuOAInY5wcggsx4+QVao1qPM0osC9fTUVlAV3zOrzTCnrMAFVnR6+a3T8wz1wFIH7KhYMcMB3u1n80A== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-syntax-flow" "^7.18.6" -"@babel/plugin-transform-for-of@^7.18.6": +"@babel/plugin-transform-for-of@^7.18.8": version "7.18.8" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz#6ef8a50b244eb6a0bdbad0c7c61877e4e30097c1" integrity sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ== dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-function-name@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.6.tgz#6a7e4ae2893d336fd1b8f64c9f92276391d0f1b4" - integrity sha512-kJha/Gbs5RjzIu0CxZwf5e3aTTSlhZnHMT8zPWnJMjNpLOUgqevg+PN5oMH68nMCXnfiMo4Bhgxqj59KHTlAnA== +"@babel/plugin-transform-function-name@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz#cc354f8234e62968946c61a46d6365440fc764e0" + integrity sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ== dependencies: - "@babel/helper-compilation-targets" "^7.18.6" - "@babel/helper-function-name" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-compilation-targets" "^7.18.9" + "@babel/helper-function-name" "^7.18.9" + "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-literals@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.6.tgz#9d6af353b5209df72960baf4492722d56f39a205" - integrity sha512-x3HEw0cJZVDoENXOp20HlypIHfl0zMIhMVZEBVTfmqbObIpsMxMbmU5nOEO8R7LYT+z5RORKPlTI5Hj4OsO9/Q== +"@babel/plugin-transform-literals@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz#72796fdbef80e56fba3c6a699d54f0de557444bc" + integrity sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-transform-member-expression-literals@^7.18.6": version "7.18.6" @@ -723,14 +731,14 @@ "@babel/helper-simple-access" "^7.18.6" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-systemjs@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.6.tgz#026511b7657d63bf5d4cf2fd4aeb963139914a54" - integrity sha512-UbPYpXxLjTw6w6yXX2BYNxF3p6QY225wcTkfQCy3OMnSlS/C3xGtwUjEzGkldb/sy6PWLiCQ3NbYfjWUTI3t4g== +"@babel/plugin-transform-modules-systemjs@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.9.tgz#545df284a7ac6a05125e3e405e536c5853099a06" + integrity sha512-zY/VSIbbqtoRoJKo2cDTewL364jSlZGvn0LKOf9ntbfxOvjfmyrdtEEOAdswOswhZEb8UH3jDkCKHd1sPgsS0A== dependencies: "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-module-transforms" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-module-transforms" "^7.18.9" + "@babel/helper-plugin-utils" "^7.18.9" "@babel/helper-validator-identifier" "^7.18.6" babel-plugin-dynamic-import-node "^2.3.3" @@ -765,7 +773,7 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/helper-replace-supers" "^7.18.6" -"@babel/plugin-transform-parameters@^7.18.6": +"@babel/plugin-transform-parameters@^7.18.8": version "7.18.8" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.8.tgz#ee9f1a0ce6d78af58d0956a9378ea3427cccb48a" integrity sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg== @@ -780,11 +788,11 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-react-constant-elements@^7.12.1": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.18.6.tgz#e477693aad3e2aafe86b6db03748a30aef417a5e" - integrity sha512-4g5H1bonF1dqgMe+wQ2fvDlRZ/mN/KwArk13teDv+xxn+pUDEiiDluQd6D2B30MJcL1u3qr0WZpfq0mw9/zSqA== + version "7.18.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.18.12.tgz#edf3bec47eb98f14e84fa0af137fcc6aad8e0443" + integrity sha512-Q99U9/ttiu+LMnRU8psd23HhvwXmKWDQIpocm0JKaICcZHnw+mdQbHm6xnSy7dOl8I5PELakYtNBubNQlBXbZw== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-transform-react-display-name@^7.16.0", "@babel/plugin-transform-react-display-name@^7.18.6": version "7.18.6" @@ -801,15 +809,15 @@ "@babel/plugin-transform-react-jsx" "^7.18.6" "@babel/plugin-transform-react-jsx@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.18.6.tgz#2721e96d31df96e3b7ad48ff446995d26bc028ff" - integrity sha512-Mz7xMPxoy9kPS/JScj6fJs03TZ/fZ1dJPlMjRAgTaxaS0fUBk8FV/A2rRgfPsVCZqALNwMexD+0Uaf5zlcKPpw== + version "7.18.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.18.10.tgz#ea47b2c4197102c196cbd10db9b3bb20daa820f1" + integrity sha512-gCy7Iikrpu3IZjYZolFE4M1Sm+nrh1/6za2Ewj77Z+XirT4TsbJcvOFOyF+fRPwU6AKKK136CZxx6L8AbSFG6A== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-syntax-jsx" "^7.18.6" - "@babel/types" "^7.18.6" + "@babel/types" "^7.18.10" "@babel/plugin-transform-react-pure-annotations@^7.18.6": version "7.18.6" @@ -835,15 +843,15 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-runtime@^7.16.4", "@babel/plugin-transform-runtime@^7.8.3": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.6.tgz#77b14416015ea93367ca06979710f5000ff34ccb" - integrity sha512-8uRHk9ZmRSnWqUgyae249EJZ94b0yAGLBIqzZzl+0iEdbno55Pmlt/32JZsHwXD9k/uZj18Aqqk35wBX4CBTXA== + version "7.18.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.10.tgz#37d14d1fa810a368fd635d4d1476c0154144a96f" + integrity sha512-q5mMeYAdfEbpBAgzl7tBre/la3LeCxmDO1+wMXRdPWbcoMjR3GiXlCLk7JBZVVye0bqTGNMbt0yYVXX1B1jEWQ== dependencies: "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - babel-plugin-polyfill-corejs2 "^0.3.1" - babel-plugin-polyfill-corejs3 "^0.5.2" - babel-plugin-polyfill-regenerator "^0.3.1" + "@babel/helper-plugin-utils" "^7.18.9" + babel-plugin-polyfill-corejs2 "^0.3.2" + babel-plugin-polyfill-corejs3 "^0.5.3" + babel-plugin-polyfill-regenerator "^0.4.0" semver "^6.3.0" "@babel/plugin-transform-shorthand-properties@^7.18.6": @@ -853,13 +861,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-spread@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.6.tgz#82b080241965f1689f0a60ecc6f1f6575dbdb9d6" - integrity sha512-ayT53rT/ENF8WWexIRg9AiV9h0aIteyWn5ptfZTZQrjk/+f3WdrJGCY4c9wcgl2+MKkKPhzbYp97FTsquZpDCw== +"@babel/plugin-transform-spread@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.9.tgz#6ea7a6297740f381c540ac56caf75b05b74fb664" + integrity sha512-39Q814wyoOPtIB/qGopNIL9xDChOE1pNU0ZY5dO0owhiVt/5kFm4li+/bBtwc7QotG0u5EPzqhZdjMtmqBqyQA== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-skip-transparent-expression-wrappers" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" "@babel/plugin-transform-sticky-regex@^7.18.6": version "7.18.6" @@ -868,35 +876,35 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-template-literals@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.6.tgz#b763f4dc9d11a7cce58cf9a490d82e80547db9c2" - integrity sha512-UuqlRrQmT2SWRvahW46cGSany0uTlcj8NYOS5sRGYi8FxPYPoLd5DDmMd32ZXEj2Jq+06uGVQKHxa/hJx2EzKw== +"@babel/plugin-transform-template-literals@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz#04ec6f10acdaa81846689d63fae117dd9c243a5e" + integrity sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-typeof-symbol@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.6.tgz#486bb39d5a18047358e0d04dc0d2f322f0b92e92" - integrity sha512-7m71iS/QhsPk85xSjFPovHPcH3H9qeyzsujhTc+vcdnsXavoWYJ74zx0lP5RhpC5+iDnVLO+PPMHzC11qels1g== +"@babel/plugin-transform-typeof-symbol@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz#c8cea68263e45addcd6afc9091429f80925762c0" + integrity sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-transform-typescript@^7.18.6": - version "7.18.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.18.8.tgz#303feb7a920e650f2213ef37b36bbf327e6fa5a0" - integrity sha512-p2xM8HI83UObjsZGofMV/EdYjamsDm6MoN3hXPYIT0+gxIoopE+B7rPYKAxfrz9K9PK7JafTTjqYC6qipLExYA== + version "7.18.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.18.12.tgz#712e9a71b9e00fde9f8c0238e0cceee86ab2f8fd" + integrity sha512-2vjjam0cum0miPkenUbQswKowuxs/NjMwIKEq0zwegRxXk12C9YOF9STXnaUptITOtOJHKHpzvvWYOjbm6tc0w== dependencies: - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-create-class-features-plugin" "^7.18.9" + "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-syntax-typescript" "^7.18.6" -"@babel/plugin-transform-unicode-escapes@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.6.tgz#0d01fb7fb2243ae1c033f65f6e3b4be78db75f27" - integrity sha512-XNRwQUXYMP7VLuy54cr/KS/WeL3AZeORhrmeZ7iewgu+X2eBqmpaLI/hzqr9ZxCeUoq0ASK4GUzSM0BDhZkLFw== +"@babel/plugin-transform-unicode-escapes@^7.18.10": + version "7.18.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz#1ecfb0eda83d09bbcb77c09970c2dd55832aa246" + integrity sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-transform-unicode-regex@^7.18.6": version "7.18.6" @@ -907,28 +915,28 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/preset-env@^7.11.0", "@babel/preset-env@^7.12.1", "@babel/preset-env@^7.16.4", "@babel/preset-env@^7.7.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.18.6.tgz#953422e98a5f66bc56cd0b9074eaea127ec86ace" - integrity sha512-WrthhuIIYKrEFAwttYzgRNQ5hULGmwTj+D6l7Zdfsv5M7IWV/OZbUfbeL++Qrzx1nVJwWROIFhCHRYQV4xbPNw== + version "7.18.10" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.18.10.tgz#83b8dfe70d7eea1aae5a10635ab0a5fe60dfc0f4" + integrity sha512-wVxs1yjFdW3Z/XkNfXKoblxoHgbtUF7/l3PvvP4m02Qz9TZ6uZGxRVYjSQeR87oQmHco9zWitW5J82DJ7sCjvA== dependencies: - "@babel/compat-data" "^7.18.6" - "@babel/helper-compilation-targets" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/compat-data" "^7.18.8" + "@babel/helper-compilation-targets" "^7.18.9" + "@babel/helper-plugin-utils" "^7.18.9" "@babel/helper-validator-option" "^7.18.6" "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.18.6" - "@babel/plugin-proposal-async-generator-functions" "^7.18.6" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.18.9" + "@babel/plugin-proposal-async-generator-functions" "^7.18.10" "@babel/plugin-proposal-class-properties" "^7.18.6" "@babel/plugin-proposal-class-static-block" "^7.18.6" "@babel/plugin-proposal-dynamic-import" "^7.18.6" - "@babel/plugin-proposal-export-namespace-from" "^7.18.6" + "@babel/plugin-proposal-export-namespace-from" "^7.18.9" "@babel/plugin-proposal-json-strings" "^7.18.6" - "@babel/plugin-proposal-logical-assignment-operators" "^7.18.6" + "@babel/plugin-proposal-logical-assignment-operators" "^7.18.9" "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.6" "@babel/plugin-proposal-numeric-separator" "^7.18.6" - "@babel/plugin-proposal-object-rest-spread" "^7.18.6" + "@babel/plugin-proposal-object-rest-spread" "^7.18.9" "@babel/plugin-proposal-optional-catch-binding" "^7.18.6" - "@babel/plugin-proposal-optional-chaining" "^7.18.6" + "@babel/plugin-proposal-optional-chaining" "^7.18.9" "@babel/plugin-proposal-private-methods" "^7.18.6" "@babel/plugin-proposal-private-property-in-object" "^7.18.6" "@babel/plugin-proposal-unicode-property-regex" "^7.18.6" @@ -950,40 +958,40 @@ "@babel/plugin-transform-arrow-functions" "^7.18.6" "@babel/plugin-transform-async-to-generator" "^7.18.6" "@babel/plugin-transform-block-scoped-functions" "^7.18.6" - "@babel/plugin-transform-block-scoping" "^7.18.6" - "@babel/plugin-transform-classes" "^7.18.6" - "@babel/plugin-transform-computed-properties" "^7.18.6" - "@babel/plugin-transform-destructuring" "^7.18.6" + "@babel/plugin-transform-block-scoping" "^7.18.9" + "@babel/plugin-transform-classes" "^7.18.9" + "@babel/plugin-transform-computed-properties" "^7.18.9" + "@babel/plugin-transform-destructuring" "^7.18.9" "@babel/plugin-transform-dotall-regex" "^7.18.6" - "@babel/plugin-transform-duplicate-keys" "^7.18.6" + "@babel/plugin-transform-duplicate-keys" "^7.18.9" "@babel/plugin-transform-exponentiation-operator" "^7.18.6" - "@babel/plugin-transform-for-of" "^7.18.6" - "@babel/plugin-transform-function-name" "^7.18.6" - "@babel/plugin-transform-literals" "^7.18.6" + "@babel/plugin-transform-for-of" "^7.18.8" + "@babel/plugin-transform-function-name" "^7.18.9" + "@babel/plugin-transform-literals" "^7.18.9" "@babel/plugin-transform-member-expression-literals" "^7.18.6" "@babel/plugin-transform-modules-amd" "^7.18.6" "@babel/plugin-transform-modules-commonjs" "^7.18.6" - "@babel/plugin-transform-modules-systemjs" "^7.18.6" + "@babel/plugin-transform-modules-systemjs" "^7.18.9" "@babel/plugin-transform-modules-umd" "^7.18.6" "@babel/plugin-transform-named-capturing-groups-regex" "^7.18.6" "@babel/plugin-transform-new-target" "^7.18.6" "@babel/plugin-transform-object-super" "^7.18.6" - "@babel/plugin-transform-parameters" "^7.18.6" + "@babel/plugin-transform-parameters" "^7.18.8" "@babel/plugin-transform-property-literals" "^7.18.6" "@babel/plugin-transform-regenerator" "^7.18.6" "@babel/plugin-transform-reserved-words" "^7.18.6" "@babel/plugin-transform-shorthand-properties" "^7.18.6" - "@babel/plugin-transform-spread" "^7.18.6" + "@babel/plugin-transform-spread" "^7.18.9" "@babel/plugin-transform-sticky-regex" "^7.18.6" - "@babel/plugin-transform-template-literals" "^7.18.6" - "@babel/plugin-transform-typeof-symbol" "^7.18.6" - "@babel/plugin-transform-unicode-escapes" "^7.18.6" + "@babel/plugin-transform-template-literals" "^7.18.9" + "@babel/plugin-transform-typeof-symbol" "^7.18.9" + "@babel/plugin-transform-unicode-escapes" "^7.18.10" "@babel/plugin-transform-unicode-regex" "^7.18.6" "@babel/preset-modules" "^0.1.5" - "@babel/types" "^7.18.6" - babel-plugin-polyfill-corejs2 "^0.3.1" - babel-plugin-polyfill-corejs3 "^0.5.2" - babel-plugin-polyfill-regenerator "^0.3.1" + "@babel/types" "^7.18.10" + babel-plugin-polyfill-corejs2 "^0.3.2" + babel-plugin-polyfill-corejs3 "^0.5.3" + babel-plugin-polyfill-regenerator "^0.4.0" core-js-compat "^3.22.1" semver "^6.3.0" @@ -1020,50 +1028,51 @@ "@babel/plugin-transform-typescript" "^7.18.6" "@babel/runtime-corejs3@^7.10.2": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.18.6.tgz#6f02c5536911f4b445946a2179554b95c8838635" - integrity sha512-cOu5wH2JFBgMjje+a+fz2JNIWU4GzYpl05oSob3UDvBEh6EuIn+TXFHMmBbhSb+k/4HMzgKCQfEEDArAWNF9Cw== + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.18.9.tgz#7bacecd1cb2dd694eacd32a91fcf7021c20770ae" + integrity sha512-qZEWeccZCrHA2Au4/X05QW5CMdm4VjUDCrGq5gf1ZDcM4hRqreKrtwAn7yci9zfgAS9apvnsFXiGBHBAxZdK9A== dependencies: core-js-pure "^3.20.2" regenerator-runtime "^0.13.4" -"@babel/runtime@^7.10.1", "@babel/runtime@^7.10.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.16.3", "@babel/runtime@^7.18.3", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.18.6.tgz#6a1ef59f838debd670421f8c7f2cbb8da9751580" - integrity sha512-t9wi7/AW6XtKahAe20Yw0/mMljKq0B1r2fPdvaAdV/KPDZewFXdaaa6K7lxmZBZ8FBNpCiAT6iHPmd6QO9bKfQ== +"@babel/runtime@^7.10.1", "@babel/runtime@^7.10.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.16.3", "@babel/runtime@^7.18.3", "@babel/runtime@^7.18.9", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.18.9.tgz#b4fcfce55db3d2e5e080d2490f608a3b9f407f4a" + integrity sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw== dependencies: regenerator-runtime "^0.13.4" -"@babel/template@^7.18.6", "@babel/template@^7.3.3", "@babel/template@^7.4.0": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.6.tgz#1283f4993e00b929d6e2d3c72fdc9168a2977a31" - integrity sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw== +"@babel/template@^7.18.10", "@babel/template@^7.18.6", "@babel/template@^7.3.3", "@babel/template@^7.4.0": + version "7.18.10" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.10.tgz#6f9134835970d1dbf0835c0d100c9f38de0c5e71" + integrity sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA== dependencies: "@babel/code-frame" "^7.18.6" - "@babel/parser" "^7.18.6" - "@babel/types" "^7.18.6" + "@babel/parser" "^7.18.10" + "@babel/types" "^7.18.10" -"@babel/traverse@^7.1.0", "@babel/traverse@^7.13.0", "@babel/traverse@^7.18.6", "@babel/traverse@^7.18.8", "@babel/traverse@^7.4.3", "@babel/traverse@^7.4.5", "@babel/traverse@^7.7.2": - version "7.18.8" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.18.8.tgz#f095e62ab46abf1da35e5a2011f43aee72d8d5b0" - integrity sha512-UNg/AcSySJYR/+mIcJQDCv00T+AqRO7j/ZEJLzpaYtgM48rMg5MnkJgyNqkzo88+p4tfRvZJCEiwwfG6h4jkRg== +"@babel/traverse@^7.1.0", "@babel/traverse@^7.18.11", "@babel/traverse@^7.18.13", "@babel/traverse@^7.18.9", "@babel/traverse@^7.4.3", "@babel/traverse@^7.4.5", "@babel/traverse@^7.7.2": + version "7.18.13" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.18.13.tgz#5ab59ef51a997b3f10c4587d648b9696b6cb1a68" + integrity sha512-N6kt9X1jRMLPxxxPYWi7tgvJRH/rtoU+dbKAPDM44RFHiMH8igdsaSBgFeskhSl/kLWLDUvIh1RXCrTmg0/zvA== dependencies: "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.18.7" - "@babel/helper-environment-visitor" "^7.18.6" - "@babel/helper-function-name" "^7.18.6" + "@babel/generator" "^7.18.13" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.18.9" "@babel/helper-hoist-variables" "^7.18.6" "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.18.8" - "@babel/types" "^7.18.8" + "@babel/parser" "^7.18.13" + "@babel/types" "^7.18.13" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.12.6", "@babel/types@^7.18.6", "@babel/types@^7.18.7", "@babel/types@^7.18.8", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.0", "@babel/types@^7.4.4": - version "7.18.8" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.18.8.tgz#c5af199951bf41ba4a6a9a6d0d8ad722b30cd42f" - integrity sha512-qwpdsmraq0aJ3osLJRApsc2ouSJCdnMeZwB0DhbtHAtRpZNZCdlbRnHIgcRKzdE1g0iOGg644fzjOBcdOz9cPw== +"@babel/types@^7.0.0", "@babel/types@^7.12.6", "@babel/types@^7.18.10", "@babel/types@^7.18.13", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.0", "@babel/types@^7.4.4": + version "7.18.13" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.18.13.tgz#30aeb9e514f4100f7c1cb6e5ba472b30e48f519a" + integrity sha512-ePqfTihzW0W6XAU+aMw2ykilisStJfDnsejDCXRchCcMJ4O0+8DhPXf2YUbZ6wjBlsEmZwLK/sPweWtu8hcJYQ== dependencies: + "@babel/helper-string-parser" "^7.18.10" "@babel/helper-validator-identifier" "^7.18.6" to-fast-properties "^2.0.0" @@ -1073,16 +1082,16 @@ integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== "@bedrock-layout/use-forwarded-ref@^1.1.4": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@bedrock-layout/use-forwarded-ref/-/use-forwarded-ref-1.3.0.tgz#c8761fd9091bb43b6f8d6ad2e6a231cbc252a8f4" - integrity sha512-z8vkgIVs4kE4uOprt3P7Q5fzSjnpi8KN7bPvXL2qpjeFM4XV4gjR/1TvlDRtHD1owqswpFiF3X2l7BzgasziIw== + version "1.3.1" + resolved "https://registry.yarnpkg.com/@bedrock-layout/use-forwarded-ref/-/use-forwarded-ref-1.3.1.tgz#cf156e518b7f2f6c11323a308a915a9b170f0117" + integrity sha512-cb3CR0Z2GYPIzPO3MiAgFi810hzqITb1hN78cdwGM6elKItjKa8CvovaQ27aUhlIrHZETFAiNEhz3bbIKbzFpQ== dependencies: - "@bedrock-layout/use-stateful-ref" "^1.2.1" + "@bedrock-layout/use-stateful-ref" "^1.2.2" -"@bedrock-layout/use-stateful-ref@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@bedrock-layout/use-stateful-ref/-/use-stateful-ref-1.2.1.tgz#d6263771e5d64e54d8e3d052f042114bfa439636" - integrity sha512-FH9EX8Avxw46ty+BURyTpf7T3rad5faLg6iX1retSNRK/qmftoLSDIoTShJDxomnKgHz+9UNmQ4PQXhA0LeA9Q== +"@bedrock-layout/use-stateful-ref@^1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@bedrock-layout/use-stateful-ref/-/use-stateful-ref-1.2.2.tgz#b8da84a151298f96bb1c97893c068d0ea652a572" + integrity sha512-cr7HFc33trSVkOAsjAUSW/xtsByG+zaVF6rzy24XbQZnE0DZ6m0bGz4Yedn9k+Z+mkpyDwKmpo/ckruwBwxx7A== "@cnakazawa/watch@^1.0.3": version "1.0.4" @@ -1092,12 +1101,17 @@ exec-sh "^0.3.2" minimist "^1.2.0" +"@colors/colors@1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" + integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== + "@csstools/normalize.css@*": version "12.0.0" resolved "https://registry.yarnpkg.com/@csstools/normalize.css/-/normalize.css-12.0.0.tgz#a9583a75c3f150667771f30b60d9f059473e62c4" integrity sha512-M0qqxAcwCsIVfpFQSlGN5XjXWu8l5JDZN+fPt1LeW5SZexQTgnaEvgXAY+CeygRw0EeppWHi12JxESWiWrB0Sg== -"@csstools/postcss-cascade-layers@^1.0.4": +"@csstools/postcss-cascade-layers@^1.0.5": version "1.0.5" resolved "https://registry.yarnpkg.com/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.0.5.tgz#f16f2c4396ace855541e1aa693f5f27ec972e6ad" integrity sha512-Id/9wBT7FkgFzdEpiEWrsVd4ltDxN0rI0QS0SChbeQiSuux3z21SJCRLu6h2cvCEUmaRi+VD0mHFj+GJD4GFnw== @@ -1105,7 +1119,7 @@ "@csstools/selector-specificity" "^2.0.2" postcss-selector-parser "^6.0.10" -"@csstools/postcss-color-function@^1.1.0": +"@csstools/postcss-color-function@^1.1.1": version "1.1.1" resolved "https://registry.yarnpkg.com/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz#2bd36ab34f82d0497cfacdc9b18d34b5e6f64b6b" integrity sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw== @@ -1113,21 +1127,21 @@ "@csstools/postcss-progressive-custom-properties" "^1.1.0" postcss-value-parser "^4.2.0" -"@csstools/postcss-font-format-keywords@^1.0.0": +"@csstools/postcss-font-format-keywords@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz#677b34e9e88ae997a67283311657973150e8b16a" integrity sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg== dependencies: postcss-value-parser "^4.2.0" -"@csstools/postcss-hwb-function@^1.0.1": +"@csstools/postcss-hwb-function@^1.0.2": version "1.0.2" resolved "https://registry.yarnpkg.com/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz#ab54a9fce0ac102c754854769962f2422ae8aa8b" integrity sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w== dependencies: postcss-value-parser "^4.2.0" -"@csstools/postcss-ic-unit@^1.0.0": +"@csstools/postcss-ic-unit@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz#28237d812a124d1a16a5acc5c3832b040b303e58" integrity sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw== @@ -1135,7 +1149,7 @@ "@csstools/postcss-progressive-custom-properties" "^1.1.0" postcss-value-parser "^4.2.0" -"@csstools/postcss-is-pseudo-class@^2.0.6": +"@csstools/postcss-is-pseudo-class@^2.0.7": version "2.0.7" resolved "https://registry.yarnpkg.com/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz#846ae6c0d5a1eaa878fce352c544f9c295509cd1" integrity sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA== @@ -1143,14 +1157,21 @@ "@csstools/selector-specificity" "^2.0.0" postcss-selector-parser "^6.0.10" -"@csstools/postcss-normalize-display-values@^1.0.0": +"@csstools/postcss-nested-calc@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@csstools/postcss-nested-calc/-/postcss-nested-calc-1.0.0.tgz#d7e9d1d0d3d15cf5ac891b16028af2a1044d0c26" + integrity sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-normalize-display-values@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz#15da54a36e867b3ac5163ee12c1d7f82d4d612c3" integrity sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw== dependencies: postcss-value-parser "^4.2.0" -"@csstools/postcss-oklab-function@^1.1.0": +"@csstools/postcss-oklab-function@^1.1.1": version "1.1.1" resolved "https://registry.yarnpkg.com/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz#88cee0fbc8d6df27079ebd2fa016ee261eecf844" integrity sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA== @@ -1165,21 +1186,28 @@ dependencies: postcss-value-parser "^4.2.0" -"@csstools/postcss-stepped-value-functions@^1.0.0": +"@csstools/postcss-stepped-value-functions@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz#f8772c3681cc2befed695e2b0b1d68e22f08c4f4" integrity sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ== dependencies: postcss-value-parser "^4.2.0" -"@csstools/postcss-trigonometric-functions@^1.0.1": +"@csstools/postcss-text-decoration-shorthand@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-1.0.0.tgz#ea96cfbc87d921eca914d3ad29340d9bcc4c953f" + integrity sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-trigonometric-functions@^1.0.2": version "1.0.2" resolved "https://registry.yarnpkg.com/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.2.tgz#94d3e4774c36d35dcdc88ce091336cb770d32756" integrity sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og== dependencies: postcss-value-parser "^4.2.0" -"@csstools/postcss-unset-value@^1.0.1": +"@csstools/postcss-unset-value@^1.0.2": version "1.0.2" resolved "https://registry.yarnpkg.com/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz#c99bb70e2cdc7312948d1eb41df2412330b81f77" integrity sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g== @@ -1189,112 +1217,173 @@ resolved "https://registry.yarnpkg.com/@csstools/selector-specificity/-/selector-specificity-2.0.2.tgz#1bfafe4b7ed0f3e4105837e056e0a89b108ebe36" integrity sha512-IkpVW/ehM1hWKln4fCA3NzJU8KwD+kIOvPZA4cqxoJHtE21CCzjyp+Kxbu0i5I4tBNOlXPL9mjwnWlL0VEG4Fg== -"@datadog/browser-core@4.14.0": - version "4.14.0" - resolved "https://registry.yarnpkg.com/@datadog/browser-core/-/browser-core-4.14.0.tgz#52c4505338b333b0f27c834563bfa0318a136132" - integrity sha512-ogtZSxHCi/Uh2V4fe88rlXHPeHy4oYbAzuCjDGn60gVECL4US6xYJ4AVi4nPAvkQun8KaxUQdYMfeohcGBMrYQ== +"@cypress/code-coverage@^3.10.0": + version "3.10.0" + resolved "https://registry.yarnpkg.com/@cypress/code-coverage/-/code-coverage-3.10.0.tgz#2132dbb7ae068cab91790926d50a9bf85140cab4" + integrity sha512-K5pW2KPpK4vKMXqxd6vuzo6m9BNgpAv1LcrrtmqAtOJ1RGoEILXYZVost0L6Q+V01NyY7n7jXIIfS7LR3nP6YA== + dependencies: + "@cypress/webpack-preprocessor" "^5.11.0" + chalk "4.1.2" + dayjs "1.10.7" + debug "4.3.4" + execa "4.1.0" + globby "11.0.4" + istanbul-lib-coverage "3.0.0" + js-yaml "3.14.1" + nyc "15.1.0" + +"@cypress/request@^2.88.10": + version "2.88.10" + resolved "https://registry.yarnpkg.com/@cypress/request/-/request-2.88.10.tgz#b66d76b07f860d3a4b8d7a0604d020c662752cce" + integrity sha512-Zp7F+R93N0yZyG34GutyTNr+okam7s/Fzc1+i3kcqOP8vk6OuajuE9qZJ6Rs+10/1JFtXFYMdyarnU1rZuJesg== + 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" + http-signature "~1.3.6" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.5.0" + tunnel-agent "^0.6.0" + uuid "^8.3.2" + +"@cypress/webpack-preprocessor@^5.11.0": + version "5.12.2" + resolved "https://registry.yarnpkg.com/@cypress/webpack-preprocessor/-/webpack-preprocessor-5.12.2.tgz#9cc623a5629980d7f2619569bffc8e3f05a701ae" + integrity sha512-t29wEFvI87IMnCd8taRunwStNsFjFWg138fGF0hPQOYgSj30fbzCEwFD9cAQLYMMcjjuXcnnw8yOfkzIZBBNVQ== + dependencies: + bluebird "3.7.1" + debug "^4.3.2" + lodash "^4.17.20" + +"@cypress/xvfb@^1.2.4": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@cypress/xvfb/-/xvfb-1.2.4.tgz#2daf42e8275b39f4aa53c14214e557bd14e7748a" + integrity sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q== + dependencies: + debug "^3.1.0" + lodash.once "^4.1.1" + +"@datadog/browser-core@4.17.2": + version "4.17.2" + resolved "https://registry.yarnpkg.com/@datadog/browser-core/-/browser-core-4.17.2.tgz#c4a898f83aa3a988b3699ccae6c5fef2fb4c0619" + integrity sha512-ocitVzLN0cfwkd1x7r6wem6MfaUSu2o4icxUP43SjMeFZryQlT1B/j+OBv30fFMtKMW7GQFm/5Kq1Eu9KdqBrw== "@datadog/browser-logs@^4.7.1": - version "4.14.0" - resolved "https://registry.yarnpkg.com/@datadog/browser-logs/-/browser-logs-4.14.0.tgz#82a1fe7280973851fb7ee70221717bd1f37abc14" - integrity sha512-WBLPVltDcaKF/sgT6LZif5uS1kZ12jkB9s/rx3NZScRgABpNZtY+pmsuLUKFS3Hjb4CmNt8X2vPfd2kxy18y/g== - dependencies: - "@datadog/browser-core" "4.14.0" - -"@emotion/babel-plugin@^11.7.1": - version "11.9.2" - resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.9.2.tgz#723b6d394c89fb2ef782229d92ba95a740576e95" - integrity sha512-Pr/7HGH6H6yKgnVFNEj2MVlreu3ADqftqjqwUvDy/OJzKFgxKeTQ+eeUf20FOTuHVkDON2iNa25rAXVYtWJCjw== - dependencies: - "@babel/helper-module-imports" "^7.12.13" - "@babel/plugin-syntax-jsx" "^7.12.13" - "@babel/runtime" "^7.13.10" - "@emotion/hash" "^0.8.0" - "@emotion/memoize" "^0.7.5" - "@emotion/serialize" "^1.0.2" - babel-plugin-macros "^2.6.1" + version "4.17.2" + resolved "https://registry.yarnpkg.com/@datadog/browser-logs/-/browser-logs-4.17.2.tgz#bdff8fe56e2f08d64130e9dade8c50c67f363b6e" + integrity sha512-gd9a3u85Z1V8z+7vhgOK0wr6ix3TzvHDinRdB2UhMAtvZckaP8UEGKVhljKYALRomeLb4XpBX2UrpLYPuIOIGQ== + dependencies: + "@datadog/browser-core" "4.17.2" + +"@emotion/babel-plugin@^11.10.0": + version "11.10.2" + resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.10.2.tgz#879db80ba622b3f6076917a1e6f648b1c7d008c7" + integrity sha512-xNQ57njWTFVfPAc3cjfuaPdsgLp5QOSuRsj9MA6ndEhH/AzuZM86qIQzt6rq+aGBwj3n5/TkLmU5lhAfdRmogA== + dependencies: + "@babel/helper-module-imports" "^7.16.7" + "@babel/plugin-syntax-jsx" "^7.17.12" + "@babel/runtime" "^7.18.3" + "@emotion/hash" "^0.9.0" + "@emotion/memoize" "^0.8.0" + "@emotion/serialize" "^1.1.0" + babel-plugin-macros "^3.1.0" convert-source-map "^1.5.0" escape-string-regexp "^4.0.0" find-root "^1.1.0" source-map "^0.5.7" stylis "4.0.13" -"@emotion/cache@^11.4.0", "@emotion/cache@^11.9.3": - version "11.9.3" - resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.9.3.tgz#96638449f6929fd18062cfe04d79b29b44c0d6cb" - integrity sha512-0dgkI/JKlCXa+lEXviaMtGBL0ynpx4osh7rjOXE71q9bIF8G+XhJgvi+wDu0B0IdCVx37BffiwXlN9I3UuzFvg== +"@emotion/cache@^11.10.0", "@emotion/cache@^11.4.0": + version "11.10.2" + resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.10.2.tgz#8e795493b46d2a55162e110396829a7240fa0f71" + integrity sha512-GPR4PovENRvYDbCEnDRecPZYJzWdNMsM+Jn+13MC5uImVNbMyKwzv95DUHy5PDcgfPtKoDtfLU6emF1grrbQDg== dependencies: - "@emotion/memoize" "^0.7.4" - "@emotion/sheet" "^1.1.1" - "@emotion/utils" "^1.0.0" - "@emotion/weak-memoize" "^0.2.5" + "@emotion/memoize" "^0.8.0" + "@emotion/sheet" "^1.2.0" + "@emotion/utils" "^1.2.0" + "@emotion/weak-memoize" "^0.3.0" stylis "4.0.13" -"@emotion/hash@^0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.8.0.tgz#bbbff68978fefdbe68ccb533bc8cbe1d1afb5413" - integrity sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow== +"@emotion/hash@^0.9.0": + version "0.9.0" + resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.9.0.tgz#c5153d50401ee3c027a57a177bc269b16d889cb7" + integrity sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ== "@emotion/is-prop-valid@^1.1.0": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.1.3.tgz#f0907a416368cf8df9e410117068e20fe87c0a3a" - integrity sha512-RFg04p6C+1uO19uG8N+vqanzKqiM9eeV1LDOG3bmkYmuOj7NbKNlFC/4EZq5gnwAIlcC/jOT24f8Td0iax2SXA== + version "1.2.0" + resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.2.0.tgz#7f2d35c97891669f7e276eb71c83376a5dc44c83" + integrity sha512-3aDpDprjM0AwaxGE09bOPkNxHpBd+kA6jty3RnaEXdweX1DF1U3VQpPYb0g1IStAuK7SVQ1cy+bNBBKp4W3Fjg== dependencies: - "@emotion/memoize" "^0.7.4" + "@emotion/memoize" "^0.8.0" -"@emotion/memoize@^0.7.4", "@emotion/memoize@^0.7.5": - version "0.7.5" - resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.5.tgz#2c40f81449a4e554e9fc6396910ed4843ec2be50" - integrity sha512-igX9a37DR2ZPGYtV6suZ6whr8pTFtyHL3K/oLUotxpSVO2ASaprmAe2Dkq7tBo7CRY7MMDrAa9nuQP9/YG8FxQ== +"@emotion/memoize@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.8.0.tgz#f580f9beb67176fa57aae70b08ed510e1b18980f" + integrity sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA== "@emotion/react@^11.8.1": - version "11.9.3" - resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.9.3.tgz#f4f4f34444f6654a2e550f5dab4f2d360c101df9" - integrity sha512-g9Q1GcTOlzOEjqwuLF/Zd9LC+4FljjPjDfxSM7KmEakm+hsHXk+bYZ2q+/hTJzr0OUNkujo72pXLQvXj6H+GJQ== - dependencies: - "@babel/runtime" "^7.13.10" - "@emotion/babel-plugin" "^11.7.1" - "@emotion/cache" "^11.9.3" - "@emotion/serialize" "^1.0.4" - "@emotion/utils" "^1.1.0" - "@emotion/weak-memoize" "^0.2.5" + version "11.10.0" + resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.10.0.tgz#53c577f063f26493f68a05188fb87528d912ff2e" + integrity sha512-K6z9zlHxxBXwN8TcpwBKcEsBsOw4JWCCmR+BeeOWgqp8GIU1yA2Odd41bwdAAr0ssbQrbJbVnndvv7oiv1bZeQ== + dependencies: + "@babel/runtime" "^7.18.3" + "@emotion/babel-plugin" "^11.10.0" + "@emotion/cache" "^11.10.0" + "@emotion/serialize" "^1.1.0" + "@emotion/utils" "^1.2.0" + "@emotion/weak-memoize" "^0.3.0" hoist-non-react-statics "^3.3.1" -"@emotion/serialize@^1.0.2", "@emotion/serialize@^1.0.4": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.0.4.tgz#ff31fd11bb07999611199c2229e152faadc21a3c" - integrity sha512-1JHamSpH8PIfFwAMryO2bNka+y8+KA5yga5Ocf2d7ZEiJjb7xlLW7aknBGZqJLajuLOvJ+72vN+IBSwPlXD1Pg== +"@emotion/serialize@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.1.0.tgz#b1f97b1011b09346a40e9796c37a3397b4ea8ea8" + integrity sha512-F1ZZZW51T/fx+wKbVlwsfchr5q97iW8brAnXmsskz4d0hVB4O3M/SiA3SaeH06x02lSNzkkQv+n3AX3kCXKSFA== dependencies: - "@emotion/hash" "^0.8.0" - "@emotion/memoize" "^0.7.4" - "@emotion/unitless" "^0.7.5" - "@emotion/utils" "^1.0.0" + "@emotion/hash" "^0.9.0" + "@emotion/memoize" "^0.8.0" + "@emotion/unitless" "^0.8.0" + "@emotion/utils" "^1.2.0" csstype "^3.0.2" -"@emotion/sheet@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.1.1.tgz#015756e2a9a3c7c5f11d8ec22966a8dbfbfac787" - integrity sha512-J3YPccVRMiTZxYAY0IOq3kd+hUP8idY8Kz6B/Cyo+JuXq52Ek+zbPbSQUrVQp95aJ+lsAW7DPL1P2Z+U1jGkKA== +"@emotion/sheet@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.2.0.tgz#771b1987855839e214fc1741bde43089397f7be5" + integrity sha512-OiTkRgpxescko+M51tZsMq7Puu/KP55wMT8BgpcXVG2hqXc0Vo0mfymJ/Uj24Hp0i083ji/o0aLddh08UEjq8w== "@emotion/stylis@^0.8.4": version "0.8.5" resolved "https://registry.yarnpkg.com/@emotion/stylis/-/stylis-0.8.5.tgz#deacb389bd6ee77d1e7fcaccce9e16c5c7e78e04" integrity sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ== -"@emotion/unitless@^0.7.4", "@emotion/unitless@^0.7.5": +"@emotion/unitless@^0.7.4": version "0.7.5" resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.5.tgz#77211291c1900a700b8a78cfafda3160d76949ed" integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg== -"@emotion/utils@^1.0.0", "@emotion/utils@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.1.0.tgz#86b0b297f3f1a0f2bdb08eeac9a2f49afd40d0cf" - integrity sha512-iRLa/Y4Rs5H/f2nimczYmS5kFJEbpiVvgN3XVfZ022IYhuNA1IRSHEizcof88LtCTXtl9S2Cxt32KgaXEu72JQ== +"@emotion/unitless@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.8.0.tgz#a4a36e9cbdc6903737cd20d38033241e1b8833db" + integrity sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw== -"@emotion/weak-memoize@^0.2.5": - version "0.2.5" - resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz#8eed982e2ee6f7f4e44c253e12962980791efd46" - integrity sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA== +"@emotion/utils@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.2.0.tgz#9716eaccbc6b5ded2ea5a90d65562609aab0f561" + integrity sha512-sn3WH53Kzpw8oQ5mgMmIzzyAaH2ZqFEbozVVBSYp538E06OSE6ytOp7pRAjNQR+Q/orwqdQYJSe2m3hCOeznkw== + +"@emotion/weak-memoize@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.3.0.tgz#ea89004119dc42db2e1dba0f97d553f7372f6fcb" + integrity sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg== "@eslint/eslintrc@^1.3.0": version "1.3.0" @@ -1311,20 +1400,37 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" +"@hapi/hoek@^9.0.0": + version "9.3.0" + resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb" + integrity sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ== + +"@hapi/topo@^5.0.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-5.1.0.tgz#dc448e332c6c6e37a4dc02fd84ba8d44b9afb012" + integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== + dependencies: + "@hapi/hoek" "^9.0.0" + "@heroicons/react@^1.0.6": version "1.0.6" resolved "https://registry.yarnpkg.com/@heroicons/react/-/react-1.0.6.tgz#35dd26987228b39ef2316db3b1245c42eb19e324" integrity sha512-JJCXydOFWMDpCP4q13iEplA503MQO3xLoZiKum+955ZCtHINWnx26CUxVxxFQu/uLb4LW3ge15ZpzIkXKkJ8oQ== -"@humanwhocodes/config-array@^0.9.2": - version "0.9.5" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.9.5.tgz#2cbaf9a89460da24b5ca6531b8bbfc23e1df50c7" - integrity sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw== +"@humanwhocodes/config-array@^0.10.4": + version "0.10.4" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.10.4.tgz#01e7366e57d2ad104feea63e72248f22015c520c" + integrity sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw== dependencies: "@humanwhocodes/object-schema" "^1.2.1" debug "^4.1.1" minimatch "^3.0.4" +"@humanwhocodes/gitignore-to-minimatch@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz#316b0a63b91c10e53f242efb4ace5c3b34e8728d" + integrity sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA== + "@humanwhocodes/object-schema@^1.2.1": version "1.2.1" resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" @@ -1378,16 +1484,16 @@ jest-util "^27.5.1" slash "^3.0.0" -"@jest/console@^28.1.1": - version "28.1.1" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-28.1.1.tgz#305f8ca50b6e70413839f54c0e002b60a0f2fd7d" - integrity sha512-0RiUocPVFEm3WRMOStIHbRWllG6iW6E3/gUPnf4lkrVFyXIIDeCe+vlKeYyFOMhB2EPE6FLFCNADSOOQMaqvyA== +"@jest/console@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-28.1.3.tgz#2030606ec03a18c31803b8a36382762e447655df" + integrity sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw== dependencies: - "@jest/types" "^28.1.1" + "@jest/types" "^28.1.3" "@types/node" "*" chalk "^4.0.0" - jest-message-util "^28.1.1" - jest-util "^28.1.1" + jest-message-util "^28.1.3" + jest-util "^28.1.3" slash "^3.0.0" "@jest/core@^25.5.4": @@ -1477,6 +1583,13 @@ "@types/node" "*" jest-mock "^27.5.1" +"@jest/expect-utils@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-28.1.3.tgz#58561ce5db7cd253a7edddbc051fb39dda50f525" + integrity sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA== + dependencies: + jest-get-type "^28.0.2" + "@jest/fake-timers@^24.9.0": version "24.9.0" resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-24.9.0.tgz#ba3e6bf0eecd09a636049896434d306636540c93" @@ -1590,12 +1703,12 @@ terminal-link "^2.0.0" v8-to-istanbul "^8.1.0" -"@jest/schemas@^28.0.2": - version "28.0.2" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-28.0.2.tgz#08c30df6a8d07eafea0aef9fb222c5e26d72e613" - integrity sha512-YVDJZjd4izeTDkij00vHHAymNXQ6WWsdChFRK86qck6Jpr3DCL5W3Is3vslviRlP+bLuMYRLbdp98amMvqudhA== +"@jest/schemas@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-28.1.3.tgz#ad8b86a66f11f33619e3d7e1dcddd7f2d40ff905" + integrity sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg== dependencies: - "@sinclair/typebox" "^0.23.3" + "@sinclair/typebox" "^0.24.1" "@jest/source-map@^24.9.0": version "24.9.0" @@ -1653,13 +1766,13 @@ "@types/istanbul-lib-coverage" "^2.0.0" collect-v8-coverage "^1.0.0" -"@jest/test-result@^28.1.1": - version "28.1.1" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-28.1.1.tgz#c6f18d1bbb01aa88925dd687872a75f8414b317a" - integrity sha512-hPmkugBktqL6rRzwWAtp1JtYT4VHwv8OQ+9lE5Gymj6dHzubI/oJHMUpPOt8NrdVWSrz9S7bHjJUmv2ggFoUNQ== +"@jest/test-result@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-28.1.3.tgz#5eae945fd9f4b8fcfce74d239e6f725b6bf076c5" + integrity sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg== dependencies: - "@jest/console" "^28.1.1" - "@jest/types" "^28.1.1" + "@jest/console" "^28.1.3" + "@jest/types" "^28.1.3" "@types/istanbul-lib-coverage" "^2.0.0" collect-v8-coverage "^1.0.0" @@ -1779,12 +1892,12 @@ "@types/yargs" "^16.0.0" chalk "^4.0.0" -"@jest/types@^28.1.1": - version "28.1.1" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-28.1.1.tgz#d059bbc80e6da6eda9f081f293299348bd78ee0b" - integrity sha512-vRXVqSg1VhDnB8bWcmvLzmg0Bt9CRKVgHPXqYwvWMX3TvAjeO+nRuK6+VdTKCtWOvYlmkF/HqNAL/z+N3B53Kw== +"@jest/types@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-28.1.3.tgz#b05de80996ff12512bc5ceb1d208285a7d11748b" + integrity sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ== dependencies: - "@jest/schemas" "^28.0.2" + "@jest/schemas" "^28.1.3" "@types/istanbul-lib-coverage" "^2.0.0" "@types/istanbul-reports" "^3.0.0" "@types/node" "*" @@ -1831,10 +1944,10 @@ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== -"@jridgewell/trace-mapping@^0.3.7", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.14" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz#b231a081d8f66796e475ad588a1ef473112701ed" - integrity sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ== +"@jridgewell/trace-mapping@^0.3.14", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.15" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz#aba35c48a38d3fd84b37e66c9c0423f9744f9774" + integrity sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g== dependencies: "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" @@ -1922,10 +2035,27 @@ resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.1.4.tgz#0c8b74c50f29ee44f423f7416829c0bf8bb5eb27" integrity sha512-LwzQKA4vzIct1zNZzBmRKI9QuNpLgTQMEjsQLf3BXuGYb3QPTP4Yjf6mkdX+X1mYttZ808QpOwAzZjv28kq7DA== -"@sinclair/typebox@^0.23.3": - version "0.23.5" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.23.5.tgz#93f7b9f4e3285a7a9ade7557d9a8d36809cbc47d" - integrity sha512-AFBVi/iT4g20DHoujvMH1aEDn8fGJh4xsRGCP6d8RpLPMqsNPvW01Jcn0QysXTsg++/xj25NmJsGyH9xug/wKg== +"@sideway/address@^4.1.3": + version "4.1.4" + resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.4.tgz#03dccebc6ea47fdc226f7d3d1ad512955d4783f0" + integrity sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw== + dependencies: + "@hapi/hoek" "^9.0.0" + +"@sideway/formula@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@sideway/formula/-/formula-3.0.0.tgz#fe158aee32e6bd5de85044be615bc08478a0a13c" + integrity sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg== + +"@sideway/pinpoint@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz#cff8ffadc372ad29fd3f78277aeb29e632cc70df" + integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== + +"@sinclair/typebox@^0.24.1": + version "0.24.28" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.28.tgz#15aa0b416f82c268b1573ab653e4413c965fe794" + integrity sha512-dgJd3HLOkLmz4Bw50eZx/zJwtBq65nms3N9VBYu5LTjJ883oBFkTyXRlCB/ZGGwqYpJJHA5zW2Ibhl5ngITfow== "@sinonjs/commons@^1.7.0": version "1.8.3" @@ -2067,9 +2197,9 @@ loader-utils "^2.0.0" "@testing-library/dom@^8.0.0": - version "8.16.0" - resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-8.16.0.tgz#d6fc50250aed17b1035ca1bd64655e342db3936a" - integrity sha512-uxF4zmnLHHDlmW4l+0WDjcgLVwCvH+OVLpD8Dfp+Bjfz85prwxWGbwXgJdLtkgjD0qfOzkJF9SmA6YZPsMYX4w== + version "8.17.1" + resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-8.17.1.tgz#2d7af4ff6dad8d837630fecd08835aee08320ad7" + integrity sha512-KnH2MnJUzmFNPW6RIKfd+zf2Wue8mEKX0M3cpX6aKl5ZXrJM1/c/Pc8c2xDNYQCnJO48Sm5ITbMXgqTr3h4jxQ== dependencies: "@babel/code-frame" "^7.10.4" "@babel/runtime" "^7.12.5" @@ -2081,15 +2211,15 @@ pretty-format "^27.0.2" "@testing-library/jest-dom@^5.14.1": - version "5.16.4" - resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-5.16.4.tgz#938302d7b8b483963a3ae821f1c0808f872245cd" - integrity sha512-Gy+IoFutbMQcky0k+bqqumXZ1cTGswLsFqmNLzNdSKkU9KGV2u9oXhukCbbJ9/LRPKiqwxEE8VpV/+YZlfkPUA== + version "5.16.5" + resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-5.16.5.tgz#3912846af19a29b2dbf32a6ae9c31ef52580074e" + integrity sha512-N5ixQ2qKpi5OLYfwQmUb/5mSV9LneAcaUfp32pn4yCnpb8r/Yz0pXFPck21dIicKmi+ta5WRAknkZCfA8refMA== dependencies: + "@adobe/css-tools" "^4.0.1" "@babel/runtime" "^7.9.2" "@types/testing-library__jest-dom" "^5.9.1" aria-query "^5.0.0" chalk "^3.0.0" - css "^3.0.0" css.escape "^1.5.1" dom-accessibility-api "^0.5.6" lodash "^4.17.15" @@ -2160,9 +2290,9 @@ "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6": - version "7.17.1" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.17.1.tgz#1a0e73e8c28c7e832656db372b779bfd2ef37314" - integrity sha512-kVzjari1s2YVi77D3w1yuvohV2idweYXMCDzqBiVNN63TcDWrIlTVOYpqVrvbbyOE/IyzBoTKF0fdnLPEORFxA== + version "7.18.0" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.18.0.tgz#8134fd78cb39567465be65b9fdc16d378095f41f" + integrity sha512-v4Vwdko+pgymgS+A2UIaJru93zQd85vIGWObM5ekZNdXCKtDYqATlEYnWgfo86Q6I1Lh0oXnksDnMU1cwmlPDw== dependencies: "@babel/types" "^7.3.0" @@ -2196,6 +2326,13 @@ dependencies: "@types/node" "*" +"@types/dompurify@^2.3.3": + version "2.3.3" + resolved "https://registry.yarnpkg.com/@types/dompurify/-/dompurify-2.3.3.tgz#c24c92f698f77ed9cc9d9fa7888f90cf2bfaa23f" + integrity sha512-nnVQSgRVuZ/843oAfhA25eRSNzUFcBPk/LOiw5gm8mD9/X7CNcbRkQu/OsjCewO8+VIYfPxUnXvPEVGenw14+w== + dependencies: + "@types/trusted-types" "*" + "@types/eslint-scope@^3.7.3": version "3.7.4" resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.4.tgz#37fc1223f0786c39627068a12e94d6e6fc61de16" @@ -2205,17 +2342,17 @@ "@types/estree" "*" "@types/eslint@*", "@types/eslint@^7.29.0 || ^8.4.1": - version "8.4.5" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.4.5.tgz#acdfb7dd36b91cc5d812d7c093811a8f3d9b31e4" - integrity sha512-dhsC09y1gpJWnK+Ff4SGvCuSnk9DaU0BJZSzOwa6GVSg65XtTugLBITDAAzRU5duGBoXBHpdR/9jHGxJjNflJQ== + version "8.4.6" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.4.6.tgz#7976f054c1bccfcf514bff0564c0c41df5c08207" + integrity sha512-/fqTbjxyFUaYNO7VcW5g+4npmqVACz1bB7RTHYuLj+PRjw9hrCwrUXVQFpChUS0JsyEFvMZ7U/PfmvWgxJhI9g== dependencies: "@types/estree" "*" "@types/json-schema" "*" "@types/estree@*": - version "0.0.52" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.52.tgz#7f1f57ad5b741f3d5b210d3b1f145640d89bf8fe" - integrity sha512-BZWrtCU0bMVAIliIV+HJO1f1PR41M7NKjfxrFJwwhKI1KwhwOxYw1SXg9ao+CIMt774nFuGiG6eU+udtbEI9oQ== + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2" + integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ== "@types/estree@0.0.39": version "0.0.39" @@ -2228,9 +2365,9 @@ integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== "@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.18": - version "4.17.29" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.29.tgz#2a1795ea8e9e9c91b4a4bbe475034b20c1ec711c" - integrity sha512-uMd++6dMKS32EOuw1Uli3e3BPgdLIXmezcfHv7N4c1s3gkhikBplORPpMq3fuWkxncZN1reb16d5n8yhQ80x7Q== + version "4.17.30" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.30.tgz#0f2f99617fa8f9696170c46152ccf7500b34ac04" + integrity sha512-gstzbTWro2/nFed1WXtf+TtrpwxH7Ggs4RLYTLbeVgIkUQOI3WG/JKjgeOU1zXDvezllupjrf8OPIdvTbIaVOQ== dependencies: "@types/node" "*" "@types/qs" "*" @@ -2261,6 +2398,11 @@ dependencies: "@types/node" "*" +"@types/highlightjs@^9.12.2": + version "9.12.2" + resolved "https://registry.yarnpkg.com/@types/highlightjs/-/highlightjs-9.12.2.tgz#6b6d460968a975f4ce3ab3907c03cde46a72a02f" + integrity sha512-oW2pEKwshxwBW1nVUizWQg/tnhboRtKrUKnF2hd6l4BZ0shr5ZjQ4ra/82+NEH6uWeM8JjrMGCux5enQXOQbTA== + "@types/history@^4.7.11": version "4.7.11" resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.11.tgz#56588b17ae8f50c53983a524fc3cc47437969d64" @@ -2319,11 +2461,11 @@ "@types/istanbul-lib-report" "*" "@types/jest@*": - version "28.1.4" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-28.1.4.tgz#a11ee6c8fd0b52c19c9c18138b78bbcc201dad5a" - integrity sha512-telv6G5N7zRJiLcI3Rs3o+ipZ28EnE+7EvF0pSrt2pZOMnAVI/f+6/LucDxOvcBcTeTL3JMF744BbVQAVBUQRA== + version "28.1.7" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-28.1.7.tgz#a680c5d05b69634c2d54a63cb106d7fb1adaba16" + integrity sha512-acDN4VHD40V24tgu0iC44jchXavRNVFXQ/E6Z5XNsswgoSO/4NgsXoEYmPUGookKldlZQyIpmrEXsHI9cA3ZTA== dependencies: - jest-matcher-utils "^28.0.0" + expect "^28.0.0" pretty-format "^28.0.0" "@types/jest@^27.0.1": @@ -2345,14 +2487,19 @@ integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== "@types/lodash@^4.14.182": - version "4.14.182" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.182.tgz#05301a4d5e62963227eaafe0ce04dd77c54ea5c2" - integrity sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q== + version "4.14.184" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.184.tgz#23f96cd2a21a28e106dc24d825d4aa966de7a9fe" + integrity sha512-RoZphVtHbxPZizt4IcILciSWiC6dcn+eZ8oX9IWEYfDMcocdd42f7NPI6fQj+6zI8y4E0L7gu2pcZKLGTRaV9Q== -"@types/mime@^1": - version "1.3.2" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" - integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== +"@types/marked@4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@types/marked/-/marked-4.0.3.tgz#2098f4a77adaba9ce881c9e0b6baf29116e5acc4" + integrity sha512-HnMWQkLJEf/PnxZIfbm0yGJRRZYYMhb++O9M36UCTA9z53uPvVoSlAwJr3XOpDEryb7Hwl1qAx/MV6YIW1RXxg== + +"@types/mime@*": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.1.tgz#5f8f2bca0a5863cb69bc0b0acd88c96cb1d4ae10" + integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA== "@types/minimatch@*", "@types/minimatch@^3.0.3": version "3.0.5" @@ -2360,14 +2507,19 @@ integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== "@types/node@*": - version "18.0.3" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.0.3.tgz#463fc47f13ec0688a33aec75d078a0541a447199" - integrity sha512-HzNRZtp4eepNitP+BD6k2L6DROIDG4Q0fm4x+dwfsr6LGmROENnok75VGw40628xf+iR24WeMFcHuuBDUAzzsQ== + version "18.7.11" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.7.11.tgz#486e72cfccde88da24e1f23ff1b7d8bfb64e6250" + integrity sha512-KZhFpSLlmK/sdocfSAjqPETTMd0ug6HIMIAwkwUpU79olnZdQtMxpQP+G1wDzCH7na+FltSIhbaZuKdwZ8RDrw== + +"@types/node@^14.14.31": + version "14.18.26" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.26.tgz#239e19f8b4ea1a9eb710528061c1d733dc561996" + integrity sha512-0b+utRBSYj8L7XAp0d+DX7lI4cSmowNaaTkk6/1SKzbKkG+doLuPusB9EOvzLJ8ahJSk03bTLIL6cWaEd4dBKA== -"@types/node@^17.0.24": - version "17.0.45" - resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.45.tgz#2c0fafd78705e7a18b7906b5201a522719dc5190" - integrity sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw== +"@types/node@^18.7.13": + version "18.7.13" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.7.13.tgz#23e6c5168333480d454243378b69e861ab5c011a" + integrity sha512-46yIhxSe5xEaJZXWdIBP7GU4HDTG8/eo0qd9atdiL+lFpA03y8KS+lkTN834TWJj5767GbWv4n/P6efyTFt1Dw== "@types/normalize-package-data@^2.4.0": version "2.4.1" @@ -2385,9 +2537,9 @@ integrity sha512-5qOlnZscTn4xxM5MeGXAMOsIOIKIbh9e85zJWfBRVPlRMEVawzoPhINYbRGkBZCI8LxvBe7tJCdWiarA99OZfQ== "@types/prettier@^2.1.5": - version "2.6.3" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.6.3.tgz#68ada76827b0010d0db071f739314fa429943d0a" - integrity sha512-ymZk3LEC/fsut+/Q5qejp6R9O1rMxz3XaRHDV6kX8MrGAhOSPqVARbDi+EZvInBpw+BnCX3TD240byVkOfQsHg== + version "2.7.0" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.0.tgz#ea03e9f0376a4446f44797ca19d9c46c36e352dc" + integrity sha512-RI1L7N4JnW5gQw2spvL7Sllfuf1SaHdrZpCHiBlCXjIlufi1SMNnbu2teze3/QE67Fg2tBlH7W+mi4hVNk4p0A== "@types/prop-types@*": version "15.7.5" @@ -2468,18 +2620,18 @@ "@types/react" "*" "@types/react@*", "@types/react@^18.0.5": - version "18.0.15" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.15.tgz#d355644c26832dc27f3e6cbf0c4f4603fc4ab7fe" - integrity sha512-iz3BtLuIYH1uWdsv6wXYdhozhqj20oD4/Hk2DNXIn1kFsmp9x8d9QB6FnPhfkbhd2PgEONt9Q1x/ebkwjfFLow== + version "18.0.17" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.17.tgz#4583d9c322d67efe4b39a935d223edcc7050ccf4" + integrity sha512-38ETy4tL+rn4uQQi7mB81G7V1g0u2ryquNmsVIOKUAEIDK+3CUjZ6rSRpdvS99dNBnkLFL83qfmtLacGOTIhwQ== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" csstype "^3.0.2" "@types/react@^17": - version "17.0.47" - resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.47.tgz#4ee71aaf4c5a9e290e03aa4d0d313c5d666b3b78" - integrity sha512-mk0BL8zBinf2ozNr3qPnlu1oyVTYq+4V7WA76RgxUAtf0Em/Wbid38KN6n4abEkvO4xMTBWmnP1FtQzgkEiJoA== + version "17.0.48" + resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.48.tgz#a4532a8b91d7b27b8768b6fc0c3bccb760d15a6c" + integrity sha512-zJ6IYlJ8cYYxiJfUaZOQee4lh99mFihBoqkOSEGV+dFi9leROW6+PgstzQ+w3gWTnUfskALtQPGHK6dYmPj+2A== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" @@ -2515,13 +2667,23 @@ "@types/express" "*" "@types/serve-static@*", "@types/serve-static@^1.13.10": - version "1.13.10" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.10.tgz#f5e0ce8797d2d7cc5ebeda48a52c96c4fa47a8d9" - integrity sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ== + version "1.15.0" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.0.tgz#c7930ff61afb334e121a9da780aac0d9b8f34155" + integrity sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg== dependencies: - "@types/mime" "^1" + "@types/mime" "*" "@types/node" "*" +"@types/sinonjs__fake-timers@8.1.1": + version "8.1.1" + resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz#b49c2c70150141a15e0fa7e79cf1f92a72934ce3" + integrity sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g== + +"@types/sizzle@^2.3.2": + version "2.3.3" + resolved "https://registry.yarnpkg.com/@types/sizzle/-/sizzle-2.3.3.tgz#ff5e2f1902969d305225a047c8a0fd5c915cebef" + integrity sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ== + "@types/sockjs@^0.3.33": version "0.3.33" resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.33.tgz#570d3a0b99ac995360e3136fd6045113b1bd236f" @@ -2561,15 +2723,15 @@ dependencies: "@types/jest" "*" -"@types/trusted-types@^2.0.2": +"@types/trusted-types@*", "@types/trusted-types@^2.0.2": version "2.0.2" resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.2.tgz#fc25ad9943bcac11cceb8168db4f275e0e72e756" integrity sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg== "@types/uglify-js@*": - version "3.16.0" - resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.16.0.tgz#2cf74a0e6ebb6cd54c0d48e509d5bd91160a9602" - integrity sha512-0yeUr92L3r0GLRnBOvtYK1v2SjqMIqQDHMl7GLb+l2L8+6LSFWEEWEIgVsPdMn5ImLM8qzWT8xFPtQYpp8co0g== + version "3.17.0" + resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.17.0.tgz#95271e7abe0bf7094c60284f76ee43232aef43b9" + integrity sha512-3HO6rm0y+/cqvOyA8xcYLweF0TKXlAxmQASjbOi49Co51A1N4nR4bEwBgRoD9kNM+rqFGArjKr654SLp2CoGmQ== dependencies: source-map "^0.6.1" @@ -2580,7 +2742,7 @@ "@types/uuid@^8.3.4": version "8.3.4" - resolved "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz" + resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.3.4.tgz#bd86a43617df0594787d38b735f55c805becf1bc" integrity sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw== "@types/webpack-sources@*": @@ -2638,20 +2800,27 @@ "@types/yargs-parser" "*" "@types/yargs@^17.0.8": - version "17.0.10" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.10.tgz#591522fce85d8739bca7b8bb90d048e4478d186a" - integrity sha512-gmEaFwpj/7f/ROdtIlci1R1VYU1J4j95m8T+Tj3iBgiBFKg1foE/PSl93bBd5T9LDXNPo8UlNN6W0qwD8O5OaA== + version "17.0.11" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.11.tgz#5e10ca33e219807c0eee0f08b5efcba9b6a42c06" + integrity sha512-aB4y9UDUXTSMxmM4MH+YnuR0g5Cph3FLQBoWoMB21DSvFVAxRVEHEMx3TLh+zUZYMCQtKiqazz0Q4Rre31f/OA== dependencies: "@types/yargs-parser" "*" +"@types/yauzl@^2.9.1": + version "2.10.0" + resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.0.tgz#b3248295276cf8c6f153ebe6a9aba0c988cb2599" + integrity sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw== + dependencies: + "@types/node" "*" + "@typescript-eslint/eslint-plugin@^5.5.0": - version "5.30.6" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.30.6.tgz#9c6017b6c1d04894141b4a87816388967f64c359" - integrity sha512-J4zYMIhgrx4MgnZrSDD7sEnQp7FmhKNOaqaOpaoQ/SfdMfRB/0yvK74hTnvH+VQxndZynqs5/Hn4t+2/j9bADg== + version "5.34.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.34.0.tgz#d690f60e335596f38b01792e8f4b361d9bd0cb35" + integrity sha512-eRfPPcasO39iwjlUAMtjeueRGuIrW3TQ9WseIDl7i5UWuFbf83yYaU7YPs4j8+4CxUMIsj1k+4kV+E+G+6ypDQ== dependencies: - "@typescript-eslint/scope-manager" "5.30.6" - "@typescript-eslint/type-utils" "5.30.6" - "@typescript-eslint/utils" "5.30.6" + "@typescript-eslint/scope-manager" "5.34.0" + "@typescript-eslint/type-utils" "5.34.0" + "@typescript-eslint/utils" "5.34.0" debug "^4.3.4" functional-red-black-tree "^1.0.1" ignore "^5.2.0" @@ -2660,75 +2829,75 @@ tsutils "^3.21.0" "@typescript-eslint/experimental-utils@^5.0.0": - version "5.30.6" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.30.6.tgz#fe30d2800aedcad7465d9260b66068337df71612" - integrity sha512-bqvT+0L8IjtW7MCrMgm9oVNxs4g7mESro1mm5c1/SNfTnHuFTf9OUX1WzVkTz75M9cp//UrTrSmGvK48NEKshQ== + version "5.34.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.34.0.tgz#f24200ee4d55ecf30a24e335d551fc6819f0c84b" + integrity sha512-bXDmphFgoQI4eY7r8Vp0mwrvU9Pic+KxuQPG8uoC33FlZLgsFhv8brhUUyniHEeDhApdg4/5a3qYEZbNGnRQYQ== dependencies: - "@typescript-eslint/utils" "5.30.6" + "@typescript-eslint/utils" "5.34.0" "@typescript-eslint/parser@^5.5.0": - version "5.30.6" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.30.6.tgz#add440db038fa9d777e4ebdaf66da9e7fb7abe92" - integrity sha512-gfF9lZjT0p2ZSdxO70Xbw8w9sPPJGfAdjK7WikEjB3fcUI/yr9maUVEdqigBjKincUYNKOmf7QBMiTf719kbrA== + version "5.34.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.34.0.tgz#ca710858ea85dbfd30c9b416a335dc49e82dbc07" + integrity sha512-SZ3NEnK4usd2CXkoV3jPa/vo1mWX1fqRyIVUQZR4As1vyp4fneknBNJj+OFtV8WAVgGf+rOHMSqQbs2Qn3nFZQ== dependencies: - "@typescript-eslint/scope-manager" "5.30.6" - "@typescript-eslint/types" "5.30.6" - "@typescript-eslint/typescript-estree" "5.30.6" + "@typescript-eslint/scope-manager" "5.34.0" + "@typescript-eslint/types" "5.34.0" + "@typescript-eslint/typescript-estree" "5.34.0" debug "^4.3.4" -"@typescript-eslint/scope-manager@5.30.6": - version "5.30.6" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.30.6.tgz#ce1b49ff5ce47f55518d63dbe8fc9181ddbd1a33" - integrity sha512-Hkq5PhLgtVoW1obkqYH0i4iELctEKixkhWLPTYs55doGUKCASvkjOXOd/pisVeLdO24ZX9D6yymJ/twqpJiG3g== +"@typescript-eslint/scope-manager@5.34.0": + version "5.34.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.34.0.tgz#14efd13dc57602937e25f188fd911f118781e527" + integrity sha512-HNvASMQlah5RsBW6L6c7IJ0vsm+8Sope/wu5sEAf7joJYWNb1LDbJipzmdhdUOnfrDFE6LR1j57x1EYVxrY4ow== dependencies: - "@typescript-eslint/types" "5.30.6" - "@typescript-eslint/visitor-keys" "5.30.6" + "@typescript-eslint/types" "5.34.0" + "@typescript-eslint/visitor-keys" "5.34.0" -"@typescript-eslint/type-utils@5.30.6": - version "5.30.6" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.30.6.tgz#a64aa9acbe609ab77f09f53434a6af2b9685f3af" - integrity sha512-GFVVzs2j0QPpM+NTDMXtNmJKlF842lkZKDSanIxf+ArJsGeZUIaeT4jGg+gAgHt7AcQSFwW7htzF/rbAh2jaVA== +"@typescript-eslint/type-utils@5.34.0": + version "5.34.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.34.0.tgz#7a324ab9ddd102cd5e1beefc94eea6f3eb32d32d" + integrity sha512-Pxlno9bjsQ7hs1pdWRUv9aJijGYPYsHpwMeCQ/Inavhym3/XaKt1ZKAA8FIw4odTBfowBdZJDMxf2aavyMDkLg== dependencies: - "@typescript-eslint/utils" "5.30.6" + "@typescript-eslint/utils" "5.34.0" debug "^4.3.4" tsutils "^3.21.0" -"@typescript-eslint/types@5.30.6": - version "5.30.6" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.30.6.tgz#86369d0a7af8c67024115ac1da3e8fb2d38907e1" - integrity sha512-HdnP8HioL1F7CwVmT4RaaMX57RrfqsOMclZc08wGMiDYJBsLGBM7JwXM4cZJmbWLzIR/pXg1kkrBBVpxTOwfUg== +"@typescript-eslint/types@5.34.0": + version "5.34.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.34.0.tgz#217bf08049e9e7b86694d982e88a2c1566330c78" + integrity sha512-49fm3xbbUPuzBIOcy2CDpYWqy/X7VBkxVN+DC21e0zIm3+61Z0NZi6J9mqPmSW1BDVk9FIOvuCFyUPjXz93sjA== -"@typescript-eslint/typescript-estree@5.30.6": - version "5.30.6" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.30.6.tgz#a84a0d6a486f9b54042da1de3d671a2c9f14484e" - integrity sha512-Z7TgPoeYUm06smfEfYF0RBkpF8csMyVnqQbLYiGgmUSTaSXTP57bt8f0UFXstbGxKIreTwQCujtaH0LY9w9B+A== +"@typescript-eslint/typescript-estree@5.34.0": + version "5.34.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.34.0.tgz#ba7b83f4bf8ccbabf074bbf1baca7a58de3ccb9a" + integrity sha512-mXHAqapJJDVzxauEkfJI96j3D10sd567LlqroyCeJaHnu42sDbjxotGb3XFtGPYKPD9IyLjhsoULML1oI3M86A== dependencies: - "@typescript-eslint/types" "5.30.6" - "@typescript-eslint/visitor-keys" "5.30.6" + "@typescript-eslint/types" "5.34.0" + "@typescript-eslint/visitor-keys" "5.34.0" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/utils@5.30.6", "@typescript-eslint/utils@^5.13.0": - version "5.30.6" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.30.6.tgz#1de2da14f678e7d187daa6f2e4cdb558ed0609dc" - integrity sha512-xFBLc/esUbLOJLk9jKv0E9gD/OH966M40aY9jJ8GiqpSkP2xOV908cokJqqhVd85WoIvHVHYXxSFE4cCSDzVvA== +"@typescript-eslint/utils@5.34.0", "@typescript-eslint/utils@^5.13.0": + version "5.34.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.34.0.tgz#0cae98f48d8f9e292e5caa9343611b6faf49e743" + integrity sha512-kWRYybU4Rn++7lm9yu8pbuydRyQsHRoBDIo11k7eqBWTldN4xUdVUMCsHBiE7aoEkFzrUEaZy3iH477vr4xHAQ== dependencies: "@types/json-schema" "^7.0.9" - "@typescript-eslint/scope-manager" "5.30.6" - "@typescript-eslint/types" "5.30.6" - "@typescript-eslint/typescript-estree" "5.30.6" + "@typescript-eslint/scope-manager" "5.34.0" + "@typescript-eslint/types" "5.34.0" + "@typescript-eslint/typescript-estree" "5.34.0" eslint-scope "^5.1.1" eslint-utils "^3.0.0" -"@typescript-eslint/visitor-keys@5.30.6": - version "5.30.6" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.30.6.tgz#94dd10bb481c8083378d24de1742a14b38a2678c" - integrity sha512-41OiCjdL2mCaSDi2SvYbzFLlqqlm5v1ZW9Ym55wXKL/Rx6OOB1IbuFGo71Fj6Xy90gJDFTlgOS+vbmtGHPTQQA== +"@typescript-eslint/visitor-keys@5.34.0": + version "5.34.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.34.0.tgz#d0fb3e31033e82ddd5de048371ad39eb342b2d40" + integrity sha512-O1moYjOSrab0a2fUvFpsJe0QHtvTC+cR+ovYpgKrAVXzqQyc74mv76TgY6z+aEtjQE2vgZux3CQVtGryqdcOAw== dependencies: - "@typescript-eslint/types" "5.30.6" + "@typescript-eslint/types" "5.34.0" eslint-visitor-keys "^3.3.0" "@webassemblyjs/ast@1.11.1": @@ -3007,6 +3176,11 @@ resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== +"@zeit/schemas@2.21.0": + version "2.21.0" + resolved "https://registry.yarnpkg.com/@zeit/schemas/-/schemas-2.21.0.tgz#cd242c6551ffb51830049d68d9743ab65b45b820" + integrity sha512-/J4WBTpWtQ4itN1rb3ao8LfClmVcmz2pO6oYb7Qd4h7VSqUhIbJIvrykz9Ew1WMg6eFWsKdsMHc5uPbFxqlCpg== + abab@^2.0.0, abab@^2.0.3, abab@^2.0.5: version "2.0.6" resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" @@ -3075,10 +3249,10 @@ acorn@^7.0.0, acorn@^7.1.0, acorn@^7.1.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -acorn@^8.2.4, acorn@^8.4.1, acorn@^8.5.0, acorn@^8.7.1: - version "8.7.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30" - integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A== +acorn@^8.2.4, acorn@^8.5.0, acorn@^8.7.1, acorn@^8.8.0: + version "8.8.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.0.tgz#88c0187620435c7f6015803f5539dae05a9dbea8" + integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w== address@^1.0.1, address@^1.1.2: version "1.2.0" @@ -3140,6 +3314,16 @@ ajv-keywords@^5.0.0: dependencies: fast-deep-equal "^3.1.3" +ajv@8.11.0, ajv@^8.0.0, ajv@^8.6.0, ajv@^8.8.0: + version "8.11.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.0.tgz#977e91dd96ca669f54a11e23e378e33b884a565f" + integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.5.3: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" @@ -3150,21 +3334,23 @@ ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.2, ajv@^6.12.3, ajv@^6.12.4, ajv json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.0, ajv@^8.6.0, ajv@^8.8.0: - version "8.11.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.0.tgz#977e91dd96ca669f54a11e23e378e33b884a565f" - integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== +ansi-align@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" + integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" + string-width "^4.1.0" ansi-colors@^3.0.0: version "3.2.4" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== +ansi-colors@^4.1.1: + version "4.1.3" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" + integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== + ansi-escapes@^4.2.1, ansi-escapes@^4.3.0, ansi-escapes@^4.3.1: version "4.3.2" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" @@ -3221,7 +3407,7 @@ ansi-styles@^5.0.0: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== -ansi-styles@^6.0.0: +ansi-styles@^6.0.0, ansi-styles@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.1.0.tgz#87313c102b8118abd57371afab34618bf7350ed3" integrity sha512-VbqNsoz55SYGczauuup0MFUyXNQviSpFTj1RQtFzmQLk18qbVSpTFFGMT293rmDaQuKCT6InmbuEyUne4mTuxQ== @@ -3243,9 +3429,9 @@ anymatch@^3.0.0, anymatch@^3.0.3, anymatch@~3.1.2: picomatch "^2.0.4" apexcharts@^3.35.3: - version "3.35.3" - resolved "https://registry.yarnpkg.com/apexcharts/-/apexcharts-3.35.3.tgz#8025e85971c4695be124aa67c21f66d5787f9c51" - integrity sha512-UDlxslJr3DG63I/SgoiivIu4lpP25GMaKFK8NvCHmTksTQshx4ng3oPPrYvdsBFOvD/ajPYIh/p7rNB0jq8vXg== + version "3.35.5" + resolved "https://registry.yarnpkg.com/apexcharts/-/apexcharts-3.35.5.tgz#c5a950f6f7be35ff4f4509b2179ff538d366c6ec" + integrity sha512-Bi3aq35xWntI71JlywXTBBAOhuKTbB4wijKw4ClkIAFV904YDkHPIJ8N9LcZq9fvVb0VX1AEmyOFBOB2Vwsuew== dependencies: svg.draggable.js "^2.2.2" svg.easing.js "^2.0.0" @@ -3254,12 +3440,29 @@ apexcharts@^3.35.3: svg.resize.js "^1.4.3" svg.select.js "^3.0.1" +append-transform@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-2.0.0.tgz#99d9d29c7b38391e6f428d28ce136551f0b77e12" + integrity sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg== + dependencies: + default-require-extensions "^3.0.0" + aproba@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== -arg@^5.0.2: +arch@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/arch/-/arch-2.2.0.tgz#1bc47818f305764f23ab3306b0bfc086c5a29d11" + integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ== + +archy@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" + integrity sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw== + +arg@5.0.2, arg@^5.0.2: version "5.0.2" resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== @@ -3463,14 +3666,14 @@ async-limiter@~1.0.0: resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== -async@^2.6.2: +async@^2.6.4: version "2.6.4" resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== dependencies: lodash "^4.17.14" -async@^3.2.3: +async@^3.2.0, async@^3.2.3: version "3.2.4" resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== @@ -3490,13 +3693,13 @@ atob@^2.1.2: resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== -autoprefixer@^10.4.7: - version "10.4.7" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.7.tgz#1db8d195f41a52ca5069b7593be167618edbbedf" - integrity sha512-ypHju4Y2Oav95SipEcCcI5J7CGPuvz8oat7sUtYj3ClK44bldfvtvcxK6IEK++7rqB7YchDGzweZIBG+SD0ZAA== +autoprefixer@^10.4.8: + version "10.4.8" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.8.tgz#92c7a0199e1cfb2ad5d9427bd585a3d75895b9e5" + integrity sha512-75Jr6Q/XpTqEf6D2ltS5uMewJIx5irCU1oBYJrWjFenq/m12WRRrz6g15L1EIoYvPLXTbEry7rDOwrcYNj77xw== dependencies: - browserslist "^4.20.3" - caniuse-lite "^1.0.30001335" + browserslist "^4.21.3" + caniuse-lite "^1.0.30001373" fraction.js "^4.2.0" normalize-range "^0.1.2" picocolors "^1.0.0" @@ -3525,12 +3728,12 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== -axe-core@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.4.2.tgz#dcf7fb6dea866166c3eab33d68208afe4d5f670c" - integrity sha512-LVAaGp/wkkgYJcjmHsoKx4juT1aQvJyPcW09MLCjVTh3V2cc6PnyempiLMNH5iMdfIX/zdbjUx2KDjMLCTdPeA== +axe-core@^4.4.3: + version "4.4.3" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.4.3.tgz#11c74d23d5013c0fa5d183796729bc3482bd2f6f" + integrity sha512-32+ub6kkdhhWick/UjvEwRchgoetXqTK14INLqbGm5U2TzBkBNF3nQtLYm8ovxSkQWArjEQvftCKryjZaATu3w== -axios@*: +axios@*, axios@^0.27.0: version "0.27.2" resolved "https://registry.yarnpkg.com/axios/-/axios-0.27.2.tgz#207658cc8621606e586c85db4b41a750e756d972" integrity sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ== @@ -3538,6 +3741,13 @@ axios@*: follow-redirects "^1.14.9" form-data "^4.0.0" +axios@^0.21.1: + version "0.21.4" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" + integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== + dependencies: + follow-redirects "^1.14.0" + axios@^0.26.1: version "0.26.1" resolved "https://registry.yarnpkg.com/axios/-/axios-0.26.1.tgz#1ede41c51fcf51bbbd6fd43669caaa4f0495aaa9" @@ -3675,15 +3885,6 @@ babel-plugin-jest-hoist@^27.5.1: "@types/babel__core" "^7.0.0" "@types/babel__traverse" "^7.0.6" -babel-plugin-macros@^2.6.1: - version "2.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz#0f958a7cc6556b1e65344465d99111a1e5e10138" - integrity sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg== - dependencies: - "@babel/runtime" "^7.7.2" - cosmiconfig "^6.0.0" - resolve "^1.12.0" - babel-plugin-macros@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz#9ef6dc74deb934b4db344dc973ee851d148c50c1" @@ -3709,29 +3910,29 @@ babel-plugin-named-asset-import@^0.3.8: resolved "https://registry.yarnpkg.com/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz#6b7fa43c59229685368683c28bc9734f24524cc2" integrity sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q== -babel-plugin-polyfill-corejs2@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz#440f1b70ccfaabc6b676d196239b138f8a2cfba5" - integrity sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w== +babel-plugin-polyfill-corejs2@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.2.tgz#e4c31d4c89b56f3cf85b92558954c66b54bd972d" + integrity sha512-LPnodUl3lS0/4wN3Rb+m+UK8s7lj2jcLRrjho4gLw+OJs+I4bvGXshINesY5xx/apM+biTnQ9reDI8yj+0M5+Q== dependencies: - "@babel/compat-data" "^7.13.11" - "@babel/helper-define-polyfill-provider" "^0.3.1" + "@babel/compat-data" "^7.17.7" + "@babel/helper-define-polyfill-provider" "^0.3.2" semver "^6.1.1" -babel-plugin-polyfill-corejs3@^0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz#aabe4b2fa04a6e038b688c5e55d44e78cd3a5f72" - integrity sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ== +babel-plugin-polyfill-corejs3@^0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.3.tgz#d7e09c9a899079d71a8b670c6181af56ec19c5c7" + integrity sha512-zKsXDh0XjnrUEW0mxIHLfjBfnXSMr5Q/goMe/fxpQnLm07mcOZiIZHBNWCMx60HmdvjxfXcalac0tfFg0wqxyw== dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.1" + "@babel/helper-define-polyfill-provider" "^0.3.2" core-js-compat "^3.21.0" -babel-plugin-polyfill-regenerator@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz#2c0678ea47c75c8cc2fbb1852278d8fb68233990" - integrity sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A== +babel-plugin-polyfill-regenerator@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.0.tgz#8f51809b6d5883e07e71548d75966ff7635527fe" + integrity sha512-RW1cnryiADFeHmfLS+WW/G431p1PsW5qdRdz0SDRi7TKcUgc7Oh/uXkT7MZ/+tGsT1BkczEAmD5XjUyJ5SWDTw== dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.1" + "@babel/helper-define-polyfill-provider" "^0.3.2" babel-plugin-react-css-modules@^5.2.6: version "5.2.6" @@ -3871,7 +4072,7 @@ base64-arraybuffer@^1.0.2: resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz#1c37589a7c4b0746e34bd1feb951da2df01c1bdc" integrity sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ== -base64-js@^1.0.2: +base64-js@^1.0.2, base64-js@^1.3.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== @@ -3943,7 +4144,17 @@ bindings@^1.5.0: dependencies: file-uri-to-path "1.0.0" -bluebird@^3.5.5: +blob-util@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/blob-util/-/blob-util-2.0.2.tgz#3b4e3c281111bb7f11128518006cdc60b403a1eb" + integrity sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ== + +bluebird@3.7.1: + version "3.7.1" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.1.tgz#df70e302b471d7473489acf26a93d63b53f874de" + integrity sha512-DdmyoGCleJnkbp3nkbxTLJ18rjDsE4yCggEwKNXkeV123sPNfOCYeDoeuOY+F2FrSjO1YXcTU+dsy96KMy+gcg== + +bluebird@3.7.2, bluebird@^3.5.5, bluebird@^3.7.2: version "3.7.2" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== @@ -4008,6 +4219,20 @@ boolbase@^1.0.0, boolbase@~1.0.0: resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== +boxen@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-7.0.0.tgz#9e5f8c26e716793fc96edcf7cf754cdf5e3fbf32" + integrity sha512-j//dBVuyacJbvW+tvZ9HuH03fZ46QcaKvvhZickZqtB271DxJ7SNRSNxrV/dZX0085m7hISRZWbzWlJvx/rHSg== + dependencies: + ansi-align "^3.0.1" + camelcase "^7.0.0" + chalk "^5.0.1" + cli-boxes "^3.0.0" + string-width "^5.1.2" + type-fest "^2.13.0" + widest-line "^4.0.1" + wrap-ansi "^8.0.1" + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -4129,15 +4354,15 @@ browserify-zlib@^0.2.0: dependencies: pako "~1.0.5" -browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4.16.6, browserslist@^4.18.1, browserslist@^4.20.2, browserslist@^4.20.3, browserslist@^4.21.0, browserslist@^4.21.1: - version "4.21.1" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.1.tgz#c9b9b0a54c7607e8dc3e01a0d311727188011a00" - integrity sha512-Nq8MFCSrnJXSc88yliwlzQe3qNe3VntIjhsArW9IJOEPSHNx23FalwApUVbzAWABLhYJJ7y8AynWI/XM8OdfjQ== +browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4.16.6, browserslist@^4.18.1, browserslist@^4.20.2, browserslist@^4.20.3, browserslist@^4.21.3: + version "4.21.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.3.tgz#5df277694eb3c48bc5c4b05af3e8b7e09c5a6d1a" + integrity sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ== dependencies: - caniuse-lite "^1.0.30001359" - electron-to-chromium "^1.4.172" - node-releases "^2.0.5" - update-browserslist-db "^1.0.4" + caniuse-lite "^1.0.30001370" + electron-to-chromium "^1.4.202" + node-releases "^2.0.6" + update-browserslist-db "^1.0.5" bser@2.1.1: version "2.1.1" @@ -4146,6 +4371,11 @@ bser@2.1.1: dependencies: node-int64 "^0.4.0" +buffer-crc32@~0.2.3: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== + buffer-from@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" @@ -4170,6 +4400,19 @@ buffer@^4.3.0: ieee754 "^1.1.4" isarray "^1.0.0" +buffer@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +builtin-modules@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" + integrity sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ== + builtin-modules@^3.1.0: version "3.3.0" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" @@ -4226,6 +4469,21 @@ cache-base@^1.0.1: union-value "^1.0.0" unset-value "^1.0.0" +cachedir@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/cachedir/-/cachedir-2.3.0.tgz#0c75892a052198f0b21c7c1804d8331edfcae0e8" + integrity sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw== + +caching-transform@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/caching-transform/-/caching-transform-4.0.0.tgz#00d297a4206d71e2163c39eaffa8157ac0651f0f" + integrity sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA== + dependencies: + hasha "^5.0.0" + make-dir "^3.0.0" + package-hash "^4.0.0" + write-file-atomic "^3.0.0" + call-bind@^1.0.0, call-bind@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" @@ -4262,6 +4520,11 @@ camelcase@^6.2.0, camelcase@^6.2.1: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== +camelcase@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-7.0.0.tgz#fd112621b212126741f998d614cbc2a8623fd174" + integrity sha512-JToIvOmz6nhGsUhAYScbo2d6Py5wojjNfoxoc2mEVLUdJ70gJK2gnd+ABY1Tc3sVMyK7QDPtN0T/XdlCQWITyQ== + camelize@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.0.tgz#164a5483e630fa4321e5af07020e531831b2609b" @@ -4277,10 +4540,10 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001335, caniuse-lite@^1.0.30001359: - version "1.0.30001364" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001364.tgz#1e118f0e933ed2b79f8d461796b8ce45398014a0" - integrity sha512-9O0xzV3wVyX0SlegIQ6knz+okhBB5pE0PC40MNdwcipjwpxoUEHL24uJ+gG42cgklPjfO5ZjZPme9FTSN3QT2Q== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001370, caniuse-lite@^1.0.30001373: + version "1.0.30001382" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001382.tgz#4d37f0d0b6fffb826c8e5e1c0f4bf8ce592db949" + integrity sha512-2rtJwDmSZ716Pxm1wCtbPvHtbDWAreTPxXbkc5RkKglow3Ig/4GNGazDI9/BVnXbG/wnv6r3B5FEbkfg9OcTGg== capture-exit@^2.0.0: version "2.0.0" @@ -4299,6 +4562,26 @@ caseless@~0.12.0: resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== +chalk-template@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/chalk-template/-/chalk-template-0.4.0.tgz#692c034d0ed62436b9062c1707fadcd0f753204b" + integrity sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg== + dependencies: + chalk "^4.1.2" + +chalk@4.1.2, chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@5.0.1, chalk@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.0.1.tgz#ca57d71e82bb534a296df63bbacc4a1c22b2a4b6" + integrity sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w== + chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" @@ -4310,7 +4593,7 @@ chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.0.0, chalk@^2.0.1, chalk@^2.4.1, chalk@^2.4.2: +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.0, 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== @@ -4327,14 +4610,6 @@ chalk@^3.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - char-regex@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" @@ -4345,6 +4620,11 @@ char-regex@^2.0.0: resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-2.0.1.tgz#6dafdb25f9d3349914079f010ba8d0e6ff9cd01e" integrity sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw== +check-more-types@2.24.0, check-more-types@^2.24.0: + version "2.24.0" + resolved "https://registry.yarnpkg.com/check-more-types/-/check-more-types-2.24.0.tgz#1420ffb10fd444dcfc79b43891bbfffd32a84600" + integrity sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA== + check-types@^11.1.1: version "11.1.2" resolved "https://registry.yarnpkg.com/check-types/-/check-types-11.1.2.tgz#86a7c12bf5539f6324eb0e70ca8896c0e38f3e2f" @@ -4452,9 +4732,9 @@ clean-css@^4.2.3: source-map "~0.6.0" clean-css@^5.2.2: - version "5.3.0" - resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.0.tgz#ad3d8238d5f3549e83d5f87205189494bc7cbb59" - integrity sha512-YYuuxv4H/iNb1Z/5IbMRoxgrzjWGhOEFfd+groZ5dMCVkpENiMZmwspdrzBo9286JjM1gZJPAyL7ZIdzuvu2AQ== + version "5.3.1" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.1.tgz#d0610b0b90d125196a2894d35366f734e5d7aa32" + integrity sha512-lCr8OHhiWCTw4v8POJovCoh4T7I9U11yVsPjMWWnnMmp9ZowCxyad1Pathle/9HjaDp+fdQKjO9fQydE6RHTZg== dependencies: source-map "~0.6.0" @@ -4471,6 +4751,11 @@ clean-webpack-plugin@^3.0.0: "@types/webpack" "^4.4.31" del "^4.1.1" +cli-boxes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-3.0.0.tgz#71a10c716feeba005e4504f36329ef0b17cf3145" + integrity sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g== + cli-cursor@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" @@ -4478,6 +4763,15 @@ cli-cursor@^3.1.0: dependencies: restore-cursor "^3.1.0" +cli-table3@~0.6.1: + version "0.6.2" + resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.2.tgz#aaf5df9d8b5bf12634dc8b3040806a0c07120d2a" + integrity sha512-QyavHCaIC80cMivimWu4aWHilIpiDpfm3hGmqAmXVL1UsnbLuBSMd21hTX6VY4ZSDSM73ESLeF8TOYId3rBTbw== + dependencies: + string-width "^4.2.0" + optionalDependencies: + "@colors/colors" "1.5.0" + cli-truncate@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" @@ -4494,6 +4788,15 @@ cli-truncate@^3.1.0: slice-ansi "^5.0.0" string-width "^5.0.0" +clipboardy@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/clipboardy/-/clipboardy-3.0.0.tgz#f3876247404d334c9ed01b6f269c11d09a5e3092" + integrity sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg== + dependencies: + arch "^2.2.0" + execa "^5.1.1" + is-wsl "^2.2.0" + cliui@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" @@ -4585,9 +4888,9 @@ color-name@^1.1.4, color-name@~1.1.4: integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== colord@^2.9.1: - version "2.9.2" - resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.2.tgz#25e2bacbbaa65991422c07ea209e2089428effb1" - integrity sha512-Uqbg+J445nc1TKn4FoDPS6ZZqAvEDnwrH42yo8B40JSOgSLxMZ/gt3h4nmCtPLQeXhjJJkqBx7SCY35WnIixaQ== + version "2.9.3" + resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.3.tgz#4f8ce919de456f1d5c1c368c307fe20f3e59fb43" + integrity sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw== colorette@^2.0.10, colorette@^2.0.16, colorette@^2.0.17: version "2.0.19" @@ -4606,7 +4909,7 @@ combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: dependencies: delayed-stream "~1.0.0" -commander@^2.18.0, commander@^2.20.0: +commander@^2.12.1, 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== @@ -4616,6 +4919,11 @@ commander@^4.1.1: resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== +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== + commander@^7.2.0: version "7.2.0" resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" @@ -4627,9 +4935,9 @@ commander@^8.3.0: integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== commander@^9.3.0: - version "9.3.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-9.3.0.tgz#f619114a5a2d2054e0d9ff1b31d5ccf89255e26b" - integrity sha512-hv95iU5uXPbK83mjrJKuZyFM/LBAoCV/XhVGkS5Je6tl7sxr6A0ITMw5WoRV46/UaJ46Nllm3Xt7IaJhXTIkzw== + version "9.4.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-9.4.0.tgz#bc4a40918fefe52e22450c111ecd6b7acce6f11c" + integrity sha512-sRPT+umqkz90UA8M1yqYfnHlZA7fF6nSphDtxeywPZ49ysjxDQybzk13CL+mXekDRG92skbcqCLVovuCusNmFw== common-path-prefix@^3.0.0: version "3.0.0" @@ -4665,7 +4973,7 @@ compressible@~2.0.16: dependencies: mime-db ">= 1.43.0 < 2" -compression@^1.7.4: +compression@1.7.4, compression@^1.7.4: version "1.7.4" resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== @@ -4740,6 +5048,11 @@ constants-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" integrity sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ== +content-disposition@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" + integrity sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA== + content-disposition@0.5.4: version "0.5.4" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" @@ -4752,6 +5065,35 @@ content-type@~1.0.4: resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== +contentful-resolve-response@^1.3.0: + version "1.3.8" + resolved "https://registry.yarnpkg.com/contentful-resolve-response/-/contentful-resolve-response-1.3.8.tgz#58835a1d0894a97ab42541a47f4175d11adaa978" + integrity sha512-y3ttLqttxAN8yh3KfXNF+5kbnJa/01VFV/Rr1GNCaTWEVp6S9VGsTa1GH1cSf5czrK4nM4LUG5r6SzgNg3OkWw== + dependencies: + fast-copy "^2.1.3" + +contentful-sdk-core@^7.0.1: + version "7.0.2" + resolved "https://registry.yarnpkg.com/contentful-sdk-core/-/contentful-sdk-core-7.0.2.tgz#5585880f546772246209de25256635ce31fd8d8e" + integrity sha512-HkBzzzJ3UGqOIJiTd4qMEMvn44ccrN7a75gEej28X1srGn05myRgJ/pWbmXJhtgpq/5gU7IURnynyKx/ecsOfg== + dependencies: + fast-copy "^2.1.3" + lodash.isplainobject "^4.0.6" + lodash.isstring "^4.0.1" + p-throttle "^4.1.1" + qs "^6.9.4" + +contentful@^9.1.33: + version "9.1.34" + resolved "https://registry.yarnpkg.com/contentful/-/contentful-9.1.34.tgz#9ead56a54fee67ccef5e6720d1ad4f2392c207d9" + integrity sha512-UlwDpCt9IS9ZK3OhE8enC2R4ZYp72GvH94cTpfIRWSst7dmctWQUY57z1UkMrzp8NT2/4b2CSxnGx5ev5bV3Sw== + dependencies: + axios "^0.27.0" + contentful-resolve-response "^1.3.0" + contentful-sdk-core "^7.0.1" + fast-copy "^2.1.0" + json-stringify-safe "^5.0.1" + 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" @@ -4799,17 +5141,17 @@ copy-descriptor@^0.1.0: integrity sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw== core-js-compat@^3.21.0, core-js-compat@^3.22.1: - version "3.23.4" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.23.4.tgz#56ad4a352884317a15f6b04548ff7139d23b917f" - integrity sha512-RkSRPe+JYEoflcsuxJWaiMPhnZoFS51FcIxm53k4KzhISCBTmaGlto9dTIrYuk0hnJc3G6pKufAKepHnBq6B6Q== + version "3.24.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.24.1.tgz#d1af84a17e18dfdd401ee39da9996f9a7ba887de" + integrity sha512-XhdNAGeRnTpp8xbD+sR/HFDK9CbeeeqXT6TuofXh3urqEevzkWmLRgrVoykodsw8okqo2pu1BOmuCKrHx63zdw== dependencies: - browserslist "^4.21.1" + browserslist "^4.21.3" semver "7.0.0" core-js-pure@^3.20.2, core-js-pure@^3.8.1: - version "3.23.4" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.23.4.tgz#aba5c7fb297063444f6bf93afb0362151679a012" - integrity sha512-lizxkcgj3XDmi7TUBFe+bQ1vNpD5E4t76BrBWI3HdUxdw/Mq1VF4CkiHzIKyieECKtcODK2asJttoofEeUKICQ== + version "3.24.1" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.24.1.tgz#8839dde5da545521bf282feb7dc6d0b425f39fd3" + integrity sha512-r1nJk41QLLPyozHUUPmILCEMtMw24NG4oWK6RbsDdjzQgg9ZvrUsPBj1MnG0wXXp1DCDU6j+wUvEmBSrtRbLXg== core-js@^2.4.0: version "2.6.12" @@ -4817,9 +5159,9 @@ core-js@^2.4.0: integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== core-js@^3.19.2: - version "3.23.4" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.23.4.tgz#92d640faa7f48b90bbd5da239986602cfc402aa6" - integrity sha512-vjsKqRc1RyAJC3Ye2kYqgfdThb3zYnx9CrqoCcjMOENMtQPC7ZViBvlDxwYU/2z2NI/IPuiXw5mT4hWhddqjzQ== + version "3.24.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.24.1.tgz#cf7724d41724154010a6576b7b57d94c5d66e64f" + integrity sha512-0QTBSYSUZ6Gq21utGzkfITDylE8jWC9Ne1D2MrhvlsZBI1x39OdDIVbzSqtgMndIy6BlHxBXpMGqzZmnztg2rg== core-util-is@1.0.2: version "1.0.2" @@ -5115,19 +5457,10 @@ css@^2.0.0: source-map-resolve "^0.5.2" urix "^0.1.0" -css@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/css/-/css-3.0.0.tgz#4447a4d58fdd03367c516ca9f64ae365cee4aa5d" - integrity sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ== - dependencies: - inherits "^2.0.4" - source-map "^0.6.1" - source-map-resolve "^0.6.0" - -cssdb@^6.6.3: - version "6.6.3" - resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-6.6.3.tgz#1f331a2fab30c18d9f087301e6122a878bb1e505" - integrity sha512-7GDvDSmE+20+WcSMhP17Q1EVWUrLlbxxpMDqG731n8P99JhnQZHR9YvtjPvEHfjFUjvQJvdpKCjlKOX+xe4UVA== +cssdb@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-7.0.1.tgz#3810a0c67ae06362982dfe965dbedf57a0f26617" + integrity sha512-pT3nzyGM78poCKLAEy2zWIVX2hikq6dIrjuZzLV98MumBg+xMTNYfHx7paUlfiRTgg91O/vR889CIf+qiv79Rw== cssesc@^3.0.0: version "3.0.0" @@ -5175,9 +5508,9 @@ cssnano-utils@^3.1.0: integrity sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA== cssnano@^5.0.6: - version "5.1.12" - resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-5.1.12.tgz#bcd0b64d6be8692de79332c501daa7ece969816c" - integrity sha512-TgvArbEZu0lk/dvg2ja+B7kYoD7BBCmn3+k58xD0qjrGHsFzXY/wKTo9M5egcUCabPol05e/PVoIu79s2JN4WQ== + version "5.1.13" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-5.1.13.tgz#83d0926e72955332dc4802a7070296e6258efc0a" + integrity sha512-S2SL2ekdEz6w6a2epXn4CmMKU4K3KpcyXLKfAYc9UQQqJRkD/2eLUG0vJ3Db/9OvO5GuAdgXw3pFbR6abqghDQ== dependencies: cssnano-preset-default "^5.2.12" lilconfig "^2.0.3" @@ -5232,6 +5565,54 @@ cyclist@^1.0.1: resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" integrity sha512-NJGVKPS81XejHcLhaLJS7plab0fK3slPh11mESeeDq2W4ZI5kUKK/LRRdVDvjJseojbPB7ZwjnyOybg3Igea/A== +cypress@^10.6.0: + version "10.6.0" + resolved "https://registry.yarnpkg.com/cypress/-/cypress-10.6.0.tgz#13f46867febf2c3715874ed5dce9c2e946b175fe" + integrity sha512-6sOpHjostp8gcLO34p6r/Ci342lBs8S5z9/eb3ZCQ22w2cIhMWGUoGKkosabPBfKcvRS9BE4UxybBtlIs8gTQA== + dependencies: + "@cypress/request" "^2.88.10" + "@cypress/xvfb" "^1.2.4" + "@types/node" "^14.14.31" + "@types/sinonjs__fake-timers" "8.1.1" + "@types/sizzle" "^2.3.2" + arch "^2.2.0" + blob-util "^2.0.2" + bluebird "^3.7.2" + buffer "^5.6.0" + cachedir "^2.3.0" + chalk "^4.1.0" + check-more-types "^2.24.0" + cli-cursor "^3.1.0" + cli-table3 "~0.6.1" + commander "^5.1.0" + common-tags "^1.8.0" + dayjs "^1.10.4" + debug "^4.3.2" + enquirer "^2.3.6" + eventemitter2 "^6.4.3" + execa "4.1.0" + executable "^4.1.1" + extract-zip "2.0.1" + figures "^3.2.0" + fs-extra "^9.1.0" + getos "^3.2.1" + is-ci "^3.0.0" + is-installed-globally "~0.4.0" + lazy-ass "^1.6.0" + listr2 "^3.8.3" + lodash "^4.17.21" + log-symbols "^4.0.0" + minimist "^1.2.6" + ospath "^1.2.2" + pretty-bytes "^5.6.0" + proxy-from-env "1.0.0" + request-progress "^3.0.0" + semver "^7.3.2" + supports-color "^8.1.1" + tmp "~0.2.1" + untildify "^4.0.0" + yauzl "^2.10.0" + d@1, d@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" @@ -5271,9 +5652,19 @@ data-urls@^2.0.0: whatwg-url "^8.0.0" date-fns@^2.0.1: - version "2.28.0" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.28.0.tgz#9570d656f5fc13143e50c975a3b6bbeb46cd08b2" - integrity sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw== + version "2.29.2" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.29.2.tgz#0d4b3d0f3dff0f920820a070920f0d9662c51931" + integrity sha512-0VNbwmWJDS/G3ySwFSJA3ayhbURMTJLtwM2DTxf9CWondCnh6DTNlO9JgRSq6ibf4eD0lfMJNBxUdEAHHix+bA== + +dayjs@1.10.7: + version "1.10.7" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.10.7.tgz#2cf5f91add28116748440866a0a1d26f3a6ce468" + integrity sha512-P6twpd70BcPK34K26uJ1KT3wlhpuOAPoMwJzpsIWUxHZ7wpmbdZL/hQqBDfz7hGurYSa5PhzdhDHtt319hL3ig== + +dayjs@^1.10.4: + version "1.11.5" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.5.tgz#00e8cc627f231f9499c19b38af49f56dc0ac5e93" + integrity sha512-CAdX5Q3YW3Gclyo5Vpqkgpj8fSdLQcRuzfX6mC6Phy0nfJ0eGYOeS7m4mt2plDWLAtA4TqTakvbboHvUxfe4iA== debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.9: version "2.6.9" @@ -5282,14 +5673,21 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.9: dependencies: ms "2.0.0" -debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: +debug@4, debug@4.3.4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" -debug@^3.1.1, debug@^3.2.7: +debug@4.3.2: + version "4.3.2" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" + integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== + dependencies: + ms "2.1.2" + +debug@^3.1.0, debug@^3.2.7: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== @@ -5302,9 +5700,9 @@ decamelize@^1.2.0: integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== decimal.js@^10.2.1: - version "10.3.1" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.3.1.tgz#d8c3a444a9c6774ba60ca6ad7261c3a94fd5e783" - integrity sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ== + version "10.4.0" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.0.tgz#97a7448873b01e92e5ff9117d89a7bca8e63e0fe" + integrity sha512-Nv6ENEzyPQ6AItkGwLE2PGKinZZ9g59vSh2BeH6NqPu0OTKZ5ruJsVqh/orbAnqXc9pBbgXAIrc2EyaCj8NpGg== decode-uri-component@^0.2.0: version "0.2.0" @@ -5333,6 +5731,11 @@ deep-equal@^1.0.1: object-keys "^1.1.1" regexp.prototype.flags "^1.2.0" +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + deep-is@^0.1.3, deep-is@~0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" @@ -5358,6 +5761,13 @@ default-gateway@^6.0.3: dependencies: execa "^5.0.0" +default-require-extensions@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-3.0.0.tgz#e03f93aac9b2b6443fc52e5e4a37b3ad9ad8df96" + integrity sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg== + dependencies: + strip-bom "^4.0.0" + define-lazy-prop@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" @@ -5491,6 +5901,11 @@ diff-sequences@^28.1.1: resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-28.1.1.tgz#9989dc731266dc2903457a70e996f3a041913ac6" integrity sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw== +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + diffie-hellman@^5.0.0: version "5.0.3" resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" @@ -5626,6 +6041,11 @@ domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.1: dependencies: domelementtype "^2.2.0" +dompurify@^2.3.10: + version "2.3.11" + resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.3.11.tgz#868f0765cb992a8af052d57b1d29ef6c929c13f1" + integrity sha512-q4c/TZfHWTPGgNBaMimQ1+bEfgo2d1G5wEnolfF3+IX2WoVw/QzOwqTyu+ylTLZDGzmsTQUnZ1gKpAGedceXMA== + domutils@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" @@ -5661,7 +6081,7 @@ dotenv@^10.0.0: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81" integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== -duplexer@^0.1.1, duplexer@^0.1.2: +duplexer@^0.1.1, duplexer@^0.1.2, duplexer@~0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== @@ -5706,10 +6126,10 @@ ejs@^3.1.6: dependencies: jake "^10.8.5" -electron-to-chromium@^1.4.172: - version "1.4.185" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.185.tgz#3432d7944f1c5fe20664bb45d9cced2151405ce2" - integrity sha512-9kV/isoOGpKkBt04yYNaSWIBn3187Q5VZRtoReq8oz5NY/A4XmU6cAoqgQlDp7kKJCZMRjWZ8nsQyxfpFHvfyw== +electron-to-chromium@^1.4.202: + version "1.4.227" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.227.tgz#28e46e2a701fed3188db3ca7bf0a3a475e484046" + integrity sha512-I9VVajA3oswIJOUFg2PSBqrHLF5Y+ahIfjOV9+v6uYyBqFZutmPxA6fxocDUUmgwYevRWFu1VjLyVG3w45qa/g== elliptic@^6.5.3: version "6.5.4" @@ -5780,7 +6200,7 @@ enhanced-resolve@^4.1.1, enhanced-resolve@^4.5.0: memory-fs "^0.5.0" tapable "^1.0.0" -enhanced-resolve@^5.9.3: +enhanced-resolve@^5.10.0: version "5.10.0" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz#0dc579c3bb2a1032e357ac45b8f3a6f3ad4fb1e6" integrity sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ== @@ -5788,6 +6208,13 @@ enhanced-resolve@^5.9.3: graceful-fs "^4.2.4" tapable "^2.2.0" +enquirer@^2.3.6: + version "2.3.6" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" + integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== + dependencies: + ansi-colors "^4.1.1" + entities@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" @@ -5870,14 +6297,19 @@ es-to-primitive@^1.2.1: is-symbol "^1.0.2" es5-ext@^0.10.35, es5-ext@^0.10.50: - version "0.10.61" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.61.tgz#311de37949ef86b6b0dcea894d1ffedb909d3269" - integrity sha512-yFhIqQAzu2Ca2I4SE2Au3rxVfmohU9Y7wqGR+s7+H7krk26NXhIRAZDgqd6xqjCEFUomDEA3/Bo/7fKmIkW1kA== + version "0.10.62" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.62.tgz#5e6adc19a6da524bf3d1e02bbc8960e5eb49a9a5" + integrity sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA== dependencies: es6-iterator "^2.0.3" es6-symbol "^3.1.3" next-tick "^1.1.0" +es6-error@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" + integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== + es6-iterator@2.0.3, es6-iterator@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" @@ -5994,12 +6426,18 @@ eslint-import-resolver-node@^0.3.6: resolve "^1.20.0" eslint-module-utils@^2.7.3: - version "2.7.3" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz#ad7e3a10552fdd0642e1e55292781bd6e34876ee" - integrity sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ== + version "2.7.4" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz#4f3e41116aaf13a20792261e61d3a2e7e0583974" + integrity sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA== dependencies: debug "^3.2.7" - find-up "^2.1.0" + +eslint-plugin-cypress@^2.12.1: + version "2.12.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-cypress/-/eslint-plugin-cypress-2.12.1.tgz#9aeee700708ca8c058e00cdafe215199918c2632" + integrity sha512-c2W/uPADl5kospNDihgiLc7n87t5XhUbFDoTl6CfVkmG+kDAb5Ux10V9PoLPu9N+r7znpc+iQlcmAqT1A/89HA== + dependencies: + globals "^11.12.0" eslint-plugin-flowtype@^8.0.3: version "8.0.3" @@ -6036,20 +6474,20 @@ eslint-plugin-jest@^25.3.0: "@typescript-eslint/experimental-utils" "^5.0.0" eslint-plugin-jsx-a11y@^6.2.3, eslint-plugin-jsx-a11y@^6.5.1: - version "6.6.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.6.0.tgz#2c5ac12e013eb98337b9aa261c3b355275cc6415" - integrity sha512-kTeLuIzpNhXL2CwLlc8AHI0aFRwWHcg483yepO9VQiHzM9bZwJdzTkzBszbuPrbgGmq2rlX/FaT2fJQsjUSHsw== + version "6.6.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.6.1.tgz#93736fc91b83fdc38cc8d115deedfc3091aef1ff" + integrity sha512-sXgFVNHiWffBq23uiS/JaP6eVR622DqwB4yTzKvGZGcPq6/yZ3WmOZfuBks/vHWo9GaFOqC2ZK4i6+C35knx7Q== dependencies: - "@babel/runtime" "^7.18.3" + "@babel/runtime" "^7.18.9" aria-query "^4.2.2" array-includes "^3.1.5" ast-types-flow "^0.0.7" - axe-core "^4.4.2" + axe-core "^4.4.3" axobject-query "^2.2.0" damerau-levenshtein "^1.0.8" emoji-regex "^9.2.2" has "^1.0.3" - jsx-ast-utils "^3.3.1" + jsx-ast-utils "^3.3.2" language-tags "^1.0.5" minimatch "^3.1.2" semver "^6.3.0" @@ -6092,9 +6530,9 @@ eslint-plugin-react@^7.27.1: string.prototype.matchall "^4.0.7" eslint-plugin-testing-library@^5.0.1: - version "5.5.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.5.1.tgz#6fe602f9082a421b471bbae8aed692e26fe981b3" - integrity sha512-plLEkkbAKBjPxsLj7x4jNapcHAg2ernkQlKKrN2I8NrQwPISZHyCUNvg5Hv3EDqOQReToQb5bnqXYbkijJPE/g== + version "5.6.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.6.0.tgz#91e810ecb838f86decc9b5202876c87e42d73ea7" + integrity sha512-y63TRzPhGCMNsnUwMGJU1MFWc/3GvYw+nzobp9QiyNTTKsgAt5RKAOT1I34+XqVBpX1lC8bScoOjCkP7iRv0Mw== dependencies: "@typescript-eslint/utils" "^5.13.0" @@ -6164,12 +6602,13 @@ eslint-webpack-plugin@^3.1.1: schema-utils "^4.0.0" eslint@^8.18.0, eslint@^8.3.0: - version "8.19.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.19.0.tgz#7342a3cbc4fbc5c106a1eefe0fd0b50b6b1a7d28" - integrity sha512-SXOPj3x9VKvPe81TjjUJCYlV4oJjQw68Uek+AM0X4p+33dj2HY5bpTZOgnQHcG2eAm1mtCU9uNMnJi7exU/kYw== + version "8.22.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.22.0.tgz#78fcb044196dfa7eef30a9d65944f6f980402c48" + integrity sha512-ci4t0sz6vSRKdmkOGmprBo6fmI4PrphDFMy5JEq/fNS0gQkJM3rLmrqcp8ipMcdobH3KtUP40KniAE9W19S4wA== dependencies: "@eslint/eslintrc" "^1.3.0" - "@humanwhocodes/config-array" "^0.9.2" + "@humanwhocodes/config-array" "^0.10.4" + "@humanwhocodes/gitignore-to-minimatch" "^1.0.2" ajv "^6.10.0" chalk "^4.0.0" cross-spawn "^7.0.2" @@ -6179,14 +6618,17 @@ eslint@^8.18.0, eslint@^8.3.0: eslint-scope "^7.1.1" eslint-utils "^3.0.0" eslint-visitor-keys "^3.3.0" - espree "^9.3.2" + espree "^9.3.3" esquery "^1.4.0" esutils "^2.0.2" fast-deep-equal "^3.1.3" file-entry-cache "^6.0.1" + find-up "^5.0.0" functional-red-black-tree "^1.0.1" glob-parent "^6.0.1" globals "^13.15.0" + globby "^11.1.0" + grapheme-splitter "^1.0.4" ignore "^5.2.0" import-fresh "^3.0.0" imurmurhash "^0.1.4" @@ -6204,12 +6646,12 @@ eslint@^8.18.0, eslint@^8.3.0: text-table "^0.2.0" v8-compile-cache "^2.0.3" -espree@^9.3.2: - version "9.3.2" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.2.tgz#f58f77bd334731182801ced3380a8cc859091596" - integrity sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA== +espree@^9.3.2, espree@^9.3.3: + version "9.3.3" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.3.tgz#2dd37c4162bb05f433ad3c1a52ddf8a49dc08e9d" + integrity sha512-ORs1Rt/uQTqUKjDdGCyrtYxbazf5umATSf/K4qxjmZHORR6HJk+2s/2Pqe+Kk49HHINC/xNIrGfgh8sZcll0ng== dependencies: - acorn "^8.7.1" + acorn "^8.8.0" acorn-jsx "^5.3.2" eslint-visitor-keys "^3.3.0" @@ -6262,6 +6704,24 @@ etag@~1.8.1: resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== +event-stream@=3.3.4: + version "3.3.4" + resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571" + integrity sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g== + dependencies: + duplexer "~0.1.1" + from "~0" + map-stream "~0.1.0" + pause-stream "0.0.11" + split "0.3" + stream-combiner "~0.0.4" + through "~2.3.1" + +eventemitter2@^6.4.3: + version "6.4.7" + resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-6.4.7.tgz#a7f6c4d7abf28a14c1ef3442f21cb306a054271d" + integrity sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg== + eventemitter3@^3.1.0: version "3.1.2" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7" @@ -6295,6 +6755,36 @@ exec-sh@^0.3.2: resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.6.tgz#ff264f9e325519a60cb5e273692943483cca63bc" integrity sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w== +execa@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" + integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== + dependencies: + cross-spawn "^7.0.0" + get-stream "^5.0.0" + human-signals "^1.1.1" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.0" + onetime "^5.1.0" + signal-exit "^3.0.2" + strip-final-newline "^2.0.0" + +execa@5.1.1, execa@^5.0.0, execa@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + execa@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" @@ -6339,21 +6829,6 @@ execa@^3.2.0: signal-exit "^3.0.2" strip-final-newline "^2.0.0" -execa@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.0" - human-signals "^2.1.0" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.1" - onetime "^5.1.2" - signal-exit "^3.0.3" - strip-final-newline "^2.0.0" - execa@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/execa/-/execa-6.1.0.tgz#cea16dee211ff011246556388effa0818394fb20" @@ -6369,6 +6844,13 @@ execa@^6.1.0: signal-exit "^3.0.7" strip-final-newline "^3.0.0" +executable@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/executable/-/executable-4.1.1.tgz#41532bff361d3e57af4d763b70582db18f5d133c" + integrity sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg== + dependencies: + pify "^2.2.0" + exit@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" @@ -6416,6 +6898,17 @@ expect@^27.5.1: jest-matcher-utils "^27.5.1" jest-message-util "^27.5.1" +expect@^28.0.0: + version "28.1.3" + resolved "https://registry.yarnpkg.com/expect/-/expect-28.1.3.tgz#90a7c1a124f1824133dd4533cce2d2bdcb6603ec" + integrity sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g== + dependencies: + "@jest/expect-utils" "^28.1.3" + jest-get-type "^28.0.2" + jest-matcher-utils "^28.1.3" + jest-message-util "^28.1.3" + jest-util "^28.1.3" + express@^4.16.3, express@^4.17.1, express@^4.17.3: version "4.18.1" resolved "https://registry.yarnpkg.com/express/-/express-4.18.1.tgz#7797de8b9c72c857b9cd0e14a5eea80666267caf" @@ -6494,6 +6987,17 @@ extglob@^2.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" +extract-zip@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" + integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== + dependencies: + debug "^4.1.1" + get-stream "^5.1.0" + yauzl "^2.10.0" + optionalDependencies: + "@types/yauzl" "^2.9.1" + extsprintf@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" @@ -6504,6 +7008,11 @@ extsprintf@^1.2.0: resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== +fast-copy@^2.1.0, fast-copy@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/fast-copy/-/fast-copy-2.1.3.tgz#bf6e05ac3cb7a9d66fbf12c51dd4440e9ddd4afb" + integrity sha512-LDzYKNTHhD+XOp8wGMuCkY4eTxFZOOycmpwLBiuF3r3OjOmZnURRD8t2dUAbmKuXGbo/MGggwbSjcBdp8QT0+g== + fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" @@ -6514,7 +7023,7 @@ fast-diff@^1.1.2: resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== -fast-glob@^3.2.11, fast-glob@^3.2.9: +fast-glob@^3.1.1, fast-glob@^3.2.11, fast-glob@^3.2.9: version "3.2.11" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== @@ -6535,6 +7044,13 @@ fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== +fast-url-parser@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/fast-url-parser/-/fast-url-parser-1.1.3.tgz#f4af3ea9f34d8a271cf58ad2b3759f431f0b318d" + integrity sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ== + dependencies: + punycode "^1.3.2" + fastparse@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.2.tgz#91728c5a5942eced8531283c79441ee4122c35a9" @@ -6561,11 +7077,25 @@ fb-watchman@^2.0.0: dependencies: bser "2.1.1" +fd-slicer@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" + integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g== + dependencies: + pend "~1.2.0" + figgy-pudding@^3.5.1: version "3.5.2" resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw== +figures@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== + dependencies: + escape-string-regexp "^1.0.5" + file-entry-cache@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" @@ -6650,7 +7180,7 @@ find-cache-dir@^2.1.0: make-dir "^2.0.0" pkg-dir "^3.0.0" -find-cache-dir@^3.3.1: +find-cache-dir@^3.2.0, find-cache-dir@^3.3.1: version "3.3.2" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== @@ -6664,13 +7194,6 @@ 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: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - integrity sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ== - dependencies: - locate-path "^2.0.0" - find-up@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" @@ -6713,9 +7236,9 @@ flat-cache@^3.0.4: rimraf "^3.0.2" flatted@^3.1.0: - version "3.2.6" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.6.tgz#022e9218c637f9f3fc9c35ab9c9193f05add60b2" - integrity sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ== + version "3.2.7" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" + integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== flush-write-stream@^1.0.0: version "1.1.1" @@ -6725,7 +7248,7 @@ flush-write-stream@^1.0.0: inherits "^2.0.3" readable-stream "^2.3.6" -follow-redirects@^1.0.0, follow-redirects@^1.14.8, follow-redirects@^1.14.9: +follow-redirects@^1.0.0, follow-redirects@^1.14.0, follow-redirects@^1.14.8, follow-redirects@^1.14.9: version "1.15.1" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.1.tgz#0ca6a452306c9b276e4d3127483e29575e207ad5" integrity sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA== @@ -6742,6 +7265,14 @@ for-in@^1.0.2: resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ== +foreground-child@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-2.0.0.tgz#71b32800c9f15aa8f2f83f4a6bd9bff35d861a53" + integrity sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA== + dependencies: + cross-spawn "^7.0.0" + signal-exit "^3.0.2" + forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" @@ -6823,6 +7354,16 @@ from2@^2.1.0: inherits "^2.0.1" readable-stream "^2.0.0" +from@~0: + version "0.1.7" + resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe" + integrity sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g== + +fromentries@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/fromentries/-/fromentries-1.3.2.tgz#e4bca6808816bf8f93b52750f1127f5a6fd86e3a" + integrity sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg== + fs-extra@^10.0.0: version "10.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" @@ -6832,7 +7373,7 @@ fs-extra@^10.0.0: jsonfile "^6.0.1" universalify "^2.0.0" -fs-extra@^9.0.0, fs-extra@^9.0.1: +fs-extra@^9.0.0, fs-extra@^9.0.1, fs-extra@^9.1.0: version "9.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== @@ -6948,7 +7489,7 @@ get-stream@^4.0.0: dependencies: pump "^3.0.0" -get-stream@^5.0.0: +get-stream@^5.0.0, get-stream@^5.1.0: version "5.2.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== @@ -6973,6 +7514,13 @@ get-value@^2.0.3, get-value@^2.0.6: resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" integrity sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA== +getos@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/getos/-/getos-3.2.1.tgz#0134d1f4e00eb46144c5a9c0ac4dc087cbb27dc5" + integrity sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q== + dependencies: + async "^3.2.0" + getpass@^0.1.1: version "0.1.7" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" @@ -7027,6 +7575,13 @@ glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: once "^1.3.0" path-is-absolute "^1.0.0" +global-dirs@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.0.tgz#70a76fe84ea315ab37b1f5576cbde7d48ef72686" + integrity sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA== + dependencies: + ini "2.0.0" + global-modules@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" @@ -7063,18 +7618,30 @@ global-prefix@^3.0.0: kind-of "^6.0.2" which "^1.3.1" -globals@^11.1.0: +globals@^11.1.0, globals@^11.12.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globals@^13.15.0: - version "13.16.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.16.0.tgz#9be4aca28f311aaeb974ea54978ebbb5e35ce46a" - integrity sha512-A1lrQfpNF+McdPOnnFqY3kSN0AFTy485bTi1bkLk4mVPODIUEcSfhHgRqA+QdXPksrSTTztYXx37NFV+GpGk3Q== + version "13.17.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.17.0.tgz#902eb1e680a41da93945adbdcb5a9f361ba69bd4" + integrity sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw== dependencies: type-fest "^0.20.2" +globby@11.0.4: + version "11.0.4" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5" + integrity sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.1.1" + ignore "^5.1.4" + merge2 "^1.3.0" + slash "^3.0.0" + globby@^11.0.4, globby@^11.1.0: version "11.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" @@ -7103,6 +7670,11 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6 resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== +grapheme-splitter@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" + integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== + growly@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" @@ -7247,11 +7819,24 @@ hash.js@^1.0.0, hash.js@^1.0.3: inherits "^2.0.3" minimalistic-assert "^1.0.1" +hasha@^5.0.0: + version "5.2.2" + resolved "https://registry.yarnpkg.com/hasha/-/hasha-5.2.2.tgz#a48477989b3b327aea3c04f53096d816d97522a1" + integrity sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ== + dependencies: + is-stream "^2.0.0" + type-fest "^0.8.0" + he@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== +highlight.js@^11.6.0: + version "11.6.0" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-11.6.0.tgz#a50e9da05763f1bb0c1322c8f4f755242cff3f5a" + integrity sha512-ig1eqDzJaB0pqEvlPVIpSSyMaO92bH1N2rJpLMN/nX396wTpDA4Eq0uK+7I/2XG17pFaaKE0kjV/XPeGt7Evjw== + history@^5.2.0: version "5.3.0" resolved "https://registry.yarnpkg.com/history/-/history-5.3.0.tgz#1548abaa245ba47992f063a0783db91ef201c73b" @@ -7480,6 +8065,15 @@ http-signature@~1.2.0: jsprim "^1.2.2" sshpk "^1.7.0" +http-signature@~1.3.6: + version "1.3.6" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.3.6.tgz#cb6fbfdf86d1c974f343be94e87f7fc128662cf9" + integrity sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw== + dependencies: + assert-plus "^1.0.0" + jsprim "^2.0.2" + sshpk "^1.14.1" + https-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" @@ -7544,10 +8138,10 @@ icss-utils@^5.0.0, icss-utils@^5.1.0: resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== -idb@^6.1.4: - version "6.1.5" - resolved "https://registry.yarnpkg.com/idb/-/idb-6.1.5.tgz#dbc53e7adf1ac7c59f9b2bf56e00b4ea4fce8c7b" - integrity sha512-IJtugpKkiVXQn5Y+LteyBCNk1N8xpGV3wWZk9EVtZWH8DYkjBn0bX1XnGP9RkyZF0sAcywa6unHqSWKe7q4LGw== +idb@^7.0.1: + version "7.0.2" + resolved "https://registry.yarnpkg.com/idb/-/idb-7.0.2.tgz#7a067e20dd16539938e456814b7d714ba8db3892" + integrity sha512-jjKrT1EnyZewQ/gCBb/eyiYrhGzws2FeY92Yx8qT9S9GeQAmo4JFVIiWRIfKW/6Ob9A+UDAOW9j9jn58fy2HIg== identity-obj-proxy@^3.0.0: version "3.0.0" @@ -7556,7 +8150,7 @@ identity-obj-proxy@^3.0.0: dependencies: harmony-reflect "^1.4.6" -ieee754@^1.1.4: +ieee754@^1.1.13, ieee754@^1.1.4: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== @@ -7643,7 +8237,12 @@ inherits@2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== -ini@^1.3.4, ini@^1.3.5: +ini@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" + integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== + +ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: version "1.3.8" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== @@ -7775,10 +8374,17 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" +is-ci@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.1.tgz#db6ecbed1bd659c43dac0f45661e7674103d1867" + integrity sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ== + dependencies: + ci-info "^3.2.0" + is-core-module@^2.8.1, is-core-module@^2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69" - integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A== + version "2.10.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.10.0.tgz#9012ede0a91c69587e647514e1d5277019e728ed" + integrity sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg== dependencies: has "^1.0.3" @@ -7877,6 +8483,14 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" +is-installed-globally@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520" + integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ== + dependencies: + global-dirs "^3.0.0" + is-path-inside "^3.0.2" + is-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" @@ -7930,6 +8544,11 @@ is-path-inside@^2.1.0: dependencies: path-is-inside "^1.0.2" +is-path-inside@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + is-plain-obj@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" @@ -7942,6 +8561,11 @@ is-plain-object@^2.0.3, is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" +is-port-reachable@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-port-reachable/-/is-port-reachable-4.0.0.tgz#dac044091ef15319c8ab2f34604d8794181f8c2d" + integrity sha512-9UoipoxYmSk6Xy7QFgRv2HDyaysmgSG75TFQs6S+3pDM7ZhKTF/bskZV+0UlABHzKjNVhPjYCLfeZUEg1wXxig== + is-potential-custom-element-name@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" @@ -8006,6 +8630,11 @@ is-typedarray@^1.0.0, is-typedarray@~1.0.0: resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + is-weakref@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" @@ -8057,6 +8686,11 @@ isstream@~0.1.2: resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== +istanbul-lib-coverage@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz#f5944a37c70b550b02a78a5c3b2055b280cec8ec" + integrity sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg== + istanbul-lib-coverage@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz#675f0ab69503fad4b1d849f736baaca803344f49" @@ -8067,6 +8701,13 @@ istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== +istanbul-lib-hook@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz#8f84c9434888cc6b1d0a9d7092a76d239ebf0cc6" + integrity sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ== + dependencies: + append-transform "^2.0.0" + istanbul-lib-instrument@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz#a5f63d91f0bbc0c3e479ef4c5de027335ec6d630" @@ -8101,6 +8742,18 @@ istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: istanbul-lib-coverage "^3.2.0" semver "^6.3.0" +istanbul-lib-processinfo@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz#366d454cd0dcb7eb6e0e419378e60072c8626169" + integrity sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg== + dependencies: + archy "^1.0.0" + cross-spawn "^7.0.3" + istanbul-lib-coverage "^3.2.0" + p-map "^3.0.0" + rimraf "^3.0.0" + uuid "^8.3.2" + istanbul-lib-report@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" @@ -8120,9 +8773,9 @@ istanbul-lib-source-maps@^4.0.0: source-map "^0.6.1" istanbul-reports@^3.0.2, istanbul-reports@^3.1.3: - version "3.1.4" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.4.tgz#1b6f068ecbc6c331040aab5741991273e609e40c" - integrity sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw== + version "3.1.5" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz#cc9a6ab25cb25659810e4785ed9d9fb742578bae" + integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== dependencies: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" @@ -8293,15 +8946,15 @@ jest-diff@^27.5.1: jest-get-type "^27.5.1" pretty-format "^27.5.1" -jest-diff@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-28.1.1.tgz#1a3eedfd81ae79810931c63a1d0f201b9120106c" - integrity sha512-/MUUxeR2fHbqHoMMiffe/Afm+U8U4olFRJ0hiVG2lZatPJcnGxx292ustVu7bULhjV65IYMxRdploAKLbcrsyg== +jest-diff@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-28.1.3.tgz#948a192d86f4e7a64c5264ad4da4877133d8792f" + integrity sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw== dependencies: chalk "^4.0.0" diff-sequences "^28.1.1" jest-get-type "^28.0.2" - pretty-format "^28.1.1" + pretty-format "^28.1.3" jest-docblock@^25.3.0: version "25.3.0" @@ -8544,15 +9197,15 @@ jest-matcher-utils@^27.0.0, jest-matcher-utils@^27.5.1: jest-get-type "^27.5.1" pretty-format "^27.5.1" -jest-matcher-utils@^28.0.0: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-28.1.1.tgz#a7c4653c2b782ec96796eb3088060720f1e29304" - integrity sha512-NPJPRWrbmR2nAJ+1nmnfcKKzSwgfaciCCrYZzVnNoxVoyusYWIjkBMNvu0RHJe7dNj4hH3uZOPZsQA+xAYWqsw== +jest-matcher-utils@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz#5a77f1c129dd5ba3b4d7fc20728806c78893146e" + integrity sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw== dependencies: chalk "^4.0.0" - jest-diff "^28.1.1" + jest-diff "^28.1.3" jest-get-type "^28.0.2" - pretty-format "^28.1.1" + pretty-format "^28.1.3" jest-message-util@^24.9.0: version "24.9.0" @@ -8597,18 +9250,18 @@ jest-message-util@^27.5.1: slash "^3.0.0" stack-utils "^2.0.3" -jest-message-util@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-28.1.1.tgz#60aa0b475cfc08c8a9363ed2fb9108514dd9ab89" - integrity sha512-xoDOOT66fLfmTRiqkoLIU7v42mal/SqwDKvfmfiWAdJMSJiU+ozgluO7KbvoAgiwIrrGZsV7viETjc8GNrA/IQ== +jest-message-util@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-28.1.3.tgz#232def7f2e333f1eecc90649b5b94b0055e7c43d" + integrity sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g== dependencies: "@babel/code-frame" "^7.12.13" - "@jest/types" "^28.1.1" + "@jest/types" "^28.1.3" "@types/stack-utils" "^2.0.0" chalk "^4.0.0" graceful-fs "^4.2.9" micromatch "^4.0.4" - pretty-format "^28.1.1" + pretty-format "^28.1.3" slash "^3.0.0" stack-utils "^2.0.3" @@ -8930,12 +9583,12 @@ jest-util@^27.5.1: graceful-fs "^4.2.9" picomatch "^2.2.3" -jest-util@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-28.1.1.tgz#ff39e436a1aca397c0ab998db5a51ae2b7080d05" - integrity sha512-FktOu7ca1DZSyhPAxgxB6hfh2+9zMoJ7aEQA759Z6p45NuO8mWcqujH+UdHlCm/V6JTWwDztM2ITCzU1ijJAfw== +jest-util@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-28.1.3.tgz#f4f932aa0074f0679943220ff9cbba7e497028b0" + integrity sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ== dependencies: - "@jest/types" "^28.1.1" + "@jest/types" "^28.1.3" "@types/node" "*" chalk "^4.0.0" ci-info "^3.2.0" @@ -9005,17 +9658,17 @@ jest-watcher@^27.5.1: string-length "^4.0.1" jest-watcher@^28.0.0: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-28.1.1.tgz#533597fb3bfefd52b5cd115cd916cffd237fb60c" - integrity sha512-RQIpeZ8EIJMxbQrXpJQYIIlubBnB9imEHsxxE41f54ZwcqWLysL/A0ZcdMirf+XsMn3xfphVQVV4EW0/p7i7Ug== + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-28.1.3.tgz#c6023a59ba2255e3b4c57179fc94164b3e73abd4" + integrity sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g== dependencies: - "@jest/test-result" "^28.1.1" - "@jest/types" "^28.1.1" + "@jest/test-result" "^28.1.3" + "@jest/types" "^28.1.3" "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" emittery "^0.10.2" - jest-util "^28.1.1" + jest-util "^28.1.3" string-length "^4.0.1" jest-worker@^24.9.0: @@ -9053,9 +9706,9 @@ jest-worker@^27.0.2, jest-worker@^27.4.5, jest-worker@^27.5.1: supports-color "^8.0.0" jest-worker@^28.0.2: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-28.1.1.tgz#3480c73247171dfd01eda77200f0063ab6a3bf28" - integrity sha512-Au7slXB08C6h+xbJPp7VIb6U0XX5Kc9uel/WFc6/rcTzGiaVCBRngBExSYuXSLFPULPSYU3cJ3ybS988lNFQhQ== + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-28.1.3.tgz#7e3c4ce3fa23d1bb6accb169e7f396f98ed4bb98" + integrity sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g== dependencies: "@types/node" "*" merge-stream "^2.0.0" @@ -9079,6 +9732,17 @@ jest@^27.4.3: import-local "^3.0.2" jest-cli "^27.5.1" +joi@^17.4.0: + version "17.6.0" + resolved "https://registry.yarnpkg.com/joi/-/joi-17.6.0.tgz#0bb54f2f006c09a96e75ce687957bd04290054b2" + integrity sha512-OX5dG6DTbcr/kbMFj0KGYxuew69HPcAE3K/sZpEV2nP6e/j/C0HV+HNiBPCASxdx5T7DMoa0s8UeHWMnb6n2zw== + dependencies: + "@hapi/hoek" "^9.0.0" + "@hapi/topo" "^5.0.0" + "@sideway/address" "^4.1.3" + "@sideway/formula" "^3.0.0" + "@sideway/pinpoint" "^2.0.0" + js-base64@^2.1.9: version "2.6.4" resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.6.4.tgz#f4e686c5de1ea1f867dbcad3d46d969428df98c4" @@ -9089,7 +9753,7 @@ js-base64@^2.1.9: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@^3.13.1: +js-yaml@3.14.1, js-yaml@^3.13.1: version "3.14.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== @@ -9222,7 +9886,7 @@ json-stable-stringify-without-jsonify@^1.0.1: resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== -json-stringify-safe@~5.0.1: +json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== @@ -9254,9 +9918,9 @@ jsonfile@^6.0.1: graceful-fs "^4.1.6" jsonpointer@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-5.0.0.tgz#f802669a524ec4805fa7389eadbc9921d5dc8072" - integrity sha512-PNYZIdMjVIvVgDSYKTT63Y+KZ6IZvGRNNWcxwD+GNnUz1MKPfv30J8ueCjdwcN0nDx2SlshgyB7Oy0epAzVRRg== + version "5.0.1" + resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-5.0.1.tgz#2110e0af0900fd37467b5907ecd13a7884a1b559" + integrity sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ== jsprim@^1.2.2: version "1.4.2" @@ -9268,13 +9932,23 @@ jsprim@^1.2.2: json-schema "0.4.0" verror "1.10.0" -"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.1: - version "3.3.2" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.2.tgz#afe5efe4332cd3515c065072bd4d6b0aa22152bd" - integrity sha512-4ZCADZHRkno244xlNnn4AOG6sRQ7iBZ5BbgZ4vW4y5IZw7cVUD1PPeblm1xx/nfmMxPdt/LHsXZW8z/j58+l9Q== +jsprim@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-2.0.2.tgz#77ca23dbcd4135cd364800d22ff82c2185803d4d" + integrity sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ== + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.4.0" + verror "1.10.0" + +"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.2: + version "3.3.3" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz#76b3e6e6cece5c69d49a5792c3d01bd1a0cdc7ea" + integrity sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw== dependencies: array-includes "^3.1.5" - object.assign "^4.1.2" + object.assign "^4.1.3" killable@^1.0.1: version "1.0.1" @@ -9327,6 +10001,11 @@ language-tags@^1.0.5: dependencies: language-subtag-registry "~0.3.2" +lazy-ass@1.6.0, lazy-ass@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/lazy-ass/-/lazy-ass-1.6.0.tgz#7999655e8646c17f089fdd187d150d3324d54513" + integrity sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw== + leven@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" @@ -9353,7 +10032,7 @@ lilconfig@2.0.5: resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.5.tgz#19e57fd06ccc3848fd1891655b5a447092225b25" integrity sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg== -lilconfig@^2.0.3, lilconfig@^2.0.5: +lilconfig@^2.0.3, lilconfig@^2.0.5, lilconfig@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.6.tgz#32a384558bd58af3d4c6e077dd1ad1d397bc69d4" integrity sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg== @@ -9382,6 +10061,20 @@ lint-staged@^13.0.3: string-argv "^0.3.1" yaml "^2.1.1" +listr2@^3.8.3: + version "3.14.0" + resolved "https://registry.yarnpkg.com/listr2/-/listr2-3.14.0.tgz#23101cc62e1375fd5836b248276d1d2b51fdbe9e" + integrity sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g== + dependencies: + cli-truncate "^2.1.0" + colorette "^2.0.16" + log-update "^4.0.0" + p-map "^4.0.0" + rfdc "^1.3.0" + rxjs "^7.5.1" + through "^2.3.8" + wrap-ansi "^7.0.0" + listr2@^4.0.5: version "4.0.5" resolved "https://registry.yarnpkg.com/listr2/-/listr2-4.0.5.tgz#9dcc50221583e8b4c71c43f9c7dfd0ef546b75d5" @@ -9448,14 +10141,6 @@ loader-utils@^3.2.0: resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-3.2.0.tgz#bcecc51a7898bee7473d4bc6b845b23af8304d4f" integrity sha512-HVl9ZqccQihZ7JM85dco1MvO9G+ONvxoGa9rkhzFsneGLKSUg1gJf9bWzhRhcvm2qChhWpebQhP44qxjKIUCaQ== -locate-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - integrity sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA== - dependencies: - p-locate "^2.0.0" - path-exists "^3.0.0" - locate-path@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" @@ -9510,6 +10195,11 @@ lodash.debounce@^4.0.8: resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== +lodash.flattendeep@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" + integrity sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ== + lodash.flow@^3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/lodash.flow/-/lodash.flow-3.5.0.tgz#87bf40292b8cf83e4e8ce1a3ae4209e20071675a" @@ -9540,6 +10230,11 @@ lodash.isplainobject@^4.0.6: resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== +lodash.isstring@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" + integrity sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw== + lodash.keys@^3.0.0: version "3.1.2" resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" @@ -9559,6 +10254,11 @@ lodash.merge@^4.6.2: resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== +lodash.once@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" + integrity sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg== + lodash.sortby@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" @@ -9574,6 +10274,14 @@ lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17 resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== +log-symbols@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + log-update@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1" @@ -9663,6 +10371,11 @@ map-cache@^0.2.2: resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" integrity sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg== +map-stream@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" + integrity sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g== + map-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" @@ -9670,6 +10383,11 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" +marked@4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/marked/-/marked-4.0.3.tgz#986760a428d8fd666251ec578429bf9a239a34bc" + integrity sha512-vSwKKtw+lCA0uFK/02JT4tBfNxEREpoTg21NoXqcmX0ySBIEyLMYWmt8WPsM61QNFaDBZkggupyNXLsV7uPuRg== + md5.js@^1.3.4: version "1.3.5" resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" @@ -9782,6 +10500,18 @@ mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== +mime-db@~1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" + integrity sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ== + +mime-types@2.1.18: + version "2.1.18" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" + integrity sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ== + dependencies: + mime-db "~1.33.0" + mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34: version "2.1.35" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" @@ -9852,7 +10582,7 @@ minimatch@^5.0.1: dependencies: brace-expansion "^2.0.1" -minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.6: +minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: version "1.2.6" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== @@ -9881,7 +10611,7 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5, mkdirp@~0.5.1: +mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.6, mkdirp@~0.5.1: version "0.5.6" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== @@ -9889,9 +10619,9 @@ mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5, mkdirp@~0.5.1: minimist "^1.2.6" moment-timezone@^0.5.34: - version "0.5.34" - resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.34.tgz#a75938f7476b88f155d3504a9343f7519d9a405c" - integrity sha512-3zAEHh2hKUs3EXLESx/wsgw6IQdusOT8Bxm3D9UrHPQR7zlMmzwybC8zHEM1tQ4LJwP7fcxrWr8tuBg05fFCbg== + version "0.5.35" + resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.35.tgz#6fa2631bdbe8ff04f6b8753f7199516be6dc9839" + integrity sha512-cY/pBOEXepQvlgli06ttCTKcIf8cD1nmNwOKQQAdHBqYApQSpAqotBMX0RJZNgMp6i0PlZuf1mFtnlyEkwyvFw== dependencies: moment ">= 2.9.0" @@ -10079,7 +10809,14 @@ node-notifier@^6.0.0: shellwords "^0.1.1" which "^1.3.1" -node-releases@^2.0.5: +node-preload@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/node-preload/-/node-preload-0.2.1.tgz#c03043bb327f417a18fee7ab7ee57b408a144301" + integrity sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ== + dependencies: + process-on-spawn "^1.0.0" + +node-releases@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503" integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg== @@ -10168,6 +10905,39 @@ nwsapi@^2.2.0: resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.1.tgz#10a9f268fbf4c461249ebcfe38e359aa36e2577c" integrity sha512-JYOWTeFoS0Z93587vRJgASD5Ut11fYl5NyihP3KrYBvMe1FRRs6RN7m20SA/16GM4P6hTnZjT+UmDOt38UeXNg== +nyc@15.1.0, nyc@^15.1.0: + version "15.1.0" + resolved "https://registry.yarnpkg.com/nyc/-/nyc-15.1.0.tgz#1335dae12ddc87b6e249d5a1994ca4bdaea75f02" + integrity sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A== + dependencies: + "@istanbuljs/load-nyc-config" "^1.0.0" + "@istanbuljs/schema" "^0.1.2" + caching-transform "^4.0.0" + convert-source-map "^1.7.0" + decamelize "^1.2.0" + find-cache-dir "^3.2.0" + find-up "^4.1.0" + foreground-child "^2.0.0" + get-package-type "^0.1.0" + glob "^7.1.6" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-hook "^3.0.0" + istanbul-lib-instrument "^4.0.0" + istanbul-lib-processinfo "^2.0.2" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.0.2" + make-dir "^3.0.0" + node-preload "^0.2.1" + p-map "^3.0.0" + process-on-spawn "^1.0.0" + resolve-from "^5.0.0" + rimraf "^3.0.0" + signal-exit "^3.0.2" + spawn-wrap "^2.0.0" + test-exclude "^6.0.0" + yargs "^15.0.2" + oauth-sign@~0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" @@ -10217,14 +10987,14 @@ object-visit@^1.0.0: dependencies: isobject "^3.0.0" -object.assign@^4.1.0, object.assign@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" - integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== +object.assign@^4.1.0, object.assign@^4.1.2, object.assign@^4.1.3: + version "4.1.4" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" + integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - has-symbols "^1.0.1" + call-bind "^1.0.2" + define-properties "^1.1.4" + has-symbols "^1.0.3" object-keys "^1.1.1" object.entries@^1.1.5: @@ -10367,6 +11137,11 @@ os-browserify@^0.3.0: resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" integrity sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A== +ospath@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/ospath/-/ospath-1.2.2.tgz#1276639774a3f8ef2572f7fe4280e0ea4550c07b" + integrity sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA== + p-each-series@^2.1.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-2.2.0.tgz#105ab0357ce72b202a8a8b94933672657b5e2a9a" @@ -10382,13 +11157,6 @@ p-finally@^2.0.0: resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-2.0.1.tgz#bd6fcaa9c559a096b680806f4d657b3f0f240561" integrity sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw== -p-limit@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" - integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== - dependencies: - p-try "^1.0.0" - p-limit@^2.0.0, p-limit@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" @@ -10403,13 +11171,6 @@ p-limit@^3.0.2: dependencies: yocto-queue "^0.1.0" -p-locate@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - integrity sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg== - dependencies: - p-limit "^1.1.0" - p-locate@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" @@ -10436,6 +11197,13 @@ p-map@^2.0.0: resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== +p-map@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" + integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ== + dependencies: + aggregate-error "^3.0.0" + p-map@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" @@ -10458,16 +11226,26 @@ p-retry@^4.5.0: "@types/retry" "0.12.0" retry "^0.13.1" -p-try@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" - integrity sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww== +p-throttle@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/p-throttle/-/p-throttle-4.1.1.tgz#80b1fbd358af40a8bfa1667f9dc8b72b714ad692" + integrity sha512-TuU8Ato+pRTPJoDzYD4s7ocJYcNSEZRvlxoq3hcPI2kZDZ49IQ1Wkj7/gDJc3X7XiEAAvRGtDzdXJI0tC3IL1g== p-try@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== +package-hash@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/package-hash/-/package-hash-4.0.0.tgz#3537f654665ec3cc38827387fc904c163c54f506" + integrity sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ== + dependencies: + graceful-fs "^4.1.15" + hasha "^5.0.0" + lodash.flattendeep "^4.4.0" + release-zalgo "^1.0.0" + pako@~1.0.5: version "1.0.11" resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" @@ -10584,7 +11362,7 @@ path-is-absolute@^1.0.0: resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== -path-is-inside@^1.0.2: +path-is-inside@1.0.2, path-is-inside@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" integrity sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w== @@ -10614,6 +11392,11 @@ path-to-regexp@0.1.7: resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== +path-to-regexp@2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-2.2.1.tgz#90b617025a16381a879bc82a38d4e8bdeb2bcf45" + integrity sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ== + path-type@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" @@ -10626,6 +11409,13 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +pause-stream@0.0.11: + version "0.0.11" + resolved "https://registry.yarnpkg.com/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" + integrity sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A== + dependencies: + through "~2.3" + pbkdf2@^3.0.3: version "3.1.2" resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" @@ -10637,6 +11427,11 @@ pbkdf2@^3.0.3: safe-buffer "^5.0.1" sha.js "^2.4.8" +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== + performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" @@ -10662,7 +11457,7 @@ pidtree@^0.6.0: resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.6.0.tgz#90ad7b6d42d5841e69e0a2419ef38f8883aa057c" integrity sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g== -pify@^2.0.0, pify@^2.3.0: +pify@^2.0.0, pify@^2.2.0, pify@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== @@ -10721,20 +11516,20 @@ pn@^1.1.0: integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== portfinder@^1.0.26: - version "1.0.28" - resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.28.tgz#67c4622852bd5374dd1dd900f779f53462fac778" - integrity sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA== + version "1.0.32" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.32.tgz#2fe1b9e58389712429dc2bea5beb2146146c7f81" + integrity sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg== dependencies: - async "^2.6.2" - debug "^3.1.1" - mkdirp "^0.5.5" + async "^2.6.4" + debug "^3.2.7" + mkdirp "^0.5.6" posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" integrity sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg== -postcss-attribute-case-insensitive@^5.0.1: +postcss-attribute-case-insensitive@^5.0.2: version "5.0.2" resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz#03d761b24afc04c09e757e92ff53716ae8ea2741" integrity sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ== @@ -10761,7 +11556,7 @@ postcss-clamp@^4.1.0: dependencies: postcss-value-parser "^4.2.0" -postcss-color-functional-notation@^4.2.3: +postcss-color-functional-notation@^4.2.4: version "4.2.4" resolved "https://registry.yarnpkg.com/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz#21a909e8d7454d3612d1659e471ce4696f28caec" integrity sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg== @@ -10775,7 +11570,7 @@ postcss-color-hex-alpha@^8.0.4: dependencies: postcss-value-parser "^4.2.0" -postcss-color-rebeccapurple@^7.1.0: +postcss-color-rebeccapurple@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz#63fdab91d878ebc4dd4b7c02619a0c3d6a56ced0" integrity sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg== @@ -10821,7 +11616,7 @@ postcss-custom-selectors@^6.0.3: dependencies: postcss-selector-parser "^6.0.4" -postcss-dir-pseudo-class@^6.0.4: +postcss-dir-pseudo-class@^6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz#2bf31de5de76added44e0a25ecf60ae9f7c7c26c" integrity sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA== @@ -10848,7 +11643,7 @@ postcss-discard-overridden@^5.1.0: resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz#7e8c5b53325747e9d90131bb88635282fb4a276e" integrity sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw== -postcss-double-position-gradients@^3.1.1: +postcss-double-position-gradients@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz#b96318fdb477be95997e86edd29c6e3557a49b91" integrity sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ== @@ -10887,12 +11682,12 @@ postcss-font-variant@^5.0.0: resolved "https://registry.yarnpkg.com/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz#efd59b4b7ea8bb06127f2d031bfbb7f24d32fa66" integrity sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA== -postcss-gap-properties@^3.0.3: - version "3.0.4" - resolved "https://registry.yarnpkg.com/postcss-gap-properties/-/postcss-gap-properties-3.0.4.tgz#8527d00284ef83725e41a53a718f9bed8e2b2beb" - integrity sha512-PaEM4AUQY7uomyuVVXsIntdo4eT8VkBMrSinQxvXuMcJ1z3RHlFw4Kqef2X+rRVz3WHaYCa0EEtwousBT6vcIA== +postcss-gap-properties@^3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz#f7e3cddcf73ee19e94ccf7cb77773f9560aa2fff" + integrity sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg== -postcss-image-set-function@^4.0.6: +postcss-image-set-function@^4.0.7: version "4.0.7" resolved "https://registry.yarnpkg.com/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz#08353bd756f1cbfb3b6e93182c7829879114481f" integrity sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw== @@ -10920,7 +11715,7 @@ postcss-js@^4.0.0: dependencies: camelcase-css "^2.0.1" -postcss-lab-function@^4.2.0: +postcss-lab-function@^4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz#6fe4c015102ff7cd27d1bd5385582f67ebdbdc98" integrity sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w== @@ -11142,7 +11937,7 @@ postcss-nested@5.0.6: dependencies: postcss-selector-parser "^6.0.6" -postcss-nesting@^10.1.9: +postcss-nesting@^10.1.10: version "10.1.10" resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-10.1.10.tgz#9c396df3d8232cbedfa95baaac6b765b8fd2a817" integrity sha512-lqd7LXCq0gWc0wKXtoKDru5wEUNjm3OryLVNRZ8OnW8km6fSNUuFrjEhU3nklxXE2jvd4qrox566acgh+xQt8w== @@ -11235,7 +12030,7 @@ postcss-ordered-values@^5.1.3: cssnano-utils "^3.1.0" postcss-value-parser "^4.2.0" -postcss-overflow-shorthand@^3.0.3: +postcss-overflow-shorthand@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz#7ed6486fec44b76f0eab15aa4866cda5d55d893e" integrity sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A== @@ -11247,7 +12042,7 @@ postcss-page-break@^3.0.4: resolved "https://registry.yarnpkg.com/postcss-page-break/-/postcss-page-break-3.0.4.tgz#7fbf741c233621622b68d435babfb70dd8c1ee5f" integrity sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ== -postcss-place@^7.0.4: +postcss-place@^7.0.5: version "7.0.5" resolved "https://registry.yarnpkg.com/postcss-place/-/postcss-place-7.0.5.tgz#95dbf85fd9656a3a6e60e832b5809914236986c4" integrity sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g== @@ -11255,59 +12050,61 @@ postcss-place@^7.0.4: postcss-value-parser "^4.2.0" postcss-preset-env@^7.0.1: - version "7.7.2" - resolved "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-7.7.2.tgz#769f7f21779b4688c9a6082ae1572416cab415cf" - integrity sha512-1q0ih7EDsZmCb/FMDRvosna7Gsbdx8CvYO5hYT120hcp2ZAuOHpSzibujZ4JpIUcAC02PG6b+eftxqjTFh5BNA== - dependencies: - "@csstools/postcss-cascade-layers" "^1.0.4" - "@csstools/postcss-color-function" "^1.1.0" - "@csstools/postcss-font-format-keywords" "^1.0.0" - "@csstools/postcss-hwb-function" "^1.0.1" - "@csstools/postcss-ic-unit" "^1.0.0" - "@csstools/postcss-is-pseudo-class" "^2.0.6" - "@csstools/postcss-normalize-display-values" "^1.0.0" - "@csstools/postcss-oklab-function" "^1.1.0" + version "7.8.0" + resolved "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-7.8.0.tgz#5bd3ad53b2ef02edd41645d1ffee1ff8a49f24e5" + integrity sha512-leqiqLOellpLKfbHkD06E04P6d9ZQ24mat6hu4NSqun7WG0UhspHR5Myiv/510qouCjoo4+YJtNOqg5xHaFnCA== + dependencies: + "@csstools/postcss-cascade-layers" "^1.0.5" + "@csstools/postcss-color-function" "^1.1.1" + "@csstools/postcss-font-format-keywords" "^1.0.1" + "@csstools/postcss-hwb-function" "^1.0.2" + "@csstools/postcss-ic-unit" "^1.0.1" + "@csstools/postcss-is-pseudo-class" "^2.0.7" + "@csstools/postcss-nested-calc" "^1.0.0" + "@csstools/postcss-normalize-display-values" "^1.0.1" + "@csstools/postcss-oklab-function" "^1.1.1" "@csstools/postcss-progressive-custom-properties" "^1.3.0" - "@csstools/postcss-stepped-value-functions" "^1.0.0" - "@csstools/postcss-trigonometric-functions" "^1.0.1" - "@csstools/postcss-unset-value" "^1.0.1" - autoprefixer "^10.4.7" - browserslist "^4.21.0" + "@csstools/postcss-stepped-value-functions" "^1.0.1" + "@csstools/postcss-text-decoration-shorthand" "^1.0.0" + "@csstools/postcss-trigonometric-functions" "^1.0.2" + "@csstools/postcss-unset-value" "^1.0.2" + autoprefixer "^10.4.8" + browserslist "^4.21.3" css-blank-pseudo "^3.0.3" css-has-pseudo "^3.0.4" css-prefers-color-scheme "^6.0.3" - cssdb "^6.6.3" - postcss-attribute-case-insensitive "^5.0.1" + cssdb "^7.0.0" + postcss-attribute-case-insensitive "^5.0.2" postcss-clamp "^4.1.0" - postcss-color-functional-notation "^4.2.3" + postcss-color-functional-notation "^4.2.4" postcss-color-hex-alpha "^8.0.4" - postcss-color-rebeccapurple "^7.1.0" + postcss-color-rebeccapurple "^7.1.1" postcss-custom-media "^8.0.2" postcss-custom-properties "^12.1.8" postcss-custom-selectors "^6.0.3" - postcss-dir-pseudo-class "^6.0.4" - postcss-double-position-gradients "^3.1.1" + postcss-dir-pseudo-class "^6.0.5" + postcss-double-position-gradients "^3.1.2" postcss-env-function "^4.0.6" postcss-focus-visible "^6.0.4" postcss-focus-within "^5.0.4" postcss-font-variant "^5.0.0" - postcss-gap-properties "^3.0.3" - postcss-image-set-function "^4.0.6" + postcss-gap-properties "^3.0.5" + postcss-image-set-function "^4.0.7" postcss-initial "^4.0.1" - postcss-lab-function "^4.2.0" + postcss-lab-function "^4.2.1" postcss-logical "^5.0.4" postcss-media-minmax "^5.0.0" - postcss-nesting "^10.1.9" + postcss-nesting "^10.1.10" postcss-opacity-percentage "^1.1.2" - postcss-overflow-shorthand "^3.0.3" + postcss-overflow-shorthand "^3.0.4" postcss-page-break "^3.0.4" - postcss-place "^7.0.4" - postcss-pseudo-class-any-link "^7.1.5" + postcss-place "^7.0.5" + postcss-pseudo-class-any-link "^7.1.6" postcss-replace-overflow-wrap "^4.0.0" - postcss-selector-not "^6.0.0" + postcss-selector-not "^6.0.1" postcss-value-parser "^4.2.0" -postcss-pseudo-class-any-link@^7.1.5: +postcss-pseudo-class-any-link@^7.1.6: version "7.1.6" resolved "https://registry.yarnpkg.com/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz#2693b221902da772c278def85a4d9a64b6e617ab" integrity sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w== @@ -11341,7 +12138,7 @@ postcss-scss@^3.0.2: dependencies: postcss "^8.2.7" -postcss-selector-not@^6.0.0: +postcss-selector-not@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz#8f0a709bf7d4b45222793fc34409be407537556d" integrity sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ== @@ -11422,9 +12219,9 @@ postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.2, postcss@^7.0.32, postcss@^7.0.3 source-map "^0.6.1" postcss@^8.2.7, postcss@^8.3.5, postcss@^8.4.14, postcss@^8.4.4, postcss@^8.4.7: - version "8.4.14" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.14.tgz#ee9274d5622b4858c1007a74d76e42e56fd21caf" - integrity sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig== + version "8.4.16" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.16.tgz#33a1d675fac39941f5f445db0de4db2b6e01d43c" + integrity sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ== dependencies: nanoid "^3.3.4" picocolors "^1.0.0" @@ -11452,7 +12249,7 @@ prettier@^2.0.4: resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.7.1.tgz#e235806850d057f97bb08368a4f7d899f7760c64" integrity sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g== -pretty-bytes@^5.3.0, pretty-bytes@^5.4.1: +pretty-bytes@^5.3.0, pretty-bytes@^5.4.1, pretty-bytes@^5.6.0: version "5.6.0" resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== @@ -11492,12 +12289,12 @@ pretty-format@^27.0.0, pretty-format@^27.0.2, pretty-format@^27.5.1: ansi-styles "^5.0.0" react-is "^17.0.1" -pretty-format@^28.0.0, pretty-format@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-28.1.1.tgz#f731530394e0f7fcd95aba6b43c50e02d86b95cb" - integrity sha512-wwJbVTGFHeucr5Jw2bQ9P+VYHyLdAqedFLEkdQUVaBF/eiidDwH5OpilINq4mEfhbCjLnirt6HTTDhv1HaTIQw== +pretty-format@^28.0.0, pretty-format@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-28.1.3.tgz#c9fba8cedf99ce50963a11b27d982a9ae90970d5" + integrity sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q== dependencies: - "@jest/schemas" "^28.0.2" + "@jest/schemas" "^28.1.3" ansi-regex "^5.0.1" ansi-styles "^5.0.0" react-is "^18.0.0" @@ -11519,6 +12316,13 @@ process-nextick-args@~2.0.0: resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== +process-on-spawn@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/process-on-spawn/-/process-on-spawn-1.0.0.tgz#95b05a23073d30a17acfdc92a440efd2baefdc93" + integrity sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg== + dependencies: + fromentries "^1.2.0" + process@^0.11.10: version "0.11.10" resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" @@ -11561,11 +12365,23 @@ proxy-addr@~2.0.7: forwarded "0.2.0" ipaddr.js "1.9.1" +proxy-from-env@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.0.0.tgz#33c50398f70ea7eb96d21f7b817630a55791c7ee" + integrity sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A== + prr@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw== +ps-tree@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/ps-tree/-/ps-tree-1.2.0.tgz#5e7425b89508736cdd4f2224d028f7bb3f722ebd" + integrity sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA== + dependencies: + event-stream "=3.3.4" + psl@^1.1.28, psl@^1.1.33: version "1.9.0" resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" @@ -11613,7 +12429,7 @@ punycode@1.3.2: resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" integrity sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw== -punycode@^1.2.4: +punycode@^1.2.4, punycode@^1.3.2: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== @@ -11635,6 +12451,13 @@ qs@6.10.3: dependencies: side-channel "^1.0.4" +qs@^6.9.4: + version "6.11.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" + integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== + dependencies: + side-channel "^1.0.4" + qs@~6.5.2: version "6.5.3" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" @@ -11687,6 +12510,11 @@ randomfill@^1.0.3: randombytes "^2.0.5" safe-buffer "^5.1.0" +range-parser@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" + integrity sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A== + range-parser@^1.2.1, range-parser@~1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" @@ -11710,6 +12538,16 @@ rc-checkbox@^2.3.2: "@babel/runtime" "^7.10.1" classnames "^2.2.1" +rc@^1.0.1, rc@^1.1.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + react-apexcharts@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/react-apexcharts/-/react-apexcharts-1.4.0.tgz#e3619104b34750da67a2ca80289dc87085c2aa27" @@ -11816,9 +12654,9 @@ react-only-when@^1.0.2: integrity sha512-agE6l3L6bqaVuwNtjihTQ36M+VBfPS63KOzcNL4ZTmlwSxQPvhzIqmBWfiol0/wLYmKxCcBqgXkEJpvj5Kob8Q== react-redux-toastr@^7.6.8: - version "7.6.8" - resolved "https://registry.yarnpkg.com/react-redux-toastr/-/react-redux-toastr-7.6.8.tgz#da6265844497a81191f16b5d1d9b054480aa4b97" - integrity sha512-ex2MzJG/SjPk2PQZCuhxZXoZbqGY/orxEgajgL3fXiYoBaKmjLrI2SiR5z5+fDFgL+aEzgqVl+ZAQK3Fgshf4Q== + version "7.6.9" + resolved "https://registry.yarnpkg.com/react-redux-toastr/-/react-redux-toastr-7.6.9.tgz#af681abfeb8d3f1a2890231a90f30c3b607c435d" + integrity sha512-qXazj72fUtQgWHG0vtJoGCqMuiAse9+IQLAHXP9Ego8pHgrXgIu4Bkr1W83s9v70dxR4EMGm/9NO2ofxc1tOQQ== dependencies: classnames "^2.2.3" eventemitter3 "^3.1.0" @@ -11933,9 +12771,9 @@ react-select@^5.3.2: react-transition-group "^4.3.0" react-spinners@^0.13.1: - version "0.13.3" - resolved "https://registry.yarnpkg.com/react-spinners/-/react-spinners-0.13.3.tgz#9d00d10fb2a0869b21efdc13fb0fddbcecd05731" - integrity sha512-FHQMH6dAl1Vw4Lxv0H7hbGsjBs0aKNVwjGrDJLuD9R/C3h9+IuBhKJOJyCcegxMaLiBSBV96Tp+XV3OwPK8Vtw== + version "0.13.4" + resolved "https://registry.yarnpkg.com/react-spinners/-/react-spinners-0.13.4.tgz#20f7435e5cb3a2bde23110efa8b7dfbe485373e9" + integrity sha512-V6IURjYOwomhdngMfuVxBp4utCF6v21sjQ6r4K2JoKl8fwXZp1UeHMBLf+2SU+cts8hAVj9rHOJ8kdT5UqqaJw== react-swipeable@^5.5.1: version "5.5.1" @@ -11960,9 +12798,9 @@ react-tooltip@^4.2.21: uuid "^7.0.3" react-transition-group@^4.3.0: - version "4.4.2" - resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.2.tgz#8b59a56f09ced7b55cbd53c36768b922890d5470" - integrity sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg== + version "4.4.5" + resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.5.tgz#e53d4e3f3344da8521489fbef8f2581d42becdd1" + integrity sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g== dependencies: "@babel/runtime" "^7.5.5" dom-helpers "^5.0.1" @@ -12186,6 +13024,21 @@ regexpu-core@^5.1.0: unicode-match-property-ecmascript "^2.0.0" unicode-match-property-value-ecmascript "^2.0.0" +registry-auth-token@3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.3.2.tgz#851fd49038eecb586911115af845260eec983f20" + integrity sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ== + dependencies: + rc "^1.1.6" + safe-buffer "^5.0.1" + +registry-url@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" + integrity sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA== + dependencies: + rc "^1.0.1" + regjsgen@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.6.0.tgz#83414c5354afd7d6627b16af5f10f41c4e71808d" @@ -12203,6 +13056,13 @@ relateurl@^0.2.7: resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" integrity sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog== +release-zalgo@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/release-zalgo/-/release-zalgo-1.0.0.tgz#09700b7e5074329739330e535c5a90fb67851730" + integrity sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA== + dependencies: + es6-error "^4.0.1" + 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" @@ -12240,6 +13100,13 @@ repeat-string@^1.6.1: resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== +request-progress@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/request-progress/-/request-progress-3.0.0.tgz#4ca754081c7fec63f505e4faa825aa06cd669dbe" + integrity sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg== + dependencies: + throttleit "^1.0.0" + request-promise-core@1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.4.tgz#3eedd4223208d419867b78ce815167d10593a22f" @@ -12391,7 +13258,7 @@ resolve@1.1.7: resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" integrity sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg== -resolve@^1.1.7, resolve@^1.10.0, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.0, resolve@^1.22.1: +resolve@^1.1.7, resolve@^1.10.0, resolve@^1.13.1, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.0, resolve@^1.22.1, resolve@^1.3.2: version "1.22.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== @@ -12488,9 +13355,9 @@ rollup-plugin-terser@^7.0.0: terser "^5.0.0" rollup@^2.43.1: - version "2.76.0" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.76.0.tgz#c69fe03db530ac53fcb9523b3caa0d3c0b9491a1" - integrity sha512-9jwRIEY1jOzKLj3nsY/yot41r19ITdQrhs+q3ggNWhr9TQgduHqANvPpS32RNpzGklJu3G1AJfvlZLi/6wFgWA== + version "2.78.1" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.78.1.tgz#52fe3934d9c83cb4f7c4cb5fb75d88591be8648f" + integrity sha512-VeeCgtGi4P+o9hIg+xz4qQpRl6R401LWEXBmxYKOV4zlF82lyhgh2hTZnheFUbANE8l2A41F458iwj2vEYaXJg== optionalDependencies: fsevents "~2.3.2" @@ -12520,7 +13387,7 @@ rxjs@^6.5.2: dependencies: tslib "^1.9.0" -rxjs@^7.5.5: +rxjs@^7.1.0, rxjs@^7.5.1, rxjs@^7.5.5: version "7.5.6" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.6.tgz#0446577557862afd6903517ce7cae79ecb9662bc" integrity sha512-dnyv2/YsXhnm461G+R/Pe5bWP41Nm6LBXEYWI6eiFP4fiwx6WRI/CD0zbdVAudd9xwLEF2IDcKXLHit0FYjUzw== @@ -12589,9 +13456,9 @@ sass-loader@^12.3.0: neo-async "^2.6.2" sass@^1.49.8: - version "1.53.0" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.53.0.tgz#eab73a7baac045cc57ddc1d1ff501ad2659952eb" - integrity sha512-zb/oMirbKhUgRQ0/GFz8TSAwRq2IlR29vOUJZOx0l8sV+CkHUfHa4u5nqrG+1VceZp7Jfj59SVW9ogdhTvJDcQ== + version "1.54.5" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.54.5.tgz#93708f5560784f6ff2eab8542ade021a4a947b3a" + integrity sha512-p7DTOzxkUPa/63FU0R3KApkRHwcVZYC0PLnLm5iyZACyp15qSi32x7zVUhRdABAATmkALqgGrjCJAcWvobmhHw== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" @@ -12689,7 +13556,7 @@ selfsigned@^2.0.1: dependencies: node-forge "^1" -"semver@2 || 3 || 4 || 5", semver@^5.5.0, semver@^5.6.0: +"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.5.0, semver@^5.6.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== @@ -12744,6 +13611,20 @@ serialize-javascript@^6.0.0: dependencies: randombytes "^2.1.0" +serve-handler@6.1.3: + version "6.1.3" + resolved "https://registry.yarnpkg.com/serve-handler/-/serve-handler-6.1.3.tgz#1bf8c5ae138712af55c758477533b9117f6435e8" + integrity sha512-FosMqFBNrLyeiIDvP1zgO6YoTzFYHxLDEIavhlmQ+knB2Z7l1t+kGLHkZIDN7UVWqQAmKI3D20A6F6jo3nDd4w== + dependencies: + bytes "3.0.0" + content-disposition "0.5.2" + fast-url-parser "1.1.3" + mime-types "2.1.18" + minimatch "3.0.4" + path-is-inside "1.0.2" + path-to-regexp "2.2.1" + range-parser "1.2.0" + serve-index@^1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" @@ -12767,6 +13648,23 @@ serve-static@1.15.0: parseurl "~1.3.3" send "0.18.0" +serve@^14.0.1: + version "14.0.1" + resolved "https://registry.yarnpkg.com/serve/-/serve-14.0.1.tgz#5b6ffc17e18e1a8e963cc392958d7df13e1ef9fd" + integrity sha512-tNGwxl27FwA8TbmMQqN0jTaSx8/trL532qZsJHX1VdiEIjjtMJHCs7AFS6OvtC7cTHOvmjXqt5yczejU6CV2Xg== + dependencies: + "@zeit/schemas" "2.21.0" + ajv "8.11.0" + arg "5.0.2" + boxen "7.0.0" + chalk "5.0.1" + chalk-template "0.4.0" + clipboardy "3.0.0" + compression "1.7.4" + is-port-reachable "4.0.0" + serve-handler "6.1.3" + update-check "1.5.4" + set-blocking@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" @@ -12984,14 +13882,6 @@ source-map-resolve@^0.5.0, source-map-resolve@^0.5.2: source-map-url "^0.4.0" urix "^0.1.0" -source-map-resolve@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.6.0.tgz#3d9df87e236b53f16d01e58150fc7711138e5ed2" - integrity sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w== - dependencies: - atob "^2.1.2" - decode-uri-component "^0.2.0" - source-map-support@^0.5.6, source-map-support@~0.5.12, source-map-support@~0.5.20: version "0.5.21" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" @@ -13037,6 +13927,18 @@ spawn-command@^0.0.2-1: resolved "https://registry.yarnpkg.com/spawn-command/-/spawn-command-0.0.2-1.tgz#62f5e9466981c1b796dc5929937e11c9c6921bd0" integrity sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg== +spawn-wrap@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/spawn-wrap/-/spawn-wrap-2.0.0.tgz#103685b8b8f9b79771318827aa78650a610d457e" + integrity sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg== + dependencies: + foreground-child "^2.0.0" + is-windows "^1.0.2" + make-dir "^3.0.0" + rimraf "^3.0.0" + signal-exit "^3.0.2" + which "^2.0.1" + spdx-correct@^3.0.0: version "3.1.1" resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" @@ -13059,9 +13961,9 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.11" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz#50c0d8c40a14ec1bf449bae69a0ea4685a9d9f95" - integrity sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g== + version "3.0.12" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz#69077835abe2710b65f03969898b6637b505a779" + integrity sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA== spdy-transport@^3.0.0: version "3.0.0" @@ -13093,12 +13995,19 @@ split-string@^3.0.1, split-string@^3.0.2: dependencies: extend-shallow "^3.0.0" +split@0.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f" + integrity sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA== + dependencies: + through "2" + sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== -sshpk@^1.7.0: +sshpk@^1.14.1, sshpk@^1.7.0: version "1.17.0" resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5" integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ== @@ -13149,6 +14058,19 @@ standalone-single-spa-webpack-plugin@^1.0.1: resolved "https://registry.yarnpkg.com/standalone-single-spa-webpack-plugin/-/standalone-single-spa-webpack-plugin-1.2.2.tgz#cae12845d6021351dbe40a2c25fe51644ceaaa4d" integrity sha512-4K4ub2LHkEvKN+MGA2SDSySw6Wr+CyFnAeJmtOPvz51uLcv05SYBXGYf5qhe7DPjbflPIXwMRUCYyTqC7EXqtA== +start-server-and-test@^1.14.0: + version "1.14.0" + resolved "https://registry.yarnpkg.com/start-server-and-test/-/start-server-and-test-1.14.0.tgz#c57f04f73eac15dd51733b551d775b40837fdde3" + integrity sha512-on5ELuxO2K0t8EmNj9MtVlFqwBMxfWOhu4U7uZD1xccVpFlOQKR93CSe0u98iQzfNxRyaNTb/CdadbNllplTsw== + dependencies: + bluebird "3.7.2" + check-more-types "2.24.0" + debug "4.3.2" + execa "5.1.1" + lazy-ass "1.6.0" + ps-tree "1.2.0" + wait-on "6.0.0" + static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" @@ -13180,6 +14102,13 @@ stream-browserify@^2.0.1: inherits "~2.0.1" readable-stream "^2.0.2" +stream-combiner@~0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14" + integrity sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw== + dependencies: + duplexer "~0.1.1" + stream-each@^1.1.0: version "1.2.3" resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" @@ -13261,7 +14190,7 @@ string-width@^4.1.0, string-width@^4.2.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string-width@^5.0.0: +string-width@^5.0.0, string-width@^5.0.1, string-width@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== @@ -13395,6 +14324,11 @@ strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== + style-loader@^1.2.1: version "1.3.0" resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-1.3.0.tgz#828b4a3b3b7e7aa5847ce7bae9e874512114249e" @@ -13478,7 +14412,7 @@ supports-color@^7.0.0, supports-color@^7.1.0: dependencies: has-flag "^4.0.0" -supports-color@^8.0.0: +supports-color@^8.0.0, supports-color@^8.1.1: version "8.1.1" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== @@ -13614,9 +14548,9 @@ systemjs-webpack-interop@^2.1.2, systemjs-webpack-interop@^2.3.1: integrity sha512-9wmhkleKWVjcGfHpc1/YvfADnvzpYMdr2/AM2e7FpMczPYEdluwM3AMXxHGzPUNbWfnSaerrmzqP4nDsTDvBxA== tailwindcss@^3.0.2: - version "3.1.6" - resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.1.6.tgz#bcb719357776c39e6376a8d84e9834b2b19a49f1" - integrity sha512-7skAOY56erZAFQssT1xkpk+kWt2NrO45kORlxFPXUt3CiGsVPhH1smuH5XoDH6sGPXLyBv+zgCKA2HWBsgCytg== + version "3.1.8" + resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.1.8.tgz#4f8520550d67a835d32f2f4021580f9fddb7b741" + integrity sha512-YSneUCZSFDYMwk+TGq8qYFdCA3yfBRdBlS7txSq0LUmzyeqRe3a8fBQzbz9M3WS/iFT4BNf/nmw9mEzrnSaC0g== dependencies: arg "^5.0.2" chokidar "^3.5.3" @@ -13627,7 +14561,7 @@ tailwindcss@^3.0.2: fast-glob "^3.2.11" glob-parent "^6.0.2" is-glob "^4.0.3" - lilconfig "^2.0.5" + lilconfig "^2.0.6" normalize-path "^3.0.0" object-hash "^3.0.0" picocolors "^1.0.0" @@ -13696,29 +14630,29 @@ terser-webpack-plugin@^1.4.3: worker-farm "^1.7.0" terser-webpack-plugin@^5.1.3, terser-webpack-plugin@^5.2.5: - version "5.3.3" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.3.tgz#8033db876dd5875487213e87c627bca323e5ed90" - integrity sha512-Fx60G5HNYknNTNQnzQ1VePRuu89ZVYWfjRAeT5rITuCY/1b08s49e5kSQwHDirKZWuoKOBRFS98EUUoZ9kLEwQ== + version "5.3.5" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.5.tgz#f7d82286031f915a4f8fb81af4bd35d2e3c011bc" + integrity sha512-AOEDLDxD2zylUGf/wxHxklEkOe2/r+seuyOWujejFrIxHf11brA1/dWQNIgXa1c6/Wkxgu7zvv0JhOWfc2ELEA== dependencies: - "@jridgewell/trace-mapping" "^0.3.7" + "@jridgewell/trace-mapping" "^0.3.14" jest-worker "^27.4.5" schema-utils "^3.1.1" serialize-javascript "^6.0.0" - terser "^5.7.2" + terser "^5.14.1" terser@^4.1.2, terser@^4.6.3: - version "4.8.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.0.tgz#63056343d7c70bb29f3af665865a46fe03a0df17" - integrity sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw== + version "4.8.1" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.1.tgz#a00e5634562de2239fd404c649051bf6fc21144f" + integrity sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw== dependencies: commander "^2.20.0" source-map "~0.6.1" source-map-support "~0.5.12" -terser@^5.0.0, terser@^5.10.0, terser@^5.7.2: - version "5.14.1" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.14.1.tgz#7c95eec36436cb11cf1902cc79ac564741d19eca" - integrity sha512-+ahUAE+iheqBTDxXhTisdA8hgvbEG1hHOQ9xmNjeUJSoi6DU/gMrKNcfZjHkyY6Alnuyc+ikYJaxxfHkT3+WuQ== +terser@^5.0.0, terser@^5.10.0, terser@^5.14.1: + version "5.14.2" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.14.2.tgz#9ac9f22b06994d736174f4091aa368db896f1c10" + integrity sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA== dependencies: "@jridgewell/source-map" "^0.3.2" acorn "^8.5.0" @@ -13766,6 +14700,11 @@ throat@^6.0.1: resolved "https://registry.yarnpkg.com/throat/-/throat-6.0.1.tgz#d514fedad95740c12c2d7fc70ea863eb51ade375" integrity sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w== +throttleit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c" + integrity sha512-rkTVqu6IjfQ/6+uNuuc3sZek4CEYxTJom3IktzgdSxcZqdARuebbA/f4QmAxMQIxqq9ZLEUkSYqvuk1I6VKq4g== + through2@^2.0.0: version "2.0.5" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" @@ -13774,7 +14713,7 @@ through2@^2.0.0: readable-stream "~2.3.6" xtend "~4.0.1" -through@^2.3.8: +through@2, through@^2.3.8, through@~2.3, through@~2.3.1: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== @@ -13791,6 +14730,13 @@ timers-browserify@^2.0.4: dependencies: setimmediate "^1.0.4" +tmp@~0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" + integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== + dependencies: + rimraf "^3.0.0" + tmpl@1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" @@ -13861,13 +14807,14 @@ tough-cookie@^3.0.1: punycode "^2.1.1" tough-cookie@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4" - integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg== + version "4.1.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.0.tgz#039b203b2ad95cd9d2a2aae07b238cb83adc46c7" + integrity sha512-IVX6AagLelGwl6F0E+hoRpXzuD192cZhAcmT7/eoLr0PnsB1wv2E5c+A2O+V8xth9FlL2p0OstFsWn0bZpVn4w== dependencies: psl "^1.1.33" punycode "^2.1.1" - universalify "^0.1.2" + universalify "^0.2.0" + url-parse "^1.5.3" tr46@^1.0.1: version "1.0.1" @@ -13903,7 +14850,7 @@ tsconfig-paths@^3.14.1: minimist "^1.2.6" strip-bom "^3.0.0" -tslib@^1.8.1, tslib@^1.9.0: +tslib@^1.13.0, tslib@^1.8.1, tslib@^1.9.0: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== @@ -13913,6 +14860,32 @@ tslib@^2.0.3, tslib@^2.1.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== +tslint@^6.1.3: + version "6.1.3" + resolved "https://registry.yarnpkg.com/tslint/-/tslint-6.1.3.tgz#5c23b2eccc32487d5523bd3a470e9aa31789d904" + integrity sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg== + dependencies: + "@babel/code-frame" "^7.0.0" + builtin-modules "^1.1.1" + chalk "^2.3.0" + commander "^2.12.1" + diff "^4.0.1" + glob "^7.1.1" + js-yaml "^3.13.1" + minimatch "^3.0.4" + mkdirp "^0.5.3" + resolve "^1.3.2" + semver "^5.3.0" + tslib "^1.13.0" + tsutils "^2.29.0" + +tsutils@^2.29.0: + version "2.29.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99" + integrity sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA== + dependencies: + tslib "^1.8.1" + tsutils@^3.21.0: version "3.21.0" resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" @@ -13976,11 +14949,16 @@ type-fest@^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.8.1: +type-fest@^0.8.0, 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-fest@^2.13.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" + integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== + type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" @@ -13995,9 +14973,9 @@ type@^1.0.1: integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== type@^2.5.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/type/-/type-2.6.0.tgz#3ca6099af5981d36ca86b78442973694278a219f" - integrity sha512-eiDBDOmkih5pMbo9OqsqPRGMljLodLcwd5XD5JbtNB0o89xZAwynY9EdCDsJU7LtcVCClu9DvM7/0Ep1hYX3EQ== + version "2.7.2" + resolved "https://registry.yarnpkg.com/type/-/type-2.7.2.tgz#2376a15a3a28b1efa0f5350dcf72d24df6ef98d0" + integrity sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw== typedarray-to-buffer@^3.1.5: version "3.1.5" @@ -14080,10 +15058,10 @@ unique-string@^2.0.0: dependencies: crypto-random-string "^2.0.0" -universalify@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== +universalify@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" + integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== universalify@^2.0.0: version "2.0.0" @@ -14108,6 +15086,11 @@ unset-value@^1.0.0: has-value "^0.3.1" isobject "^3.0.0" +untildify@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" + integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== + unused-files-webpack-plugin@^3.4.0: version "3.4.0" resolved "https://registry.yarnpkg.com/unused-files-webpack-plugin/-/unused-files-webpack-plugin-3.4.0.tgz#adc67a3b5549d028818d3119cbf2b5c88aea8670" @@ -14124,14 +15107,22 @@ upath@^1.1.1, upath@^1.2.0: resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== -update-browserslist-db@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.4.tgz#dbfc5a789caa26b1db8990796c2c8ebbce304824" - integrity sha512-jnmO2BEGUjsMOe/Fg9u0oczOe/ppIDZPebzccl1yDWGLFP16Pa1/RM5wEoKYPG2zstNcDuAStejyxsOuKINdGA== +update-browserslist-db@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz#be06a5eedd62f107b7c19eb5bcefb194411abf38" + integrity sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q== dependencies: escalade "^3.1.1" picocolors "^1.0.0" +update-check@1.5.4: + version "1.5.4" + resolved "https://registry.yarnpkg.com/update-check/-/update-check-1.5.4.tgz#5b508e259558f1ad7dbc8b4b0457d4c9d28c8743" + integrity sha512-5YHsflzHP4t1G+8WGPlvKbJEbAJGCgw+Em+dGR1KmBUbr1J36SJBqlHLjR7oob7sco5hWHGQVcr9B2poIVDDTQ== + dependencies: + registry-auth-token "3.3.2" + registry-url "3.1.0" + uri-js@^4.2.2: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" @@ -14144,7 +15135,7 @@ urix@^0.1.0: resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" integrity sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg== -url-parse@^1.5.10: +url-parse@^1.5.10, url-parse@^1.5.3: version "1.5.10" resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== @@ -14323,6 +15314,17 @@ w3c-xmlserializer@^2.0.0: dependencies: xml-name-validator "^3.0.0" +wait-on@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/wait-on/-/wait-on-6.0.0.tgz#7e9bf8e3d7fe2daecbb7a570ac8ca41e9311c7e7" + integrity sha512-tnUJr9p5r+bEYXPUdRseolmz5XqJTTj98JgOsfBn7Oz2dxfE2g3zw1jE+Mo8lopM3j3et/Mq1yW7kKX6qw7RVw== + dependencies: + axios "^0.21.1" + joi "^17.4.0" + lodash "^4.17.21" + minimist "^1.2.5" + rxjs "^7.1.0" + walker@^1.0.7, walker@~1.0.5: version "1.0.8" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" @@ -14355,7 +15357,7 @@ watchpack@^1.7.4: chokidar "^3.4.1" watchpack-chokidar2 "^2.0.1" -watchpack@^2.3.1: +watchpack@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== @@ -14505,9 +15507,9 @@ webpack-dev-server@^3.9.0: yargs "^13.3.2" webpack-dev-server@^4.6.0: - version "4.9.3" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.9.3.tgz#2360a5d6d532acb5410a668417ad549ee3b8a3c9" - integrity sha512-3qp/eoboZG5/6QgiZ3llN8TUzkSpYg1Ko9khWX1h40MIEUNS2mDoIa8aXsPfskER+GbTvs/IJZ1QTBBhhuetSw== + version "4.10.0" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.10.0.tgz#de270d0009eba050546912be90116e7fd740a9ca" + integrity sha512-7dezwAs+k6yXVFZ+MaL8VnE+APobiO3zvpp3rBHe/HmWQ+avwh0Q3d0xxacOiBybZZ3syTZw9HXzpa3YNbAZDQ== dependencies: "@types/bonjour" "^3.5.9" "@types/connect-history-api-fallback" "^1.3.5" @@ -14613,20 +15615,20 @@ webpack@^4.41.2: webpack-sources "^1.4.1" webpack@^5.64.4: - version "5.73.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.73.0.tgz#bbd17738f8a53ee5760ea2f59dce7f3431d35d38" - integrity sha512-svjudQRPPa0YiOYa2lM/Gacw0r6PvxptHj4FuEKQ2kX05ZLkjbVc5MnPs6its5j7IZljnIqSVo/OsY2X0IpHGA== + version "5.74.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.74.0.tgz#02a5dac19a17e0bb47093f2be67c695102a55980" + integrity sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA== dependencies: "@types/eslint-scope" "^3.7.3" "@types/estree" "^0.0.51" "@webassemblyjs/ast" "1.11.1" "@webassemblyjs/wasm-edit" "1.11.1" "@webassemblyjs/wasm-parser" "1.11.1" - acorn "^8.4.1" + acorn "^8.7.1" acorn-import-assertions "^1.7.6" browserslist "^4.14.5" chrome-trace-event "^1.0.2" - enhanced-resolve "^5.9.3" + enhanced-resolve "^5.10.0" es-module-lexer "^0.9.0" eslint-scope "5.1.1" events "^3.2.0" @@ -14639,7 +15641,7 @@ webpack@^5.64.4: schema-utils "^3.1.0" tapable "^2.1.1" terser-webpack-plugin "^5.1.3" - watchpack "^2.3.1" + watchpack "^2.4.0" webpack-sources "^3.2.3" websocket-driver@>=0.5.1, websocket-driver@^0.7.4: @@ -14726,30 +15728,37 @@ which@^2.0.1, which@^2.0.2: dependencies: isexe "^2.0.0" +widest-line@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-4.0.1.tgz#a0fc673aaba1ea6f0a0d35b3c2795c9a9cc2ebf2" + integrity sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig== + dependencies: + string-width "^5.0.1" + 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== -workbox-background-sync@6.5.3: - version "6.5.3" - resolved "https://registry.yarnpkg.com/workbox-background-sync/-/workbox-background-sync-6.5.3.tgz#7c66c1836aeca6f3762dc48d17a1852a33b3168c" - integrity sha512-0DD/V05FAcek6tWv9XYj2w5T/plxhDSpclIcAGjA/b7t/6PdaRkQ7ZgtAX6Q/L7kV7wZ8uYRJUoH11VjNipMZw== +workbox-background-sync@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/workbox-background-sync/-/workbox-background-sync-6.5.4.tgz#3141afba3cc8aa2ae14c24d0f6811374ba8ff6a9" + integrity sha512-0r4INQZMyPky/lj4Ou98qxcThrETucOde+7mRGJl13MPJugQNKeZQOdIJe/1AchOP23cTqHcN/YVpD6r8E6I8g== dependencies: - idb "^6.1.4" - workbox-core "6.5.3" + idb "^7.0.1" + workbox-core "6.5.4" -workbox-broadcast-update@6.5.3: - version "6.5.3" - resolved "https://registry.yarnpkg.com/workbox-broadcast-update/-/workbox-broadcast-update-6.5.3.tgz#fc2ad79cf507e22950cda9baf1e9a0ccc43f31bc" - integrity sha512-4AwCIA5DiDrYhlN+Miv/fp5T3/whNmSL+KqhTwRBTZIL6pvTgE4lVuRzAt1JltmqyMcQ3SEfCdfxczuI4kwFQg== +workbox-broadcast-update@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/workbox-broadcast-update/-/workbox-broadcast-update-6.5.4.tgz#8441cff5417cd41f384ba7633ca960a7ffe40f66" + integrity sha512-I/lBERoH1u3zyBosnpPEtcAVe5lwykx9Yg1k6f8/BGEPGaMMgZrwVrqL1uA9QZ1NGGFoyE6t9i7lBjOlDhFEEw== dependencies: - workbox-core "6.5.3" + workbox-core "6.5.4" -workbox-build@6.5.3: - version "6.5.3" - resolved "https://registry.yarnpkg.com/workbox-build/-/workbox-build-6.5.3.tgz#38e3f286d63d2745bff4d1478bb3a6ab5c8b1170" - integrity sha512-8JNHHS7u13nhwIYCDea9MNXBNPHXCs5KDZPKI/ZNTr3f4sMGoD7hgFGecbyjX1gw4z6e9bMpMsOEJNyH5htA/w== +workbox-build@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/workbox-build/-/workbox-build-6.5.4.tgz#7d06d31eb28a878817e1c991c05c5b93409f0389" + integrity sha512-kgRevLXEYvUW9WS4XoziYqZ8Q9j/2ziJYEtTrjdz5/L/cTUa2XfyMP2i7c3p34lgqJ03+mTiz13SdFef2POwbA== dependencies: "@apideck/better-ajv-errors" "^0.3.1" "@babel/core" "^7.11.1" @@ -14773,132 +15782,132 @@ workbox-build@6.5.3: strip-comments "^2.0.1" tempy "^0.6.0" upath "^1.2.0" - workbox-background-sync "6.5.3" - workbox-broadcast-update "6.5.3" - workbox-cacheable-response "6.5.3" - workbox-core "6.5.3" - workbox-expiration "6.5.3" - workbox-google-analytics "6.5.3" - workbox-navigation-preload "6.5.3" - workbox-precaching "6.5.3" - workbox-range-requests "6.5.3" - workbox-recipes "6.5.3" - workbox-routing "6.5.3" - workbox-strategies "6.5.3" - workbox-streams "6.5.3" - workbox-sw "6.5.3" - workbox-window "6.5.3" - -workbox-cacheable-response@6.5.3: - version "6.5.3" - resolved "https://registry.yarnpkg.com/workbox-cacheable-response/-/workbox-cacheable-response-6.5.3.tgz#b1f8c2bc599a7be8f7e3c262535629c558738e47" - integrity sha512-6JE/Zm05hNasHzzAGKDkqqgYtZZL2H06ic2GxuRLStA4S/rHUfm2mnLFFXuHAaGR1XuuYyVCEey1M6H3PdZ7SQ== + workbox-background-sync "6.5.4" + workbox-broadcast-update "6.5.4" + workbox-cacheable-response "6.5.4" + workbox-core "6.5.4" + workbox-expiration "6.5.4" + workbox-google-analytics "6.5.4" + workbox-navigation-preload "6.5.4" + workbox-precaching "6.5.4" + workbox-range-requests "6.5.4" + workbox-recipes "6.5.4" + workbox-routing "6.5.4" + workbox-strategies "6.5.4" + workbox-streams "6.5.4" + workbox-sw "6.5.4" + workbox-window "6.5.4" + +workbox-cacheable-response@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/workbox-cacheable-response/-/workbox-cacheable-response-6.5.4.tgz#a5c6ec0c6e2b6f037379198d4ef07d098f7cf137" + integrity sha512-DCR9uD0Fqj8oB2TSWQEm1hbFs/85hXXoayVwFKLVuIuxwJaihBsLsp4y7J9bvZbqtPJ1KlCkmYVGQKrBU4KAug== dependencies: - workbox-core "6.5.3" + workbox-core "6.5.4" -workbox-core@6.5.3: - version "6.5.3" - resolved "https://registry.yarnpkg.com/workbox-core/-/workbox-core-6.5.3.tgz#bca038a9ef0d7a634a6db2a60f45313ed22ac249" - integrity sha512-Bb9ey5n/M9x+l3fBTlLpHt9ASTzgSGj6vxni7pY72ilB/Pb3XtN+cZ9yueboVhD5+9cNQrC9n/E1fSrqWsUz7Q== +workbox-core@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/workbox-core/-/workbox-core-6.5.4.tgz#df48bf44cd58bb1d1726c49b883fb1dffa24c9ba" + integrity sha512-OXYb+m9wZm8GrORlV2vBbE5EC1FKu71GGp0H4rjmxmF4/HLbMCoTFws87M3dFwgpmg0v00K++PImpNQ6J5NQ6Q== -workbox-expiration@6.5.3: - version "6.5.3" - resolved "https://registry.yarnpkg.com/workbox-expiration/-/workbox-expiration-6.5.3.tgz#efc0811f371a2ede1052b9de1c4f072b71d50503" - integrity sha512-jzYopYR1zD04ZMdlbn/R2Ik6ixiXbi15c9iX5H8CTi6RPDz7uhvMLZPKEndZTpfgmUk8mdmT9Vx/AhbuCl5Sqw== +workbox-expiration@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/workbox-expiration/-/workbox-expiration-6.5.4.tgz#501056f81e87e1d296c76570bb483ce5e29b4539" + integrity sha512-jUP5qPOpH1nXtjGGh1fRBa1wJL2QlIb5mGpct3NzepjGG2uFFBn4iiEBiI9GUmfAFR2ApuRhDydjcRmYXddiEQ== dependencies: - idb "^6.1.4" - workbox-core "6.5.3" + idb "^7.0.1" + workbox-core "6.5.4" -workbox-google-analytics@6.5.3: - version "6.5.3" - resolved "https://registry.yarnpkg.com/workbox-google-analytics/-/workbox-google-analytics-6.5.3.tgz#cc8c3a61f449131660a4ed2f5362d9a3599b18fe" - integrity sha512-3GLCHotz5umoRSb4aNQeTbILETcrTVEozSfLhHSBaegHs1PnqCmN0zbIy2TjTpph2AGXiNwDrWGF0AN+UgDNTw== +workbox-google-analytics@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/workbox-google-analytics/-/workbox-google-analytics-6.5.4.tgz#c74327f80dfa4c1954cbba93cd7ea640fe7ece7d" + integrity sha512-8AU1WuaXsD49249Wq0B2zn4a/vvFfHkpcFfqAFHNHwln3jK9QUYmzdkKXGIZl9wyKNP+RRX30vcgcyWMcZ9VAg== dependencies: - workbox-background-sync "6.5.3" - workbox-core "6.5.3" - workbox-routing "6.5.3" - workbox-strategies "6.5.3" + workbox-background-sync "6.5.4" + workbox-core "6.5.4" + workbox-routing "6.5.4" + workbox-strategies "6.5.4" -workbox-navigation-preload@6.5.3: - version "6.5.3" - resolved "https://registry.yarnpkg.com/workbox-navigation-preload/-/workbox-navigation-preload-6.5.3.tgz#81b74f598b11aa07e2cf1c21af7a826a4f0f70b3" - integrity sha512-bK1gDFTc5iu6lH3UQ07QVo+0ovErhRNGvJJO/1ngknT0UQ702nmOUhoN9qE5mhuQSrnK+cqu7O7xeaJ+Rd9Tmg== +workbox-navigation-preload@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/workbox-navigation-preload/-/workbox-navigation-preload-6.5.4.tgz#ede56dd5f6fc9e860a7e45b2c1a8f87c1c793212" + integrity sha512-IIwf80eO3cr8h6XSQJF+Hxj26rg2RPFVUmJLUlM0+A2GzB4HFbQyKkrgD5y2d84g2IbJzP4B4j5dPBRzamHrng== dependencies: - workbox-core "6.5.3" + workbox-core "6.5.4" -workbox-precaching@6.5.3: - version "6.5.3" - resolved "https://registry.yarnpkg.com/workbox-precaching/-/workbox-precaching-6.5.3.tgz#c870312b2ef901d790ab9e48da084e776c62af47" - integrity sha512-sjNfgNLSsRX5zcc63H/ar/hCf+T19fRtTqvWh795gdpghWb5xsfEkecXEvZ8biEi1QD7X/ljtHphdaPvXDygMQ== +workbox-precaching@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/workbox-precaching/-/workbox-precaching-6.5.4.tgz#740e3561df92c6726ab5f7471e6aac89582cab72" + integrity sha512-hSMezMsW6btKnxHB4bFy2Qfwey/8SYdGWvVIKFaUm8vJ4E53JAY+U2JwLTRD8wbLWoP6OVUdFlXsTdKu9yoLTg== dependencies: - workbox-core "6.5.3" - workbox-routing "6.5.3" - workbox-strategies "6.5.3" + workbox-core "6.5.4" + workbox-routing "6.5.4" + workbox-strategies "6.5.4" -workbox-range-requests@6.5.3: - version "6.5.3" - resolved "https://registry.yarnpkg.com/workbox-range-requests/-/workbox-range-requests-6.5.3.tgz#e624ac82ff266a5e4f236d055797def07949d941" - integrity sha512-pGCP80Bpn/0Q0MQsfETSfmtXsQcu3M2QCJwSFuJ6cDp8s2XmbUXkzbuQhCUzKR86ZH2Vex/VUjb2UaZBGamijA== +workbox-range-requests@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/workbox-range-requests/-/workbox-range-requests-6.5.4.tgz#86b3d482e090433dab38d36ae031b2bb0bd74399" + integrity sha512-Je2qR1NXCFC8xVJ/Lux6saH6IrQGhMpDrPXWZWWS8n/RD+WZfKa6dSZwU+/QksfEadJEr/NfY+aP/CXFFK5JFg== dependencies: - workbox-core "6.5.3" + workbox-core "6.5.4" -workbox-recipes@6.5.3: - version "6.5.3" - resolved "https://registry.yarnpkg.com/workbox-recipes/-/workbox-recipes-6.5.3.tgz#15beac9d8ae7a3a1c100218094a824b4dd3fd59a" - integrity sha512-IcgiKYmbGiDvvf3PMSEtmwqxwfQ5zwI7OZPio3GWu4PfehA8jI8JHI3KZj+PCfRiUPZhjQHJ3v1HbNs+SiSkig== +workbox-recipes@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/workbox-recipes/-/workbox-recipes-6.5.4.tgz#cca809ee63b98b158b2702dcfb741b5cc3e24acb" + integrity sha512-QZNO8Ez708NNwzLNEXTG4QYSKQ1ochzEtRLGaq+mr2PyoEIC1xFW7MrWxrONUxBFOByksds9Z4//lKAX8tHyUA== dependencies: - workbox-cacheable-response "6.5.3" - workbox-core "6.5.3" - workbox-expiration "6.5.3" - workbox-precaching "6.5.3" - workbox-routing "6.5.3" - workbox-strategies "6.5.3" + workbox-cacheable-response "6.5.4" + workbox-core "6.5.4" + workbox-expiration "6.5.4" + workbox-precaching "6.5.4" + workbox-routing "6.5.4" + workbox-strategies "6.5.4" -workbox-routing@6.5.3: - version "6.5.3" - resolved "https://registry.yarnpkg.com/workbox-routing/-/workbox-routing-6.5.3.tgz#a0a699d8cc90b5692bd3df24679acbbda3913777" - integrity sha512-DFjxcuRAJjjt4T34RbMm3MCn+xnd36UT/2RfPRfa8VWJGItGJIn7tG+GwVTdHmvE54i/QmVTJepyAGWtoLPTmg== +workbox-routing@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/workbox-routing/-/workbox-routing-6.5.4.tgz#6a7fbbd23f4ac801038d9a0298bc907ee26fe3da" + integrity sha512-apQswLsbrrOsBUWtr9Lf80F+P1sHnQdYodRo32SjiByYi36IDyL2r7BH1lJtFX8fwNHDa1QOVY74WKLLS6o5Pg== dependencies: - workbox-core "6.5.3" + workbox-core "6.5.4" -workbox-strategies@6.5.3: - version "6.5.3" - resolved "https://registry.yarnpkg.com/workbox-strategies/-/workbox-strategies-6.5.3.tgz#4bea9a48fee16cf43766e0d8138296773c8a9783" - integrity sha512-MgmGRrDVXs7rtSCcetZgkSZyMpRGw8HqL2aguszOc3nUmzGZsT238z/NN9ZouCxSzDu3PQ3ZSKmovAacaIhu1w== +workbox-strategies@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/workbox-strategies/-/workbox-strategies-6.5.4.tgz#4edda035b3c010fc7f6152918370699334cd204d" + integrity sha512-DEtsxhx0LIYWkJBTQolRxG4EI0setTJkqR4m7r4YpBdxtWJH1Mbg01Cj8ZjNOO8etqfA3IZaOPHUxCs8cBsKLw== dependencies: - workbox-core "6.5.3" + workbox-core "6.5.4" -workbox-streams@6.5.3: - version "6.5.3" - resolved "https://registry.yarnpkg.com/workbox-streams/-/workbox-streams-6.5.3.tgz#b6860290031caa7d0e46ad7142315c94359c780b" - integrity sha512-vN4Qi8o+b7zj1FDVNZ+PlmAcy1sBoV7SC956uhqYvZ9Sg1fViSbOpydULOssVJ4tOyKRifH/eoi6h99d+sJ33w== +workbox-streams@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/workbox-streams/-/workbox-streams-6.5.4.tgz#1cb3c168a6101df7b5269d0353c19e36668d7d69" + integrity sha512-FXKVh87d2RFXkliAIheBojBELIPnWbQdyDvsH3t74Cwhg0fDheL1T8BqSM86hZvC0ZESLsznSYWw+Va+KVbUzg== dependencies: - workbox-core "6.5.3" - workbox-routing "6.5.3" + workbox-core "6.5.4" + workbox-routing "6.5.4" -workbox-sw@6.5.3: - version "6.5.3" - resolved "https://registry.yarnpkg.com/workbox-sw/-/workbox-sw-6.5.3.tgz#cd2f0c086f4496acd25774ed02c48504189bebdd" - integrity sha512-BQBzm092w+NqdIEF2yhl32dERt9j9MDGUTa2Eaa+o3YKL4Qqw55W9yQC6f44FdAHdAJrJvp0t+HVrfh8AiGj8A== +workbox-sw@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/workbox-sw/-/workbox-sw-6.5.4.tgz#d93e9c67924dd153a61367a4656ff4d2ae2ed736" + integrity sha512-vo2RQo7DILVRoH5LjGqw3nphavEjK4Qk+FenXeUsknKn14eCNedHOXWbmnvP4ipKhlE35pvJ4yl4YYf6YsJArA== workbox-webpack-plugin@^6.4.1: - version "6.5.3" - resolved "https://registry.yarnpkg.com/workbox-webpack-plugin/-/workbox-webpack-plugin-6.5.3.tgz#c37bb323be4952311565c07db51054fe59c87d73" - integrity sha512-Es8Xr02Gi6Kc3zaUwR691ZLy61hz3vhhs5GztcklQ7kl5k2qAusPh0s6LF3wEtlpfs9ZDErnmy5SErwoll7jBA== + version "6.5.4" + resolved "https://registry.yarnpkg.com/workbox-webpack-plugin/-/workbox-webpack-plugin-6.5.4.tgz#baf2d3f4b8f435f3469887cf4fba2b7fac3d0fd7" + integrity sha512-LmWm/zoaahe0EGmMTrSLUi+BjyR3cdGEfU3fS6PN1zKFYbqAKuQ+Oy/27e4VSXsyIwAw8+QDfk1XHNGtZu9nQg== dependencies: fast-json-stable-stringify "^2.1.0" pretty-bytes "^5.4.1" upath "^1.2.0" webpack-sources "^1.4.3" - workbox-build "6.5.3" + workbox-build "6.5.4" -workbox-window@6.5.3: - version "6.5.3" - resolved "https://registry.yarnpkg.com/workbox-window/-/workbox-window-6.5.3.tgz#4ade70056cb73477ef1cd8fea7cfd0ecbd825c7f" - integrity sha512-GnJbx1kcKXDtoJBVZs/P7ddP0Yt52NNy4nocjBpYPiRhMqTpJCNrSL+fGHZ/i/oP6p/vhE8II0sA6AZGKGnssw== +workbox-window@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/workbox-window/-/workbox-window-6.5.4.tgz#d991bc0a94dff3c2dbb6b84558cff155ca878e91" + integrity sha512-HnLZJDwYBE+hpG25AQBO8RUWBJRaCsI9ksQJEp3aCOFCaG5kqaToAYXFRAHxzRluM2cQbGzdQF5rjKPWPA1fug== dependencies: "@types/trusted-types" "^2.0.2" - workbox-core "6.5.3" + workbox-core "6.5.4" worker-farm@^1.7.0: version "1.7.0" @@ -14934,6 +15943,15 @@ wrap-ansi@^7.0.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.0.1.tgz#2101e861777fec527d0ea90c57c6b03aac56a5b3" + integrity sha512-QFF+ufAqhoYHvoHdajT/Po7KoXVBPXS2bgjIam5isfWJPfIOnQZ50JtUiVvCv/sjgacf3yRrt2ZKUZ/V4itN4g== + dependencies: + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" @@ -14966,14 +15984,14 @@ ws@^6.0.0, ws@^6.2.1: async-limiter "~1.0.0" ws@^7.0.0, ws@^7.4.6: - version "7.5.8" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.8.tgz#ac2729881ab9e7cbaf8787fe3469a48c5c7f636a" - integrity sha512-ri1Id1WinAX5Jqn9HejiGb8crfRio0Qgu8+MtL36rlTA6RLsMdWt1Az/19A2Qij6uSHUMphEFaTKa4WG+UNHNw== + version "7.5.9" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" + integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== ws@^8.4.2: - version "8.8.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.8.0.tgz#8e71c75e2f6348dbf8d78005107297056cb77769" - integrity sha512-JDAgSYQ1ksuwqfChJusw1LSJ8BizJ2e/vVu5Lxjq3YvNJNlROv1ui4i+c/kUUrPheBvQl4c5UbERhTwKa6QBJQ== + version "8.8.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.8.1.tgz#5dbad0feb7ade8ecc99b830c1d77c913d4955ff0" + integrity sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA== xml-name-validator@^3.0.0: version "3.0.0" @@ -15057,7 +16075,7 @@ yargs@^13.3.0, yargs@^13.3.2: y18n "^4.0.0" yargs-parser "^13.1.2" -yargs@^15.3.1: +yargs@^15.0.2, yargs@^15.3.1: version "15.4.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== @@ -15087,6 +16105,14 @@ yargs@^16.2.0: y18n "^5.0.5" yargs-parser "^20.2.2" +yauzl@^2.10.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" + integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== + dependencies: + buffer-crc32 "~0.2.3" + fd-slicer "~1.1.0" + yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"