From 6e29c3ed65ef9c9f47072e886e49d7bcb419943f Mon Sep 17 00:00:00 2001 From: David Joy Date: Thu, 1 Aug 2024 10:17:28 -0400 Subject: [PATCH 01/90] fix: improve TS declaration files MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Okay, so the plan is that the frontend-base.d.ts file is used internally by frontend-base. The generated index.d.ts file is used by consumers of frontend-base. If those consumers want to use an SVG file, they’ll need to add their own “declare module” for SVG, like frontend-base.d.ts does for itself. I don’t know of a way to generate ‘declare module’ definitions as part of the generated declarations. --- Makefile | 1 - frontend-base.d.ts | 4 +--- package.json | 2 +- runtime/initialize.js | 2 +- 4 files changed, 3 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index d662cf2c..b614547a 100644 --- a/Makefile +++ b/Makefile @@ -13,7 +13,6 @@ cat_docs_command = cat ./docs/_API-header.md ./docs/_API-body.md > ./docs/API.md build: rm -rf ./dist tsc - cp frontend-base.d.ts dist/frontend-base.d.ts mkdir -p ./scss/header/studio-header cp shell/index.scss dist/shell/index.scss diff --git a/frontend-base.d.ts b/frontend-base.d.ts index b2db15f7..d43cfcfc 100644 --- a/frontend-base.d.ts +++ b/frontend-base.d.ts @@ -1,6 +1,4 @@ -/// - -import { OpenedXConfig } from "./dist"; +import { OpenedXConfig } from "./"; declare module 'env.config' { export default OpenedXConfig; diff --git a/package.json b/package.json index 6f89797a..37b0e0ed 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ }, "main": "dist/index.js", "module": "dist/index.js", - "types": "dist/frontend-base.d.ts", + "types": "dist/index.d.ts", "files": [ "/dist", "/config", diff --git a/runtime/initialize.js b/runtime/initialize.js index da8135ba..09804cf1 100644 --- a/runtime/initialize.js +++ b/runtime/initialize.js @@ -57,7 +57,7 @@ folder. It points at an `env.config.js` file in the root of an MFE's repository falls back to an empty object `{}` if the file doesn't exist. This acts like an 'optional' import, in a sense. */ -import envConfig from 'env.config'; // eslint-disable-line import/no-unresolved +import envConfig from 'env.config'; import { publish, } from './pubSub'; From c104816b8c2d1671bf38ff14a438407b12134db1 Mon Sep 17 00:00:00 2001 From: David Joy Date: Wed, 7 Aug 2024 11:27:48 -0400 Subject: [PATCH 02/90] refactor: moving openedx.js into cli/scripts This puts the CLI tool in the same folder as our other CLI scripts, intl-imports, transifex-utils, and serve. --- bin/openedx.js => cli/scripts/openedx.ts | 7 ++++--- package-lock.json | 2 +- package.json | 2 +- test-app/package-lock.json | 4 ++-- tsconfig.json | 1 - 5 files changed, 8 insertions(+), 8 deletions(-) rename bin/openedx.js => cli/scripts/openedx.ts (95%) diff --git a/bin/openedx.js b/cli/scripts/openedx.ts similarity index 95% rename from bin/openedx.js rename to cli/scripts/openedx.ts index e9f3e7ae..f42b0e58 100755 --- a/bin/openedx.js +++ b/cli/scripts/openedx.ts @@ -1,8 +1,9 @@ #!/usr/bin/env node +import chalk from 'chalk'; -const chalk = require('chalk'); +// const chalk = require('chalk'); -const presets = require('../cli/presets'); +const presets = require('../presets'); /** * TLDR: @@ -80,7 +81,7 @@ switch (commandName) { break; } case 'serve': - require('../cli/scripts/serve'); + require('./serve'); break; default: console.log(chalk.red(`[ERROR] openedx: The command ${chalk.bold.red(commandName)} is unsupported.`)); diff --git a/package-lock.json b/package-lock.json index 846cc5c4..fa02cd14 100644 --- a/package-lock.json +++ b/package-lock.json @@ -92,7 +92,7 @@ }, "bin": { "intl-imports.js": "dist/cli/scripts/intl-imports.js", - "openedx": "dist/bin/openedx.js", + "openedx": "dist/cli/scripts/openedx.js", "transifex-utils.js": "dist/cli/scripts/transifex-utils.js" }, "devDependencies": { diff --git a/package.json b/package.json index 37b0e0ed..2dc41ffb 100644 --- a/package.json +++ b/package.json @@ -15,8 +15,8 @@ "/shell/**/*.scss" ], "bin": { - "openedx": "dist/bin/openedx.js", "intl-imports.js": "dist/cli/scripts/intl-imports.js", + "openedx": "dist/cli/scripts/openedx.js", "transifex-utils.js": "dist/cli/scripts/transifex-utils.js" }, "scripts": { diff --git a/test-app/package-lock.json b/test-app/package-lock.json index e7238f79..bc19f127 100644 --- a/test-app/package-lock.json +++ b/test-app/package-lock.json @@ -107,7 +107,7 @@ }, "bin": { "intl-imports.js": "dist/cli/scripts/intl-imports.js", - "openedx": "dist/bin/openedx.js", + "openedx": "dist/cli/scripts/openedx.js", "transifex-utils.js": "dist/cli/scripts/transifex-utils.js" }, "devDependencies": { @@ -217,7 +217,7 @@ }, "bin": { "intl-imports.js": "dist/cli/scripts/intl-imports.js", - "openedx": "dist/bin/openedx.js", + "openedx": "dist/cli/scripts/openedx.js", "transifex-utils.js": "dist/cli/scripts/transifex-utils.js" }, "devDependencies": { diff --git a/tsconfig.json b/tsconfig.json index f8aa0ca8..dbabd0c4 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -7,7 +7,6 @@ "declaration": true, }, "include": [ - "bin/**/*", "cli/**/*", "config/**/*", "runtime/**/*", From 5b9399b18a0d848bf5a5456cbf4ca7dcefaa7edb Mon Sep 17 00:00:00 2001 From: David Joy Date: Wed, 7 Aug 2024 11:28:42 -0400 Subject: [PATCH 03/90] docs: removing references to frontend-platform --- cli/scripts/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cli/scripts/README.md b/cli/scripts/README.md index 0a3fa7bb..fe243722 100644 --- a/cli/scripts/README.md +++ b/cli/scripts/README.md @@ -2,7 +2,7 @@ This directory contains the `transifex-utils.js` and `intl-imports.js` files which are shared across all micro-frontends. -The package.json of `frontend-platform` includes the following sections: +The package.json of `frontend-base` includes the following sections: ``` "bin": { @@ -11,7 +11,7 @@ The package.json of `frontend-platform` includes the following sections: }, ``` -This config block causes boths scripts to be copied to the following path when `frontend-platform` is installed as a +This config block causes boths scripts to be copied to the following path when `frontend-base` is installed as a dependency of a micro-frontend: ``` From a0cbf3d535830a6acf75de59c859069117b14b65 Mon Sep 17 00:00:00 2001 From: David Joy Date: Wed, 7 Aug 2024 11:29:15 -0400 Subject: [PATCH 04/90] docs: Adding a reminder to remove the auth handler override in the shell --- shell/bootstrap.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/shell/bootstrap.tsx b/shell/bootstrap.tsx index dca11c71..e82604f3 100644 --- a/shell/bootstrap.tsx +++ b/shell/bootstrap.tsx @@ -32,6 +32,7 @@ subscribe(APP_INIT_ERROR, (error) => { initialize({ messages, handlers: { + // TODO: Remove this. auth: () => {}, // This MFE turns off auth so it can run independently of edx-platform. }, }); From c37f7352cf31c74aa8d48bd0b9c00433706b207e Mon Sep 17 00:00:00 2001 From: David Joy Date: Wed, 7 Aug 2024 12:16:17 -0400 Subject: [PATCH 05/90] =?UTF-8?q?build:=20the=20jest=20and=20babel=20confi?= =?UTF-8?q?gs=20shouldn=E2=80=99t=20be=20included=20in=20dist?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tsconfig.json | 2 -- 1 file changed, 2 deletions(-) diff --git a/tsconfig.json b/tsconfig.json index dbabd0c4..a98ef0cd 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -12,8 +12,6 @@ "runtime/**/*", "shell/**/*", "index.ts", - "jest.config.js", - "babel.config.js", ], "exclude": [ "test-app/**/*", From fca8d8569b19b52abe3f21076c0506472441cf98 Mon Sep 17 00:00:00 2001 From: David Joy Date: Wed, 7 Aug 2024 12:19:57 -0400 Subject: [PATCH 06/90] refactor: using createConfig in babel config. --- babel.config.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/babel.config.js b/babel.config.js index fc59fc9c..c66966af 100644 --- a/babel.config.js +++ b/babel.config.js @@ -1,3 +1,3 @@ -const config = require('./config/babel.config'); +const { createConfig } = require('./config'); -module.exports = config; +module.exports = createConfig('babel'); From cd80d6c8b696aa9eaaf1f04d26721a122e3fef40 Mon Sep 17 00:00:00 2001 From: David Joy Date: Wed, 7 Aug 2024 12:20:21 -0400 Subject: [PATCH 07/90] fix: removing old babel/eslint config file types from preset --- cli/presets.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cli/presets.js b/cli/presets.js index ef398e67..e53d41cd 100644 --- a/cli/presets.js +++ b/cli/presets.js @@ -4,13 +4,13 @@ const searchFilepaths = [process.cwd()]; const babel = new ConfigPreset({ defaultFilename: 'babel.config.js', - searchFilenames: ['.babelrc', '.babelrc.js', 'babel.config.js'], + searchFilenames: ['babel.config.js'], searchFilepaths, }); const eslint = new ConfigPreset({ defaultFilename: '.eslintrc.js', - searchFilenames: ['.eslintrc', '.eslintrc.js'], + searchFilenames: ['.eslintrc.js'], searchFilepaths, }); From ad69e3f6d90a0c128def588f93f1add5ba9f04e5 Mon Sep 17 00:00:00 2001 From: David Joy Date: Wed, 7 Aug 2024 12:21:15 -0400 Subject: [PATCH 08/90] fix: jest assumes existence of env.config, disallows .env files MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We’re moving away from .env files in general, and frontend-base is going to assume an env.config file for the test suite is present. --- README.md | 10 ++++++++++ config/jest.config.js | 13 +------------ config/jest/fallback.env.config.js | 12 ------------ config/jest/setupTest.js | 9 --------- 4 files changed, 11 insertions(+), 33 deletions(-) delete mode 100644 config/jest/fallback.env.config.js delete mode 100644 config/jest/setupTest.js diff --git a/README.md b/README.md index d12aca96..17da00c5 100644 --- a/README.md +++ b/README.md @@ -256,6 +256,16 @@ Remember to make the following substitution for these functions: + import { configureLogging } from '@openedx/frontend-base'; ``` +### 12. Replace the .env.test file with configuration in env.test.config.tsx file + +We're moving away from .env files because they're not expressive enough (only string types!) to configure an Open edX frontend. Instead, the test suite has been configured to expect an env.test.config.tsx file. If you're initializing an application in your tests, frontend-base will pick up this configuration and make it available to getConfig(), etc. If you need to manually access the variables, you an import `env.config` in your test files: + +```diff ++ import config from 'env.config'; +``` + +The Jest configuration has been set up to find `env.config` at an `env.test.config.tsx` file. + ## Migrating to the frontend-base shell (:rotating_light: Work In Progress) This is an interim migration that helps prepare an MFE to be released as a set of modules suitable for module federation or being included as a plugin into the shell application. diff --git a/config/jest.config.js b/config/jest.config.js index 79a24e9c..a1029747 100644 --- a/config/jest.config.js +++ b/config/jest.config.js @@ -1,25 +1,14 @@ const path = require('path'); -const fs = require('fs'); - -let envConfigPath = path.resolve(__dirname, './jest/fallback.env.config.js'); -const appEnvConfigPath = path.resolve(process.cwd(), './env.config.js'); - -if (fs.existsSync(appEnvConfigPath)) { - envConfigPath = appEnvConfigPath; -} module.exports = { testEnvironment: 'jsdom', testEnvironmentOptions: { url: 'http://localhost/', }, - setupFiles: [ - path.resolve(__dirname, 'jest/setupTest.js'), - ], rootDir: process.cwd(), moduleNameMapper: { '\\.(css|scss)$': require.resolve('identity-obj-proxy'), - 'env.config': envConfigPath, + 'env.config': path.resolve(process.cwd(), './env.test.config.tsx'), }, collectCoverageFrom: [ 'src/**/*.{js,jsx,ts,tsx}', diff --git a/config/jest/fallback.env.config.js b/config/jest/fallback.env.config.js deleted file mode 100644 index ca3268d5..00000000 --- a/config/jest/fallback.env.config.js +++ /dev/null @@ -1,12 +0,0 @@ -module.exports = { - // DO NOT PUT ANY CONFIGURATION IN THIS FILE. - - // The existence of this file is a technical detail of the mechanism used to implement - // env.config.js files for jest. - - // This file is used as a fallback to prevent build errors if an env.config.js file has not been - // defined in a consuming application. If we could inline an empty object instead of needing a - // file to reference, that'd be clearer, but doesn't seem to be an option. - - // This is NOT an appropriate place to put actual configuration values for tests. -}; diff --git a/config/jest/setupTest.js b/config/jest/setupTest.js deleted file mode 100644 index f1ebf80d..00000000 --- a/config/jest/setupTest.js +++ /dev/null @@ -1,9 +0,0 @@ -const path = require('path'); -const fs = require('fs'); -const dotenv = require('dotenv'); - -const testEnvFile = path.resolve(process.cwd(), '.env.test'); - -if (fs.existsSync(testEnvFile)) { - dotenv.config({ path: testEnvFile }); -} From 71d9ee1a59e79ee886dd2fbcbec510b6070bd613 Mon Sep 17 00:00:00 2001 From: David Joy Date: Wed, 7 Aug 2024 12:22:54 -0400 Subject: [PATCH 09/90] test: removing non-existent setupTest.js from jest config --- config/jest.config.js | 1 - 1 file changed, 1 deletion(-) diff --git a/config/jest.config.js b/config/jest.config.js index a1029747..34aebc85 100644 --- a/config/jest.config.js +++ b/config/jest.config.js @@ -15,7 +15,6 @@ module.exports = { ], coveragePathIgnorePatterns: [ '/node_modules/', - 'setupTest.js', ], transformIgnorePatterns: [ '/node_modules/(?!(@openedx|@edx)/)', From a697bf45efbc76fa01c46a2c0f86766e50a34d8c Mon Sep 17 00:00:00 2001 From: David Joy Date: Wed, 7 Aug 2024 12:35:50 -0400 Subject: [PATCH 10/90] fix: frontend-base will no longer fallback if env.config is missing env.config is now required. The build will fail without one. --- config/webpack.common.config.js | 5 ----- 1 file changed, 5 deletions(-) diff --git a/config/webpack.common.config.js b/config/webpack.common.config.js index 944fdf62..11d12cdc 100644 --- a/config/webpack.common.config.js +++ b/config/webpack.common.config.js @@ -12,11 +12,6 @@ module.exports = { alias: { 'env.config': path.resolve(process.cwd(), './env.config'), }, - fallback: { - // This causes the system to return an empty object if it can't find an env.config.js file in - // the application being built. - 'env.config': false, - }, extensions: ['.js', '.jsx', '.ts', '.tsx'], }, ignoreWarnings: [ From f6960d90297b7fe0149b817b5ed8453840e9aa13 Mon Sep 17 00:00:00 2001 From: David Joy Date: Wed, 7 Aug 2024 17:44:45 -0400 Subject: [PATCH 11/90] feat: removing dotenv and purgecss MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Neither dotenv nor purgecss make much sense in the new shell-based architecture. - The shell cannot be purged of CSS because it doesn’t know what will be needed by modules it loads at runtime. - dotenv is no longer an appropriate way to get environment variables into MFEs, as we want to double-down on using the JS file config mechanism because it’s more expressive. We’re also requiring that consumers of frontend-base have an env.config.tsx file in their repo, which removes the need for adding runtime variables to the code via dotenv. --- cli/resolvePrivateEnvConfig.js | 15 - cli/scripts/serve.js | 14 - config/webpack.dev-stage.config.js | 18 - config/webpack.dev.config.js | 18 - config/webpack.prod.config.js | 21 - config/webpack.shell.dev.config.js | 19 - package-lock.json | 104 - package.json | 3 - test-app/package-lock.json | 15606 ++++++++++++++++++++++++++- 9 files changed, 15159 insertions(+), 659 deletions(-) delete mode 100644 cli/resolvePrivateEnvConfig.js diff --git a/cli/resolvePrivateEnvConfig.js b/cli/resolvePrivateEnvConfig.js deleted file mode 100644 index 8c7532a6..00000000 --- a/cli/resolvePrivateEnvConfig.js +++ /dev/null @@ -1,15 +0,0 @@ -// Allow private/local overrides of env vars from .env.development(-stage) for config settings -// that you'd like to persist locally during development, without the risk of checking -// in temporary modifications to .env.development(-stage). - -const fs = require('fs'); -const dotenv = require('dotenv'); - -module.exports = (filePath) => { - if (fs.existsSync(filePath)) { - const privateEnvConfig = dotenv.parse(fs.readFileSync(filePath)); - Object.entries(privateEnvConfig).forEach(([key, value]) => { - process.env[key] = value; - }); - } -}; diff --git a/cli/scripts/serve.js b/cli/scripts/serve.js index 40101da4..14ded3fb 100644 --- a/cli/scripts/serve.js +++ b/cli/scripts/serve.js @@ -2,20 +2,6 @@ const express = require('express'); const path = require('path'); const fs = require('fs'); const chalk = require('chalk'); -const dotenv = require('dotenv'); - -const resolvePrivateEnvConfig = require('../resolvePrivateEnvConfig'); - -// Add process env vars. Currently used only for setting the -// server port and the publicPath -dotenv.config({ - path: path.resolve(process.cwd(), '.env.development'), -}); - -// Allow private/local overrides of env vars from .env.development for config settings -// that you'd like to persist locally during development, without the risk of checking -// in temporary modifications to .env.development. -resolvePrivateEnvConfig('.env.private'); function isDirectoryEmpty(directoryPath) { try { diff --git a/config/webpack.dev-stage.config.js b/config/webpack.dev-stage.config.js index 2cee4b69..41b838e0 100644 --- a/config/webpack.dev-stage.config.js +++ b/config/webpack.dev-stage.config.js @@ -3,8 +3,6 @@ const ImageMinimizerPlugin = require('image-minimizer-webpack-plugin'); const { merge } = require('webpack-merge'); -const Dotenv = require('dotenv-webpack'); -const dotenv = require('dotenv'); const HtmlWebpackPlugin = require('html-webpack-plugin'); const path = require('path'); const PostCssAutoprefixerPlugin = require('autoprefixer'); @@ -14,20 +12,8 @@ const ReactRefreshWebpackPlugin = require('@pmmmwh/react-refresh-webpack-plugin' const { transform } = require('@formatjs/ts-transformer'); const commonConfig = require('./webpack.common.config'); -const resolvePrivateEnvConfig = require('../cli/resolvePrivateEnvConfig'); const getLocalAliases = require('./getLocalAliases'); -// Add process env vars. Currently used only for setting the -// server port and the publicPath -dotenv.config({ - path: path.resolve(process.cwd(), '.env.development-stage'), -}); - -// Allow private/local overrides of env vars from .env.development for config settings -// that you'd like to persist locally during development, without the risk of checking -// in temporary modifications to .env.development. -resolvePrivateEnvConfig('.env.private'); - const aliases = getLocalAliases(); const PUBLIC_PATH = process.env.PUBLIC_PATH || '/'; @@ -164,10 +150,6 @@ module.exports = merge(commonConfig, { OPTIMIZELY_PROJECT_ID: process.env.OPTIMIZELY_PROJECT_ID || null, NODE_ENV: process.env.NODE_ENV || null, }), - new Dotenv({ - path: path.resolve(process.cwd(), '.env.development-stage'), - systemvars: true, - }), new ReactRefreshWebpackPlugin(), ], // This configures webpack-dev-server which serves bundles from memory and provides live diff --git a/config/webpack.dev.config.js b/config/webpack.dev.config.js index b107dca1..5ac9cb09 100644 --- a/config/webpack.dev.config.js +++ b/config/webpack.dev.config.js @@ -3,8 +3,6 @@ const ImageMinimizerPlugin = require('image-minimizer-webpack-plugin'); const { merge } = require('webpack-merge'); -const Dotenv = require('dotenv-webpack'); -const dotenv = require('dotenv'); const HtmlWebpackPlugin = require('html-webpack-plugin'); const path = require('path'); const PostCssAutoprefixerPlugin = require('autoprefixer'); @@ -14,20 +12,8 @@ const ReactRefreshWebpackPlugin = require('@pmmmwh/react-refresh-webpack-plugin' const { transform } = require('@formatjs/ts-transformer'); const commonConfig = require('./webpack.common.config'); -const resolvePrivateEnvConfig = require('../cli/resolvePrivateEnvConfig'); const getLocalAliases = require('./getLocalAliases'); -// Add process env vars. Currently used only for setting the -// server port and the publicPath -dotenv.config({ - path: path.resolve(process.cwd(), '.env.development'), -}); - -// Allow private/local overrides of env vars from .env.development for config settings -// that you'd like to persist locally during development, without the risk of checking -// in temporary modifications to .env.development. -resolvePrivateEnvConfig('.env.private'); - const aliases = getLocalAliases(); const PUBLIC_PATH = process.env.PUBLIC_PATH || '/'; @@ -164,10 +150,6 @@ module.exports = merge(commonConfig, { OPTIMIZELY_PROJECT_ID: process.env.OPTIMIZELY_PROJECT_ID || null, NODE_ENV: process.env.NODE_ENV || null, }), - new Dotenv({ - path: path.resolve(process.cwd(), '.env.development'), - systemvars: true, - }), new ReactRefreshWebpackPlugin(), ], // This configures webpack-dev-server which serves bundles from memory and provides live diff --git a/config/webpack.prod.config.js b/config/webpack.prod.config.js index 74bc2935..1bab859d 100644 --- a/config/webpack.prod.config.js +++ b/config/webpack.prod.config.js @@ -5,8 +5,6 @@ const ImageMinimizerPlugin = require('image-minimizer-webpack-plugin'); const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer'); const { merge } = require('webpack-merge'); const CssNano = require('cssnano'); -const Dotenv = require('dotenv-webpack'); -const dotenv = require('dotenv'); const NewRelicSourceMapPlugin = require('@edx/new-relic-source-map-webpack-plugin'); const HtmlWebpackPlugin = require('html-webpack-plugin'); const MiniCssExtractPlugin = require('mini-css-extract-plugin'); @@ -16,24 +14,10 @@ const PostCssRTLCSS = require('postcss-rtlcss'); const PostCssCustomMediaCSS = require('postcss-custom-media'); const { transform } = require('@formatjs/ts-transformer'); -// Reduce CSS file size by ~70% -const purgecss = require('@fullhuman/postcss-purgecss'); - const getLocalAliases = require('./getLocalAliases'); const HtmlWebpackNewRelicPlugin = require('../cli/plugins/html-webpack-new-relic-plugin'); const commonConfig = require('./webpack.common.config'); -// Add process env vars. Currently used only for setting the PUBLIC_PATH. -dotenv.config({ - path: path.resolve(process.cwd(), '.env'), -}); - -const extraPostCssPlugins = []; -if (process.env.USE_PURGECSS) { // If USE_PURGECSS is set we append it. - extraPostCssPlugins.push(purgecss({ - content: ['./**/*.html', './**/*.js', './**/*.jsx', './**/*.ts', './**/*.tsx'], - })); -} const extraPlugins = []; if (process.env.ENABLE_NEW_RELIC !== 'false') { // Enable NewRelic logging only if the account ID is properly defined @@ -136,7 +120,6 @@ module.exports = merge(commonConfig, { PostCssRTLCSS(), CssNano(), PostCssCustomMediaCSS(), - ...extraPostCssPlugins, ], }, }, @@ -219,10 +202,6 @@ module.exports = merge(commonConfig, { OPTIMIZELY_PROJECT_ID: process.env.OPTIMIZELY_PROJECT_ID || null, NODE_ENV: process.env.NODE_ENV || null, }), - new Dotenv({ - path: path.resolve(process.cwd(), '.env'), - systemvars: true, - }), new BundleAnalyzerPlugin({ analyzerMode: 'static', openAnalyzer: false, diff --git a/config/webpack.shell.dev.config.js b/config/webpack.shell.dev.config.js index 8983a367..f2eafd41 100644 --- a/config/webpack.shell.dev.config.js +++ b/config/webpack.shell.dev.config.js @@ -2,8 +2,6 @@ // time at the expense of creating larger, unoptimized bundles. const ImageMinimizerPlugin = require('image-minimizer-webpack-plugin'); -const Dotenv = require('dotenv-webpack'); -const dotenv = require('dotenv'); const HtmlWebpackPlugin = require('html-webpack-plugin'); const path = require('path'); const PostCssAutoprefixerPlugin = require('autoprefixer'); @@ -11,21 +9,8 @@ const PostCssRTLCSS = require('postcss-rtlcss'); const PostCssCustomMediaCSS = require('postcss-custom-media'); const ReactRefreshWebpackPlugin = require('@pmmmwh/react-refresh-webpack-plugin'); const { transform } = require('@formatjs/ts-transformer'); - -const resolvePrivateEnvConfig = require('../cli/resolvePrivateEnvConfig'); const getLocalAliases = require('./getLocalAliases'); -// Add process env vars. Currently used only for setting the -// server port and the publicPath -dotenv.config({ - path: path.resolve(process.cwd(), '.env.development'), -}); - -// Allow private/local overrides of env vars from .env.development for config settings -// that you'd like to persist locally during development, without the risk of checking -// in temporary modifications to .env.development. -resolvePrivateEnvConfig('.env.private'); - const aliases = getLocalAliases(); const PUBLIC_PATH = process.env.PUBLIC_PATH || '/'; @@ -196,10 +181,6 @@ module.exports = { OPTIMIZELY_PROJECT_ID: process.env.OPTIMIZELY_PROJECT_ID || null, NODE_ENV: process.env.NODE_ENV || null, }), - new Dotenv({ - path: path.resolve(process.cwd(), '.env.development'), - systemvars: true, - }), new ReactRefreshWebpackPlugin(), ], // This configures webpack-dev-server which serves bundles from memory and provides live diff --git a/package-lock.json b/package-lock.json index fa02cd14..cd2f352b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,7 +19,6 @@ "@formatjs/intl-pluralrules": "^4.3.3", "@formatjs/intl-relativetimeformat": "^10.0.1", "@formatjs/ts-transformer": "^3.13.14", - "@fullhuman/postcss-purgecss": "5.0.0", "@module-federation/runtime": "^0.2.6", "@pmmmwh/react-refresh-webpack-plugin": "0.5.15", "@typescript-eslint/eslint-plugin": "^6.21.0", @@ -34,8 +33,6 @@ "clean-webpack-plugin": "4.0.0", "css-loader": "5.2.7", "cssnano": "6.0.3", - "dotenv": "8.6.0", - "dotenv-webpack": "8.0.1", "eslint": "8.44.0", "eslint-config-airbnb": "19.0.4", "eslint-config-airbnb-typescript": "^17.0.0", @@ -2437,17 +2434,6 @@ "react": ">=16.x" } }, - "node_modules/@fullhuman/postcss-purgecss": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@fullhuman/postcss-purgecss/-/postcss-purgecss-5.0.0.tgz", - "integrity": "sha512-onDS/b/2pMRzqSoj4qOs2tYFmOpaspjTAgvACIHMPiicu1ptajiBruTrjBzTKdxWdX0ldaBb7wj8nEaTLyFkJw==", - "dependencies": { - "purgecss": "^5.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.14", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", @@ -6542,36 +6528,6 @@ "tslib": "^2.0.3" } }, - "node_modules/dotenv": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", - "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==", - "engines": { - "node": ">=10" - } - }, - "node_modules/dotenv-defaults": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dotenv-defaults/-/dotenv-defaults-2.0.2.tgz", - "integrity": "sha512-iOIzovWfsUHU91L5i8bJce3NYK5JXeAwH50Jh6+ARUdLiiGlYWfGw6UkzsYqaXZH/hjE/eCd/PlfM/qqyK0AMg==", - "dependencies": { - "dotenv": "^8.2.0" - } - }, - "node_modules/dotenv-webpack": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/dotenv-webpack/-/dotenv-webpack-8.0.1.tgz", - "integrity": "sha512-CdrgfhZOnx4uB18SgaoP9XHRN2v48BbjuXQsZY5ixs5A8579NxQkmMxRtI7aTwSiSQcM2ao12Fdu+L3ZS3bG4w==", - "dependencies": { - "dotenv-defaults": "^2.0.2" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "webpack": "^4 || ^5" - } - }, "node_modules/duplexer": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", @@ -12852,66 +12808,6 @@ } ] }, - "node_modules/purgecss": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/purgecss/-/purgecss-5.0.0.tgz", - "integrity": "sha512-RAnuxrGuVyLLTr8uMbKaxDRGWMgK5CCYDfRyUNNcaz5P3kGgD2b7ymQGYEyo2ST7Tl/ScwFgf5l3slKMxHSbrw==", - "dependencies": { - "commander": "^9.0.0", - "glob": "^8.0.3", - "postcss": "^8.4.4", - "postcss-selector-parser": "^6.0.7" - }, - "bin": { - "purgecss": "bin/purgecss.js" - } - }, - "node_modules/purgecss/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/purgecss/node_modules/commander": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", - "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", - "engines": { - "node": "^12.20.0 || >=14" - } - }, - "node_modules/purgecss/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/purgecss/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/qs": { "version": "6.11.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", diff --git a/package.json b/package.json index 2dc41ffb..da26f25f 100644 --- a/package.json +++ b/package.json @@ -54,7 +54,6 @@ "@formatjs/intl-pluralrules": "^4.3.3", "@formatjs/intl-relativetimeformat": "^10.0.1", "@formatjs/ts-transformer": "^3.13.14", - "@fullhuman/postcss-purgecss": "5.0.0", "@module-federation/runtime": "^0.2.6", "@pmmmwh/react-refresh-webpack-plugin": "0.5.15", "@typescript-eslint/eslint-plugin": "^6.21.0", @@ -69,8 +68,6 @@ "clean-webpack-plugin": "4.0.0", "css-loader": "5.2.7", "cssnano": "6.0.3", - "dotenv": "8.6.0", - "dotenv-webpack": "8.0.1", "eslint": "8.44.0", "eslint-config-airbnb": "19.0.4", "eslint-config-airbnb-typescript": "^17.0.0", diff --git a/test-app/package-lock.json b/test-app/package-lock.json index bc19f127..a2b7761e 100644 --- a/test-app/package-lock.json +++ b/test-app/package-lock.json @@ -36,22 +36,20 @@ "@formatjs/intl-pluralrules": "^4.3.3", "@formatjs/intl-relativetimeformat": "^10.0.1", "@formatjs/ts-transformer": "^3.13.14", - "@fullhuman/postcss-purgecss": "5.0.0", "@module-federation/runtime": "^0.2.6", "@pmmmwh/react-refresh-webpack-plugin": "0.5.15", - "@typescript-eslint/eslint-plugin": "^5.58.0", - "@typescript-eslint/parser": "^5.58.0", + "@typescript-eslint/eslint-plugin": "^6.21.0", + "@typescript-eslint/parser": "^6.21.0", "autoprefixer": "10.4.19", "axios": "^0.28.1", "axios-cache-interceptor": "^0.10.7", "babel-jest": "^29.7.0", "babel-plugin-formatjs": "^10.5.16", "chalk": "4.1.2", + "classnames": "^2.5.1", "clean-webpack-plugin": "4.0.0", "css-loader": "5.2.7", "cssnano": "6.0.3", - "dotenv": "8.6.0", - "dotenv-webpack": "8.0.1", "eslint": "8.44.0", "eslint-config-airbnb": "19.0.4", "eslint-config-airbnb-typescript": "^17.0.0", @@ -75,6 +73,7 @@ "localforage": "^1.10.0", "localforage-memoryStorageDriver": "^0.9.2", "lodash.camelcase": "^4.3.0", + "lodash.isempty": "^4.4.0", "lodash.memoize": "^4.1.2", "lodash.merge": "^4.6.2", "lodash.snakecase": "^4.1.1", @@ -111,6 +110,7 @@ "transifex-utils.js": "dist/cli/scripts/transifex-utils.js" }, "devDependencies": { + "@testing-library/dom": "^8.20.1", "@testing-library/jest-dom": "^6.4.6", "@testing-library/react": "^12.1.5", "@testing-library/react-hooks": "^8.0.1", @@ -132,118 +132,15002 @@ "redux": "^4.2.1" } }, - "../../openedx-frontend-base-1.0.0": { - "name": "@openedx/frontend-base", + "../node_modules/@adobe/css-tools": { + "version": "4.4.0", + "dev": true, + "license": "MIT" + }, + "../node_modules/@ampproject/remapping": { + "version": "2.3.0", + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "../node_modules/@babel/code-frame": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "../node_modules/@babel/compat-data": { + "version": "7.24.9", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "../node_modules/@babel/core": { + "version": "7.24.9", + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.24.9", + "@babel/helper-compilation-targets": "^7.24.8", + "@babel/helper-module-transforms": "^7.24.9", + "@babel/helpers": "^7.24.8", + "@babel/parser": "^7.24.8", + "@babel/template": "^7.24.7", + "@babel/traverse": "^7.24.8", + "@babel/types": "^7.24.9", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "../node_modules/@babel/generator": { + "version": "7.24.10", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.24.9", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "../node_modules/@babel/helper-annotate-as-pure": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "../node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "../node_modules/@babel/helper-compilation-targets": { + "version": "7.24.8", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.24.8", + "@babel/helper-validator-option": "^7.24.8", + "browserslist": "^4.23.1", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "../node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.24.8", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-member-expression-to-functions": "^7.24.8", + "@babel/helper-optimise-call-expression": "^7.24.7", + "@babel/helper-replace-supers": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "../node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "../node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.2", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "../node_modules/@babel/helper-environment-visitor": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "../node_modules/@babel/helper-function-name": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "../node_modules/@babel/helper-hoist-variables": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "../node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.24.8", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.24.8", + "@babel/types": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "../node_modules/@babel/helper-module-imports": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "../node_modules/@babel/helper-module-transforms": { + "version": "7.24.9", + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "../node_modules/@babel/helper-optimise-call-expression": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "../node_modules/@babel/helper-plugin-utils": { + "version": "7.24.8", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "../node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-wrap-function": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "../node_modules/@babel/helper-replace-supers": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-member-expression-to-functions": "^7.24.7", + "@babel/helper-optimise-call-expression": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "../node_modules/@babel/helper-simple-access": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "../node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "../node_modules/@babel/helper-split-export-declaration": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "../node_modules/@babel/helper-string-parser": { + "version": "7.24.8", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "../node_modules/@babel/helper-validator-identifier": { + "version": "7.24.7", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "../node_modules/@babel/helper-validator-option": { + "version": "7.24.8", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "../node_modules/@babel/helper-wrap-function": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-function-name": "^7.24.7", + "@babel/template": "^7.24.7", + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "../node_modules/@babel/helpers": { + "version": "7.24.8", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.24.7", + "@babel/types": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "../node_modules/@babel/highlight": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.24.7", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "../node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "../node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "../node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "../node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "license": "MIT" + }, + "../node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "../node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "../node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "../node_modules/@babel/parser": { + "version": "7.24.8", + "license": "MIT", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "../node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "../node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "../node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "../node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "../node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "../node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "../node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "../node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "../node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "../node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "../node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "../node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "../node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "../node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "../node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "../node_modules/@babel/plugin-syntax-jsx": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "../node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "../node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "../node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "../node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "../node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "../node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "../node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "../node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "../node_modules/@babel/plugin-syntax-typescript": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "../node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "../node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "../node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-remap-async-to-generator": "^7.24.7", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "../node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-remap-async-to-generator": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "../node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "../node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "../node_modules/@babel/plugin-transform-class-properties": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "../node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "../node_modules/@babel/plugin-transform-classes": { + "version": "7.24.8", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-compilation-targets": "^7.24.8", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-replace-supers": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "../node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/template": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "../node_modules/@babel/plugin-transform-destructuring": { + "version": "7.24.8", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "../node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "../node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "../node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "../node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "../node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "../node_modules/@babel/plugin-transform-for-of": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "../node_modules/@babel/plugin-transform-function-name": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "../node_modules/@babel/plugin-transform-json-strings": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "../node_modules/@babel/plugin-transform-literals": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "../node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "../node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "../node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "../node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.24.8", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.24.8", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-simple-access": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "../node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-hoist-variables": "^7.24.7", + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "../node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "../node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "../node_modules/@babel/plugin-transform-new-target": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "../node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "../node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "../node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "../node_modules/@babel/plugin-transform-object-super": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-replace-supers": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "../node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "../node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.24.8", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "../node_modules/@babel/plugin-transform-parameters": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "../node_modules/@babel/plugin-transform-private-methods": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "../node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "../node_modules/@babel/plugin-transform-property-literals": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "../node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "../node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-jsx": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "../node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "../node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "../node_modules/@babel/plugin-transform-regenerator": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "regenerator-transform": "^0.15.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "../node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "../node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "../node_modules/@babel/plugin-transform-spread": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "../node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "../node_modules/@babel/plugin-transform-template-literals": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "../node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.24.8", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "../node_modules/@babel/plugin-transform-typescript": { + "version": "7.24.8", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-create-class-features-plugin": "^7.24.8", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/plugin-syntax-typescript": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "../node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "../node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "../node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "../node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "../node_modules/@babel/preset-env": { + "version": "7.24.8", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.24.8", + "@babel/helper-compilation-targets": "^7.24.8", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-validator-option": "^7.24.8", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.7", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.7", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.7", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.7", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.24.7", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.24.7", + "@babel/plugin-transform-async-generator-functions": "^7.24.7", + "@babel/plugin-transform-async-to-generator": "^7.24.7", + "@babel/plugin-transform-block-scoped-functions": "^7.24.7", + "@babel/plugin-transform-block-scoping": "^7.24.7", + "@babel/plugin-transform-class-properties": "^7.24.7", + "@babel/plugin-transform-class-static-block": "^7.24.7", + "@babel/plugin-transform-classes": "^7.24.8", + "@babel/plugin-transform-computed-properties": "^7.24.7", + "@babel/plugin-transform-destructuring": "^7.24.8", + "@babel/plugin-transform-dotall-regex": "^7.24.7", + "@babel/plugin-transform-duplicate-keys": "^7.24.7", + "@babel/plugin-transform-dynamic-import": "^7.24.7", + "@babel/plugin-transform-exponentiation-operator": "^7.24.7", + "@babel/plugin-transform-export-namespace-from": "^7.24.7", + "@babel/plugin-transform-for-of": "^7.24.7", + "@babel/plugin-transform-function-name": "^7.24.7", + "@babel/plugin-transform-json-strings": "^7.24.7", + "@babel/plugin-transform-literals": "^7.24.7", + "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", + "@babel/plugin-transform-member-expression-literals": "^7.24.7", + "@babel/plugin-transform-modules-amd": "^7.24.7", + "@babel/plugin-transform-modules-commonjs": "^7.24.8", + "@babel/plugin-transform-modules-systemjs": "^7.24.7", + "@babel/plugin-transform-modules-umd": "^7.24.7", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", + "@babel/plugin-transform-new-target": "^7.24.7", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", + "@babel/plugin-transform-numeric-separator": "^7.24.7", + "@babel/plugin-transform-object-rest-spread": "^7.24.7", + "@babel/plugin-transform-object-super": "^7.24.7", + "@babel/plugin-transform-optional-catch-binding": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.8", + "@babel/plugin-transform-parameters": "^7.24.7", + "@babel/plugin-transform-private-methods": "^7.24.7", + "@babel/plugin-transform-private-property-in-object": "^7.24.7", + "@babel/plugin-transform-property-literals": "^7.24.7", + "@babel/plugin-transform-regenerator": "^7.24.7", + "@babel/plugin-transform-reserved-words": "^7.24.7", + "@babel/plugin-transform-shorthand-properties": "^7.24.7", + "@babel/plugin-transform-spread": "^7.24.7", + "@babel/plugin-transform-sticky-regex": "^7.24.7", + "@babel/plugin-transform-template-literals": "^7.24.7", + "@babel/plugin-transform-typeof-symbol": "^7.24.8", + "@babel/plugin-transform-unicode-escapes": "^7.24.7", + "@babel/plugin-transform-unicode-property-regex": "^7.24.7", + "@babel/plugin-transform-unicode-regex": "^7.24.7", + "@babel/plugin-transform-unicode-sets-regex": "^7.24.7", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.4", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "core-js-compat": "^3.37.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "../node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "../node_modules/@babel/preset-react": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-validator-option": "^7.24.7", + "@babel/plugin-transform-react-display-name": "^7.24.7", + "@babel/plugin-transform-react-jsx": "^7.24.7", + "@babel/plugin-transform-react-jsx-development": "^7.24.7", + "@babel/plugin-transform-react-pure-annotations": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "../node_modules/@babel/preset-typescript": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-validator-option": "^7.24.7", + "@babel/plugin-syntax-jsx": "^7.24.7", + "@babel/plugin-transform-modules-commonjs": "^7.24.7", + "@babel/plugin-transform-typescript": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "../node_modules/@babel/regjsgen": { + "version": "0.8.0", + "license": "MIT" + }, + "../node_modules/@babel/runtime": { + "version": "7.24.8", + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "../node_modules/@babel/runtime-corejs3": { + "version": "7.24.8", + "license": "MIT", + "peer": true, + "dependencies": { + "core-js-pure": "^3.30.2", + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "../node_modules/@babel/template": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "../node_modules/@babel/traverse": { + "version": "7.24.8", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.24.8", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-hoist-variables": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/parser": "^7.24.8", + "@babel/types": "^7.24.8", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "../node_modules/@babel/types": { + "version": "7.24.9", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "../node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "license": "MIT" + }, + "../node_modules/@cospired/i18n-iso-languages": { + "version": "4.2.0", + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "../node_modules/@csstools/cascade-layer-name-parser": { + "version": "1.0.13", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^2.7.1", + "@csstools/css-tokenizer": "^2.4.1" + } + }, + "../node_modules/@csstools/css-parser-algorithms": { + "version": "2.7.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^2.4.1" + } + }, + "../node_modules/@csstools/css-tokenizer": { + "version": "2.4.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18" + } + }, + "../node_modules/@csstools/media-query-list-parser": { + "version": "2.1.13", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^2.7.1", + "@csstools/css-tokenizer": "^2.4.1" + } + }, + "../node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "../node_modules/@edx/new-relic-source-map-webpack-plugin": { + "version": "2.1.0", + "license": "AGPL-3.0", + "dependencies": { + "@newrelic/publish-sourcemap": "^5.0.1" + } + }, + "../node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "../node_modules/@eslint-community/regexpp": { + "version": "4.11.0", + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "../node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "../node_modules/@eslint/eslintrc/node_modules/argparse": { + "version": "2.0.1", + "license": "Python-2.0" + }, + "../node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "../node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../node_modules/@eslint/js": { + "version": "8.44.0", + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "../node_modules/@formatjs/cli": { + "version": "6.2.12", + "license": "MIT", + "bin": { + "formatjs": "bin/formatjs" + }, + "engines": { + "node": ">= 16" + }, + "peerDependencies": { + "@glimmer/env": "^0.1.7", + "@glimmer/reference": "^0.91.1 || ^0.92.0", + "@glimmer/syntax": "^0.92.0", + "@glimmer/validator": "^0.92.0", + "@vue/compiler-core": "^3.4.0", + "content-tag": "^2.0.1", + "ember-template-recast": "^6.1.4", + "vue": "^3.4.0" + }, + "peerDependenciesMeta": { + "@glimmer/env": { + "optional": true + }, + "@glimmer/reference": { + "optional": true + }, + "@glimmer/syntax": { + "optional": true + }, + "@glimmer/validator": { + "optional": true + }, + "@vue/compiler-core": { + "optional": true + }, + "content-tag": { + "optional": true + }, + "ember-template-recast": { + "optional": true + }, + "vue": { + "optional": true + } + } + }, + "../node_modules/@formatjs/ecma402-abstract": { + "version": "1.11.4", + "license": "MIT", + "dependencies": { + "@formatjs/intl-localematcher": "0.2.25", + "tslib": "^2.1.0" + } + }, + "../node_modules/@formatjs/fast-memoize": { + "version": "2.2.0", + "license": "MIT", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "../node_modules/@formatjs/icu-messageformat-parser": { + "version": "2.7.8", + "license": "MIT", + "dependencies": { + "@formatjs/ecma402-abstract": "2.0.0", + "@formatjs/icu-skeleton-parser": "1.8.2", + "tslib": "^2.4.0" + } + }, + "../node_modules/@formatjs/icu-messageformat-parser/node_modules/@formatjs/ecma402-abstract": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "@formatjs/intl-localematcher": "0.5.4", + "tslib": "^2.4.0" + } + }, + "../node_modules/@formatjs/icu-messageformat-parser/node_modules/@formatjs/intl-localematcher": { + "version": "0.5.4", + "license": "MIT", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "../node_modules/@formatjs/icu-skeleton-parser": { + "version": "1.8.2", + "license": "MIT", + "dependencies": { + "@formatjs/ecma402-abstract": "2.0.0", + "tslib": "^2.4.0" + } + }, + "../node_modules/@formatjs/icu-skeleton-parser/node_modules/@formatjs/ecma402-abstract": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "@formatjs/intl-localematcher": "0.5.4", + "tslib": "^2.4.0" + } + }, + "../node_modules/@formatjs/icu-skeleton-parser/node_modules/@formatjs/intl-localematcher": { + "version": "0.5.4", + "license": "MIT", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "../node_modules/@formatjs/intl": { + "version": "2.10.4", + "license": "MIT", + "dependencies": { + "@formatjs/ecma402-abstract": "2.0.0", + "@formatjs/fast-memoize": "2.2.0", + "@formatjs/icu-messageformat-parser": "2.7.8", + "@formatjs/intl-displaynames": "6.6.8", + "@formatjs/intl-listformat": "7.5.7", + "intl-messageformat": "10.5.14", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "typescript": "^4.7 || 5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "../node_modules/@formatjs/intl-displaynames": { + "version": "6.6.8", + "license": "MIT", + "dependencies": { + "@formatjs/ecma402-abstract": "2.0.0", + "@formatjs/intl-localematcher": "0.5.4", + "tslib": "^2.4.0" + } + }, + "../node_modules/@formatjs/intl-displaynames/node_modules/@formatjs/ecma402-abstract": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "@formatjs/intl-localematcher": "0.5.4", + "tslib": "^2.4.0" + } + }, + "../node_modules/@formatjs/intl-displaynames/node_modules/@formatjs/intl-localematcher": { + "version": "0.5.4", + "license": "MIT", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "../node_modules/@formatjs/intl-listformat": { + "version": "7.5.7", + "license": "MIT", + "dependencies": { + "@formatjs/ecma402-abstract": "2.0.0", + "@formatjs/intl-localematcher": "0.5.4", + "tslib": "^2.4.0" + } + }, + "../node_modules/@formatjs/intl-listformat/node_modules/@formatjs/ecma402-abstract": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "@formatjs/intl-localematcher": "0.5.4", + "tslib": "^2.4.0" + } + }, + "../node_modules/@formatjs/intl-listformat/node_modules/@formatjs/intl-localematcher": { + "version": "0.5.4", + "license": "MIT", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "../node_modules/@formatjs/intl-localematcher": { + "version": "0.2.25", + "license": "MIT", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "../node_modules/@formatjs/intl-pluralrules": { + "version": "4.3.3", + "license": "MIT", + "dependencies": { + "@formatjs/ecma402-abstract": "1.11.4", + "@formatjs/intl-localematcher": "0.2.25", + "tslib": "^2.1.0" + } + }, + "../node_modules/@formatjs/intl-relativetimeformat": { + "version": "10.0.1", + "license": "MIT", + "dependencies": { + "@formatjs/ecma402-abstract": "1.11.4", + "@formatjs/intl-localematcher": "0.2.25", + "tslib": "^2.1.0" + } + }, + "../node_modules/@formatjs/intl/node_modules/@formatjs/ecma402-abstract": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "@formatjs/intl-localematcher": "0.5.4", + "tslib": "^2.4.0" + } + }, + "../node_modules/@formatjs/intl/node_modules/@formatjs/intl-localematcher": { + "version": "0.5.4", + "license": "MIT", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "../node_modules/@formatjs/ts-transformer": { + "version": "3.13.14", + "license": "MIT", + "dependencies": { + "@formatjs/icu-messageformat-parser": "2.7.8", + "@types/json-stable-stringify": "^1.0.32", + "@types/node": "14 || 16 || 17", + "chalk": "^4.0.0", + "json-stable-stringify": "^1.0.1", + "tslib": "^2.4.0", + "typescript": "5" + }, + "peerDependencies": { + "ts-jest": ">=27" + }, + "peerDependenciesMeta": { + "ts-jest": { + "optional": true + } + } + }, + "../node_modules/@fortawesome/fontawesome-common-types": { + "version": "6.6.0", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "../node_modules/@fortawesome/fontawesome-svg-core": { + "version": "6.6.0", + "license": "MIT", + "peer": true, + "dependencies": { + "@fortawesome/fontawesome-common-types": "6.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "../node_modules/@fortawesome/react-fontawesome": { + "version": "0.1.19", + "license": "MIT", + "peer": true, + "dependencies": { + "prop-types": "^15.8.1" + }, + "peerDependencies": { + "@fortawesome/fontawesome-svg-core": "~1 || ~6", + "react": ">=16.x" + } + }, + "../node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "../node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "../node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "license": "BSD-3-Clause" + }, + "../node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "license": "ISC", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "../node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../node_modules/@jest/console": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "../node_modules/@jest/core": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "../node_modules/@jest/core/node_modules/ansi-styles": { + "version": "5.2.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "../node_modules/@jest/core/node_modules/pretty-format": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "../node_modules/@jest/core/node_modules/react-is": { + "version": "18.3.1", + "license": "MIT" + }, + "../node_modules/@jest/environment": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "../node_modules/@jest/expect": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "../node_modules/@jest/expect-utils": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "../node_modules/@jest/fake-timers": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "../node_modules/@jest/globals": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "../node_modules/@jest/reporters": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "../node_modules/@jest/reporters/node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "../node_modules/@jest/reporters/node_modules/semver": { + "version": "7.6.3", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "../node_modules/@jest/schemas": { + "version": "29.6.3", + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "../node_modules/@jest/source-map": { + "version": "29.6.3", + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "../node_modules/@jest/test-result": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "../node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "../node_modules/@jest/transform": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "../node_modules/@jest/types": { + "version": "29.6.3", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "../node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "../node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "../node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "../node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "../node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "license": "MIT" + }, + "../node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "../node_modules/@jsdoc/salty": { + "version": "0.2.8", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "lodash": "^4.17.21" + }, + "engines": { + "node": ">=v12.0.0" + } + }, + "../node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.5", + "license": "MIT" + }, + "../node_modules/@module-federation/runtime": { + "version": "0.2.8", + "license": "MIT", + "dependencies": { + "@module-federation/sdk": "0.2.8" + } + }, + "../node_modules/@module-federation/sdk": { + "version": "0.2.8", + "license": "MIT" + }, + "../node_modules/@newrelic/publish-sourcemap": { + "version": "5.1.0", + "license": "New Relic proprietary", + "dependencies": { + "superagent": "^3.4.1", + "yargs": "^16.0.3" + }, + "bin": { + "delete-sourcemap": "scripts/delete-cli.js", + "list-sourcemaps": "scripts/list-cli.js", + "publish-sourcemap": "scripts/publish-cli.js" + } + }, + "../node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "../node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "../node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "../node_modules/@openedx/paragon": { + "version": "22.7.0", + "license": "Apache-2.0", + "peer": true, + "workspaces": [ + "example", + "component-generator", + "www", + "icons", + "dependent-usage-analyzer" + ], + "dependencies": { + "@fortawesome/fontawesome-svg-core": "^6.1.1", + "@fortawesome/react-fontawesome": "^0.1.18", + "@popperjs/core": "^2.11.4", + "bootstrap": "^4.6.2", + "chalk": "^4.1.2", + "child_process": "^1.0.2", + "classnames": "^2.3.1", + "email-prop-type": "^3.0.0", + "file-selector": "^0.6.0", + "font-awesome": "^4.7.0", + "glob": "^8.0.3", + "inquirer": "^8.2.5", + "lodash.uniqby": "^4.7.0", + "mailto-link": "^2.0.0", + "prop-types": "^15.8.1", + "react-bootstrap": "^1.6.5", + "react-colorful": "^5.6.1", + "react-dropzone": "^14.2.1", + "react-focus-on": "^3.5.4", + "react-imask": "^7.1.3", + "react-loading-skeleton": "^3.1.0", + "react-popper": "^2.2.5", + "react-proptype-conditional-require": "^1.0.4", + "react-responsive": "^8.2.0", + "react-table": "^7.7.0", + "react-transition-group": "^4.4.2", + "tabbable": "^5.3.3", + "uncontrollable": "^7.2.1", + "uuid": "^9.0.0" + }, + "bin": { + "paragon": "bin/paragon-scripts.js" + }, + "peerDependencies": { + "react": "^16.8.6 || ^17.0.0", + "react-dom": "^16.8.6 || ^17.0.0", + "react-intl": "^5.25.1 || ^6.4.0" + } + }, + "../node_modules/@openedx/paragon/node_modules/brace-expansion": { + "version": "2.0.1", + "license": "MIT", + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "../node_modules/@openedx/paragon/node_modules/glob": { + "version": "8.1.0", + "license": "ISC", + "peer": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "../node_modules/@openedx/paragon/node_modules/matchmediaquery": { + "version": "0.3.1", + "license": "MIT", + "peer": true, + "dependencies": { + "css-mediaquery": "^0.1.2" + } + }, + "../node_modules/@openedx/paragon/node_modules/minimatch": { + "version": "5.1.6", + "license": "ISC", + "peer": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "../node_modules/@openedx/paragon/node_modules/react-responsive": { + "version": "8.2.0", + "license": "MIT", + "peer": true, + "dependencies": { + "hyphenate-style-name": "^1.0.0", + "matchmediaquery": "^0.3.0", + "prop-types": "^15.6.1", + "shallow-equal": "^1.1.0" + }, + "engines": { + "node": ">= 0.10" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "../node_modules/@openedx/paragon/node_modules/shallow-equal": { + "version": "1.2.1", + "license": "MIT", + "peer": true + }, + "../node_modules/@pmmmwh/react-refresh-webpack-plugin": { + "version": "0.5.15", + "license": "MIT", + "dependencies": { + "ansi-html": "^0.0.9", + "core-js-pure": "^3.23.3", + "error-stack-parser": "^2.0.6", + "html-entities": "^2.1.0", + "loader-utils": "^2.0.4", + "schema-utils": "^4.2.0", + "source-map": "^0.7.3" + }, + "engines": { + "node": ">= 10.13" + }, + "peerDependencies": { + "@types/webpack": "4.x || 5.x", + "react-refresh": ">=0.10.0 <1.0.0", + "sockjs-client": "^1.4.0", + "type-fest": ">=0.17.0 <5.0.0", + "webpack": ">=4.43.0 <6.0.0", + "webpack-dev-server": "3.x || 4.x || 5.x", + "webpack-hot-middleware": "2.x", + "webpack-plugin-serve": "0.x || 1.x" + }, + "peerDependenciesMeta": { + "@types/webpack": { + "optional": true + }, + "sockjs-client": { + "optional": true + }, + "type-fest": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + }, + "webpack-hot-middleware": { + "optional": true + }, + "webpack-plugin-serve": { + "optional": true + } + } + }, + "../node_modules/@polka/url": { + "version": "1.0.0-next.25", + "license": "MIT" + }, + "../node_modules/@popperjs/core": { + "version": "2.11.8", + "license": "MIT", + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "../node_modules/@remix-run/router": { + "version": "1.18.0", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=14.0.0" + } + }, + "../node_modules/@restart/context": { + "version": "2.1.4", + "license": "MIT", + "peer": true, + "peerDependencies": { + "react": ">=16.3.2" + } + }, + "../node_modules/@restart/hooks": { + "version": "0.4.16", + "license": "MIT", + "peer": true, + "dependencies": { + "dequal": "^2.0.3" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "../node_modules/@sinclair/typebox": { + "version": "0.27.8", + "license": "MIT" + }, + "../node_modules/@sinonjs/commons": { + "version": "3.0.1", + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "../node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "../node_modules/@testing-library/dom": { + "version": "8.20.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.1.3", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=12" + } + }, + "../node_modules/@testing-library/dom/node_modules/aria-query": { + "version": "5.1.3", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "deep-equal": "^2.0.5" + } + }, + "../node_modules/@testing-library/dom/node_modules/dom-accessibility-api": { + "version": "0.5.16", + "dev": true, + "license": "MIT" + }, + "../node_modules/@testing-library/jest-dom": { + "version": "6.4.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@adobe/css-tools": "^4.4.0", + "@babel/runtime": "^7.9.2", + "aria-query": "^5.0.0", + "chalk": "^3.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.6.3", + "lodash": "^4.17.21", + "redent": "^3.0.0" + }, + "engines": { + "node": ">=14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "../node_modules/@testing-library/jest-dom/node_modules/chalk": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "../node_modules/@testing-library/react": { + "version": "12.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5", + "@testing-library/dom": "^8.0.0", + "@types/react-dom": "<18.0.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "react": "<18.0.0", + "react-dom": "<18.0.0" + } + }, + "../node_modules/@testing-library/react-hooks": { + "version": "8.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5", + "react-error-boundary": "^3.1.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "@types/react": "^16.9.0 || ^17.0.0", + "react": "^16.9.0 || ^17.0.0", + "react-dom": "^16.9.0 || ^17.0.0", + "react-test-renderer": "^16.9.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "react-test-renderer": { + "optional": true + } + } + }, + "../node_modules/@tootallnate/once": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "../node_modules/@trysound/sax": { + "version": "0.2.0", + "license": "ISC", + "engines": { + "node": ">=10.13.0" + } + }, + "../node_modules/@types/aria-query": { + "version": "5.0.4", + "dev": true, + "license": "MIT" + }, + "../node_modules/@types/babel__core": { + "version": "7.20.5", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "../node_modules/@types/babel__generator": { + "version": "7.6.8", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "../node_modules/@types/babel__helper-plugin-utils": { + "version": "7.10.3", + "license": "MIT", + "dependencies": { + "@types/babel__core": "*" + } + }, + "../node_modules/@types/babel__template": { + "version": "7.4.4", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "../node_modules/@types/babel__traverse": { + "version": "7.20.6", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "../node_modules/@types/body-parser": { + "version": "1.19.5", + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "../node_modules/@types/bonjour": { + "version": "3.5.13", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "../node_modules/@types/connect": { + "version": "3.4.38", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "../node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "license": "MIT", + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "../node_modules/@types/cookie": { + "version": "0.3.3", + "license": "MIT" + }, + "../node_modules/@types/eslint": { + "version": "8.56.11", + "license": "MIT", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "../node_modules/@types/eslint-scope": { + "version": "3.7.7", + "license": "MIT", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "../node_modules/@types/estree": { + "version": "1.0.5", + "license": "MIT" + }, + "../node_modules/@types/express": { + "version": "4.17.21", + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "../node_modules/@types/express-serve-static-core": { + "version": "4.19.5", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "../node_modules/@types/glob": { + "version": "7.2.0", + "license": "MIT", + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "../node_modules/@types/graceful-fs": { + "version": "4.1.9", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "../node_modules/@types/hoist-non-react-statics": { + "version": "3.3.5", + "license": "MIT", + "dependencies": { + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0" + } + }, + "../node_modules/@types/html-minifier-terser": { + "version": "6.1.0", + "license": "MIT" + }, + "../node_modules/@types/http-errors": { + "version": "2.0.4", + "license": "MIT" + }, + "../node_modules/@types/http-proxy": { + "version": "1.17.14", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "../node_modules/@types/invariant": { + "version": "2.2.37", + "license": "MIT", + "peer": true + }, + "../node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "license": "MIT" + }, + "../node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "../node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "../node_modules/@types/jest": { + "version": "29.5.12", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "../node_modules/@types/jest/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "../node_modules/@types/jest/node_modules/pretty-format": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "../node_modules/@types/jest/node_modules/react-is": { + "version": "18.3.1", + "dev": true, + "license": "MIT" + }, + "../node_modules/@types/jsdom": { + "version": "20.0.1", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/tough-cookie": "*", + "parse5": "^7.0.0" + } + }, + "../node_modules/@types/json-schema": { + "version": "7.0.15", + "license": "MIT" + }, + "../node_modules/@types/json-stable-stringify": { + "version": "1.0.36", + "license": "MIT" + }, + "../node_modules/@types/json5": { + "version": "0.0.29", + "license": "MIT" + }, + "../node_modules/@types/linkify-it": { + "version": "5.0.0", + "dev": true, + "license": "MIT" + }, + "../node_modules/@types/markdown-it": { + "version": "14.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/linkify-it": "^5", + "@types/mdurl": "^2" + } + }, + "../node_modules/@types/mdurl": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "../node_modules/@types/mime": { + "version": "1.3.5", + "license": "MIT" + }, + "../node_modules/@types/minimatch": { + "version": "5.1.2", + "license": "MIT" + }, + "../node_modules/@types/node": { + "version": "17.0.45", + "license": "MIT" + }, + "../node_modules/@types/node-forge": { + "version": "1.3.11", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "../node_modules/@types/parse-json": { + "version": "4.0.2", + "license": "MIT" + }, + "../node_modules/@types/picomatch": { + "version": "2.3.4", + "license": "MIT" + }, + "../node_modules/@types/prop-types": { + "version": "15.7.12", + "license": "MIT" + }, + "../node_modules/@types/qs": { + "version": "6.9.15", + "license": "MIT" + }, + "../node_modules/@types/range-parser": { + "version": "1.2.7", + "license": "MIT" + }, + "../node_modules/@types/react": { + "version": "17.0.80", + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "^0.16", + "csstype": "^3.0.2" + } + }, + "../node_modules/@types/react-dom": { + "version": "17.0.25", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@types/react": "^17" + } + }, + "../node_modules/@types/react-transition-group": { + "version": "4.4.10", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/react": "*" + } + }, + "../node_modules/@types/retry": { + "version": "0.12.0", + "license": "MIT" + }, + "../node_modules/@types/scheduler": { + "version": "0.16.8", + "license": "MIT" + }, + "../node_modules/@types/semver": { + "version": "7.5.8", + "license": "MIT" + }, + "../node_modules/@types/send": { + "version": "0.17.4", + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "../node_modules/@types/serve-index": { + "version": "1.9.4", + "license": "MIT", + "dependencies": { + "@types/express": "*" + } + }, + "../node_modules/@types/serve-static": { + "version": "1.15.7", + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" + } + }, + "../node_modules/@types/sockjs": { + "version": "0.3.36", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "../node_modules/@types/stack-utils": { + "version": "2.0.3", + "license": "MIT" + }, + "../node_modules/@types/tough-cookie": { + "version": "4.0.5", + "license": "MIT" + }, + "../node_modules/@types/use-sync-external-store": { + "version": "0.0.3", + "license": "MIT", + "peer": true + }, + "../node_modules/@types/warning": { + "version": "3.0.3", + "license": "MIT", + "peer": true + }, + "../node_modules/@types/ws": { + "version": "8.5.11", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "../node_modules/@types/yargs": { + "version": "17.0.32", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "../node_modules/@types/yargs-parser": { + "version": "21.0.3", + "license": "MIT" + }, + "../node_modules/@typescript-eslint/eslint-plugin": { + "version": "6.21.0", + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/type-utils": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "../node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { + "version": "7.6.3", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "../node_modules/@typescript-eslint/parser": { + "version": "6.21.0", + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "../node_modules/@typescript-eslint/scope-manager": { + "version": "6.21.0", + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "../node_modules/@typescript-eslint/type-utils": { + "version": "6.21.0", + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "../node_modules/@typescript-eslint/types": { + "version": "6.21.0", + "license": "MIT", + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "../node_modules/@typescript-eslint/typescript-estree": { + "version": "6.21.0", + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "../node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "../node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.3", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "../node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.6.3", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "../node_modules/@typescript-eslint/utils": { + "version": "6.21.0", + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "../node_modules/@typescript-eslint/utils/node_modules/semver": { + "version": "7.6.3", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "../node_modules/@typescript-eslint/visitor-keys": { + "version": "6.21.0", + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "../node_modules/@webassemblyjs/ast": { + "version": "1.12.1", + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "../node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "license": "MIT" + }, + "../node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "license": "MIT" + }, + "../node_modules/@webassemblyjs/helper-buffer": { + "version": "1.12.1", + "license": "MIT" + }, + "../node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "license": "MIT", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "../node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "license": "MIT" + }, + "../node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.12.1", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.12.1" + } + }, + "../node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "../node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "../node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "license": "MIT" + }, + "../node_modules/@webassemblyjs/wasm-edit": { + "version": "1.12.1", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" + } + }, + "../node_modules/@webassemblyjs/wasm-gen": { + "version": "1.12.1", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "../node_modules/@webassemblyjs/wasm-opt": { + "version": "1.12.1", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" + } + }, + "../node_modules/@webassemblyjs/wasm-parser": { + "version": "1.12.1", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "../node_modules/@webassemblyjs/wast-printer": { + "version": "1.12.1", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@xtuc/long": "4.2.2" + } + }, + "../node_modules/@webpack-cli/configtest": { + "version": "2.1.1", + "license": "MIT", + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "../node_modules/@webpack-cli/info": { + "version": "2.0.2", + "license": "MIT", + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "../node_modules/@webpack-cli/serve": { + "version": "2.0.5", + "license": "MIT", + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } + }, + "../node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "license": "BSD-3-Clause" + }, + "../node_modules/@xtuc/long": { + "version": "4.2.2", + "license": "Apache-2.0" + }, + "../node_modules/abab": { + "version": "2.0.6", + "license": "BSD-3-Clause" + }, + "../node_modules/accepts": { + "version": "1.3.8", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "../node_modules/acorn": { + "version": "8.12.1", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "../node_modules/acorn-globals": { + "version": "7.0.1", + "license": "MIT", + "dependencies": { + "acorn": "^8.1.0", + "acorn-walk": "^8.0.2" + } + }, + "../node_modules/acorn-import-attributes": { + "version": "1.9.5", + "license": "MIT", + "peerDependencies": { + "acorn": "^8" + } + }, + "../node_modules/acorn-jsx": { + "version": "5.3.2", + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "../node_modules/acorn-walk": { + "version": "8.3.3", + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "../node_modules/address": { + "version": "1.2.2", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "../node_modules/adjust-sourcemap-loader": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "regex-parser": "^2.2.11" + }, + "engines": { + "node": ">=8.9" + } + }, + "../node_modules/agent-base": { + "version": "6.0.2", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "../node_modules/ajv": { + "version": "6.12.6", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "../node_modules/ajv-formats": { + "version": "2.1.1", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "../node_modules/ajv-formats/node_modules/ajv": { + "version": "8.17.1", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "../node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "license": "MIT" + }, + "../node_modules/ajv-keywords": { + "version": "3.5.2", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "../node_modules/ansi-escapes": { + "version": "4.3.2", + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../node_modules/ansi-html": { + "version": "0.0.9", + "engines": [ + "node >= 0.8.0" + ], + "license": "Apache-2.0", + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "../node_modules/ansi-html-community": { + "version": "0.0.8", + "engines": [ + "node >= 0.8.0" + ], + "license": "Apache-2.0", + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "../node_modules/ansi-regex": { + "version": "5.0.1", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../node_modules/ansi-styles": { + "version": "4.3.0", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "../node_modules/anymatch": { + "version": "3.1.3", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "../node_modules/argparse": { + "version": "1.0.10", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "../node_modules/aria-hidden": { + "version": "1.2.4", + "license": "MIT", + "peer": true, + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "../node_modules/aria-query": { + "version": "5.3.0", + "license": "Apache-2.0", + "dependencies": { + "dequal": "^2.0.3" + } + }, + "../node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/array-flatten": { + "version": "1.1.1", + "license": "MIT" + }, + "../node_modules/array-includes": { + "version": "3.1.8", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/array-union": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../node_modules/array-uniq": { + "version": "1.0.3", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../node_modules/array.prototype.flat": { + "version": "1.3.2", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "../node_modules/arraybuffer.prototype.slice": { + "version": "1.0.3", + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/assert-ok": { + "version": "1.0.0", + "license": "MIT", + "peer": true + }, + "../node_modules/ast-types-flow": { + "version": "0.0.7", + "license": "ISC" + }, + "../node_modules/asynckit": { + "version": "0.4.0", + "license": "MIT" + }, + "../node_modules/at-least-node": { + "version": "1.0.0", + "license": "ISC", + "engines": { + "node": ">= 4.0.0" + } + }, + "../node_modules/attr-accept": { + "version": "2.2.2", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "../node_modules/autoprefixer": { + "version": "10.4.19", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-lite": "^1.0.30001599", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "../node_modules/available-typed-arrays": { + "version": "1.0.7", + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/axe-core": { + "version": "4.9.1", + "license": "MPL-2.0", + "engines": { + "node": ">=4" + } + }, + "../node_modules/axios": { + "version": "0.28.1", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "../node_modules/axios-cache-interceptor": { + "version": "0.10.7", + "license": "MIT", + "dependencies": { + "cache-parser": "^1.2.4", + "fast-defer": "^1.1.7", + "object-code": "^1.2.4" + }, + "funding": { + "url": "https://github.com/ArthurFiorette/axios-cache-interceptor?sponsor=1" + } + }, + "../node_modules/axios-mock-adapter": { + "version": "1.22.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "is-buffer": "^2.0.5" + }, + "peerDependencies": { + "axios": ">= 0.17.0" + } + }, + "../node_modules/axobject-query": { + "version": "3.2.4", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "../node_modules/b4a": { + "version": "1.6.6", + "license": "Apache-2.0" + }, + "../node_modules/babel-jest": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "../node_modules/babel-plugin-formatjs": { + "version": "10.5.16", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-jsx": "7", + "@babel/traverse": "7", + "@babel/types": "^7.12.11", + "@formatjs/icu-messageformat-parser": "2.7.8", + "@formatjs/ts-transformer": "3.13.14", + "@types/babel__core": "^7.1.7", + "@types/babel__helper-plugin-utils": "^7.10.0", + "@types/babel__traverse": "^7.1.7", + "tslib": "^2.4.0" + } + }, + "../node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "../node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "../node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.11", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.2", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "../node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.10.4", + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.1", + "core-js-compat": "^3.36.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "../node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.2", + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "../node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "../node_modules/babel-preset-jest": { + "version": "29.6.3", + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "../node_modules/balanced-match": { + "version": "1.0.2", + "license": "MIT" + }, + "../node_modules/bare-events": { + "version": "2.4.2", + "license": "Apache-2.0", + "optional": true + }, + "../node_modules/bare-fs": { + "version": "2.3.1", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-events": "^2.0.0", + "bare-path": "^2.0.0", + "bare-stream": "^2.0.0" + } + }, + "../node_modules/bare-os": { + "version": "2.4.0", + "license": "Apache-2.0", + "optional": true + }, + "../node_modules/bare-path": { + "version": "2.1.3", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-os": "^2.1.0" + } + }, + "../node_modules/bare-stream": { + "version": "2.1.3", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "streamx": "^2.18.0" + } + }, + "../node_modules/base64-js": { + "version": "1.5.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "../node_modules/batch": { + "version": "0.6.1", + "license": "MIT" + }, + "../node_modules/big.js": { + "version": "5.2.2", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "../node_modules/binary-extensions": { + "version": "2.3.0", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../node_modules/bl": { + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "../node_modules/bluebird": { + "version": "3.7.2", + "dev": true, + "license": "MIT" + }, + "../node_modules/body-parser": { + "version": "1.20.2", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "../node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "../node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "../node_modules/bonjour-service": { + "version": "1.2.1", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "../node_modules/boolbase": { + "version": "1.0.0", + "license": "ISC" + }, + "../node_modules/bootstrap": { + "version": "4.6.2", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/twbs" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/bootstrap" + } + ], + "license": "MIT", + "peer": true, + "peerDependencies": { + "jquery": "1.9.1 - 3", + "popper.js": "^1.16.1" + } + }, + "../node_modules/brace-expansion": { + "version": "1.1.11", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "../node_modules/braces": { + "version": "3.0.3", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "../node_modules/browserslist": { + "version": "4.23.2", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001640", + "electron-to-chromium": "^1.4.820", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.1.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "../node_modules/bser": { + "version": "2.1.1", + "license": "Apache-2.0", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "../node_modules/buffer": { + "version": "5.7.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "../node_modules/buffer-from": { + "version": "1.1.2", + "license": "MIT" + }, + "../node_modules/bytes": { + "version": "3.1.2", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "../node_modules/cache-parser": { + "version": "1.2.5", + "license": "MIT" + }, + "../node_modules/call-bind": { + "version": "1.0.7", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/callsites": { + "version": "3.1.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "../node_modules/camel-case": { + "version": "4.1.2", + "license": "MIT", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "../node_modules/camelcase": { + "version": "5.3.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "../node_modules/caniuse-api": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "../node_modules/caniuse-lite": { + "version": "1.0.30001643", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "../node_modules/cast-array": { + "version": "1.0.1", + "license": "MIT", + "peer": true, + "dependencies": { + "isarray": "0.0.1" + } + }, + "../node_modules/cast-array/node_modules/isarray": { + "version": "0.0.1", + "license": "MIT", + "peer": true + }, + "../node_modules/catharsis": { + "version": "0.9.0", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4.17.15" + }, + "engines": { + "node": ">= 10" + } + }, + "../node_modules/chalk": { + "version": "4.1.2", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "../node_modules/char-regex": { + "version": "1.0.2", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "../node_modules/chardet": { + "version": "0.7.0", + "license": "MIT", + "peer": true + }, + "../node_modules/child_process": { + "version": "1.0.2", + "license": "ISC", + "peer": true + }, + "../node_modules/chokidar": { + "version": "3.6.0", + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "../node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "../node_modules/chownr": { + "version": "1.1.4", + "license": "ISC" + }, + "../node_modules/chrome-trace-event": { + "version": "1.0.4", + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "../node_modules/ci-info": { + "version": "3.9.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../node_modules/cjs-module-lexer": { + "version": "1.3.1", + "license": "MIT" + }, + "../node_modules/classnames": { + "version": "2.5.1", + "license": "MIT" + }, + "../node_modules/clean-css": { + "version": "5.3.3", + "license": "MIT", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "../node_modules/clean-css/node_modules/source-map": { + "version": "0.6.1", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "../node_modules/clean-webpack-plugin": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "del": "^4.1.1" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "webpack": ">=4.0.0 <6.0.0" + } + }, + "../node_modules/cli-cursor": { + "version": "3.1.0", + "license": "MIT", + "peer": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "../node_modules/cli-spinners": { + "version": "2.9.2", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../node_modules/cli-width": { + "version": "3.0.0", + "license": "ISC", + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "../node_modules/cliui": { + "version": "7.0.4", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "../node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "../node_modules/clone": { + "version": "1.0.4", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.8" + } + }, + "../node_modules/clone-deep": { + "version": "4.0.1", + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "../node_modules/co": { + "version": "4.6.0", + "license": "MIT", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "../node_modules/collect-v8-coverage": { + "version": "1.0.2", + "license": "MIT" + }, + "../node_modules/color": { + "version": "4.2.3", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, + "../node_modules/color-convert": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "../node_modules/color-name": { + "version": "1.1.4", + "license": "MIT" + }, + "../node_modules/color-string": { + "version": "1.9.1", + "license": "MIT", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "../node_modules/colord": { + "version": "2.9.3", + "license": "MIT" + }, + "../node_modules/colorette": { + "version": "2.0.20", + "license": "MIT" + }, + "../node_modules/combined-stream": { + "version": "1.0.8", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "../node_modules/commander": { + "version": "8.3.0", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "../node_modules/component-emitter": { + "version": "1.3.1", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../node_modules/compressible": { + "version": "2.0.18", + "license": "MIT", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "../node_modules/compression": { + "version": "1.7.4", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "../node_modules/compression/node_modules/bytes": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "../node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "../node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "../node_modules/compression/node_modules/safe-buffer": { + "version": "5.1.2", + "license": "MIT" + }, + "../node_modules/concat-map": { + "version": "0.0.1", + "license": "MIT" + }, + "../node_modules/confusing-browser-globals": { + "version": "1.0.11", + "license": "MIT" + }, + "../node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "../node_modules/content-disposition": { + "version": "0.5.4", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "../node_modules/content-type": { + "version": "1.0.5", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "../node_modules/convert-source-map": { + "version": "2.0.0", + "license": "MIT" + }, + "../node_modules/cookie": { + "version": "0.6.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "../node_modules/cookie-signature": { + "version": "1.0.6", + "license": "MIT" + }, + "../node_modules/cookiejar": { + "version": "2.1.4", + "license": "MIT" + }, + "../node_modules/core-js-compat": { + "version": "3.37.1", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "../node_modules/core-js-pure": { + "version": "3.37.1", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "../node_modules/core-util-is": { + "version": "1.0.3", + "license": "MIT" + }, + "../node_modules/cosmiconfig": { + "version": "8.3.6", + "license": "MIT", + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "../node_modules/cosmiconfig/node_modules/argparse": { + "version": "2.0.1", + "license": "Python-2.0" + }, + "../node_modules/cosmiconfig/node_modules/js-yaml": { + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "../node_modules/create-jest": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "../node_modules/cross-spawn": { + "version": "7.0.3", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "../node_modules/css-declaration-sorter": { + "version": "7.2.0", + "license": "ISC", + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "../node_modules/css-loader": { + "version": "5.2.7", + "license": "MIT", + "dependencies": { + "icss-utils": "^5.1.0", + "loader-utils": "^2.0.0", + "postcss": "^8.2.15", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.1.0", + "schema-utils": "^3.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.27.0 || ^5.0.0" + } + }, + "../node_modules/css-loader/node_modules/schema-utils": { + "version": "3.3.0", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "../node_modules/css-loader/node_modules/semver": { + "version": "7.6.3", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "../node_modules/css-mediaquery": { + "version": "0.1.2", + "license": "BSD" + }, + "../node_modules/css-select": { + "version": "4.3.0", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "../node_modules/css-tree": { + "version": "2.3.1", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "../node_modules/css-what": { + "version": "6.1.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "../node_modules/css.escape": { + "version": "1.5.1", + "dev": true, + "license": "MIT" + }, + "../node_modules/cssesc": { + "version": "3.0.0", + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "../node_modules/cssnano": { + "version": "6.0.3", + "license": "MIT", + "dependencies": { + "cssnano-preset-default": "^6.0.3", + "lilconfig": "^3.0.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "../node_modules/cssnano-preset-default": { + "version": "6.1.2", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "css-declaration-sorter": "^7.2.0", + "cssnano-utils": "^4.0.2", + "postcss-calc": "^9.0.1", + "postcss-colormin": "^6.1.0", + "postcss-convert-values": "^6.1.0", + "postcss-discard-comments": "^6.0.2", + "postcss-discard-duplicates": "^6.0.3", + "postcss-discard-empty": "^6.0.3", + "postcss-discard-overridden": "^6.0.2", + "postcss-merge-longhand": "^6.0.5", + "postcss-merge-rules": "^6.1.1", + "postcss-minify-font-values": "^6.1.0", + "postcss-minify-gradients": "^6.0.3", + "postcss-minify-params": "^6.1.0", + "postcss-minify-selectors": "^6.0.4", + "postcss-normalize-charset": "^6.0.2", + "postcss-normalize-display-values": "^6.0.2", + "postcss-normalize-positions": "^6.0.2", + "postcss-normalize-repeat-style": "^6.0.2", + "postcss-normalize-string": "^6.0.2", + "postcss-normalize-timing-functions": "^6.0.2", + "postcss-normalize-unicode": "^6.1.0", + "postcss-normalize-url": "^6.0.2", + "postcss-normalize-whitespace": "^6.0.2", + "postcss-ordered-values": "^6.0.2", + "postcss-reduce-initial": "^6.1.0", + "postcss-reduce-transforms": "^6.0.2", + "postcss-svgo": "^6.0.3", + "postcss-unique-selectors": "^6.0.4" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "../node_modules/cssnano-utils": { + "version": "4.0.2", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "../node_modules/csso": { + "version": "5.0.5", + "license": "MIT", + "dependencies": { + "css-tree": "~2.2.0" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "../node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "../node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "license": "CC0-1.0" + }, + "../node_modules/cssom": { + "version": "0.5.0", + "license": "MIT" + }, + "../node_modules/cssstyle": { + "version": "2.3.0", + "license": "MIT", + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "../node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "license": "MIT" + }, + "../node_modules/csstype": { + "version": "3.1.3", + "license": "MIT" + }, + "../node_modules/damerau-levenshtein": { + "version": "1.0.8", + "license": "BSD-2-Clause" + }, + "../node_modules/data-urls": { + "version": "3.0.2", + "license": "MIT", + "dependencies": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "../node_modules/data-view-buffer": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/data-view-byte-length": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/data-view-byte-offset": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/debounce": { + "version": "1.2.1", + "license": "MIT" + }, + "../node_modules/debug": { + "version": "4.3.5", + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "../node_modules/decimal.js": { + "version": "10.4.3", + "license": "MIT" + }, + "../node_modules/decode-uri-component": { + "version": "0.2.2", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10" + } + }, + "../node_modules/decompress-response": { + "version": "6.0.0", + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../node_modules/dedent": { + "version": "1.5.3", + "license": "MIT", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "../node_modules/deep-equal": { + "version": "2.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.5", + "es-get-iterator": "^1.1.3", + "get-intrinsic": "^1.2.2", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.2", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/deep-extend": { + "version": "0.6.0", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "../node_modules/deep-is": { + "version": "0.1.4", + "license": "MIT" + }, + "../node_modules/deepmerge": { + "version": "4.3.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../node_modules/default-gateway": { + "version": "6.0.3", + "license": "BSD-2-Clause", + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "../node_modules/defaults": { + "version": "1.0.4", + "license": "MIT", + "peer": true, + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../node_modules/define-data-property": { + "version": "1.1.4", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/define-lazy-prop": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../node_modules/define-properties": { + "version": "1.2.1", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/del": { + "version": "4.1.1", + "license": "MIT", + "dependencies": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + }, + "engines": { + "node": ">=6" + } + }, + "../node_modules/del/node_modules/array-union": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "array-uniq": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "../node_modules/del/node_modules/globby": { + "version": "6.1.0", + "license": "MIT", + "dependencies": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "../node_modules/del/node_modules/globby/node_modules/pify": { + "version": "2.3.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../node_modules/delayed-stream": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "../node_modules/depd": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "../node_modules/dequal": { + "version": "2.0.3", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "../node_modules/destroy": { + "version": "1.2.0", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "../node_modules/detect-libc": { + "version": "2.0.3", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "../node_modules/detect-newline": { + "version": "3.1.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../node_modules/detect-node": { + "version": "2.1.0", + "license": "MIT" + }, + "../node_modules/detect-node-es": { + "version": "1.1.0", + "license": "MIT", + "peer": true + }, + "../node_modules/detect-port-alt": { + "version": "1.1.6", + "license": "MIT", + "dependencies": { + "address": "^1.0.1", + "debug": "^2.6.0" + }, + "bin": { + "detect": "bin/detect-port", + "detect-port": "bin/detect-port" + }, + "engines": { + "node": ">= 4.2.1" + } + }, + "../node_modules/detect-port-alt/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "../node_modules/detect-port-alt/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "../node_modules/diacritics": { + "version": "1.3.0", + "license": "MIT" + }, + "../node_modules/diff-sequences": { + "version": "29.6.3", + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "../node_modules/dir-glob": { + "version": "3.0.1", + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "../node_modules/dns-packet": { + "version": "5.6.1", + "license": "MIT", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "../node_modules/doctrine": { + "version": "3.0.0", + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "../node_modules/dom-accessibility-api": { + "version": "0.6.3", + "dev": true, + "license": "MIT" + }, + "../node_modules/dom-converter": { + "version": "0.2.0", + "license": "MIT", + "dependencies": { + "utila": "~0.4" + } + }, + "../node_modules/dom-helpers": { + "version": "5.2.1", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "../node_modules/dom-serializer": { + "version": "1.4.1", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "../node_modules/dom-serializer/node_modules/entities": { + "version": "2.2.0", + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "../node_modules/domelementtype": { + "version": "2.3.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "../node_modules/domexception": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "../node_modules/domhandler": { + "version": "4.3.1", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "../node_modules/domutils": { + "version": "2.8.0", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "../node_modules/dot-case": { + "version": "3.0.4", + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "../node_modules/duplexer": { + "version": "0.1.2", + "license": "MIT" + }, + "../node_modules/ee-first": { + "version": "1.1.1", + "license": "MIT" + }, + "../node_modules/electron-to-chromium": { + "version": "1.5.0", + "license": "ISC" + }, + "../node_modules/email-prop-type": { + "version": "3.0.1", + "license": "MIT", + "peer": true, + "dependencies": { + "email-validator": "^2.0.4" + } + }, + "../node_modules/email-validator": { + "version": "2.0.4", + "peer": true, + "engines": { + "node": ">4.0" + } + }, + "../node_modules/emittery": { + "version": "0.13.1", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "../node_modules/emoji-regex": { + "version": "10.3.0", + "license": "MIT" + }, + "../node_modules/emojis-list": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "../node_modules/encodeurl": { + "version": "1.0.2", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "../node_modules/end-of-stream": { + "version": "1.4.4", + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "../node_modules/enhanced-resolve": { + "version": "5.17.1", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "../node_modules/entities": { + "version": "4.5.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "../node_modules/envinfo": { + "version": "7.13.0", + "license": "MIT", + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "../node_modules/error-ex": { + "version": "1.3.2", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "../node_modules/error-stack-parser": { + "version": "2.1.4", + "license": "MIT", + "dependencies": { + "stackframe": "^1.3.4" + } + }, + "../node_modules/es-abstract": { + "version": "1.23.3", + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.3", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/es-define-property": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "../node_modules/es-errors": { + "version": "1.3.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "../node_modules/es-get-iterator": { + "version": "1.1.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/es-module-lexer": { + "version": "1.5.4", + "license": "MIT" + }, + "../node_modules/es-object-atoms": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "../node_modules/es-set-tostringtag": { + "version": "2.0.3", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "../node_modules/es-shim-unscopables": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.0" + } + }, + "../node_modules/es-to-primitive": { + "version": "1.2.1", + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/escalade": { + "version": "3.1.2", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "../node_modules/escape-html": { + "version": "1.0.3", + "license": "MIT" + }, + "../node_modules/escape-string-regexp": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../node_modules/escodegen": { + "version": "2.1.0", + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "../node_modules/escodegen/node_modules/source-map": { + "version": "0.6.1", + "license": "BSD-3-Clause", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "../node_modules/eslint": { + "version": "8.44.0", + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.1.0", + "@eslint/js": "8.44.0", + "@humanwhocodes/config-array": "^0.11.10", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.1", + "espree": "^9.6.0", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "../node_modules/eslint-config-airbnb": { + "version": "19.0.4", + "license": "MIT", + "dependencies": { + "eslint-config-airbnb-base": "^15.0.0", + "object.assign": "^4.1.2", + "object.entries": "^1.1.5" + }, + "engines": { + "node": "^10.12.0 || ^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^7.32.0 || ^8.2.0", + "eslint-plugin-import": "^2.25.3", + "eslint-plugin-jsx-a11y": "^6.5.1", + "eslint-plugin-react": "^7.28.0", + "eslint-plugin-react-hooks": "^4.3.0" + } + }, + "../node_modules/eslint-config-airbnb-base": { + "version": "15.0.0", + "license": "MIT", + "dependencies": { + "confusing-browser-globals": "^1.0.10", + "object.assign": "^4.1.2", + "object.entries": "^1.1.5", + "semver": "^6.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "peerDependencies": { + "eslint": "^7.32.0 || ^8.2.0", + "eslint-plugin-import": "^2.25.2" + } + }, + "../node_modules/eslint-config-airbnb-typescript": { + "version": "17.1.0", + "license": "MIT", + "dependencies": { + "eslint-config-airbnb-base": "^15.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^5.13.0 || ^6.0.0", + "@typescript-eslint/parser": "^5.0.0 || ^6.0.0", + "eslint": "^7.32.0 || ^8.2.0", + "eslint-plugin-import": "^2.25.3" + } + }, + "../node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "../node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "../node_modules/eslint-module-utils": { + "version": "2.8.1", + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "../node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "../node_modules/eslint-plugin-formatjs": { + "version": "4.13.3", + "license": "MIT", + "dependencies": { + "@formatjs/icu-messageformat-parser": "2.7.8", + "@formatjs/ts-transformer": "3.13.14", + "@types/eslint": "7 || 8", + "@types/picomatch": "^2.3.0", + "@typescript-eslint/utils": "^6.18.1", + "emoji-regex": "^10.2.1", + "magic-string": "^0.30.0", + "picomatch": "^2.3.1", + "tslib": "2.6.2", + "typescript": "5", + "unicode-emoji-utils": "^1.2.0" + }, + "peerDependencies": { + "eslint": "7 || 8" + } + }, + "../node_modules/eslint-plugin-formatjs/node_modules/tslib": { + "version": "2.6.2", + "license": "0BSD" + }, + "../node_modules/eslint-plugin-import": { + "version": "2.27.5", + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "array.prototype.flatmap": "^1.3.1", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.7", + "eslint-module-utils": "^2.7.4", + "has": "^1.0.3", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.values": "^1.1.6", + "resolve": "^1.22.1", + "semver": "^6.3.0", + "tsconfig-paths": "^3.14.1" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "../node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "../node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "../node_modules/eslint-plugin-jsx-a11y": { + "version": "6.7.1", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.20.7", + "aria-query": "^5.1.3", + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "ast-types-flow": "^0.0.7", + "axe-core": "^4.6.2", + "axobject-query": "^3.1.1", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "has": "^1.0.3", + "jsx-ast-utils": "^3.3.3", + "language-tags": "=1.0.5", + "minimatch": "^3.1.2", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "../node_modules/eslint-plugin-jsx-a11y/node_modules/emoji-regex": { + "version": "9.2.2", + "license": "MIT" + }, + "../node_modules/eslint-plugin-react": { + "version": "7.32.2", + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "array.prototype.tosorted": "^1.1.1", + "doctrine": "^2.1.0", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "object.hasown": "^1.1.2", + "object.values": "^1.1.6", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.4", + "semver": "^6.3.0", + "string.prototype.matchall": "^4.0.8" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "../node_modules/eslint-plugin-react-hooks": { + "version": "4.6.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "../node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "../node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/eslint-scope": { + "version": "5.1.1", + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "../node_modules/eslint-scope/node_modules/estraverse": { + "version": "4.3.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "../node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "../node_modules/eslint/node_modules/argparse": { + "version": "2.0.1", + "license": "Python-2.0" + }, + "../node_modules/eslint/node_modules/eslint-scope": { + "version": "7.2.2", + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "../node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../node_modules/eslint/node_modules/globals": { + "version": "13.24.0", + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../node_modules/eslint/node_modules/js-yaml": { + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "../node_modules/eslint/node_modules/locate-path": { + "version": "6.0.0", + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../node_modules/espree": { + "version": "9.6.1", + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "../node_modules/esprima": { + "version": "4.0.1", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "../node_modules/esquery": { + "version": "1.6.0", + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "../node_modules/esrecurse": { + "version": "4.3.0", + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "../node_modules/estraverse": { + "version": "5.3.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "../node_modules/esutils": { + "version": "2.0.3", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "../node_modules/etag": { + "version": "1.8.1", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "../node_modules/eventemitter3": { + "version": "4.0.7", + "license": "MIT" + }, + "../node_modules/events": { + "version": "3.3.0", + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "../node_modules/execa": { + "version": "5.1.1", + "license": "MIT", + "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" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "../node_modules/exit": { + "version": "0.1.2", + "engines": { + "node": ">= 0.8.0" + } + }, + "../node_modules/expand-template": { + "version": "2.0.3", + "license": "(MIT OR WTFPL)", + "engines": { + "node": ">=6" + } + }, + "../node_modules/expect": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "../node_modules/express": { + "version": "4.19.2", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.6.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "../node_modules/express/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "../node_modules/express/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "../node_modules/extend": { + "version": "3.0.2", + "license": "MIT" + }, + "../node_modules/external-editor": { + "version": "3.1.0", + "license": "MIT", + "peer": true, + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "../node_modules/fast-deep-equal": { + "version": "3.1.3", + "license": "MIT" + }, + "../node_modules/fast-defer": { + "version": "1.1.8", + "license": "MIT" + }, + "../node_modules/fast-fifo": { + "version": "1.3.2", + "license": "MIT" + }, + "../node_modules/fast-glob": { + "version": "3.3.2", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "../node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "../node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "license": "MIT" + }, + "../node_modules/fast-levenshtein": { + "version": "2.0.6", + "license": "MIT" + }, + "../node_modules/fast-uri": { + "version": "3.0.1", + "license": "MIT" + }, + "../node_modules/fastest-levenshtein": { + "version": "1.0.16", + "license": "MIT", + "engines": { + "node": ">= 4.9.1" + } + }, + "../node_modules/fastq": { + "version": "1.17.1", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "../node_modules/faye-websocket": { + "version": "0.11.4", + "license": "Apache-2.0", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "../node_modules/fb-watchman": { + "version": "2.0.2", + "license": "Apache-2.0", + "dependencies": { + "bser": "2.1.1" + } + }, + "../node_modules/figures": { + "version": "3.2.0", + "license": "MIT", + "peer": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../node_modules/figures/node_modules/escape-string-regexp": { + "version": "1.0.5", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.8.0" + } + }, + "../node_modules/file-entry-cache": { + "version": "6.0.1", + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "../node_modules/file-loader": { + "version": "6.2.0", + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "../node_modules/file-loader/node_modules/schema-utils": { + "version": "3.3.0", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "../node_modules/file-selector": { + "version": "0.6.0", + "license": "MIT", + "peer": true, + "dependencies": { + "tslib": "^2.4.0" + }, + "engines": { + "node": ">= 12" + } + }, + "../node_modules/filesize": { + "version": "8.0.7", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 0.4.0" + } + }, + "../node_modules/fill-range": { + "version": "7.1.1", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "../node_modules/filter-obj": { + "version": "1.1.0", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "../node_modules/finalhandler": { + "version": "1.2.0", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "../node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "../node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "../node_modules/find-up": { + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "../node_modules/flat": { + "version": "5.0.2", + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "../node_modules/flat-cache": { + "version": "3.2.0", + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "../node_modules/flat-cache/node_modules/rimraf": { + "version": "3.0.2", + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "../node_modules/flatted": { + "version": "3.3.1", + "license": "ISC" + }, + "../node_modules/focus-lock": { + "version": "1.3.5", + "license": "MIT", + "peer": true, + "dependencies": { + "tslib": "^2.0.3" + }, + "engines": { + "node": ">=10" + } + }, + "../node_modules/follow-redirects": { + "version": "1.15.6", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "../node_modules/font-awesome": { + "version": "4.7.0", + "license": "(OFL-1.1 AND MIT)", + "peer": true, + "engines": { + "node": ">=0.10.3" + } + }, + "../node_modules/for-each": { + "version": "0.3.3", + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "../node_modules/fork-ts-checker-webpack-plugin": { + "version": "6.5.3", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.8.3", + "@types/json-schema": "^7.0.5", + "chalk": "^4.1.0", + "chokidar": "^3.4.2", + "cosmiconfig": "^6.0.0", + "deepmerge": "^4.2.2", + "fs-extra": "^9.0.0", + "glob": "^7.1.6", + "memfs": "^3.1.2", + "minimatch": "^3.0.4", + "schema-utils": "2.7.0", + "semver": "^7.3.2", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=10", + "yarn": ">=1.0.0" + }, + "peerDependencies": { + "eslint": ">= 6", + "typescript": ">= 2.7", + "vue-template-compiler": "*", + "webpack": ">= 4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + }, + "vue-template-compiler": { + "optional": true + } + } + }, + "../node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": { + "version": "6.0.0", + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + }, + "engines": { + "node": ">=8" + } + }, + "../node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { + "version": "2.7.0", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.4", + "ajv": "^6.12.2", + "ajv-keywords": "^3.4.1" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "../node_modules/fork-ts-checker-webpack-plugin/node_modules/semver": { + "version": "7.6.3", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "../node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": { + "version": "1.1.3", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "../node_modules/form-data": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "../node_modules/form-urlencoded": { + "version": "6.1.5", + "license": "MIT" + }, + "../node_modules/formidable": { + "version": "1.2.6", + "license": "MIT", + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" + } + }, + "../node_modules/forwarded": { + "version": "0.2.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "../node_modules/fraction.js": { + "version": "4.3.7", + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "../node_modules/fresh": { + "version": "0.5.2", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "../node_modules/fs-constants": { + "version": "1.0.0", + "license": "MIT" + }, + "../node_modules/fs-extra": { + "version": "9.1.0", + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "../node_modules/fs-monkey": { + "version": "1.0.6", + "license": "Unlicense" + }, + "../node_modules/fs.realpath": { + "version": "1.0.0", + "license": "ISC" + }, + "../node_modules/fsevents": { + "version": "2.3.3", + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "../node_modules/function-bind": { + "version": "1.1.2", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/function.prototype.name": { + "version": "1.1.6", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/functions-have-names": { + "version": "1.2.3", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/gensync": { + "version": "1.0.0-beta.2", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "../node_modules/get-caller-file": { + "version": "2.0.5", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "../node_modules/get-intrinsic": { + "version": "1.2.4", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/get-nonce": { + "version": "1.0.1", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "../node_modules/get-package-type": { + "version": "0.1.0", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "../node_modules/get-stream": { + "version": "6.0.1", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../node_modules/get-symbol-description": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/github-from-package": { + "version": "0.0.0", + "license": "MIT" + }, + "../node_modules/glob": { + "version": "7.2.3", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "../node_modules/glob-parent": { + "version": "6.0.2", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "../node_modules/glob-to-regexp": { + "version": "0.4.1", + "license": "BSD-2-Clause" + }, + "../node_modules/global-modules": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "../node_modules/global-prefix": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "../node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "../node_modules/globals": { + "version": "11.12.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "../node_modules/globalthis": { + "version": "1.0.4", + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/globby": { + "version": "11.1.0", + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../node_modules/gopd": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/graceful-fs": { + "version": "4.2.11", + "license": "ISC" + }, + "../node_modules/graphemer": { + "version": "1.4.0", + "license": "MIT" + }, + "../node_modules/gzip-size": { + "version": "6.0.0", + "license": "MIT", + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../node_modules/handle-thing": { + "version": "2.0.1", + "license": "MIT" + }, + "../node_modules/harmony-reflect": { + "version": "1.6.2", + "license": "(Apache-2.0 OR MPL-1.1)" + }, + "../node_modules/has": { + "version": "1.0.4", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "../node_modules/has-bigints": { + "version": "1.0.2", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/has-flag": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../node_modules/has-property-descriptors": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/has-proto": { + "version": "1.0.3", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/has-symbols": { + "version": "1.0.3", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/has-tostringtag": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/hasown": { + "version": "2.0.2", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "../node_modules/he": { + "version": "1.2.0", + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "../node_modules/history": { + "version": "4.10.1", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^3.0.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^1.0.1" + } + }, + "../node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "../node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "license": "MIT" + }, + "../node_modules/hpack.js": { + "version": "2.1.6", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "../node_modules/hpack.js/node_modules/isarray": { + "version": "1.0.0", + "license": "MIT" + }, + "../node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "../node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "license": "MIT" + }, + "../node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "../node_modules/html-encoding-sniffer": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "../node_modules/html-entities": { + "version": "2.5.2", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ], + "license": "MIT" + }, + "../node_modules/html-escaper": { + "version": "2.0.2", + "license": "MIT" + }, + "../node_modules/html-minifier-terser": { + "version": "6.1.0", + "license": "MIT", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=12" + } + }, + "../node_modules/html-webpack-plugin": { + "version": "5.6.0", + "license": "MIT", + "dependencies": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/html-webpack-plugin" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.20.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "../node_modules/htmlparser2": { + "version": "6.1.0", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "../node_modules/htmlparser2/node_modules/entities": { + "version": "2.2.0", + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "../node_modules/http-deceiver": { + "version": "1.2.7", + "license": "MIT" + }, + "../node_modules/http-errors": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "../node_modules/http-parser-js": { + "version": "0.5.8", + "license": "MIT" + }, + "../node_modules/http-proxy": { + "version": "1.18.1", + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "../node_modules/http-proxy-agent": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "../node_modules/http-proxy-middleware": { + "version": "2.0.6", + "license": "MIT", + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "../node_modules/https-proxy-agent": { + "version": "5.0.1", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "../node_modules/human-signals": { + "version": "2.1.0", + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "../node_modules/hyphenate-style-name": { + "version": "1.1.0", + "license": "BSD-3-Clause" + }, + "../node_modules/i18n-iso-countries": { + "version": "4.3.1", + "license": "MIT", + "dependencies": { + "diacritics": "^1.3.0" + }, + "engines": { + "node": ">= 6" + } + }, + "../node_modules/iconv-lite": { + "version": "0.4.24", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "../node_modules/icss-utils": { + "version": "5.1.0", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "../node_modules/identity-obj-proxy": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "harmony-reflect": "^1.4.6" + }, + "engines": { + "node": ">=4" + } + }, + "../node_modules/ieee754": { + "version": "1.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "../node_modules/ignore": { + "version": "5.3.1", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "../node_modules/ignore-by-default": { + "version": "1.0.1", + "dev": true, + "license": "ISC" + }, + "../node_modules/image-minimizer-webpack-plugin": { + "version": "3.8.3", + "license": "MIT", + "dependencies": { + "schema-utils": "^4.2.0", + "serialize-javascript": "^6.0.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@squoosh/lib": { + "optional": true + }, + "imagemin": { + "optional": true + }, + "sharp": { + "optional": true + }, + "svgo": { + "optional": true + } + } + }, + "../node_modules/imask": { + "version": "7.6.1", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime-corejs3": "^7.24.4" + }, + "engines": { + "npm": ">=4.0.0" + } + }, + "../node_modules/immediate": { + "version": "3.0.6", + "license": "MIT" + }, + "../node_modules/immer": { + "version": "9.0.21", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "../node_modules/immutable": { + "version": "4.3.7", + "license": "MIT" + }, + "../node_modules/import-fresh": { + "version": "3.3.0", + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "../node_modules/import-local": { + "version": "3.2.0", + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../node_modules/imurmurhash": { + "version": "0.1.4", + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "../node_modules/indent-string": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../node_modules/inflight": { + "version": "1.0.6", + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "../node_modules/inherits": { + "version": "2.0.4", + "license": "ISC" + }, + "../node_modules/ini": { + "version": "1.3.8", + "license": "ISC" + }, + "../node_modules/inquirer": { + "version": "8.2.6", + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.1", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.4.1", + "run-async": "^2.4.0", + "rxjs": "^7.5.5", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6", + "wrap-ansi": "^6.0.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "../node_modules/internal-slot": { + "version": "1.0.7", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "../node_modules/interpret": { + "version": "3.1.1", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "../node_modules/intl-messageformat": { + "version": "10.5.14", + "license": "BSD-3-Clause", + "dependencies": { + "@formatjs/ecma402-abstract": "2.0.0", + "@formatjs/fast-memoize": "2.2.0", + "@formatjs/icu-messageformat-parser": "2.7.8", + "tslib": "^2.4.0" + } + }, + "../node_modules/intl-messageformat/node_modules/@formatjs/ecma402-abstract": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "@formatjs/intl-localematcher": "0.5.4", + "tslib": "^2.4.0" + } + }, + "../node_modules/intl-messageformat/node_modules/@formatjs/intl-localematcher": { + "version": "0.5.4", + "license": "MIT", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "../node_modules/invariant": { + "version": "2.2.4", + "license": "MIT", + "peer": true, + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "../node_modules/ipaddr.js": { + "version": "1.9.1", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "../node_modules/is-arguments": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/is-array-buffer": { + "version": "3.0.4", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/is-arrayish": { + "version": "0.2.1", + "license": "MIT" + }, + "../node_modules/is-bigint": { + "version": "1.0.4", + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/is-binary-path": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "../node_modules/is-boolean-object": { + "version": "1.1.2", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/is-buffer": { + "version": "2.0.5", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "../node_modules/is-callable": { + "version": "1.2.7", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/is-core-module": { + "version": "2.15.0", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/is-data-view": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/is-date-object": { + "version": "1.0.5", + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/is-docker": { + "version": "2.2.1", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../node_modules/is-extglob": { + "version": "2.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../node_modules/is-generator-fn": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "../node_modules/is-glob": { + "version": "4.0.3", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "../node_modules/is-interactive": { + "version": "1.0.0", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "../node_modules/is-map": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/is-negative-zero": { + "version": "2.0.3", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/is-number": { + "version": "7.0.0", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "../node_modules/is-number-object": { + "version": "1.0.7", + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/is-path-cwd": { + "version": "2.2.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "../node_modules/is-path-in-cwd": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "is-path-inside": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "../node_modules/is-path-in-cwd/node_modules/is-path-inside": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "path-is-inside": "^1.0.2" + }, + "engines": { + "node": ">=6" + } + }, + "../node_modules/is-path-inside": { + "version": "3.0.3", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../node_modules/is-plain-obj": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../node_modules/is-plain-object": { + "version": "2.0.4", + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "../node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "license": "MIT" + }, + "../node_modules/is-regex": { + "version": "1.1.4", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/is-root": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "../node_modules/is-set": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/is-shared-array-buffer": { + "version": "1.0.3", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/is-stream": { + "version": "2.0.1", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../node_modules/is-string": { + "version": "1.0.7", + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/is-symbol": { + "version": "1.0.4", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/is-typed-array": { + "version": "1.1.13", + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/is-unicode-supported": { + "version": "0.1.0", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../node_modules/is-weakmap": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/is-weakref": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/is-weakset": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/is-wsl": { + "version": "2.2.0", + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "../node_modules/isarray": { + "version": "2.0.5", + "license": "MIT" + }, + "../node_modules/isexe": { + "version": "2.0.0", + "license": "ISC" + }, + "../node_modules/isobject": { + "version": "3.0.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "../node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "../node_modules/istanbul-lib-report": { + "version": "3.0.1", + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "../node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "license": "BSD-3-Clause", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "../node_modules/istanbul-lib-source-maps/node_modules/source-map": { + "version": "0.6.1", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "../node_modules/istanbul-reports": { + "version": "3.1.7", + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "../node_modules/jest": { + "version": "29.6.1", + "license": "MIT", + "dependencies": { + "@jest/core": "^29.6.1", + "@jest/types": "^29.6.1", + "import-local": "^3.0.2", + "jest-cli": "^29.6.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "../node_modules/jest-chain": { + "version": "1.1.6", + "dev": true, + "license": "MIT" + }, + "../node_modules/jest-changed-files": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "../node_modules/jest-circus": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "../node_modules/jest-circus/node_modules/ansi-styles": { + "version": "5.2.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "../node_modules/jest-circus/node_modules/pretty-format": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "../node_modules/jest-circus/node_modules/react-is": { + "version": "18.3.1", + "license": "MIT" + }, + "../node_modules/jest-cli": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "../node_modules/jest-cli/node_modules/cliui": { + "version": "8.0.1", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "../node_modules/jest-cli/node_modules/wrap-ansi": { + "version": "7.0.0", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "../node_modules/jest-cli/node_modules/yargs": { + "version": "17.7.2", + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "../node_modules/jest-cli/node_modules/yargs-parser": { + "version": "21.1.1", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "../node_modules/jest-config": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "../node_modules/jest-config/node_modules/ansi-styles": { + "version": "5.2.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "../node_modules/jest-config/node_modules/pretty-format": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "../node_modules/jest-config/node_modules/react-is": { + "version": "18.3.1", + "license": "MIT" + }, + "../node_modules/jest-diff": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "../node_modules/jest-diff/node_modules/ansi-styles": { + "version": "5.2.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "../node_modules/jest-diff/node_modules/pretty-format": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "../node_modules/jest-diff/node_modules/react-is": { + "version": "18.3.1", + "license": "MIT" + }, + "../node_modules/jest-docblock": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "../node_modules/jest-each": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "../node_modules/jest-each/node_modules/ansi-styles": { + "version": "5.2.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "../node_modules/jest-each/node_modules/pretty-format": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "../node_modules/jest-each/node_modules/react-is": { + "version": "18.3.1", + "license": "MIT" + }, + "../node_modules/jest-environment-jsdom": { + "version": "29.6.1", + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.6.1", + "@jest/fake-timers": "^29.6.1", + "@jest/types": "^29.6.1", + "@types/jsdom": "^20.0.0", + "@types/node": "*", + "jest-mock": "^29.6.1", + "jest-util": "^29.6.1", + "jsdom": "^20.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "../node_modules/jest-environment-node": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "../node_modules/jest-get-type": { + "version": "29.6.3", + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "../node_modules/jest-haste-map": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "../node_modules/jest-leak-detector": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "../node_modules/jest-leak-detector/node_modules/ansi-styles": { + "version": "5.2.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "../node_modules/jest-leak-detector/node_modules/pretty-format": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "../node_modules/jest-leak-detector/node_modules/react-is": { + "version": "18.3.1", + "license": "MIT" + }, + "../node_modules/jest-matcher-utils": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "../node_modules/jest-matcher-utils/node_modules/ansi-styles": { + "version": "5.2.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "../node_modules/jest-matcher-utils/node_modules/pretty-format": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "../node_modules/jest-matcher-utils/node_modules/react-is": { + "version": "18.3.1", + "license": "MIT" + }, + "../node_modules/jest-message-util": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "../node_modules/jest-message-util/node_modules/ansi-styles": { + "version": "5.2.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "../node_modules/jest-message-util/node_modules/pretty-format": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "../node_modules/jest-message-util/node_modules/react-is": { + "version": "18.3.1", + "license": "MIT" + }, + "../node_modules/jest-mock": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "../node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "../node_modules/jest-regex-util": { + "version": "29.6.3", + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "../node_modules/jest-resolve": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "../node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "../node_modules/jest-runner": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "../node_modules/jest-runtime": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "../node_modules/jest-snapshot": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "../node_modules/jest-snapshot/node_modules/ansi-styles": { + "version": "5.2.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "../node_modules/jest-snapshot/node_modules/pretty-format": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "../node_modules/jest-snapshot/node_modules/react-is": { + "version": "18.3.1", + "license": "MIT" + }, + "../node_modules/jest-snapshot/node_modules/semver": { + "version": "7.6.3", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "../node_modules/jest-util": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "../node_modules/jest-validate": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "../node_modules/jest-validate/node_modules/ansi-styles": { + "version": "5.2.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "../node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../node_modules/jest-validate/node_modules/pretty-format": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "../node_modules/jest-validate/node_modules/react-is": { + "version": "18.3.1", + "license": "MIT" + }, + "../node_modules/jest-watcher": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "../node_modules/jest-worker": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "../node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "../node_modules/jiti": { + "version": "1.21.6", + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "../node_modules/jquery": { + "version": "3.7.1", + "license": "MIT", + "peer": true + }, + "../node_modules/js-tokens": { + "version": "4.0.0", + "license": "MIT" + }, + "../node_modules/js-yaml": { + "version": "3.14.1", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "../node_modules/js2xmlparser": { + "version": "4.0.2", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "xmlcreate": "^2.0.4" + } + }, + "../node_modules/jsdoc": { + "version": "4.0.3", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@babel/parser": "^7.20.15", + "@jsdoc/salty": "^0.2.1", + "@types/markdown-it": "^14.1.1", + "bluebird": "^3.7.2", + "catharsis": "^0.9.0", + "escape-string-regexp": "^2.0.0", + "js2xmlparser": "^4.0.2", + "klaw": "^3.0.0", + "markdown-it": "^14.1.0", + "markdown-it-anchor": "^8.6.7", + "marked": "^4.0.10", + "mkdirp": "^1.0.4", + "requizzle": "^0.2.3", + "strip-json-comments": "^3.1.0", + "underscore": "~1.13.2" + }, + "bin": { + "jsdoc": "jsdoc.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "../node_modules/jsdoc/node_modules/escape-string-regexp": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../node_modules/jsdom": { + "version": "20.0.3", + "license": "MIT", + "dependencies": { + "abab": "^2.0.6", + "acorn": "^8.8.1", + "acorn-globals": "^7.0.0", + "cssom": "^0.5.0", + "cssstyle": "^2.3.0", + "data-urls": "^3.0.2", + "decimal.js": "^10.4.2", + "domexception": "^4.0.0", + "escodegen": "^2.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.2", + "parse5": "^7.1.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.2", + "w3c-xmlserializer": "^4.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0", + "ws": "^8.11.0", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "../node_modules/jsesc": { + "version": "2.5.2", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "../node_modules/json-buffer": { + "version": "3.0.1", + "license": "MIT" + }, + "../node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "license": "MIT" + }, + "../node_modules/json-schema-traverse": { + "version": "0.4.1", + "license": "MIT" + }, + "../node_modules/json-stable-stringify": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.5", + "isarray": "^2.0.5", + "jsonify": "^0.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "license": "MIT" + }, + "../node_modules/json5": { + "version": "2.2.3", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "../node_modules/jsonfile": { + "version": "6.1.0", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "../node_modules/jsonify": { + "version": "0.0.1", + "license": "Public Domain", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/jsx-ast-utils": { + "version": "3.3.5", + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "../node_modules/jwt-decode": { + "version": "3.1.2", + "license": "MIT" + }, + "../node_modules/keyv": { + "version": "4.5.4", + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "../node_modules/kind-of": { + "version": "6.0.3", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../node_modules/klaw": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.9" + } + }, + "../node_modules/kleur": { + "version": "3.0.3", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "../node_modules/language-subtag-registry": { + "version": "0.3.23", + "license": "CC0-1.0" + }, + "../node_modules/language-tags": { + "version": "1.0.5", + "license": "MIT", + "dependencies": { + "language-subtag-registry": "~0.3.2" + } + }, + "../node_modules/launch-editor": { + "version": "2.8.0", + "license": "MIT", + "dependencies": { + "picocolors": "^1.0.0", + "shell-quote": "^1.8.1" + } + }, + "../node_modules/leven": { + "version": "3.1.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "../node_modules/levn": { + "version": "0.4.1", + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "../node_modules/lie": { + "version": "3.1.1", + "license": "MIT", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "../node_modules/lilconfig": { + "version": "3.1.2", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "../node_modules/lines-and-columns": { + "version": "1.2.4", + "license": "MIT" + }, + "../node_modules/linkify-it": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "uc.micro": "^2.0.0" + } + }, + "../node_modules/loader-runner": { + "version": "4.3.0", + "license": "MIT", + "engines": { + "node": ">=6.11.5" + } + }, + "../node_modules/loader-utils": { + "version": "2.0.4", + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "../node_modules/localforage": { + "version": "1.10.0", + "license": "Apache-2.0", + "dependencies": { + "lie": "3.1.1" + } + }, + "../node_modules/localforage-memoryStorageDriver": { + "version": "0.9.2", + "dependencies": { + "localforage": ">=1.4.0" + } + }, + "../node_modules/locate-path": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "../node_modules/lodash": { + "version": "4.17.21", + "license": "MIT" + }, + "../node_modules/lodash.camelcase": { + "version": "4.3.0", + "license": "MIT" + }, + "../node_modules/lodash.debounce": { + "version": "4.0.8", + "license": "MIT" + }, + "../node_modules/lodash.isempty": { + "version": "4.4.0", + "license": "MIT" + }, + "../node_modules/lodash.memoize": { + "version": "4.1.2", + "license": "MIT" + }, + "../node_modules/lodash.merge": { + "version": "4.6.2", + "license": "MIT" + }, + "../node_modules/lodash.snakecase": { + "version": "4.1.1", + "license": "MIT" + }, + "../node_modules/lodash.uniq": { + "version": "4.5.0", + "license": "MIT" + }, + "../node_modules/lodash.uniqby": { + "version": "4.7.0", + "license": "MIT", + "peer": true + }, + "../node_modules/log-symbols": { + "version": "4.1.0", + "license": "MIT", + "peer": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../node_modules/loose-envify": { + "version": "1.4.0", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "../node_modules/lower-case": { + "version": "2.0.2", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "../node_modules/lru-cache": { + "version": "5.1.1", + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "../node_modules/lz-string": { + "version": "1.5.0", + "dev": true, + "license": "MIT", + "bin": { + "lz-string": "bin/bin.js" + } + }, + "../node_modules/magic-string": { + "version": "0.30.10", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + } + }, + "../node_modules/mailto-link": { + "version": "2.0.0", + "license": "MIT", + "peer": true, + "dependencies": { + "assert-ok": "~1.0.0", + "cast-array": "~1.0.1", + "object-filter": "~1.0.2", + "query-string": "~7.0.0" + }, + "engines": { + "node": ">= 12" + } + }, + "../node_modules/make-dir": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../node_modules/make-dir/node_modules/semver": { + "version": "7.6.3", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "../node_modules/makeerror": { + "version": "1.0.12", + "license": "BSD-3-Clause", + "dependencies": { + "tmpl": "1.0.5" + } + }, + "../node_modules/markdown-it": { + "version": "14.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1", + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" + }, + "bin": { + "markdown-it": "bin/markdown-it.mjs" + } + }, + "../node_modules/markdown-it-anchor": { + "version": "8.6.7", + "dev": true, + "license": "Unlicense", + "peerDependencies": { + "@types/markdown-it": "*", + "markdown-it": "*" + } + }, + "../node_modules/markdown-it/node_modules/argparse": { + "version": "2.0.1", + "dev": true, + "license": "Python-2.0" + }, + "../node_modules/marked": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 12" + } + }, + "../node_modules/matchmediaquery": { + "version": "0.4.2", + "license": "MIT", + "dependencies": { + "css-mediaquery": "^0.1.2" + } + }, + "../node_modules/mdn-data": { + "version": "2.0.30", + "license": "CC0-1.0" + }, + "../node_modules/mdurl": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "../node_modules/media-typer": { + "version": "0.3.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "../node_modules/memfs": { + "version": "3.5.3", + "license": "Unlicense", + "dependencies": { + "fs-monkey": "^1.0.4" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "../node_modules/merge-descriptors": { + "version": "1.0.1", + "license": "MIT" + }, + "../node_modules/merge-stream": { + "version": "2.0.0", + "license": "MIT" + }, + "../node_modules/merge2": { + "version": "1.4.1", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "../node_modules/methods": { + "version": "1.1.2", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "../node_modules/micromatch": { + "version": "4.0.7", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "../node_modules/mime": { + "version": "1.6.0", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "../node_modules/mime-db": { + "version": "1.52.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "../node_modules/mime-types": { + "version": "2.1.35", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "../node_modules/mimic-fn": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "../node_modules/mimic-response": { + "version": "3.1.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../node_modules/min-indent": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "../node_modules/mini-css-extract-plugin": { + "version": "1.6.2", + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0", + "webpack-sources": "^1.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.4.0 || ^5.0.0" + } + }, + "../node_modules/mini-css-extract-plugin/node_modules/schema-utils": { + "version": "3.3.0", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "../node_modules/minimalistic-assert": { + "version": "1.0.1", + "license": "ISC" + }, + "../node_modules/minimatch": { + "version": "3.1.2", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "../node_modules/minimist": { + "version": "1.2.8", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/mkdirp": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "../node_modules/mkdirp-classic": { + "version": "0.5.3", + "license": "MIT" + }, + "../node_modules/mrmime": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "../node_modules/ms": { + "version": "2.1.2", + "license": "MIT" + }, + "../node_modules/multicast-dns": { + "version": "7.2.5", + "license": "MIT", + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "../node_modules/mute-stream": { + "version": "0.0.8", + "license": "ISC", + "peer": true + }, + "../node_modules/nanoid": { + "version": "3.3.7", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "../node_modules/napi-build-utils": { + "version": "1.0.2", + "license": "MIT" + }, + "../node_modules/natural-compare": { + "version": "1.4.0", + "license": "MIT" + }, + "../node_modules/negotiator": { + "version": "0.6.3", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "../node_modules/neo-async": { + "version": "2.6.2", + "license": "MIT" + }, + "../node_modules/no-case": { + "version": "3.0.4", + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "../node_modules/node-abi": { + "version": "3.65.0", + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "../node_modules/node-abi/node_modules/semver": { + "version": "7.6.3", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "../node_modules/node-addon-api": { + "version": "6.1.0", + "license": "MIT" + }, + "../node_modules/node-forge": { + "version": "1.3.1", + "license": "(BSD-3-Clause OR GPL-2.0)", + "engines": { + "node": ">= 6.13.0" + } + }, + "../node_modules/node-int64": { + "version": "0.4.0", + "license": "MIT" + }, + "../node_modules/node-releases": { + "version": "2.0.18", + "license": "MIT" + }, + "../node_modules/nodemon": { + "version": "3.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^4", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "../node_modules/nodemon/node_modules/has-flag": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "../node_modules/nodemon/node_modules/semver": { + "version": "7.6.3", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "../node_modules/nodemon/node_modules/supports-color": { + "version": "5.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "../node_modules/normalize-path": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../node_modules/normalize-range": { + "version": "0.1.2", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../node_modules/npm-run-path": { + "version": "4.0.1", + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "../node_modules/nth-check": { + "version": "2.1.1", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "../node_modules/nwsapi": { + "version": "2.2.12", + "license": "MIT" + }, + "../node_modules/object-assign": { + "version": "4.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../node_modules/object-code": { + "version": "1.3.3", + "license": "MIT" + }, + "../node_modules/object-filter": { + "version": "1.0.2", + "license": "MIT", + "peer": true + }, + "../node_modules/object-inspect": { + "version": "1.13.2", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/object-is": { + "version": "1.1.6", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/object-keys": { + "version": "1.1.1", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "../node_modules/object.assign": { + "version": "4.1.5", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/object.entries": { + "version": "1.1.8", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "../node_modules/object.fromentries": { + "version": "2.0.8", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/object.hasown": { + "version": "1.1.4", + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/object.values": { + "version": "1.2.0", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/obuf": { + "version": "1.1.2", + "license": "MIT" + }, + "../node_modules/on-finished": { + "version": "2.4.1", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "../node_modules/on-headers": { + "version": "1.0.2", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "../node_modules/once": { + "version": "1.4.0", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "../node_modules/onetime": { + "version": "5.1.2", + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../node_modules/open": { + "version": "8.4.2", + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../node_modules/opener": { + "version": "1.5.2", + "license": "(WTFPL OR MIT)", + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "../node_modules/optionator": { + "version": "0.9.4", + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "../node_modules/ora": { + "version": "5.4.1", + "license": "MIT", + "peer": true, + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../node_modules/os-tmpdir": { + "version": "1.0.2", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "../node_modules/p-limit": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../node_modules/p-locate": { + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "../node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../node_modules/p-map": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "../node_modules/p-retry": { + "version": "4.6.2", + "license": "MIT", + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "../node_modules/p-try": { + "version": "2.2.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "../node_modules/param-case": { + "version": "3.0.4", + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "../node_modules/parent-module": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "../node_modules/parse-json": { + "version": "5.2.0", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../node_modules/parse5": { + "version": "7.1.2", + "license": "MIT", + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "../node_modules/parseurl": { + "version": "1.3.3", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "../node_modules/pascal-case": { + "version": "3.1.2", + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "../node_modules/path-exists": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../node_modules/path-is-absolute": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../node_modules/path-is-inside": { + "version": "1.0.2", + "license": "(WTFPL OR MIT)" + }, + "../node_modules/path-key": { + "version": "3.1.1", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../node_modules/path-parse": { + "version": "1.0.7", + "license": "MIT" + }, + "../node_modules/path-to-regexp": { + "version": "0.1.7", + "license": "MIT" + }, + "../node_modules/path-type": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../node_modules/picocolors": { + "version": "1.0.1", + "license": "ISC" + }, + "../node_modules/picomatch": { + "version": "2.3.1", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "../node_modules/pify": { + "version": "4.0.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "../node_modules/pinkie": { + "version": "2.0.4", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../node_modules/pinkie-promise": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "../node_modules/pirates": { + "version": "4.0.6", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "../node_modules/pkg-dir": { + "version": "4.2.0", + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "../node_modules/pkg-up": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "../node_modules/pkg-up/node_modules/find-up": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "../node_modules/pkg-up/node_modules/locate-path": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "../node_modules/pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../node_modules/pkg-up/node_modules/p-locate": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "../node_modules/pkg-up/node_modules/path-exists": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "../node_modules/popper.js": { + "version": "1.16.1", + "license": "MIT", + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "../node_modules/possible-typed-array-names": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "../node_modules/postcss": { + "version": "8.4.40", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.1", + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "../node_modules/postcss-calc": { + "version": "9.0.1", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.11", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.2.2" + } + }, + "../node_modules/postcss-colormin": { + "version": "6.1.0", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-api": "^3.0.0", + "colord": "^2.9.3", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "../node_modules/postcss-convert-values": { + "version": "6.1.0", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "../node_modules/postcss-custom-media": { + "version": "10.0.6", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/cascade-layer-name-parser": "^1.0.11", + "@csstools/css-parser-algorithms": "^2.6.3", + "@csstools/css-tokenizer": "^2.3.1", + "@csstools/media-query-list-parser": "^2.1.11" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "../node_modules/postcss-discard-comments": { + "version": "6.0.2", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "../node_modules/postcss-discard-duplicates": { + "version": "6.0.3", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "../node_modules/postcss-discard-empty": { + "version": "6.0.3", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "../node_modules/postcss-discard-overridden": { + "version": "6.0.2", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "../node_modules/postcss-loader": { + "version": "7.3.4", + "license": "MIT", + "dependencies": { + "cosmiconfig": "^8.3.5", + "jiti": "^1.20.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + } + }, + "../node_modules/postcss-loader/node_modules/semver": { + "version": "7.6.3", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "../node_modules/postcss-merge-longhand": { + "version": "6.0.5", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^6.1.1" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "../node_modules/postcss-merge-rules": { + "version": "6.1.1", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^4.0.2", + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "../node_modules/postcss-minify-font-values": { + "version": "6.1.0", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "../node_modules/postcss-minify-gradients": { + "version": "6.0.3", + "license": "MIT", + "dependencies": { + "colord": "^2.9.3", + "cssnano-utils": "^4.0.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "../node_modules/postcss-minify-params": { + "version": "6.1.0", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "cssnano-utils": "^4.0.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "../node_modules/postcss-minify-selectors": { + "version": "6.0.4", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "../node_modules/postcss-modules-extract-imports": { + "version": "3.1.0", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "../node_modules/postcss-modules-local-by-default": { + "version": "4.0.5", + "license": "MIT", + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "../node_modules/postcss-modules-scope": { + "version": "3.2.0", + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "../node_modules/postcss-modules-values": { + "version": "4.0.0", + "license": "ISC", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "../node_modules/postcss-normalize-charset": { + "version": "6.0.2", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "../node_modules/postcss-normalize-display-values": { + "version": "6.0.2", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "../node_modules/postcss-normalize-positions": { + "version": "6.0.2", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "../node_modules/postcss-normalize-repeat-style": { + "version": "6.0.2", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "../node_modules/postcss-normalize-string": { + "version": "6.0.2", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "../node_modules/postcss-normalize-timing-functions": { + "version": "6.0.2", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "../node_modules/postcss-normalize-unicode": { + "version": "6.1.0", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "../node_modules/postcss-normalize-url": { + "version": "6.0.2", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "../node_modules/postcss-normalize-whitespace": { + "version": "6.0.2", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "../node_modules/postcss-ordered-values": { + "version": "6.0.2", + "license": "MIT", + "dependencies": { + "cssnano-utils": "^4.0.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "../node_modules/postcss-reduce-initial": { + "version": "6.1.0", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-api": "^3.0.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "../node_modules/postcss-reduce-transforms": { + "version": "6.0.2", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "../node_modules/postcss-rtlcss": { + "version": "5.1.2", + "license": "Apache-2.0", + "dependencies": { + "rtlcss": "4.1.1" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "../node_modules/postcss-selector-parser": { + "version": "6.1.1", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "../node_modules/postcss-svgo": { + "version": "6.0.3", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "svgo": "^3.2.0" + }, + "engines": { + "node": "^14 || ^16 || >= 18" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "../node_modules/postcss-unique-selectors": { + "version": "6.0.4", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "../node_modules/postcss-value-parser": { + "version": "4.2.0", + "license": "MIT" + }, + "../node_modules/prebuild-install": { + "version": "7.1.2", + "license": "MIT", + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, + "../node_modules/prebuild-install/node_modules/tar-fs": { + "version": "2.1.1", + "license": "MIT", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "../node_modules/prebuild-install/node_modules/tar-stream": { + "version": "2.2.0", + "license": "MIT", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "../node_modules/prelude-ls": { + "version": "1.2.1", + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "../node_modules/pretty-error": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" + } + }, + "../node_modules/pretty-format": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "../node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "../node_modules/process-nextick-args": { + "version": "2.0.1", + "license": "MIT" + }, + "../node_modules/prompts": { + "version": "2.4.2", + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "../node_modules/prop-types": { + "version": "15.8.1", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "../node_modules/prop-types-extra": { + "version": "1.1.1", + "license": "MIT", + "peer": true, + "dependencies": { + "react-is": "^16.3.2", + "warning": "^4.0.0" + }, + "peerDependencies": { + "react": ">=0.14.0" + } + }, + "../node_modules/prop-types-extra/node_modules/react-is": { + "version": "16.13.1", + "license": "MIT", + "peer": true + }, + "../node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "license": "MIT" + }, + "../node_modules/proxy-addr": { + "version": "2.0.7", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "../node_modules/proxy-from-env": { + "version": "1.1.0", + "license": "MIT" + }, + "../node_modules/psl": { + "version": "1.9.0", + "license": "MIT" + }, + "../node_modules/pstree.remy": { + "version": "1.1.8", + "dev": true, + "license": "MIT" + }, + "../node_modules/pubsub-js": { + "version": "1.9.4", + "license": "MIT" + }, + "../node_modules/pump": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "../node_modules/punycode": { + "version": "2.3.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "../node_modules/punycode.js": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "../node_modules/pure-rand": { + "version": "6.1.0", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, + "../node_modules/qs": { + "version": "6.11.0", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/query-string": { + "version": "7.0.1", + "license": "MIT", + "peer": true, + "dependencies": { + "decode-uri-component": "^0.2.0", + "filter-obj": "^1.1.0", + "split-on-first": "^1.0.0", + "strict-uri-encode": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../node_modules/querystringify": { + "version": "2.2.0", + "license": "MIT" + }, + "../node_modules/queue-microtask": { + "version": "1.2.3", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "../node_modules/queue-tick": { + "version": "1.0.1", + "license": "MIT" + }, + "../node_modules/randombytes": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "../node_modules/range-parser": { + "version": "1.2.1", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "../node_modules/raw-body": { + "version": "2.5.2", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "../node_modules/rc": { + "version": "1.2.8", + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "../node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../node_modules/react": { + "version": "17.0.2", + "license": "MIT", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "../node_modules/react-bootstrap": { + "version": "1.6.8", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.14.0", + "@restart/context": "^2.1.4", + "@restart/hooks": "^0.4.7", + "@types/invariant": "^2.2.33", + "@types/prop-types": "^15.7.3", + "@types/react": ">=16.14.8", + "@types/react-transition-group": "^4.4.1", + "@types/warning": "^3.0.0", + "classnames": "^2.3.1", + "dom-helpers": "^5.2.1", + "invariant": "^2.2.4", + "prop-types": "^15.7.2", + "prop-types-extra": "^1.1.0", + "react-overlays": "^5.1.2", + "react-transition-group": "^4.4.1", + "uncontrollable": "^7.2.1", + "warning": "^4.0.3" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "../node_modules/react-clientside-effect": { + "version": "1.2.6", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.12.13" + }, + "peerDependencies": { + "react": "^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "../node_modules/react-colorful": { + "version": "5.6.1", + "license": "MIT", + "peer": true, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "../node_modules/react-dev-utils": { + "version": "12.0.1", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.16.0", + "address": "^1.1.2", + "browserslist": "^4.18.1", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.3", + "detect-port-alt": "^1.1.6", + "escape-string-regexp": "^4.0.0", + "filesize": "^8.0.6", + "find-up": "^5.0.0", + "fork-ts-checker-webpack-plugin": "^6.5.0", + "global-modules": "^2.0.0", + "globby": "^11.0.4", + "gzip-size": "^6.0.0", + "immer": "^9.0.7", + "is-root": "^2.1.0", + "loader-utils": "^3.2.0", + "open": "^8.4.0", + "pkg-up": "^3.1.0", + "prompts": "^2.4.2", + "react-error-overlay": "^6.0.11", + "recursive-readdir": "^2.2.2", + "shell-quote": "^1.7.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "engines": { + "node": ">=14" + } + }, + "../node_modules/react-dev-utils/node_modules/find-up": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../node_modules/react-dev-utils/node_modules/loader-utils": { + "version": "3.3.1", + "license": "MIT", + "engines": { + "node": ">= 12.13.0" + } + }, + "../node_modules/react-dev-utils/node_modules/locate-path": { + "version": "6.0.0", + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../node_modules/react-dev-utils/node_modules/p-locate": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../node_modules/react-dom": { + "version": "17.0.2", + "license": "MIT", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "scheduler": "^0.20.2" + }, + "peerDependencies": { + "react": "17.0.2" + } + }, + "../node_modules/react-dropzone": { + "version": "14.2.3", + "license": "MIT", + "peer": true, + "dependencies": { + "attr-accept": "^2.2.2", + "file-selector": "^0.6.0", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">= 10.13" + }, + "peerDependencies": { + "react": ">= 16.8 || 18.0.0" + } + }, + "../node_modules/react-error-boundary": { + "version": "3.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + }, + "peerDependencies": { + "react": ">=16.13.1" + } + }, + "../node_modules/react-error-overlay": { + "version": "6.0.11", + "license": "MIT" + }, + "../node_modules/react-fast-compare": { + "version": "3.2.2", + "license": "MIT", + "peer": true + }, + "../node_modules/react-focus-lock": { + "version": "2.12.1", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.0.0", + "focus-lock": "^1.3.5", + "prop-types": "^15.6.2", + "react-clientside-effect": "^1.2.6", + "use-callback-ref": "^1.3.2", + "use-sidecar": "^1.1.2" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "../node_modules/react-focus-on": { + "version": "3.9.3", + "license": "MIT", + "peer": true, + "dependencies": { + "aria-hidden": "^1.2.2", + "react-focus-lock": "^2.11.3", + "react-remove-scroll": "^2.5.7", + "react-style-singleton": "^2.2.1", + "tslib": "^2.3.1", + "use-sidecar": "^1.1.2" + }, + "engines": { + "node": ">=8.5.0" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "../node_modules/react-imask": { + "version": "7.6.1", + "license": "MIT", + "peer": true, + "dependencies": { + "imask": "^7.6.1", + "prop-types": "^15.8.1" + }, + "engines": { + "npm": ">=4.0.0" + }, + "peerDependencies": { + "react": ">=0.14.0" + } + }, + "../node_modules/react-intl": { + "version": "6.6.8", + "license": "BSD-3-Clause", + "dependencies": { + "@formatjs/ecma402-abstract": "2.0.0", + "@formatjs/icu-messageformat-parser": "2.7.8", + "@formatjs/intl": "2.10.4", + "@formatjs/intl-displaynames": "6.6.8", + "@formatjs/intl-listformat": "7.5.7", + "@types/hoist-non-react-statics": "^3.3.1", + "@types/react": "16 || 17 || 18", + "hoist-non-react-statics": "^3.3.2", + "intl-messageformat": "10.5.14", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "react": "^16.6.0 || 17 || 18", + "typescript": "^4.7 || 5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "../node_modules/react-intl/node_modules/@formatjs/ecma402-abstract": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "@formatjs/intl-localematcher": "0.5.4", + "tslib": "^2.4.0" + } + }, + "../node_modules/react-intl/node_modules/@formatjs/intl-localematcher": { + "version": "0.5.4", + "license": "MIT", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "../node_modules/react-is": { + "version": "17.0.2", + "dev": true, + "license": "MIT" + }, + "../node_modules/react-lifecycles-compat": { + "version": "3.0.4", + "license": "MIT", + "peer": true + }, + "../node_modules/react-loading-skeleton": { + "version": "3.4.0", + "license": "MIT", + "peer": true, + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "../node_modules/react-overlays": { + "version": "5.2.1", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.13.8", + "@popperjs/core": "^2.11.6", + "@restart/hooks": "^0.4.7", + "@types/warning": "^3.0.0", + "dom-helpers": "^5.2.0", + "prop-types": "^15.7.2", + "uncontrollable": "^7.2.1", + "warning": "^4.0.3" + }, + "peerDependencies": { + "react": ">=16.3.0", + "react-dom": ">=16.3.0" + } + }, + "../node_modules/react-popper": { + "version": "2.3.0", + "license": "MIT", + "peer": true, + "dependencies": { + "react-fast-compare": "^3.0.1", + "warning": "^4.0.2" + }, + "peerDependencies": { + "@popperjs/core": "^2.0.0", + "react": "^16.8.0 || ^17 || ^18", + "react-dom": "^16.8.0 || ^17 || ^18" + } + }, + "../node_modules/react-proptype-conditional-require": { + "version": "1.0.4", + "license": "MIT", + "peer": true + }, + "../node_modules/react-redux": { + "version": "8.1.3", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.12.1", + "@types/hoist-non-react-statics": "^3.3.1", + "@types/use-sync-external-store": "^0.0.3", + "hoist-non-react-statics": "^3.3.2", + "react-is": "^18.0.0", + "use-sync-external-store": "^1.0.0" + }, + "peerDependencies": { + "@types/react": "^16.8 || ^17.0 || ^18.0", + "@types/react-dom": "^16.8 || ^17.0 || ^18.0", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0", + "react-native": ">=0.59", + "redux": "^4 || ^5.0.0-beta.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + }, + "redux": { + "optional": true + } + } + }, + "../node_modules/react-redux/node_modules/react-is": { + "version": "18.3.1", + "license": "MIT", + "peer": true + }, + "../node_modules/react-refresh": { + "version": "0.14.2", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../node_modules/react-remove-scroll": { + "version": "2.5.10", + "license": "MIT", + "peer": true, + "dependencies": { + "react-remove-scroll-bar": "^2.3.6", + "react-style-singleton": "^2.2.1", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.0", + "use-sidecar": "^1.1.2" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "../node_modules/react-remove-scroll-bar": { + "version": "2.3.6", + "license": "MIT", + "peer": true, + "dependencies": { + "react-style-singleton": "^2.2.1", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "../node_modules/react-responsive": { + "version": "10.0.0", + "license": "MIT", + "dependencies": { + "hyphenate-style-name": "^1.0.0", + "matchmediaquery": "^0.4.2", + "prop-types": "^15.6.1", + "shallow-equal": "^3.1.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "../node_modules/react-router": { + "version": "6.25.1", + "license": "MIT", + "peer": true, + "dependencies": { + "@remix-run/router": "1.18.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "../node_modules/react-router-dom": { + "version": "6.25.1", + "license": "MIT", + "peer": true, + "dependencies": { + "@remix-run/router": "1.18.0", + "react-router": "6.25.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "../node_modules/react-shallow-renderer": { + "version": "16.15.0", + "dev": true, + "license": "MIT", + "dependencies": { + "object-assign": "^4.1.1", + "react-is": "^16.12.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependencies": { + "react": "^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "../node_modules/react-style-singleton": { + "version": "2.2.1", + "license": "MIT", + "peer": true, + "dependencies": { + "get-nonce": "^1.0.0", + "invariant": "^2.2.4", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "../node_modules/react-table": { + "version": "7.8.0", + "license": "MIT", + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^16.8.3 || ^17.0.0-0 || ^18.0.0" + } + }, + "../node_modules/react-test-renderer": { + "version": "17.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "object-assign": "^4.1.1", + "react-is": "^17.0.2", + "react-shallow-renderer": "^16.13.1", + "scheduler": "^0.20.2" + }, + "peerDependencies": { + "react": "17.0.2" + } + }, + "../node_modules/react-transition-group": { + "version": "4.4.5", + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, + "../node_modules/readable-stream": { + "version": "3.6.2", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "../node_modules/readdirp": { + "version": "3.6.0", + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "../node_modules/rechoir": { + "version": "0.8.0", + "license": "MIT", + "dependencies": { + "resolve": "^1.20.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "../node_modules/recursive-readdir": { + "version": "2.2.3", + "license": "MIT", + "dependencies": { + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "../node_modules/redent": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "../node_modules/redux": { + "version": "4.2.1", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.9.2" + } + }, + "../node_modules/regenerate": { + "version": "1.4.2", + "license": "MIT" + }, + "../node_modules/regenerate-unicode-properties": { + "version": "10.1.1", + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "../node_modules/regenerator-runtime": { + "version": "0.14.1", + "license": "MIT" + }, + "../node_modules/regenerator-transform": { + "version": "0.15.2", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "../node_modules/regex-parser": { + "version": "2.3.0", + "license": "MIT" + }, + "../node_modules/regexp.prototype.flags": { + "version": "1.5.2", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/regexpu-core": { + "version": "5.3.2", + "license": "MIT", + "dependencies": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "../node_modules/regjsparser": { + "version": "0.9.1", + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "../node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "bin": { + "jsesc": "bin/jsesc" + } + }, + "../node_modules/relateurl": { + "version": "0.2.7", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "../node_modules/renderkid": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } + }, + "../node_modules/require-directory": { + "version": "2.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../node_modules/require-from-string": { + "version": "2.0.2", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../node_modules/requires-port": { + "version": "1.0.0", + "license": "MIT" + }, + "../node_modules/requizzle": { + "version": "0.2.4", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4.17.21" + } + }, + "../node_modules/resolve": { + "version": "1.22.8", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/resolve-cwd": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "../node_modules/resolve-from": { + "version": "5.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../node_modules/resolve-pathname": { + "version": "3.0.0", + "license": "MIT" + }, + "../node_modules/resolve-url-loader": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "adjust-sourcemap-loader": "^4.0.0", + "convert-source-map": "^1.7.0", + "loader-utils": "^2.0.0", + "postcss": "^8.2.14", + "source-map": "0.6.1" + }, + "engines": { + "node": ">=12" + } + }, + "../node_modules/resolve-url-loader/node_modules/convert-source-map": { + "version": "1.9.0", + "license": "MIT" + }, + "../node_modules/resolve-url-loader/node_modules/source-map": { + "version": "0.6.1", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "../node_modules/resolve.exports": { + "version": "2.0.2", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "../node_modules/restore-cursor": { + "version": "3.1.0", + "license": "MIT", + "peer": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "../node_modules/retry": { + "version": "0.13.1", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "../node_modules/reusify": { + "version": "1.0.4", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "../node_modules/rimraf": { + "version": "2.7.1", + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "../node_modules/rtlcss": { + "version": "4.1.1", + "license": "MIT", + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0", + "postcss": "^8.4.21", + "strip-json-comments": "^3.1.1" + }, + "bin": { + "rtlcss": "bin/rtlcss.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "../node_modules/run-async": { + "version": "2.4.1", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.12.0" + } + }, + "../node_modules/run-parallel": { + "version": "1.2.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "../node_modules/rxjs": { + "version": "7.8.1", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "../node_modules/safe-array-concat": { + "version": "1.1.2", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/safe-buffer": { + "version": "5.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "../node_modules/safe-regex-test": { + "version": "1.0.3", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/safer-buffer": { + "version": "2.1.2", + "license": "MIT" + }, + "../node_modules/sass": { + "version": "1.69.7", + "license": "MIT", + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "../node_modules/sass-loader": { + "version": "13.3.3", + "license": "MIT", + "dependencies": { + "neo-async": "^2.6.2" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "fibers": ">= 3.1.0", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", + "sass": "^1.3.0", + "sass-embedded": "*", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "fibers": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + } + } + }, + "../node_modules/saxes": { + "version": "6.0.0", + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "../node_modules/scheduler": { + "version": "0.20.2", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "../node_modules/schema-utils": { + "version": "4.2.0", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "../node_modules/schema-utils/node_modules/ajv": { + "version": "8.17.1", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "../node_modules/schema-utils/node_modules/ajv-keywords": { + "version": "5.1.0", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "../node_modules/schema-utils/node_modules/json-schema-traverse": { + "version": "1.0.0", + "license": "MIT" + }, + "../node_modules/select-hose": { + "version": "2.0.0", + "license": "MIT" + }, + "../node_modules/selfsigned": { + "version": "2.4.1", + "license": "MIT", + "dependencies": { + "@types/node-forge": "^1.3.0", + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "../node_modules/semver": { + "version": "6.3.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "../node_modules/send": { + "version": "0.18.0", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "../node_modules/send/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "../node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "../node_modules/send/node_modules/ms": { + "version": "2.1.3", + "license": "MIT" + }, + "../node_modules/serialize-javascript": { + "version": "6.0.2", + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "../node_modules/serve-index": { + "version": "1.9.1", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "../node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "../node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "../node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "license": "MIT", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "../node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "license": "ISC" + }, + "../node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "../node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "license": "ISC" + }, + "../node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "../node_modules/serve-static": { + "version": "1.15.0", + "license": "MIT", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "../node_modules/set-function-length": { + "version": "1.2.2", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "../node_modules/set-function-name": { + "version": "2.0.2", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "../node_modules/setprototypeof": { + "version": "1.2.0", + "license": "ISC" + }, + "../node_modules/shallow-clone": { + "version": "3.0.1", + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "../node_modules/shallow-equal": { + "version": "3.1.0", + "license": "MIT" + }, + "../node_modules/sharp": { + "version": "0.32.6", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "color": "^4.2.3", + "detect-libc": "^2.0.2", + "node-addon-api": "^6.1.0", + "prebuild-install": "^7.1.1", + "semver": "^7.5.4", + "simple-get": "^4.0.1", + "tar-fs": "^3.0.4", + "tunnel-agent": "^0.6.0" + }, + "engines": { + "node": ">=14.15.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "../node_modules/sharp/node_modules/semver": { + "version": "7.6.3", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "../node_modules/shebang-command": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "../node_modules/shebang-regex": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../node_modules/shell-quote": { + "version": "1.8.1", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/side-channel": { + "version": "1.0.6", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/signal-exit": { + "version": "3.0.7", + "license": "ISC" + }, + "../node_modules/simple-concat": { + "version": "1.0.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "../node_modules/simple-get": { + "version": "4.0.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "../node_modules/simple-swizzle": { + "version": "0.2.2", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "../node_modules/simple-swizzle/node_modules/is-arrayish": { + "version": "0.3.2", + "license": "MIT" + }, + "../node_modules/simple-update-notifier": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "../node_modules/simple-update-notifier/node_modules/semver": { + "version": "7.6.3", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "../node_modules/sirv": { + "version": "2.0.4", + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "../node_modules/sisteransi": { + "version": "1.0.5", + "license": "MIT" + }, + "../node_modules/slash": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../node_modules/sockjs": { + "version": "0.3.24", + "license": "MIT", + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "../node_modules/sockjs/node_modules/uuid": { + "version": "8.3.2", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "../node_modules/source-list-map": { + "version": "2.0.1", + "license": "MIT" + }, + "../node_modules/source-map": { + "version": "0.7.4", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 8" + } + }, + "../node_modules/source-map-js": { + "version": "1.2.0", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "../node_modules/source-map-loader": { + "version": "4.0.2", + "license": "MIT", + "dependencies": { + "iconv-lite": "^0.6.3", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.72.1" + } + }, + "../node_modules/source-map-loader/node_modules/iconv-lite": { + "version": "0.6.3", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "../node_modules/source-map-support": { + "version": "0.5.13", + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "../node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "../node_modules/spdy": { + "version": "4.0.2", + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "../node_modules/spdy-transport": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "../node_modules/split-on-first": { + "version": "1.1.0", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "../node_modules/sprintf-js": { + "version": "1.0.3", + "license": "BSD-3-Clause" + }, + "../node_modules/stack-utils": { + "version": "2.0.6", + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "../node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../node_modules/stackframe": { + "version": "1.3.4", + "license": "MIT" + }, + "../node_modules/statuses": { + "version": "2.0.1", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "../node_modules/stop-iteration-iterator": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "internal-slot": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "../node_modules/streamx": { + "version": "2.18.0", + "license": "MIT", + "dependencies": { + "fast-fifo": "^1.3.2", + "queue-tick": "^1.0.1", + "text-decoder": "^1.1.0" + }, + "optionalDependencies": { + "bare-events": "^2.2.0" + } + }, + "../node_modules/strict-uri-encode": { + "version": "2.0.0", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "../node_modules/string_decoder": { + "version": "1.3.0", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "../node_modules/string-length": { + "version": "4.0.2", + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "../node_modules/string-width": { + "version": "4.2.3", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "../node_modules/string-width/node_modules/emoji-regex": { + "version": "8.0.0", + "license": "MIT" + }, + "../node_modules/string.prototype.matchall": { + "version": "4.0.11", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "regexp.prototype.flags": "^1.5.2", + "set-function-name": "^2.0.2", + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/string.prototype.trim": { + "version": "1.2.9", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/string.prototype.trimend": { + "version": "1.0.8", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/strip-ansi": { + "version": "6.0.1", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "../node_modules/strip-bom": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../node_modules/strip-final-newline": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "../node_modules/strip-indent": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "../node_modules/strip-json-comments": { + "version": "3.1.1", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../node_modules/style-loader": { + "version": "3.3.4", + "license": "MIT", + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "../node_modules/stylehacks": { + "version": "6.1.1", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "../node_modules/superagent": { + "version": "3.8.3", + "license": "MIT", + "dependencies": { + "component-emitter": "^1.2.0", + "cookiejar": "^2.1.0", + "debug": "^3.1.0", + "extend": "^3.0.0", + "form-data": "^2.3.1", + "formidable": "^1.2.0", + "methods": "^1.1.1", + "mime": "^1.4.1", + "qs": "^6.5.1", + "readable-stream": "^2.3.5" + }, + "engines": { + "node": ">= 4.0" + } + }, + "../node_modules/superagent/node_modules/debug": { + "version": "3.2.7", + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "../node_modules/superagent/node_modules/form-data": { + "version": "2.5.1", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "../node_modules/superagent/node_modules/isarray": { + "version": "1.0.0", + "license": "MIT" + }, + "../node_modules/superagent/node_modules/readable-stream": { + "version": "2.3.8", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "../node_modules/superagent/node_modules/safe-buffer": { + "version": "5.1.2", + "license": "MIT" + }, + "../node_modules/superagent/node_modules/string_decoder": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "../node_modules/supports-color": { + "version": "7.2.0", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "../node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/svgo": { + "version": "3.3.2", + "license": "MIT", + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^5.1.0", + "css-tree": "^2.3.1", + "css-what": "^6.1.0", + "csso": "^5.0.5", + "picocolors": "^1.0.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" + } + }, + "../node_modules/svgo/node_modules/commander": { + "version": "7.2.0", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "../node_modules/svgo/node_modules/css-select": { + "version": "5.1.0", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "../node_modules/svgo/node_modules/dom-serializer": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "../node_modules/svgo/node_modules/domhandler": { + "version": "5.0.3", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "../node_modules/svgo/node_modules/domutils": { + "version": "3.1.0", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "../node_modules/symbol-tree": { + "version": "3.2.4", + "license": "MIT" + }, + "../node_modules/tabbable": { + "version": "5.3.3", + "license": "MIT", + "peer": true + }, + "../node_modules/tapable": { + "version": "2.2.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "../node_modules/tar-fs": { + "version": "3.0.6", + "license": "MIT", + "dependencies": { + "pump": "^3.0.0", + "tar-stream": "^3.1.5" + }, + "optionalDependencies": { + "bare-fs": "^2.1.1", + "bare-path": "^2.1.0" + } + }, + "../node_modules/tar-stream": { + "version": "3.1.7", + "license": "MIT", + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "../node_modules/terser": { + "version": "5.31.3", + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "../node_modules/terser-webpack-plugin": { + "version": "5.3.10", + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.20", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "../node_modules/terser-webpack-plugin/node_modules/jest-worker": { + "version": "27.5.1", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "../node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.3.0", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "../node_modules/terser-webpack-plugin/node_modules/supports-color": { + "version": "8.1.1", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "../node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "license": "MIT" + }, + "../node_modules/terser/node_modules/source-map": { + "version": "0.6.1", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "../node_modules/terser/node_modules/source-map-support": { + "version": "0.5.21", + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "../node_modules/test-exclude": { + "version": "6.0.0", + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "../node_modules/text-decoder": { + "version": "1.1.1", + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.6.4" + } + }, + "../node_modules/text-table": { + "version": "0.2.0", + "license": "MIT" + }, + "../node_modules/through": { + "version": "2.3.8", + "license": "MIT", + "peer": true + }, + "../node_modules/thunky": { + "version": "1.1.0", + "license": "MIT" + }, + "../node_modules/tiny-invariant": { + "version": "1.3.3", + "license": "MIT" + }, + "../node_modules/tiny-warning": { + "version": "1.0.3", + "license": "MIT" + }, + "../node_modules/tmp": { + "version": "0.0.33", + "license": "MIT", + "peer": true, + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "../node_modules/tmpl": { + "version": "1.0.5", + "license": "BSD-3-Clause" + }, + "../node_modules/to-fast-properties": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "../node_modules/to-regex-range": { + "version": "5.0.1", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "../node_modules/toidentifier": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "../node_modules/totalist": { + "version": "3.0.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "../node_modules/touch": { + "version": "3.1.1", + "dev": true, + "license": "ISC", + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "../node_modules/tough-cookie": { + "version": "4.1.4", + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "../node_modules/tough-cookie/node_modules/universalify": { + "version": "0.2.0", + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "../node_modules/tr46": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "../node_modules/ts-api-utils": { + "version": "1.3.0", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "../node_modules/ts-loader": { + "version": "9.5.1", + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4", + "source-map": "^0.7.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "typescript": "*", + "webpack": "^5.0.0" + } + }, + "../node_modules/ts-loader/node_modules/semver": { + "version": "7.6.3", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "../node_modules/tsconfig-paths": { + "version": "3.15.0", + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "../node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "../node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "../node_modules/tslib": { + "version": "2.6.3", + "license": "0BSD" + }, + "../node_modules/tunnel-agent": { + "version": "0.6.0", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "../node_modules/type-check": { + "version": "0.4.0", + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "../node_modules/type-detect": { + "version": "4.0.8", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "../node_modules/type-fest": { + "version": "0.21.3", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../node_modules/type-is": { + "version": "1.6.18", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "../node_modules/typed-array-buffer": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + } + }, + "../node_modules/typed-array-byte-length": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/typed-array-byte-offset": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/typed-array-length": { + "version": "1.0.6", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/typescript": { + "version": "5.5.4", + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "../node_modules/uc.micro": { + "version": "2.1.0", + "dev": true, + "license": "MIT" + }, + "../node_modules/unbox-primitive": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/uncontrollable": { + "version": "7.2.1", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.6.3", + "@types/react": ">=16.9.11", + "invariant": "^2.2.4", + "react-lifecycles-compat": "^3.0.4" + }, + "peerDependencies": { + "react": ">=15.0.0" + } + }, + "../node_modules/undefsafe": { + "version": "2.0.5", + "dev": true, + "license": "MIT" + }, + "../node_modules/underscore": { + "version": "1.13.6", + "dev": true, + "license": "MIT" + }, + "../node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "../node_modules/unicode-emoji-utils": { + "version": "1.2.0", + "license": "MIT", + "dependencies": { + "emoji-regex": "10.3.0" + } + }, + "../node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "../node_modules/unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "../node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "../node_modules/universal-cookie": { + "version": "4.0.4", + "license": "MIT", + "dependencies": { + "@types/cookie": "^0.3.3", + "cookie": "^0.4.0" + } + }, + "../node_modules/universal-cookie/node_modules/cookie": { + "version": "0.4.2", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "../node_modules/universalify": { + "version": "2.0.1", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "../node_modules/unpipe": { "version": "1.0.0", - "extraneous": true, - "license": "AGPL-3.0", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "../node_modules/update-browserslist-db": { + "version": "1.1.0", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.1.2", + "picocolors": "^1.0.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "../node_modules/uri-js": { + "version": "4.4.1", + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "../node_modules/url-loader": { + "version": "4.1.1", + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "mime-types": "^2.1.27", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "file-loader": "*", + "webpack": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "file-loader": { + "optional": true + } + } + }, + "../node_modules/url-loader/node_modules/schema-utils": { + "version": "3.3.0", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "../node_modules/url-parse": { + "version": "1.5.10", + "license": "MIT", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "../node_modules/use-callback-ref": { + "version": "1.3.2", + "license": "MIT", + "peer": true, + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "../node_modules/use-sidecar": { + "version": "1.1.2", + "license": "MIT", + "peer": true, + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.9.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "../node_modules/use-sync-external-store": { + "version": "1.2.2", + "license": "MIT", + "peer": true, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "../node_modules/util-deprecate": { + "version": "1.0.2", + "license": "MIT" + }, + "../node_modules/utila": { + "version": "0.4.0", + "license": "MIT" + }, + "../node_modules/utils-merge": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "../node_modules/uuid": { + "version": "9.0.1", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "peer": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "../node_modules/v8-to-istanbul": { + "version": "9.3.0", + "license": "ISC", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "../node_modules/value-equal": { + "version": "1.0.1", + "license": "MIT" + }, + "../node_modules/vary": { + "version": "1.1.2", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "../node_modules/w3c-xmlserializer": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "../node_modules/walker": { + "version": "1.0.8", + "license": "Apache-2.0", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "../node_modules/warning": { + "version": "4.0.3", + "license": "MIT", + "peer": true, + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "../node_modules/watchpack": { + "version": "2.4.1", + "license": "MIT", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "../node_modules/wbuf": { + "version": "1.7.3", + "license": "MIT", + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "../node_modules/wcwidth": { + "version": "1.0.1", + "license": "MIT", + "peer": true, + "dependencies": { + "defaults": "^1.0.3" + } + }, + "../node_modules/webidl-conversions": { + "version": "7.0.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "../node_modules/webpack": { + "version": "5.93.0", + "license": "MIT", + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", + "acorn": "^8.7.1", + "acorn-import-attributes": "^1.9.5", + "browserslist": "^4.21.10", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.17.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "../node_modules/webpack-bundle-analyzer": { + "version": "4.10.2", + "license": "MIT", + "dependencies": { + "@discoveryjs/json-ext": "0.5.7", + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "commander": "^7.2.0", + "debounce": "^1.2.1", + "escape-string-regexp": "^4.0.0", + "gzip-size": "^6.0.0", + "html-escaper": "^2.0.2", + "opener": "^1.5.2", + "picocolors": "^1.0.0", + "sirv": "^2.0.3", + "ws": "^7.3.1" + }, + "bin": { + "webpack-bundle-analyzer": "lib/bin/analyzer.js" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "../node_modules/webpack-bundle-analyzer/node_modules/commander": { + "version": "7.2.0", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "../node_modules/webpack-bundle-analyzer/node_modules/ws": { + "version": "7.5.10", + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "../node_modules/webpack-cli": { + "version": "5.1.4", + "license": "MIT", + "dependencies": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^2.1.1", + "@webpack-cli/info": "^2.0.2", + "@webpack-cli/serve": "^2.0.5", + "colorette": "^2.0.14", + "commander": "^10.0.1", + "cross-spawn": "^7.0.3", + "envinfo": "^7.7.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", + "webpack-merge": "^5.7.3" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "5.x.x" + }, + "peerDependenciesMeta": { + "@webpack-cli/generators": { + "optional": true + }, + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } + } + }, + "../node_modules/webpack-cli/node_modules/commander": { + "version": "10.0.1", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "../node_modules/webpack-dev-middleware": { + "version": "5.3.4", + "license": "MIT", + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "../node_modules/webpack-dev-server": { + "version": "4.15.2", + "license": "MIT", + "dependencies": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.5", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.4", + "ws": "^8.13.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "../node_modules/webpack-dev-server/node_modules/ipaddr.js": { + "version": "2.2.0", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "../node_modules/webpack-dev-server/node_modules/rimraf": { + "version": "3.0.2", + "license": "ISC", "dependencies": { - "@babel/core": "^7.24.9", - "@babel/preset-env": "^7.24.8", - "@babel/preset-react": "^7.24.7", - "@babel/preset-typescript": "^7.24.7", - "@cospired/i18n-iso-languages": "^4.2.0", - "@edx/new-relic-source-map-webpack-plugin": "2.1.0", - "@formatjs/cli": "^6.0.3", - "@formatjs/intl-pluralrules": "^4.3.3", - "@formatjs/intl-relativetimeformat": "^10.0.1", - "@formatjs/ts-transformer": "^3.13.14", - "@fullhuman/postcss-purgecss": "5.0.0", - "@module-federation/runtime": "^0.2.6", - "@pmmmwh/react-refresh-webpack-plugin": "0.5.15", - "@typescript-eslint/eslint-plugin": "^5.58.0", - "@typescript-eslint/parser": "^5.58.0", - "autoprefixer": "10.4.19", - "axios": "^0.28.1", - "axios-cache-interceptor": "^0.10.7", - "babel-jest": "^29.7.0", - "babel-plugin-formatjs": "^10.5.16", - "chalk": "4.1.2", - "clean-webpack-plugin": "4.0.0", - "css-loader": "5.2.7", - "cssnano": "6.0.3", - "dotenv": "8.6.0", - "dotenv-webpack": "8.0.1", - "eslint": "8.44.0", - "eslint-config-airbnb": "19.0.4", - "eslint-config-airbnb-typescript": "^17.0.0", - "eslint-plugin-formatjs": "^4.12.2", - "eslint-plugin-import": "2.27.5", - "eslint-plugin-jsx-a11y": "6.7.1", - "eslint-plugin-react": "7.32.2", - "eslint-plugin-react-hooks": "4.6.0", - "express": "^4.18.2", - "file-loader": "6.2.0", - "form-urlencoded": "^6.1.5", - "glob": "^7.2.3", - "history": "^4.10.1", - "html-webpack-plugin": "5.6.0", - "i18n-iso-countries": "^4.3.1", - "identity-obj-proxy": "3.0.0", - "image-minimizer-webpack-plugin": "3.8.3", - "jest": "29.6.1", - "jest-environment-jsdom": "29.6.1", - "jwt-decode": "^3.1.2", - "localforage": "^1.10.0", - "localforage-memoryStorageDriver": "^0.9.2", - "lodash.camelcase": "^4.3.0", - "lodash.memoize": "^4.1.2", - "lodash.merge": "^4.6.2", - "lodash.snakecase": "^4.1.1", - "mini-css-extract-plugin": "1.6.2", - "postcss": "8.4.38", - "postcss-custom-media": "10.0.6", - "postcss-loader": "7.3.4", - "postcss-rtlcss": "5.1.2", - "pubsub-js": "^1.9.4", - "react-dev-utils": "12.0.1", - "react-intl": "^6.6.6", - "react-refresh": "0.14.2", - "resolve-url-loader": "5.0.0", - "sass": "1.69.7", - "sass-loader": "13.3.3", - "sharp": "0.32.6", - "source-map-loader": "4.0.2", - "style-loader": "3.3.4", - "ts-loader": "^9.5.1", - "typescript": "^5.5.3", - "universal-cookie": "^4.0.4", - "url-loader": "4.1.1", - "webpack": "^5.89.0", - "webpack-bundle-analyzer": "^4.10.1", - "webpack-cli": "^5.1.4", - "webpack-dev-server": "^4.15.1", - "webpack-merge": "^5.10.0" + "glob": "^7.1.3" }, "bin": { - "intl-imports.js": "dist/cli/scripts/intl-imports.js", - "openedx": "dist/cli/scripts/openedx.js", - "transifex-utils.js": "dist/cli/scripts/transifex-utils.js" + "rimraf": "bin.js" }, - "devDependencies": { - "@testing-library/jest-dom": "^6.4.6", - "@testing-library/react": "^12.1.5", - "@testing-library/react-hooks": "^8.0.1", - "@types/jest": "^29.5.12", - "@types/react": "^17.0.0", - "@types/react-dom": "^17.0.11", - "axios-mock-adapter": "^1.22.0", - "jsdoc": "^4.0.3", - "nodemon": "^3.1.4" + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "../node_modules/webpack-merge": { + "version": "5.10.0", + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "../node_modules/webpack-sources": { + "version": "1.4.3", + "license": "MIT", + "dependencies": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "../node_modules/webpack-sources/node_modules/source-map": { + "version": "0.6.1", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "../node_modules/webpack/node_modules/schema-utils": { + "version": "3.3.0", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "../node_modules/webpack/node_modules/webpack-sources": { + "version": "3.2.3", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "../node_modules/websocket-driver": { + "version": "0.7.4", + "license": "Apache-2.0", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "../node_modules/websocket-extensions": { + "version": "0.1.4", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8.0" + } + }, + "../node_modules/whatwg-encoding": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=12" + } + }, + "../node_modules/whatwg-encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "../node_modules/whatwg-mimetype": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "../node_modules/whatwg-url": { + "version": "11.0.0", + "license": "MIT", + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "../node_modules/which": { + "version": "2.0.2", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "../node_modules/which-boxed-primitive": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/which-collection": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/which-typed-array": { + "version": "1.1.15", + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../node_modules/wildcard": { + "version": "2.0.1", + "license": "MIT" + }, + "../node_modules/word-wrap": { + "version": "1.2.5", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../node_modules/wrap-ansi": { + "version": "6.2.0", + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "../node_modules/wrappy": { + "version": "1.0.2", + "license": "ISC" + }, + "../node_modules/write-file-atomic": { + "version": "4.0.2", + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "../node_modules/ws": { + "version": "8.18.0", + "license": "MIT", + "engines": { + "node": ">=10.0.0" }, "peerDependencies": { - "@openedx/paragon": "^22.6.1", - "react": "^17.0.2", - "react-dom": "^17.0.2", - "react-redux": "^8.1.3", - "react-router-dom": "^6.24.1", - "redux": "^4.2.1" + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "../node_modules/xml-name-validator": { + "version": "4.0.0", + "license": "Apache-2.0", + "engines": { + "node": ">=12" + } + }, + "../node_modules/xmlchars": { + "version": "2.2.0", + "license": "MIT" + }, + "../node_modules/xmlcreate": { + "version": "2.0.4", + "dev": true, + "license": "Apache-2.0" + }, + "../node_modules/y18n": { + "version": "5.0.8", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "../node_modules/yallist": { + "version": "3.1.1", + "license": "ISC" + }, + "../node_modules/yaml": { + "version": "1.10.2", + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "../node_modules/yargs": { + "version": "16.2.0", + "license": "MIT", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "../node_modules/yargs-parser": { + "version": "20.2.9", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "../node_modules/yocto-queue": { + "version": "0.1.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@babel/runtime": { "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.7.tgz", - "integrity": "sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==", + "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -253,8 +15137,7 @@ }, "node_modules/@babel/runtime-corejs3": { "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.24.7.tgz", - "integrity": "sha512-eytSX6JLBY6PVAeQa2bFlDx/7Mmln/gaEpsit5a3WEvjGfiIytEsgAwuIXCPM0xvw0v0cJn3ilq0/TvXrW0kgA==", + "license": "MIT", "dependencies": { "core-js-pure": "^3.30.2", "regenerator-runtime": "^0.14.0" @@ -265,8 +15148,7 @@ }, "node_modules/@formatjs/ecma402-abstract": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-2.0.0.tgz", - "integrity": "sha512-rRqXOqdFmk7RYvj4khklyqzcfQl9vEL/usogncBHRZfZBDOwMGuSRNFl02fu5KGHXdbinju+YXyuR+Nk8xlr/g==", + "license": "MIT", "peer": true, "dependencies": { "@formatjs/intl-localematcher": "0.5.4", @@ -275,8 +15157,7 @@ }, "node_modules/@formatjs/fast-memoize": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-2.2.0.tgz", - "integrity": "sha512-hnk/nY8FyrL5YxwP9e4r9dqeM6cAbo8PeU9UjyXojZMNvVad2Z06FAVHyR3Ecw6fza+0GH7vdJgiKIVXTMbSBA==", + "license": "MIT", "peer": true, "dependencies": { "tslib": "^2.4.0" @@ -284,8 +15165,7 @@ }, "node_modules/@formatjs/icu-messageformat-parser": { "version": "2.7.8", - "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.7.8.tgz", - "integrity": "sha512-nBZJYmhpcSX0WeJ5SDYUkZ42AgR3xiyhNCsQweFx3cz/ULJjym8bHAzWKvG5e2+1XO98dBYC0fWeeAECAVSwLA==", + "license": "MIT", "peer": true, "dependencies": { "@formatjs/ecma402-abstract": "2.0.0", @@ -295,8 +15175,7 @@ }, "node_modules/@formatjs/icu-skeleton-parser": { "version": "1.8.2", - "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.2.tgz", - "integrity": "sha512-k4ERKgw7aKGWJZgTarIcNEmvyTVD9FYh0mTrrBMHZ1b8hUu6iOJ4SzsZlo3UNAvHYa+PnvntIwRPt1/vy4nA9Q==", + "license": "MIT", "peer": true, "dependencies": { "@formatjs/ecma402-abstract": "2.0.0", @@ -305,8 +15184,7 @@ }, "node_modules/@formatjs/intl": { "version": "2.10.4", - "resolved": "https://registry.npmjs.org/@formatjs/intl/-/intl-2.10.4.tgz", - "integrity": "sha512-56483O+HVcL0c7VucAS2tyH020mt9XTozZO67cwtGg0a7KWDukS/FzW3OnvaHmTHDuYsoPIzO+ZHVfU6fT/bJw==", + "license": "MIT", "peer": true, "dependencies": { "@formatjs/ecma402-abstract": "2.0.0", @@ -328,8 +15206,7 @@ }, "node_modules/@formatjs/intl-displaynames": { "version": "6.6.8", - "resolved": "https://registry.npmjs.org/@formatjs/intl-displaynames/-/intl-displaynames-6.6.8.tgz", - "integrity": "sha512-Lgx6n5KxN16B3Pb05z3NLEBQkGoXnGjkTBNCZI+Cn17YjHJ3fhCeEJJUqRlIZmJdmaXQhjcQVDp6WIiNeRYT5g==", + "license": "MIT", "peer": true, "dependencies": { "@formatjs/ecma402-abstract": "2.0.0", @@ -339,8 +15216,7 @@ }, "node_modules/@formatjs/intl-listformat": { "version": "7.5.7", - "resolved": "https://registry.npmjs.org/@formatjs/intl-listformat/-/intl-listformat-7.5.7.tgz", - "integrity": "sha512-MG2TSChQJQT9f7Rlv+eXwUFiG24mKSzmF144PLb8m8OixyXqn4+YWU+5wZracZGCgVTVmx8viCf7IH3QXoiB2g==", + "license": "MIT", "peer": true, "dependencies": { "@formatjs/ecma402-abstract": "2.0.0", @@ -350,8 +15226,7 @@ }, "node_modules/@formatjs/intl-localematcher": { "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.5.4.tgz", - "integrity": "sha512-zTwEpWOzZ2CiKcB93BLngUX59hQkuZjT2+SAQEscSm52peDW/getsawMcWF1rGRpMCX6D7nSJA3CzJ8gn13N/g==", + "license": "MIT", "peer": true, "dependencies": { "tslib": "^2.4.0" @@ -359,18 +15234,16 @@ }, "node_modules/@fortawesome/fontawesome-common-types": { "version": "6.5.2", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.5.2.tgz", - "integrity": "sha512-gBxPg3aVO6J0kpfHNILc+NMhXnqHumFxOmjYCFfOiLZfwhnnfhtsdA2hfJlDnj+8PjAs6kKQPenOTKj3Rf7zHw==", "hasInstallScript": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/@fortawesome/fontawesome-svg-core": { "version": "6.5.2", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.5.2.tgz", - "integrity": "sha512-5CdaCBGl8Rh9ohNdxeeTMxIj8oc3KNBgIeLMvJosBMdslK/UnEB8rzyDRrbKdL1kDweqBPo4GT9wvnakHWucZw==", "hasInstallScript": true, + "license": "MIT", "dependencies": { "@fortawesome/fontawesome-common-types": "6.5.2" }, @@ -380,8 +15253,7 @@ }, "node_modules/@fortawesome/react-fontawesome": { "version": "0.1.19", - "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.19.tgz", - "integrity": "sha512-Hyb+lB8T18cvLNX0S3llz7PcSOAJMLwiVKBuuzwM/nI5uoBw+gQjnf9il0fR1C3DKOI5Kc79pkJ4/xB0Uw9aFQ==", + "license": "MIT", "dependencies": { "prop-types": "^15.8.1" }, @@ -396,8 +15268,6 @@ }, "node_modules/@openedx/paragon": { "version": "22.7.0", - "resolved": "https://registry.npmjs.org/@openedx/paragon/-/paragon-22.7.0.tgz", - "integrity": "sha512-BWj4vYXUmLS0BinJckxbhNp0o1UPfwURinaSgTxxBkF0L2VUtAO+SldVWvKDqlltzoR062yjcBA5QSGq8Jxgeg==", "license": "Apache-2.0", "workspaces": [ "example", @@ -448,8 +15318,7 @@ }, "node_modules/@popperjs/core": { "version": "2.11.8", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", - "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/popperjs" @@ -457,24 +15326,21 @@ }, "node_modules/@remix-run/router": { "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.18.0.tgz", - "integrity": "sha512-L3jkqmqoSVBVKHfpGZmLrex0lxR5SucGA0sUfFzGctehw+S/ggL9L/0NnC5mw6P8HUWpFZ3nQw3cRApjjWx9Sw==", + "license": "MIT", "engines": { "node": ">=14.0.0" } }, "node_modules/@restart/context": { "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@restart/context/-/context-2.1.4.tgz", - "integrity": "sha512-INJYZQJP7g+IoDUh/475NlGiTeMfwTXUEr3tmRneckHIxNolGOW9CTq83S8cxq0CgJwwcMzMJFchxvlwe7Rk8Q==", + "license": "MIT", "peerDependencies": { "react": ">=16.3.2" } }, "node_modules/@restart/hooks": { "version": "0.4.16", - "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.4.16.tgz", - "integrity": "sha512-f7aCv7c+nU/3mF7NWLtVVr0Ra80RqsO89hO72r+Y/nvQr5+q0UFGkocElTH6MJApvReVh6JHUFYn2cw1WdHF3w==", + "license": "MIT", "dependencies": { "dequal": "^2.0.3" }, @@ -484,8 +15350,7 @@ }, "node_modules/@types/hoist-non-react-statics": { "version": "3.3.5", - "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz", - "integrity": "sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==", + "license": "MIT", "dependencies": { "@types/react": "*", "hoist-non-react-statics": "^3.3.0" @@ -493,18 +15358,15 @@ }, "node_modules/@types/invariant": { "version": "2.2.37", - "resolved": "https://registry.npmjs.org/@types/invariant/-/invariant-2.2.37.tgz", - "integrity": "sha512-IwpIMieE55oGWiXkQPSBY1nw1nFs6bsKXTFskNY8sdS17K24vyEBRQZEwlRS7ZmXCWnJcQtbxWzly+cODWGs2A==" + "license": "MIT" }, "node_modules/@types/prop-types": { "version": "15.7.12", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", - "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==" + "license": "MIT" }, "node_modules/@types/react": { "version": "18.3.3", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz", - "integrity": "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==", + "license": "MIT", "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -512,26 +15374,22 @@ }, "node_modules/@types/react-transition-group": { "version": "4.4.10", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.10.tgz", - "integrity": "sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==", + "license": "MIT", "dependencies": { "@types/react": "*" } }, "node_modules/@types/use-sync-external-store": { "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz", - "integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==" + "license": "MIT" }, "node_modules/@types/warning": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/warning/-/warning-3.0.3.tgz", - "integrity": "sha512-D1XC7WK8K+zZEveUPY+cf4+kgauk8N4eHr/XIHXGlGYkHLud6hK9lYfZk1ry1TNh798cZUCgb6MqGEG8DkJt6Q==" + "license": "MIT" }, "node_modules/ansi-escapes": { "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "license": "MIT", "dependencies": { "type-fest": "^0.21.3" }, @@ -544,16 +15402,14 @@ }, "node_modules/ansi-regex": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -566,8 +15422,7 @@ }, "node_modules/aria-hidden": { "version": "1.2.4", - "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.4.tgz", - "integrity": "sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==", + "license": "MIT", "dependencies": { "tslib": "^2.0.0" }, @@ -577,26 +15432,21 @@ }, "node_modules/assert-ok": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-ok/-/assert-ok-1.0.0.tgz", - "integrity": "sha512-lCvYmCpMl8c1tp9ynExhoDEk0gGW43SVVC3RE1VYrrVKhNMy8GHfdiwZdoIM6a605s56bUAbENQxtOC0uZp3wg==" + "license": "MIT" }, "node_modules/attr-accept": { "version": "2.2.2", - "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-2.2.2.tgz", - "integrity": "sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg==", + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/balanced-match": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + "license": "MIT" }, "node_modules/base64-js": { "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "funding": [ { "type": "github", @@ -610,12 +15460,12 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/bl": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "license": "MIT", "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -624,8 +15474,6 @@ }, "node_modules/bootstrap": { "version": "4.6.2", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.6.2.tgz", - "integrity": "sha512-51Bbp/Uxr9aTuy6ca/8FbFloBUJZLHwnhTcnjIeRn2suQWsWzcuJhGjKDB5eppVte/8oCdOL3VuwxvZDUggwGQ==", "funding": [ { "type": "github", @@ -636,6 +15484,7 @@ "url": "https://opencollective.com/bootstrap" } ], + "license": "MIT", "peerDependencies": { "jquery": "1.9.1 - 3", "popper.js": "^1.16.1" @@ -643,16 +15492,13 @@ }, "node_modules/brace-expansion": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/buffer": { "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "funding": [ { "type": "github", @@ -667,6 +15513,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -674,16 +15521,14 @@ }, "node_modules/cast-array": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cast-array/-/cast-array-1.0.1.tgz", - "integrity": "sha512-EiqtV+M9L42wd0IRgYjgVGDq7vdNBUUrdecd03QReJp8pIr59o2A1b0XfP+aCUlzLKx2E7zVetaogeJCtiHa+w==", + "license": "MIT", "dependencies": { "isarray": "0.0.1" } }, "node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -697,23 +15542,19 @@ }, "node_modules/chardet": { "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" + "license": "MIT" }, "node_modules/child_process": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/child_process/-/child_process-1.0.2.tgz", - "integrity": "sha512-Wmza/JzL0SiWz7kl6MhIKT5ceIlnFPJX+lwUGj7Clhy5MMldsSoJR0+uvRzOS5Kv45Mq7t1PoE8TsOA9bzvb6g==" + "license": "ISC" }, "node_modules/classnames": { "version": "2.5.1", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", - "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==" + "license": "MIT" }, "node_modules/cli-cursor": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "license": "MIT", "dependencies": { "restore-cursor": "^3.1.0" }, @@ -723,8 +15564,7 @@ }, "node_modules/cli-spinners": { "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "license": "MIT", "engines": { "node": ">=6" }, @@ -734,24 +15574,21 @@ }, "node_modules/cli-width": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "license": "ISC", "engines": { "node": ">= 10" } }, "node_modules/clone": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "license": "MIT", "engines": { "node": ">=0.8" } }, "node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -761,14 +15598,12 @@ }, "node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "license": "MIT" }, "node_modules/core-js-pure": { "version": "3.37.1", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.37.1.tgz", - "integrity": "sha512-J/r5JTHSmzTxbiYYrzXg9w1VpqrYt+gexenBE9pugeyhwPZTAEJddyiReJWsLO6uNQ8xJZFbod6XC7KKwatCiA==", "hasInstallScript": true, + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" @@ -776,26 +15611,22 @@ }, "node_modules/css-mediaquery": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/css-mediaquery/-/css-mediaquery-0.1.2.tgz", - "integrity": "sha512-COtn4EROW5dBGlE/4PiKnh6rZpAPxDeFLaEEwt4i10jpDMFt2EhQGS79QmmrO+iKCHv0PU/HrOWEhijFd1x99Q==" + "license": "BSD" }, "node_modules/csstype": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + "license": "MIT" }, "node_modules/decode-uri-component": { "version": "0.2.2", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", - "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "license": "MIT", "engines": { "node": ">=0.10" } }, "node_modules/defaults": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "license": "MIT", "dependencies": { "clone": "^1.0.2" }, @@ -805,21 +15636,18 @@ }, "node_modules/dequal": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/detect-node-es": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", - "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" + "license": "MIT" }, "node_modules/dom-helpers": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", - "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.8.7", "csstype": "^3.0.2" @@ -827,37 +15655,31 @@ }, "node_modules/email-prop-type": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/email-prop-type/-/email-prop-type-3.0.1.tgz", - "integrity": "sha512-tONZGMEOOkadp5OBftuVXU8DsceWmINxYK+pqPFB4LT5ODjrPX/esel3WGqbV7d6in5/MnZE4n4QcqOr4gh7dg==", + "license": "MIT", "dependencies": { "email-validator": "^2.0.4" } }, "node_modules/email-validator": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/email-validator/-/email-validator-2.0.4.tgz", - "integrity": "sha512-gYCwo7kh5S3IDyZPLZf6hSS0MnZT8QmJFqYvbqlDZSbwdZlY6QZWxJ4i/6UhITOJ4XzyI647Bm2MXKCLqnJ4nQ==", "engines": { "node": ">4.0" } }, "node_modules/emoji-regex": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "license": "MIT" }, "node_modules/escape-string-regexp": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", "engines": { "node": ">=0.8.0" } }, "node_modules/external-editor": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "license": "MIT", "dependencies": { "chardet": "^0.7.0", "iconv-lite": "^0.4.24", @@ -869,8 +15691,7 @@ }, "node_modules/figures": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "license": "MIT", "dependencies": { "escape-string-regexp": "^1.0.5" }, @@ -883,8 +15704,7 @@ }, "node_modules/file-selector": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-0.6.0.tgz", - "integrity": "sha512-QlZ5yJC0VxHxQQsQhXvBaC7VRJ2uaxTf+Tfpu4Z/OcVQJVpZO+DGU0rkoVW5ce2SccxugvpBJoMvUs59iILYdw==", + "license": "MIT", "dependencies": { "tslib": "^2.4.0" }, @@ -894,16 +15714,14 @@ }, "node_modules/filter-obj": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz", - "integrity": "sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/focus-lock": { "version": "1.3.5", - "resolved": "https://registry.npmjs.org/focus-lock/-/focus-lock-1.3.5.tgz", - "integrity": "sha512-QFaHbhv9WPUeLYBDe/PAuLKJ4Dd9OPvKs9xZBr3yLXnUrDNaVXKu2baDBXe3naPY30hgHYSsf2JW4jzas2mDEQ==", + "license": "MIT", "dependencies": { "tslib": "^2.0.3" }, @@ -913,30 +15731,25 @@ }, "node_modules/font-awesome": { "version": "4.7.0", - "resolved": "https://registry.npmjs.org/font-awesome/-/font-awesome-4.7.0.tgz", - "integrity": "sha512-U6kGnykA/6bFmg1M/oT9EkFeIYv7JlX3bozwQJWiiLz6L0w3F5vBVPxHlwyX/vtNq1ckcpRKOB9f2Qal/VtFpg==", + "license": "(OFL-1.1 AND MIT)", "engines": { "node": ">=0.10.3" } }, "node_modules/fs.realpath": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + "license": "ISC" }, "node_modules/get-nonce": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", - "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/glob": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -953,29 +15766,25 @@ }, "node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/hoist-non-react-statics": { "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "license": "BSD-3-Clause", "dependencies": { "react-is": "^16.7.0" } }, "node_modules/hyphenate-style-name": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.1.0.tgz", - "integrity": "sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw==" + "license": "BSD-3-Clause" }, "node_modules/iconv-lite": { "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -985,8 +15794,6 @@ }, "node_modules/ieee754": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "funding": [ { "type": "github", @@ -1000,12 +15807,12 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "BSD-3-Clause" }, "node_modules/imask": { "version": "7.6.1", - "resolved": "https://registry.npmjs.org/imask/-/imask-7.6.1.tgz", - "integrity": "sha512-sJlIFM7eathUEMChTh9Mrfw/IgiWgJqBKq2VNbyXvBZ7ev/IlO6/KQTKlV/Fm+viQMLrFLG/zCuudrLIwgK2dg==", + "license": "MIT", "dependencies": { "@babel/runtime-corejs3": "^7.24.4" }, @@ -1015,9 +15822,7 @@ }, "node_modules/inflight": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "license": "ISC", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -1025,13 +15830,11 @@ }, "node_modules/inherits": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "license": "ISC" }, "node_modules/inquirer": { "version": "8.2.6", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.6.tgz", - "integrity": "sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==", + "license": "MIT", "dependencies": { "ansi-escapes": "^4.2.1", "chalk": "^4.1.1", @@ -1055,8 +15858,7 @@ }, "node_modules/intl-messageformat": { "version": "10.5.14", - "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.5.14.tgz", - "integrity": "sha512-IjC6sI0X7YRjjyVH9aUgdftcmZK7WXdHeil4KwbjDnRWjnVitKpAx3rr6t6di1joFp5188VqKcobOPA6mCLG/w==", + "license": "BSD-3-Clause", "peer": true, "dependencies": { "@formatjs/ecma402-abstract": "2.0.0", @@ -1067,32 +15869,28 @@ }, "node_modules/invariant": { "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "license": "MIT", "dependencies": { "loose-envify": "^1.0.0" } }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/is-interactive": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/is-unicode-supported": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -1102,34 +15900,28 @@ }, "node_modules/isarray": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + "license": "MIT" }, "node_modules/jquery": { "version": "3.7.1", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz", - "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==", + "license": "MIT", "peer": true }, "node_modules/js-tokens": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + "license": "MIT" }, "node_modules/lodash": { "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "license": "MIT" }, "node_modules/lodash.uniqby": { "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", - "integrity": "sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==" + "license": "MIT" }, "node_modules/log-symbols": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "license": "MIT", "dependencies": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" @@ -1143,8 +15935,7 @@ }, "node_modules/loose-envify": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, @@ -1154,8 +15945,7 @@ }, "node_modules/mailto-link": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mailto-link/-/mailto-link-2.0.0.tgz", - "integrity": "sha512-b5FErkZ4t6mpH1IFZSw7Mm2IQHXQ2R0/5Q4xd7Rv8dVkWvE54mFG/UW7HjfFazXFjXTNsM+dSX2tTeIDrV9K9A==", + "license": "MIT", "dependencies": { "assert-ok": "~1.0.0", "cast-array": "~1.0.1", @@ -1168,24 +15958,21 @@ }, "node_modules/matchmediaquery": { "version": "0.3.1", - "resolved": "https://registry.npmjs.org/matchmediaquery/-/matchmediaquery-0.3.1.tgz", - "integrity": "sha512-Hlk20WQHRIm9EE9luN1kjRjYXAQToHOIAHPJn9buxBwuhfTHoKUcX+lXBbxc85DVQfXYbEQ4HcwQdd128E3qHQ==", + "license": "MIT", "dependencies": { "css-mediaquery": "^0.1.2" } }, "node_modules/mimic-fn": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/minimatch": { "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -1195,34 +15982,29 @@ }, "node_modules/mute-stream": { "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" + "license": "ISC" }, "node_modules/object-assign": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/object-filter": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/object-filter/-/object-filter-1.0.2.tgz", - "integrity": "sha512-NahvP2vZcy1ZiiYah30CEPw0FpDcSkSePJBMpzl5EQgCmISijiGuJm3SPYp7U+Lf2TljyaIw3E5EgkEx/TNEVA==" + "license": "MIT" }, "node_modules/once": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", "dependencies": { "wrappy": "1" } }, "node_modules/onetime": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" }, @@ -1235,8 +16017,7 @@ }, "node_modules/ora": { "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "license": "MIT", "dependencies": { "bl": "^4.1.0", "chalk": "^4.1.0", @@ -1257,17 +16038,14 @@ }, "node_modules/os-tmpdir": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/popper.js": { "version": "1.16.1", - "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", - "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==", - "deprecated": "You can find the new Popper v2 at @popperjs/core, this package is dedicated to the legacy v1", + "license": "MIT", "peer": true, "funding": { "type": "opencollective", @@ -1276,8 +16054,7 @@ }, "node_modules/prop-types": { "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", @@ -1286,8 +16063,7 @@ }, "node_modules/prop-types-extra": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.1.1.tgz", - "integrity": "sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew==", + "license": "MIT", "dependencies": { "react-is": "^16.3.2", "warning": "^4.0.0" @@ -1298,8 +16074,7 @@ }, "node_modules/query-string": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-7.0.1.tgz", - "integrity": "sha512-uIw3iRvHnk9to1blJCG3BTc+Ro56CBowJXKmNNAm3RulvPBzWLRqKSiiDk+IplJhsydwtuNMHi8UGQFcCLVfkA==", + "license": "MIT", "dependencies": { "decode-uri-component": "^0.2.0", "filter-obj": "^1.1.0", @@ -1315,8 +16090,7 @@ }, "node_modules/react": { "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", - "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", + "license": "MIT", "dependencies": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1" @@ -1327,8 +16101,7 @@ }, "node_modules/react-bootstrap": { "version": "1.6.8", - "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-1.6.8.tgz", - "integrity": "sha512-yD6uN78XlFOkETQp6GRuVe0s5509x3XYx8PfPbirwFTYCj5/RfmSs9YZGCwkUrhZNFzj7tZPdpb+3k50mK1E4g==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.14.0", "@restart/context": "^2.1.4", @@ -1355,8 +16128,7 @@ }, "node_modules/react-clientside-effect": { "version": "1.2.6", - "resolved": "https://registry.npmjs.org/react-clientside-effect/-/react-clientside-effect-1.2.6.tgz", - "integrity": "sha512-XGGGRQAKY+q25Lz9a/4EPqom7WRjz3z9R2k4jhVKA/puQFH/5Nt27vFZYql4m4NVNdUvX8PS3O7r/Zzm7cjUlg==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.13" }, @@ -1366,8 +16138,7 @@ }, "node_modules/react-colorful": { "version": "5.6.1", - "resolved": "https://registry.npmjs.org/react-colorful/-/react-colorful-5.6.1.tgz", - "integrity": "sha512-1exovf0uGTGyq5mXQT0zgQ80uvj2PCwvF8zY1RN9/vbJVSjSo3fsB/4L3ObbF7u70NduSiK4xu4Y6q1MHoUGEw==", + "license": "MIT", "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" @@ -1375,8 +16146,7 @@ }, "node_modules/react-dom": { "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", - "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", + "license": "MIT", "dependencies": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", @@ -1388,8 +16158,7 @@ }, "node_modules/react-dropzone": { "version": "14.2.3", - "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.2.3.tgz", - "integrity": "sha512-O3om8I+PkFKbxCukfIR3QAGftYXDZfOE2N1mr/7qebQJHs7U+/RSL/9xomJNpRg9kM5h9soQSdf0Gc7OHF5Fug==", + "license": "MIT", "dependencies": { "attr-accept": "^2.2.2", "file-selector": "^0.6.0", @@ -1404,13 +16173,11 @@ }, "node_modules/react-fast-compare": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", - "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==" + "license": "MIT" }, "node_modules/react-focus-lock": { "version": "2.12.1", - "resolved": "https://registry.npmjs.org/react-focus-lock/-/react-focus-lock-2.12.1.tgz", - "integrity": "sha512-lfp8Dve4yJagkHiFrC1bGtib3mF2ktqwPJw4/WGcgPW+pJ/AVQA5X2vI7xgp13FcxFEpYBBHpXai/N2DBNC0Jw==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.0.0", "focus-lock": "^1.3.5", @@ -1431,8 +16198,7 @@ }, "node_modules/react-focus-on": { "version": "3.9.3", - "resolved": "https://registry.npmjs.org/react-focus-on/-/react-focus-on-3.9.3.tgz", - "integrity": "sha512-GSLz54TvP6OUlsvnlgHJu80nHOAO2ikRTtDt/aP8GZu3DPPAbwHFdliveBwUfPnyKLUKutFMCJUkH55vuo4uKQ==", + "license": "MIT", "dependencies": { "aria-hidden": "^1.2.2", "react-focus-lock": "^2.11.3", @@ -1456,8 +16222,7 @@ }, "node_modules/react-imask": { "version": "7.6.1", - "resolved": "https://registry.npmjs.org/react-imask/-/react-imask-7.6.1.tgz", - "integrity": "sha512-vLNfzcCz62Yzx/GRGh5tiCph9Gbh2cZu+Tz8OiO5it2eNuuhpA0DWhhSlOtVtSJ80+Bx+vFK5De8eQ9AmbkXzA==", + "license": "MIT", "dependencies": { "imask": "^7.6.1", "prop-types": "^15.8.1" @@ -1471,8 +16236,7 @@ }, "node_modules/react-intl": { "version": "6.6.8", - "resolved": "https://registry.npmjs.org/react-intl/-/react-intl-6.6.8.tgz", - "integrity": "sha512-M0pkhzcgV31h++2901BiRXWl69hp2zPyLxRrSwRjd1ErXbNoubz/f4M6DrRTd4OiSUrT4ajRQzrmtS5plG4FtA==", + "license": "BSD-3-Clause", "peer": true, "dependencies": { "@formatjs/ecma402-abstract": "2.0.0", @@ -1498,26 +16262,22 @@ }, "node_modules/react-is": { "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + "license": "MIT" }, "node_modules/react-lifecycles-compat": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", - "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" + "license": "MIT" }, "node_modules/react-loading-skeleton": { "version": "3.4.0", - "resolved": "https://registry.npmjs.org/react-loading-skeleton/-/react-loading-skeleton-3.4.0.tgz", - "integrity": "sha512-1oJEBc9+wn7BbkQQk7YodlYEIjgeR+GrRjD+QXkVjwZN7LGIcAFHrx4NhT7UHGBxNY1+zax3c+Fo6XQM4R7CgA==", + "license": "MIT", "peerDependencies": { "react": ">=16.8.0" } }, "node_modules/react-overlays": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/react-overlays/-/react-overlays-5.2.1.tgz", - "integrity": "sha512-GLLSOLWr21CqtJn8geSwQfoJufdt3mfdsnIiQswouuQ2MMPns+ihZklxvsTDKD3cR2tF8ELbi5xUsvqVhR6WvA==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.13.8", "@popperjs/core": "^2.11.6", @@ -1535,8 +16295,7 @@ }, "node_modules/react-popper": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-2.3.0.tgz", - "integrity": "sha512-e1hj8lL3uM+sgSR4Lxzn5h1GxBlpa4CQz0XLF8kx4MDrDRWY0Ena4c97PUeSX9i5W3UAfDP0z0FXCTQkoXUl3Q==", + "license": "MIT", "dependencies": { "react-fast-compare": "^3.0.1", "warning": "^4.0.2" @@ -1549,13 +16308,11 @@ }, "node_modules/react-proptype-conditional-require": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/react-proptype-conditional-require/-/react-proptype-conditional-require-1.0.4.tgz", - "integrity": "sha512-nopsRn7KnGgazBe2c3H2+Kf+Csp6PGDRLiBkYEDMKY8o/EIgft/WnIm/OnAKTawZiLnJXHAqhpFBddvs6NiXlw==" + "license": "MIT" }, "node_modules/react-redux": { "version": "8.1.3", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-8.1.3.tgz", - "integrity": "sha512-n0ZrutD7DaX/j9VscF+uTALI3oUPa/pO4Z3soOBIjuRn/FzVu6aehhysxZCLi6y7duMf52WNZGMl7CtuK5EnRw==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.1", "@types/hoist-non-react-statics": "^3.3.1", @@ -1592,13 +16349,11 @@ }, "node_modules/react-redux/node_modules/react-is": { "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" + "license": "MIT" }, "node_modules/react-remove-scroll": { "version": "2.5.10", - "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.10.tgz", - "integrity": "sha512-m3zvBRANPBw3qxVVjEIPEQinkcwlFZ4qyomuWVpNJdv4c6MvHfXV0C3L9Jx5rr3HeBHKNRX+1jreB5QloDIJjA==", + "license": "MIT", "dependencies": { "react-remove-scroll-bar": "^2.3.6", "react-style-singleton": "^2.2.1", @@ -1621,8 +16376,7 @@ }, "node_modules/react-remove-scroll-bar": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.6.tgz", - "integrity": "sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==", + "license": "MIT", "dependencies": { "react-style-singleton": "^2.2.1", "tslib": "^2.0.0" @@ -1642,8 +16396,7 @@ }, "node_modules/react-responsive": { "version": "8.2.0", - "resolved": "https://registry.npmjs.org/react-responsive/-/react-responsive-8.2.0.tgz", - "integrity": "sha512-iagCqVrw4QSjhxKp3I/YK6+ODkWY6G+YPElvdYKiUUbywwh9Ds0M7r26Fj2/7dWFFbOpcGnJE6uE7aMck8j5Qg==", + "license": "MIT", "dependencies": { "hyphenate-style-name": "^1.0.0", "matchmediaquery": "^0.3.0", @@ -1659,8 +16412,7 @@ }, "node_modules/react-router": { "version": "6.25.1", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.25.1.tgz", - "integrity": "sha512-u8ELFr5Z6g02nUtpPAggP73Jigj1mRePSwhS/2nkTrlPU5yEkH1vYzWNyvSnSzeeE2DNqWdH+P8OhIh9wuXhTw==", + "license": "MIT", "dependencies": { "@remix-run/router": "1.18.0" }, @@ -1673,8 +16425,7 @@ }, "node_modules/react-router-dom": { "version": "6.25.1", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.25.1.tgz", - "integrity": "sha512-0tUDpbFvk35iv+N89dWNrJp+afLgd+y4VtorJZuOCXK0kkCWjEvb3vTJM++SYvMEpbVwXKf3FjeVveVEb6JpDQ==", + "license": "MIT", "dependencies": { "@remix-run/router": "1.18.0", "react-router": "6.25.1" @@ -1689,9 +16440,8 @@ }, "node_modules/react-shallow-renderer": { "version": "16.15.0", - "resolved": "https://registry.npmjs.org/react-shallow-renderer/-/react-shallow-renderer-16.15.0.tgz", - "integrity": "sha512-oScf2FqQ9LFVQgA73vr86xl2NaOIX73rh+YFqcOp68CWj56tSfgtGKrEbyhCj0rSijyG9M1CYprTh39fBi5hzA==", "dev": true, + "license": "MIT", "dependencies": { "object-assign": "^4.1.1", "react-is": "^16.12.0 || ^17.0.0 || ^18.0.0" @@ -1702,8 +16452,7 @@ }, "node_modules/react-style-singleton": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz", - "integrity": "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==", + "license": "MIT", "dependencies": { "get-nonce": "^1.0.0", "invariant": "^2.2.4", @@ -1724,8 +16473,7 @@ }, "node_modules/react-table": { "version": "7.8.0", - "resolved": "https://registry.npmjs.org/react-table/-/react-table-7.8.0.tgz", - "integrity": "sha512-hNaz4ygkZO4bESeFfnfOft73iBUj8K5oKi1EcSHPAibEydfsX2MyU6Z8KCr3mv3C9Kqqh71U+DhZkFvibbnPbA==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/tannerlinsley" @@ -1736,9 +16484,8 @@ }, "node_modules/react-test-renderer": { "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-17.0.2.tgz", - "integrity": "sha512-yaQ9cB89c17PUb0x6UfWRs7kQCorVdHlutU1boVPEsB8IDZH6n9tHxMacc3y0JoXOJUsZb/t/Mb8FUWMKaM7iQ==", "dev": true, + "license": "MIT", "dependencies": { "object-assign": "^4.1.1", "react-is": "^17.0.2", @@ -1751,14 +16498,12 @@ }, "node_modules/react-test-renderer/node_modules/react-is": { "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/react-transition-group": { "version": "4.4.5", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", - "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "license": "BSD-3-Clause", "dependencies": { "@babel/runtime": "^7.5.5", "dom-helpers": "^5.0.1", @@ -1772,8 +16517,7 @@ }, "node_modules/readable-stream": { "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -1785,21 +16529,18 @@ }, "node_modules/redux": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", - "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.9.2" } }, "node_modules/regenerator-runtime": { "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + "license": "MIT" }, "node_modules/restore-cursor": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "license": "MIT", "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" @@ -1810,24 +16551,20 @@ }, "node_modules/run-async": { "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "license": "MIT", "engines": { "node": ">=0.12.0" } }, "node_modules/rxjs": { "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "license": "Apache-2.0", "dependencies": { "tslib": "^2.1.0" } }, "node_modules/safe-buffer": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "funding": [ { "type": "github", @@ -1841,17 +16578,16 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/safer-buffer": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "license": "MIT" }, "node_modules/scheduler": { "version": "0.20.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", - "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "license": "MIT", "dependencies": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1" @@ -1859,42 +16595,36 @@ }, "node_modules/shallow-equal": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/shallow-equal/-/shallow-equal-1.2.1.tgz", - "integrity": "sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==" + "license": "MIT" }, "node_modules/signal-exit": { "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + "license": "ISC" }, "node_modules/split-on-first": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", - "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/strict-uri-encode": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", - "integrity": "sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==", + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/string_decoder": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", "dependencies": { "safe-buffer": "~5.2.0" } }, "node_modules/string-width": { "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -1906,8 +16636,7 @@ }, "node_modules/strip-ansi": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -1917,8 +16646,7 @@ }, "node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -1928,18 +16656,15 @@ }, "node_modules/tabbable": { "version": "5.3.3", - "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-5.3.3.tgz", - "integrity": "sha512-QD9qKY3StfbZqWOPLp0++pOrAVb/HbUi5xCc8cUo4XjP19808oaMiDzn0leBY5mCespIBM0CIZePzZjgzR83kA==" + "license": "MIT" }, "node_modules/through": { "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" + "license": "MIT" }, "node_modules/tmp": { "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "license": "MIT", "dependencies": { "os-tmpdir": "~1.0.2" }, @@ -1949,13 +16674,11 @@ }, "node_modules/tslib": { "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + "license": "0BSD" }, "node_modules/type-fest": { "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -1965,8 +16688,7 @@ }, "node_modules/typescript": { "version": "5.5.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.3.tgz", - "integrity": "sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==", + "license": "Apache-2.0", "optional": true, "peer": true, "bin": { @@ -1979,8 +16701,7 @@ }, "node_modules/uncontrollable": { "version": "7.2.1", - "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-7.2.1.tgz", - "integrity": "sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.6.3", "@types/react": ">=16.9.11", @@ -1993,8 +16714,7 @@ }, "node_modules/use-callback-ref": { "version": "1.3.2", - "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.2.tgz", - "integrity": "sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==", + "license": "MIT", "dependencies": { "tslib": "^2.0.0" }, @@ -2013,8 +16733,7 @@ }, "node_modules/use-sidecar": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz", - "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==", + "license": "MIT", "dependencies": { "detect-node-es": "^1.1.0", "tslib": "^2.0.0" @@ -2034,49 +16753,43 @@ }, "node_modules/use-sync-external-store": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz", - "integrity": "sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==", + "license": "MIT", "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, "node_modules/util-deprecate": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + "license": "MIT" }, "node_modules/uuid": { "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" ], + "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } }, "node_modules/warning": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", - "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "license": "MIT", "dependencies": { "loose-envify": "^1.0.0" } }, "node_modules/wcwidth": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "license": "MIT", "dependencies": { "defaults": "^1.0.3" } }, "node_modules/wrap-ansi": { "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -2088,8 +16801,7 @@ }, "node_modules/wrappy": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + "license": "ISC" } } } From aa8114c4fe63778c7bf3f99c17f8f8f8772deb5a Mon Sep 17 00:00:00 2001 From: David Joy Date: Fri, 9 Aug 2024 16:45:03 -0400 Subject: [PATCH 12/90] test: removing warnings from AppProvider test Added missing languages so it stops complaining. --- runtime/react/AppProvider.test.jsx | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/runtime/react/AppProvider.test.jsx b/runtime/react/AppProvider.test.jsx index af0a7625..a5a2795a 100644 --- a/runtime/react/AppProvider.test.jsx +++ b/runtime/react/AppProvider.test.jsx @@ -1,8 +1,7 @@ -import React from 'react'; -import { createStore } from 'redux'; import { render } from '@testing-library/react'; -import AppProvider from './AppProvider'; +import { createStore } from 'redux'; import { initialize } from '../initialize'; +import AppProvider from './AppProvider'; jest.mock('../auth', () => ({ configure: () => {}, @@ -44,6 +43,8 @@ describe('AppProvider', () => { ru: {}, th: {}, uk: {}, + 'fa-ir': {}, + fa: {}, }, }); }); From 09b2bc663af7ea7d485991695bcf11307bc53aa1 Mon Sep 17 00:00:00 2001 From: David Joy Date: Fri, 9 Aug 2024 16:45:46 -0400 Subject: [PATCH 13/90] refactor: simplifying pubSub.js by just re-exporting MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit There’s no good reason to wrap PubSub’s functions with our own. Removing it. --- runtime/pubSub.js | 31 +++++-------------------------- 1 file changed, 5 insertions(+), 26 deletions(-) diff --git a/runtime/pubSub.js b/runtime/pubSub.js index db540ea1..00e5f35d 100644 --- a/runtime/pubSub.js +++ b/runtime/pubSub.js @@ -19,29 +19,8 @@ import PubSub from 'pubsub-js'; -/** - * - * @param {string} type - * @param {function} callback - * @returns {string} A subscription token that can be passed to `unsubscribe` - */ -export function subscribe(type, callback) { - return PubSub.subscribe(type, callback); -} - -/** - * - * @param {string} token A subscription token provided by `subscribe` - */ -export function unsubscribe(token) { - return PubSub.unsubscribe(token); -} - -/** - * - * @param {string} type - * @param {Object} data - */ -export function publish(type, data) { - return PubSub.publish(type, data); -} +export const { + subscribe, + unsubscribe, + publish, +} = PubSub; From ec41d23641c99319bc45a8c2f8c7233f4a9102d0 Mon Sep 17 00:00:00 2001 From: David Joy Date: Fri, 9 Aug 2024 16:46:27 -0400 Subject: [PATCH 14/90] =?UTF-8?q?fix:=20mocking=20console.error=20to=20rem?= =?UTF-8?q?ove=20false=20positive=20=E2=80=98errors=E2=80=99=20from=20test?= =?UTF-8?q?s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Some tests in this file intentionally log errors. This removes them from output. --- runtime/plugins/PluginSlot.test.jsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/runtime/plugins/PluginSlot.test.jsx b/runtime/plugins/PluginSlot.test.jsx index b3ef7e95..6d670a7d 100644 --- a/runtime/plugins/PluginSlot.test.jsx +++ b/runtime/plugins/PluginSlot.test.jsx @@ -67,10 +67,12 @@ const TestPluginSlot = ( describe('PluginSlot', () => { beforeEach(() => { usePluginSlot.mockReturnValue(defaultSlotConfig); + console.error = jest.fn(); }); afterEach(() => { jest.clearAllMocks(); + console.error.mockRestore(); }); it('should render multiple types of Plugin in a single slot config', () => { From 095d4289fe81185a465cea7ffa607037cac78a15 Mon Sep 17 00:00:00 2001 From: David Joy Date: Fri, 9 Aug 2024 16:47:15 -0400 Subject: [PATCH 15/90] test: removing PubSub warnings about re-initialization MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This test doesn’t rely on pubsub, but loads it. This just mocks it out so we don’t get any warnings. --- runtime/react/AuthenticatedPageRoute.test.jsx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/runtime/react/AuthenticatedPageRoute.test.jsx b/runtime/react/AuthenticatedPageRoute.test.jsx index c629b093..32aa52e2 100644 --- a/runtime/react/AuthenticatedPageRoute.test.jsx +++ b/runtime/react/AuthenticatedPageRoute.test.jsx @@ -1,13 +1,13 @@ /* eslint-disable react/jsx-no-constructed-context-values */ -import React from 'react'; import { render } from '@testing-library/react'; -import { Route, Routes, MemoryRouter } from 'react-router-dom'; +import { MemoryRouter, Route, Routes } from 'react-router-dom'; +import { sendPageEvent } from '../analytics'; import { getAuthenticatedUser, getLoginRedirectUrl } from '../auth'; -import AuthenticatedPageRoute from './AuthenticatedPageRoute'; -import AppContext from './AppContext'; import { getConfig } from '../config'; -import { sendPageEvent } from '../analytics'; +import AppContext from './AppContext'; +import AuthenticatedPageRoute from './AuthenticatedPageRoute'; +jest.mock('../pubSub'); jest.mock('../analytics'); jest.mock('../auth'); From be69452fbc608509947ba0552a223783acac694d Mon Sep 17 00:00:00 2001 From: David Joy Date: Fri, 9 Aug 2024 16:47:51 -0400 Subject: [PATCH 16/90] =?UTF-8?q?test:=20ignoring=20the=20=E2=80=98shell?= =?UTF-8?q?=E2=80=99=20folder=20in=20the=20runtime=20jest=20config?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This removes a warning about duplicate __mocks__ files. --- runtime/jest.config.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/runtime/jest.config.js b/runtime/jest.config.js index aa81d66e..3add51d5 100644 --- a/runtime/jest.config.js +++ b/runtime/jest.config.js @@ -24,7 +24,8 @@ module.exports = { '/node_modules/(?!(@openedx|@edx)/)', ], modulePathIgnorePatterns: [ - '/dist/', + '/dist', + '/shell', ], testPathIgnorePatterns: [ '/node_modules/', From 4101c6c4b30f31764cd35235710878f10d2855e1 Mon Sep 17 00:00:00 2001 From: David Joy Date: Fri, 9 Aug 2024 16:53:47 -0400 Subject: [PATCH 17/90] =?UTF-8?q?test:=20call=20pubsub=E2=80=99s=20methods?= =?UTF-8?q?=20directly=20to=20avoid=20warning?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit If we import pubsub and call its functions directly, instead of through our re-export, it avoids some warnings in our test suite about re-initializing PubSub. We only use the re-export for consumers of frontend-base, basically, and internally use PubSub directly. --- runtime/auth/interface.js | 5 ++--- runtime/config.js | 8 ++++---- .../initialize.async.function.config.test.js | 1 + runtime/initialize.const.config.test.js | 1 + runtime/initialize.function.config.test.js | 3 ++- runtime/initialize.js | 19 ++++++++---------- runtime/initialize.test.js | 20 +++++++++---------- runtime/react/hooks.js | 5 ++--- 8 files changed, 30 insertions(+), 32 deletions(-) diff --git a/runtime/auth/interface.js b/runtime/auth/interface.js index efddf576..4254ed14 100644 --- a/runtime/auth/interface.js +++ b/runtime/auth/interface.js @@ -35,7 +35,6 @@ * @module Auth */ import PropTypes from 'prop-types'; -import { publish } from '../pubSub'; /** * @constant @@ -207,7 +206,7 @@ export function getAuthenticatedUser() { */ export function setAuthenticatedUser(authUser) { service.setAuthenticatedUser(authUser); - publish(AUTHENTICATED_USER_CHANGED); + global.PubSub.publish(AUTHENTICATED_USER_CHANGED); } /** @@ -248,7 +247,7 @@ export async function ensureAuthenticatedUser(redirectUrl) { */ export async function hydrateAuthenticatedUser() { await service.hydrateAuthenticatedUser(); - publish(AUTHENTICATED_USER_CHANGED); + global.PubSub.publish(AUTHENTICATED_USER_CHANGED); } /** diff --git a/runtime/config.js b/runtime/config.js index 41b20825..30f11002 100644 --- a/runtime/config.js +++ b/runtime/config.js @@ -123,9 +123,9 @@ * @module Config */ +import 'pubsub-js'; import { APP_CONFIG_INITIALIZED, CONFIG_CHANGED } from './constants'; -import { publish, subscribe } from './pubSub'; import { ensureDefinedConfig } from './utils'; function extractRegex(envVar) { @@ -214,7 +214,7 @@ export function getConfig() { export function setConfig(newConfig) { ensureDefinedConfig(config, 'config'); config = newConfig; - publish(CONFIG_CHANGED); + global.PubSub.publish(CONFIG_CHANGED); } /** @@ -234,7 +234,7 @@ export function setConfig(newConfig) { export function mergeConfig(newConfig) { ensureDefinedConfig(newConfig, 'ProcessEnvConfigService'); config = Object.assign(config, newConfig); - publish(CONFIG_CHANGED); + global.PubSub.publish(CONFIG_CHANGED); } /** @@ -262,7 +262,7 @@ export function mergeConfig(newConfig) { * @param {string} [requester='unspecified application code'] */ export function ensureConfig(keys, requester = 'unspecified application code') { - subscribe(APP_CONFIG_INITIALIZED, () => { + global.PubSub.subscribe(APP_CONFIG_INITIALIZED, () => { keys.forEach((key) => { if (config[key] === undefined) { // eslint-disable-next-line no-console diff --git a/runtime/initialize.async.function.config.test.js b/runtime/initialize.async.function.config.test.js index 4ce61f02..04418723 100644 --- a/runtime/initialize.async.function.config.test.js +++ b/runtime/initialize.async.function.config.test.js @@ -1,3 +1,4 @@ +import 'pubsub-js'; import { initialize } from './initialize'; import { diff --git a/runtime/initialize.const.config.test.js b/runtime/initialize.const.config.test.js index db19c870..bfd6fc80 100644 --- a/runtime/initialize.const.config.test.js +++ b/runtime/initialize.const.config.test.js @@ -1,3 +1,4 @@ +import 'pubsub-js'; import { initialize } from './initialize'; import { diff --git a/runtime/initialize.function.config.test.js b/runtime/initialize.function.config.test.js index 3b1a8498..1fb180c1 100644 --- a/runtime/initialize.function.config.test.js +++ b/runtime/initialize.function.config.test.js @@ -1,4 +1,4 @@ -import { initialize } from './initialize'; +import 'pubsub-js'; import { ensureAuthenticatedUser, @@ -6,6 +6,7 @@ import { hydrateAuthenticatedUser, } from './auth'; import { getConfig } from './config'; +import { initialize } from './initialize'; import { logError, } from './logging'; diff --git a/runtime/initialize.js b/runtime/initialize.js index 09804cf1..9f9ff16e 100644 --- a/runtime/initialize.js +++ b/runtime/initialize.js @@ -58,9 +58,6 @@ falls back to an empty object `{}` if the file doesn't exist. This acts like an in a sense. */ import envConfig from 'env.config'; -import { - publish, -} from './pubSub'; import { getPath } from './utils'; // eslint-disable-next-line import/no-cycle import { @@ -311,13 +308,13 @@ export async function initialize({ try { // Pub/Sub await handlers.pubSub(); - publish(APP_PUBSUB_INITIALIZED); + global.PubSub.publish(APP_PUBSUB_INITIALIZED); // Configuration await handlers.config(); await jsFileConfig(); await runtimeConfig(); - publish(APP_CONFIG_INITIALIZED); + global.PubSub.publish(APP_CONFIG_INITIALIZED); loadExternalScripts(externalScripts, { config: getConfig(), @@ -337,7 +334,7 @@ export async function initialize({ config: getConfig(), }); await handlers.logging(); - publish(APP_LOGGING_INITIALIZED); + global.PubSub.publish(APP_LOGGING_INITIALIZED); // Internationalization configureI18n({ @@ -346,7 +343,7 @@ export async function initialize({ loggingService: getLoggingService(), }); await handlers.i18n(); - publish(APP_I18N_INITIALIZED); + global.PubSub.publish(APP_I18N_INITIALIZED); // Authentication configureAuth(authServiceImpl, { @@ -356,7 +353,7 @@ export async function initialize({ }); await handlers.auth(requireUser, hydrateUser); - publish(APP_AUTH_INITIALIZED); + global.PubSub.publish(APP_AUTH_INITIALIZED); // Analytics configureAnalytics(analyticsServiceImpl, { @@ -365,16 +362,16 @@ export async function initialize({ httpClient: getAuthenticatedHttpClient(), }); await handlers.analytics(); - publish(APP_ANALYTICS_INITIALIZED); + global.PubSub.publish(APP_ANALYTICS_INITIALIZED); // Application Ready await handlers.ready(); - publish(APP_READY); + global.PubSub.publish(APP_READY); } catch (error) { if (!error.isRedirecting) { // Initialization Error await handlers.initError(error); - publish(APP_INIT_ERROR, error); + global.PubSub.publish(APP_INIT_ERROR, error); } } } diff --git a/runtime/initialize.test.js b/runtime/initialize.test.js index 8fd84f88..7b52bc4b 100644 --- a/runtime/initialize.test.js +++ b/runtime/initialize.test.js @@ -1,4 +1,5 @@ import { createBrowserHistory } from 'history'; +import 'pubsub-js'; import { APP_ANALYTICS_INITIALIZED, APP_AUTH_INITIALIZED, @@ -10,7 +11,6 @@ import { APP_READY, } from './constants'; import { initialize } from './initialize'; -import { subscribe } from './pubSub'; import { configure as configureAnalytics, SegmentAnalyticsService } from './analytics'; import { @@ -106,13 +106,13 @@ describe('initialize', () => { } } - subscribe(APP_PUBSUB_INITIALIZED, checkDispatchedDone); - subscribe(APP_CONFIG_INITIALIZED, checkDispatchedDone); - subscribe(APP_LOGGING_INITIALIZED, checkDispatchedDone); - subscribe(APP_AUTH_INITIALIZED, checkDispatchedDone); - subscribe(APP_ANALYTICS_INITIALIZED, checkDispatchedDone); - subscribe(APP_I18N_INITIALIZED, checkDispatchedDone); - subscribe(APP_READY, checkDispatchedDone); + global.PubSub.subscribe(APP_PUBSUB_INITIALIZED, checkDispatchedDone); + global.PubSub.subscribe(APP_CONFIG_INITIALIZED, checkDispatchedDone); + global.PubSub.subscribe(APP_LOGGING_INITIALIZED, checkDispatchedDone); + global.PubSub.subscribe(APP_AUTH_INITIALIZED, checkDispatchedDone); + global.PubSub.subscribe(APP_ANALYTICS_INITIALIZED, checkDispatchedDone); + global.PubSub.subscribe(APP_I18N_INITIALIZED, checkDispatchedDone); + global.PubSub.subscribe(APP_READY, checkDispatchedDone); const messages = { i_am: 'a message' }; await initialize({ messages }); @@ -222,7 +222,7 @@ describe('initialize', () => { expect(data).toEqual(new Error('uhoh!')); } - subscribe(APP_INIT_ERROR, errorHandler); + global.PubSub.subscribe(APP_INIT_ERROR, errorHandler); await initialize({ messages: null, @@ -258,7 +258,7 @@ describe('initialize', () => { expect(data).toEqual(new Error('uhoh!')); } - subscribe(APP_INIT_ERROR, errorHandler); + global.PubSub.subscribe(APP_INIT_ERROR, errorHandler); await initialize({ messages: null, diff --git a/runtime/react/hooks.js b/runtime/react/hooks.js index 83800cc0..a3b10cb9 100644 --- a/runtime/react/hooks.js +++ b/runtime/react/hooks.js @@ -1,6 +1,5 @@ /* eslint-disable import/prefer-default-export */ import { useEffect } from 'react'; -import { subscribe, unsubscribe } from '../pubSub'; import { sendTrackEvent } from '../analytics'; /** @@ -15,10 +14,10 @@ import { sendTrackEvent } from '../analytics'; */ export const useAppEvent = (type, callback) => { useEffect(() => { - const subscriptionToken = subscribe(type, callback); + const subscriptionToken = global.PubSub.subscribe(type, callback); return function cleanup() { - unsubscribe(subscriptionToken); + global.PubSub.unsubscribe(subscriptionToken); }; }, [callback, type]); }; From 6e236de40007c05e23f781e58e7e0be6b561cde2 Mon Sep 17 00:00:00 2001 From: David Joy Date: Fri, 9 Aug 2024 16:54:37 -0400 Subject: [PATCH 18/90] test: shell test suite uses an env.test.config.tsx file now MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This replaces the __mocks__ env.config.js file, and feels like a more ‘real’ way to do this. --- shell/__mocks__/env.config.js | 1 - shell/env.test.config.tsx | 37 +++++++++++++++++++++++++++++++++++ shell/jest.config.js | 2 +- 3 files changed, 38 insertions(+), 2 deletions(-) delete mode 100644 shell/__mocks__/env.config.js create mode 100644 shell/env.test.config.tsx diff --git a/shell/__mocks__/env.config.js b/shell/__mocks__/env.config.js deleted file mode 100644 index f053ebf7..00000000 --- a/shell/__mocks__/env.config.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = {}; diff --git a/shell/env.test.config.tsx b/shell/env.test.config.tsx new file mode 100644 index 00000000..925c404f --- /dev/null +++ b/shell/env.test.config.tsx @@ -0,0 +1,37 @@ +import { OpenedXConfig } from '..'; + +const config: OpenedXConfig = { + ACCESS_TOKEN_COOKIE_NAME: 'edx-jwt-cookie-header-payload', + ACCOUNT_PROFILE_URL: 'http://localhost:1995', + ACCOUNT_SETTINGS_URL: 'http://localhost:1997', + BASE_URL: 'localhost:8080', + CREDENTIALS_BASE_URL: 'http://localhost:18150', + CSRF_TOKEN_API_PATH: '/csrf/api/v1/token', + DISCOVERY_API_BASE_URL: 'http://localhost:18381', + PUBLISHER_BASE_URL: 'http://localhost:18400', + ECOMMERCE_BASE_URL: 'http://localhost:18130', + LANGUAGE_PREFERENCE_COOKIE_NAME: 'openedx-language-preference', + LMS_BASE_URL: 'http://localhost:18000', + LEARNING_BASE_URL: 'http://localhost:2000', + LOGIN_URL: 'http://localhost:18000/login', + LOGOUT_URL: 'http://localhost:18000/logout', + STUDIO_BASE_URL: 'http://localhost:18010', + MARKETING_SITE_BASE_URL: 'http://localhost:18000', + ORDER_HISTORY_URL: 'localhost:1996/orders', + REFRESH_ACCESS_TOKEN_ENDPOINT: 'http://localhost:18000/login_refresh', + SEGMENT_KEY: 'segment_whoa', + SITE_NAME: 'edX', + USER_INFO_COOKIE_NAME: 'edx-user-info', + LOGO_URL: 'https://edx-cdn.org/v3/default/logo.svg', + LOGO_TRADEMARK_URL: 'https://edx-cdn.org/v3/default/logo-trademark.svg', + LOGO_WHITE_URL: 'https://edx-cdn.org/v3/default/logo-white.svg', + FAVICON_URL: 'https://edx-cdn.org/v3/default/favicon.ico', + MFE_CONFIG_API_URL: null, + APP_ID: 'runtime', + SUPPORT_URL: 'https://support.edx.org', + ENVIRONMENT: 'test', + IGNORED_ERROR_REGEX: null, + PUBLIC_PATH: '/' +}; + +export default config; diff --git a/shell/jest.config.js b/shell/jest.config.js index 7ad3a878..c785a39a 100644 --- a/shell/jest.config.js +++ b/shell/jest.config.js @@ -6,7 +6,7 @@ module.exports = { '\\.svg$': '/shell/__mocks__/svg.js', '\\.(jpg|jpeg|png|gif|eot|otf|webp|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$': '/shell/__mocks__/file.js', '\\.(css|scss)$': require.resolve('identity-obj-proxy'), - 'env.config': '/shell/__mocks__/env.config.js', + 'env.config': '/shell/env.test.config.tsx', }, testEnvironment: 'jsdom', testEnvironmentOptions: { From 712629d5c86eb00e54d94f5514f9dbfac76ff4c6 Mon Sep 17 00:00:00 2001 From: David Joy Date: Fri, 9 Aug 2024 16:55:25 -0400 Subject: [PATCH 19/90] feat: making SUPPORT_URL optional If a SUPPORT_URL is not specified in the configuration, the link in the header will be hidden. This is a small step toward a slimmer and more flexible configuration document. --- shell/header/learning-header/AuthenticatedUserDropdown.jsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/shell/header/learning-header/AuthenticatedUserDropdown.jsx b/shell/header/learning-header/AuthenticatedUserDropdown.jsx index 80abfc62..4d462e39 100644 --- a/shell/header/learning-header/AuthenticatedUserDropdown.jsx +++ b/shell/header/learning-header/AuthenticatedUserDropdown.jsx @@ -17,7 +17,9 @@ const AuthenticatedUserDropdown = ({ intl, username }) => { return ( <> - {intl.formatMessage(messages.help)} + {getConfig().SUPPORT_URL && ( + {intl.formatMessage(messages.help)} + )} {/* */} From ff7d60a5791b5c00a1136be78642f7d65e829ed5 Mon Sep 17 00:00:00 2001 From: David Joy Date: Fri, 9 Aug 2024 16:57:31 -0400 Subject: [PATCH 20/90] test: properly mocks env.config in some runtime initialization tests As far as the test suite is concerned, env.config is a package. It gets mocked in our jest.config, and these are just overriding that further. They have no concept of its file extension. --- runtime/initialize.async.function.config.test.js | 2 +- runtime/initialize.const.config.test.js | 2 +- runtime/initialize.function.config.test.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/runtime/initialize.async.function.config.test.js b/runtime/initialize.async.function.config.test.js index 04418723..63a997b3 100644 --- a/runtime/initialize.async.function.config.test.js +++ b/runtime/initialize.async.function.config.test.js @@ -16,7 +16,7 @@ jest.mock('./auth'); jest.mock('./analytics'); jest.mock('./i18n'); jest.mock('./auth/LocalForageCache'); -jest.mock('env.config.js', () => async () => new Promise((resolve) => { +jest.mock('env.config', () => async () => new Promise((resolve) => { resolve({ JS_FILE_VAR: 'JS_FILE_VAR_VALUE_ASYNC_FUNCTION', }); diff --git a/runtime/initialize.const.config.test.js b/runtime/initialize.const.config.test.js index bfd6fc80..cf8ee6fa 100644 --- a/runtime/initialize.const.config.test.js +++ b/runtime/initialize.const.config.test.js @@ -16,7 +16,7 @@ jest.mock('./auth'); jest.mock('./analytics'); jest.mock('./i18n'); jest.mock('./auth/LocalForageCache'); -jest.mock('env.config.js', () => ({ +jest.mock('env.config', () => ({ JS_FILE_VAR: 'JS_FILE_VAR_VALUE_CONSTANT', })); diff --git a/runtime/initialize.function.config.test.js b/runtime/initialize.function.config.test.js index 1fb180c1..2a7ecd66 100644 --- a/runtime/initialize.function.config.test.js +++ b/runtime/initialize.function.config.test.js @@ -16,7 +16,7 @@ jest.mock('./auth'); jest.mock('./analytics'); jest.mock('./i18n'); jest.mock('./auth/LocalForageCache'); -jest.mock('env.config.js', () => () => ({ +jest.mock('env.config', () => () => ({ JS_FILE_VAR: 'JS_FILE_VAR_VALUE_FUNCTION', })); From 113e52c6f13a24d4bc39f70b18a042dd3c0b2d43 Mon Sep 17 00:00:00 2001 From: David Joy Date: Fri, 9 Aug 2024 17:31:21 -0400 Subject: [PATCH 21/90] feat: making env.config the fundamental way frontends are configured This commit effectively finishes removing support for using process.env files for configuration. Prior to this, the config object exposed by getConfig() was initialized using process.env, the config handler was then called, and finally env.config and runtime config were layered on top of it in that order. Now, the config handler has been moved after env.config processing, allowing it to override env.config values. The configuration object is initialized with minimal defaults and null, relying on env.config to provide real values. This had an impact on some of our tests, which this commit also adjusts. To end users of frontend-base, it simply means that process.env and .env files are no longer used, and an env.config.tsx file is required. --- .env | 22 ------- .env.development | 30 --------- .env.test | 30 --------- runtime/__mocks__/env.config.js | 1 - runtime/config.js | 83 +++++++++++------------- runtime/env.test.config.tsx | 37 +++++++++++ runtime/initialize.js | 2 +- runtime/initialize.test.js | 96 +++++++++++++++++----------- runtime/jest.config.js | 2 +- runtime/testing/initializeMockApp.js | 7 +- 10 files changed, 142 insertions(+), 168 deletions(-) delete mode 100644 .env delete mode 100644 .env.development delete mode 100644 .env.test delete mode 100644 runtime/__mocks__/env.config.js create mode 100644 runtime/env.test.config.tsx diff --git a/.env b/.env deleted file mode 100644 index 08e68bf3..00000000 --- a/.env +++ /dev/null @@ -1,22 +0,0 @@ -NODE_ENV='production' -ACCESS_TOKEN_COOKIE_NAME='' -BASE_URL='' -CREDENTIALS_BASE_URL='' -CSRF_TOKEN_API_PATH='' -ECOMMERCE_BASE_URL='' -LANGUAGE_PREFERENCE_COOKIE_NAME='' -LMS_BASE_URL='' -LOGIN_URL='' -LOGOUT_URL='' -LOGO_URL='' -LOGO_TRADEMARK_URL='' -LOGO_WHITE_URL='' -FAVICON_URL='' -MARKETING_SITE_BASE_URL='' -ORDER_HISTORY_URL='' -REFRESH_ACCESS_TOKEN_ENDPOINT='' -SEGMENT_KEY='' -SITE_NAME='' -USER_INFO_COOKIE_NAME='' -APP_ID='' -MFE_CONFIG_API_URL='' diff --git a/.env.development b/.env.development deleted file mode 100644 index 21974f26..00000000 --- a/.env.development +++ /dev/null @@ -1,30 +0,0 @@ -EXAMPLE_VAR=Example Value -ACCESS_TOKEN_COOKIE_NAME=edx-jwt-cookie-header-payload -ACCOUNT_PROFILE_URL=http://localhost:1995 -ACCOUNT_SETTINGS_URL=http://localhost:1997 -BASE_URL=http://localhost:8080 -CREDENTIALS_BASE_URL=http://localhost:18150 -CSRF_TOKEN_API_PATH=/csrf/api/v1/token -DISCOVERY_API_BASE_URL=http://localhost:18381 -PUBLISHER_BASE_URL=http://localhost:18400 -ECOMMERCE_BASE_URL=http://localhost:18130 -LANGUAGE_PREFERENCE_COOKIE_NAME=openedx-language-preference -LEARNING_BASE_URL=http://localhost:2000 -LMS_BASE_URL=http://localhost:18000 -LOGIN_URL=http://localhost:18000/login -LOGOUT_URL=http://localhost:18000/logout -STUDIO_BASE_URL=http://localhost:18010 -MARKETING_SITE_BASE_URL=http://localhost:18000 -ORDER_HISTORY_URL=http://localhost:1996/orders -REFRESH_ACCESS_TOKEN_ENDPOINT=http://localhost:18000/login_refresh -SEGMENT_KEY='' -SITE_NAME=localhost -USER_INFO_COOKIE_NAME=edx-user-info -LOGO_URL=https://edx-cdn.org/v3/default/logo.svg -LOGO_TRADEMARK_URL=https://edx-cdn.org/v3/default/logo-trademark.svg -LOGO_WHITE_URL=https://edx-cdn.org/v3/default/logo-white.svg -FAVICON_URL=https://edx-cdn.org/v3/default/favicon.ico -IGNORED_ERROR_REGEX= -MFE_CONFIG_API_URL= -APP_ID= -SUPPORT_URL=https://support.edx.org \ No newline at end of file diff --git a/.env.test b/.env.test deleted file mode 100644 index f25231a3..00000000 --- a/.env.test +++ /dev/null @@ -1,30 +0,0 @@ -EXAMPLE_VAR=Example Value -ACCESS_TOKEN_COOKIE_NAME=edx-jwt-cookie-header-payload -ACCOUNT_PROFILE_URL=http://localhost:1995 -ACCOUNT_SETTINGS_URL=http://localhost:1997 -BASE_URL=http://localhost:8080 -CREDENTIALS_BASE_URL=http://localhost:18150 -CSRF_TOKEN_API_PATH=/csrf/api/v1/token -DISCOVERY_API_BASE_URL=http://localhost:18381 -PUBLISHER_BASE_URL=http://localhost:18400 -ECOMMERCE_BASE_URL=http://localhost:18130 -LANGUAGE_PREFERENCE_COOKIE_NAME=openedx-language-preference -LEARNING_BASE_URL=http://localhost:2000 -LMS_BASE_URL=http://localhost:18000 -LOGIN_URL=http://localhost:18000/login -LOGOUT_URL=http://localhost:18000/logout -STUDIO_BASE_URL=http://localhost:18010 -MARKETING_SITE_BASE_URL=http://localhost:18000 -ORDER_HISTORY_URL=http://localhost:1996/orders -REFRESH_ACCESS_TOKEN_ENDPOINT=http://localhost:18000/login_refresh -SEGMENT_KEY='' -SITE_NAME=localhost -USER_INFO_COOKIE_NAME=edx-user-info -LOGO_URL=https://edx-cdn.org/v3/default/logo.svg -LOGO_TRADEMARK_URL=https://edx-cdn.org/v3/default/logo-trademark.svg -LOGO_WHITE_URL=https://edx-cdn.org/v3/default/logo-white.svg -FAVICON_URL=https://edx-cdn.org/v3/default/favicon.ico -IGNORED_ERROR_REGEX= -MFE_CONFIG_API_URL= -APP_ID= -SUPPORT_URL=https://support.edx.org diff --git a/runtime/__mocks__/env.config.js b/runtime/__mocks__/env.config.js deleted file mode 100644 index f053ebf7..00000000 --- a/runtime/__mocks__/env.config.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = {}; diff --git a/runtime/config.js b/runtime/config.js index 30f11002..896cb705 100644 --- a/runtime/config.js +++ b/runtime/config.js @@ -40,7 +40,7 @@ * * ###### JavaScript File Configuration * - * Configuration variables can be supplied in an optional file named env.config.js. This file must + * Configuration variables can be supplied in an optional file named env.config.tsx. This file must * export either an Object containing configuration variables or a function. The function must * return an Object containing configuration variables or, alternately, a promise which resolves to * an Object. @@ -123,54 +123,44 @@ * @module Config */ +import merge from 'lodash.merge'; import 'pubsub-js'; import { APP_CONFIG_INITIALIZED, CONFIG_CHANGED } from './constants'; import { ensureDefinedConfig } from './utils'; -function extractRegex(envVar) { - // Convert the environment variable string to a regex, while guarding - // against a non-string and an empty/whitespace-only string. - if (typeof envVar === 'string' && envVar.trim() !== '') { - return new RegExp(envVar); - } - return undefined; -} - -const ENVIRONMENT = process.env.NODE_ENV; let config = { - ACCESS_TOKEN_COOKIE_NAME: process.env.ACCESS_TOKEN_COOKIE_NAME, - ACCOUNT_PROFILE_URL: process.env.ACCOUNT_PROFILE_URL, - ACCOUNT_SETTINGS_URL: process.env.ACCOUNT_SETTINGS_URL, - BASE_URL: process.env.BASE_URL, - PUBLIC_PATH: process.env.PUBLIC_PATH || '/', - CREDENTIALS_BASE_URL: process.env.CREDENTIALS_BASE_URL, - CSRF_TOKEN_API_PATH: process.env.CSRF_TOKEN_API_PATH, - DISCOVERY_API_BASE_URL: process.env.DISCOVERY_API_BASE_URL, - PUBLISHER_BASE_URL: process.env.PUBLISHER_BASE_URL, - ECOMMERCE_BASE_URL: process.env.ECOMMERCE_BASE_URL, - ENVIRONMENT, - IGNORED_ERROR_REGEX: extractRegex(process.env.IGNORED_ERROR_REGEX), - LANGUAGE_PREFERENCE_COOKIE_NAME: process.env.LANGUAGE_PREFERENCE_COOKIE_NAME, - LEARNING_BASE_URL: process.env.LEARNING_BASE_URL, - LMS_BASE_URL: process.env.LMS_BASE_URL, - LOGIN_URL: process.env.LOGIN_URL, - LOGOUT_URL: process.env.LOGOUT_URL, - STUDIO_BASE_URL: process.env.STUDIO_BASE_URL, - MARKETING_SITE_BASE_URL: process.env.MARKETING_SITE_BASE_URL, - ORDER_HISTORY_URL: process.env.ORDER_HISTORY_URL, - REFRESH_ACCESS_TOKEN_ENDPOINT: process.env.REFRESH_ACCESS_TOKEN_ENDPOINT, - SECURE_COOKIES: ENVIRONMENT !== 'development', - SEGMENT_KEY: process.env.SEGMENT_KEY, - SITE_NAME: process.env.SITE_NAME, - USER_INFO_COOKIE_NAME: process.env.USER_INFO_COOKIE_NAME, - LOGO_URL: process.env.LOGO_URL, - LOGO_TRADEMARK_URL: process.env.LOGO_TRADEMARK_URL, - LOGO_WHITE_URL: process.env.LOGO_WHITE_URL, - FAVICON_URL: process.env.FAVICON_URL, - MFE_CONFIG_API_URL: process.env.MFE_CONFIG_API_URL, - APP_ID: process.env.APP_ID, - SUPPORT_URL: process.env.SUPPORT_URL, + ACCESS_TOKEN_COOKIE_NAME: 'edx-jwt-cookie-header-payload', + ACCOUNT_PROFILE_URL: null, + ACCOUNT_SETTINGS_URL: null, + BASE_URL: null, + PUBLIC_PATH: '/', + CREDENTIALS_BASE_URL: null, + CSRF_TOKEN_API_PATH: '/csrf/api/v1/token', + DISCOVERY_API_BASE_URL: null, + PUBLISHER_BASE_URL: null, + ECOMMERCE_BASE_URL: null, + ENVIRONMENT: 'production', + IGNORED_ERROR_REGEX: null, + LANGUAGE_PREFERENCE_COOKIE_NAME: 'openedx-language-preference', + LEARNING_BASE_URL: null, + LMS_BASE_URL: null, + LOGIN_URL: null, + LOGOUT_URL: null, + STUDIO_BASE_URL: null, + MARKETING_SITE_BASE_URL: null, + ORDER_HISTORY_URL: null, + REFRESH_ACCESS_TOKEN_ENDPOINT: null, + SEGMENT_KEY: null, + SITE_NAME: '', + USER_INFO_COOKIE_NAME: 'edx-user-info', + LOGO_URL: null, + LOGO_TRADEMARK_URL: null, + LOGO_WHITE_URL: null, + FAVICON_URL: null, + MFE_CONFIG_API_URL: null, + APP_ID: null, + SUPPORT_URL: null, }; /** @@ -229,11 +219,15 @@ export function setConfig(newConfig) { * * If any of the key values are `undefined`, an error will be logged to 'warn'. * + * This function uses lodash.merge internally to merge configuration objects + * which means they will be merged recursively. See https://lodash.com/docs/latest#merge for + * documentation on the exact behavior. + * * @param {Object} newConfig */ export function mergeConfig(newConfig) { ensureDefinedConfig(newConfig, 'ProcessEnvConfigService'); - config = Object.assign(config, newConfig); + config = merge(config, newConfig); global.PubSub.publish(CONFIG_CHANGED); } @@ -313,7 +307,6 @@ export function ensureConfig(keys, requester = 'unspecified application code') { * @property {string} MARKETING_SITE_BASE_URL * @property {string} ORDER_HISTORY_URL * @property {string} REFRESH_ACCESS_TOKEN_ENDPOINT - * @property {boolean} SECURE_COOKIES * @property {string} SEGMENT_KEY * @property {string} SITE_NAME * @property {string} USER_INFO_COOKIE_NAME diff --git a/runtime/env.test.config.tsx b/runtime/env.test.config.tsx new file mode 100644 index 00000000..87e606f0 --- /dev/null +++ b/runtime/env.test.config.tsx @@ -0,0 +1,37 @@ +import { OpenedXConfig } from '..'; + +const config: OpenedXConfig = { + ACCESS_TOKEN_COOKIE_NAME: 'edx-jwt-cookie-header-payload', + ACCOUNT_PROFILE_URL: 'http://localhost:1995', + ACCOUNT_SETTINGS_URL: 'http://localhost:1997', + BASE_URL: 'http://localhost:8080', + CREDENTIALS_BASE_URL: 'http://localhost:18150', + CSRF_TOKEN_API_PATH: '/csrf/api/v1/token', + DISCOVERY_API_BASE_URL: 'http://localhost:18381', + PUBLISHER_BASE_URL: 'http://localhost:18400', + ECOMMERCE_BASE_URL: 'http://localhost:18130', + LANGUAGE_PREFERENCE_COOKIE_NAME: 'openedx-language-preference', + LMS_BASE_URL: 'http://localhost:18000', + LEARNING_BASE_URL: 'http://localhost:2000', + LOGIN_URL: 'http://localhost:18000/login', + LOGOUT_URL: 'http://localhost:18000/logout', + STUDIO_BASE_URL: 'http://localhost:18010', + MARKETING_SITE_BASE_URL: 'http://localhost:18000', + ORDER_HISTORY_URL: 'localhost:1996/orders', + REFRESH_ACCESS_TOKEN_ENDPOINT: 'http://localhost:18000/login_refresh', + SEGMENT_KEY: 'segment_whoa', + SITE_NAME: 'edX', + USER_INFO_COOKIE_NAME: 'edx-user-info', + LOGO_URL: 'https://edx-cdn.org/v3/default/logo.svg', + LOGO_TRADEMARK_URL: 'https://edx-cdn.org/v3/default/logo-trademark.svg', + LOGO_WHITE_URL: 'https://edx-cdn.org/v3/default/logo-white.svg', + FAVICON_URL: 'https://edx-cdn.org/v3/default/favicon.ico', + MFE_CONFIG_API_URL: null, + APP_ID: 'runtime', + SUPPORT_URL: 'https://support.edx.org', + ENVIRONMENT: 'test', + IGNORED_ERROR_REGEX: null, + PUBLIC_PATH: '/' +}; + +export default config; diff --git a/runtime/initialize.js b/runtime/initialize.js index 9f9ff16e..60683bc2 100644 --- a/runtime/initialize.js +++ b/runtime/initialize.js @@ -311,8 +311,8 @@ export async function initialize({ global.PubSub.publish(APP_PUBSUB_INITIALIZED); // Configuration - await handlers.config(); await jsFileConfig(); + await handlers.config(); await runtimeConfig(); global.PubSub.publish(APP_CONFIG_INITIALIZED); diff --git a/runtime/initialize.test.js b/runtime/initialize.test.js index 7b52bc4b..15562692 100644 --- a/runtime/initialize.test.js +++ b/runtime/initialize.test.js @@ -23,7 +23,7 @@ import { hydrateAuthenticatedUser, } from './auth'; import configureCache from './auth/LocalForageCache'; -import { getConfig } from './config'; +import { getConfig, mergeConfig } from './config'; import { configure as configureI18n } from './i18n'; import { configure as configureLogging, @@ -276,8 +276,6 @@ describe('initialize', () => { }); it('should initialize the app with runtime configuration', async () => { - config.MFE_CONFIG_API_URL = 'http://localhost:18000/api/mfe/v1/config'; - config.APP_ID = 'auth'; configureCache.mockReturnValueOnce(Promise.resolve({ get: (url) => { const params = new URL(url).search; @@ -287,7 +285,17 @@ describe('initialize', () => { })); const messages = { i_am: 'a message' }; - await initialize({ messages }); + await initialize({ + messages, + handlers: { + config: () => { + mergeConfig({ + MFE_CONFIG_API_URL: 'http://localhost:18000/api/mfe/v1/config', + APP_ID: 'auth', + }); + } + } + }); expect(configureCache).toHaveBeenCalled(); expect(configureLogging).toHaveBeenCalledWith(NewRelicLoggingService, { config }); @@ -311,45 +319,59 @@ describe('initialize', () => { expect(ensureAuthenticatedUser).not.toHaveBeenCalled(); expect(hydrateAuthenticatedUser).not.toHaveBeenCalled(); expect(logError).not.toHaveBeenCalled(); - expect(config.SITE_NAME).toBe(newConfig.common.SITE_NAME); - expect(config.INFO_EMAIL).toBe(newConfig.auth.INFO_EMAIL); - expect(Object.values(config).includes(newConfig.learning.DISCUSSIONS_MFE_BASE_URL)).toBeFalsy(); + expect(getConfig().SITE_NAME).toBe(newConfig.common.SITE_NAME); + expect(getConfig().INFO_EMAIL).toBe(newConfig.auth.INFO_EMAIL); + expect(Object.values(getConfig()).includes(newConfig.learning.DISCUSSIONS_MFE_BASE_URL)).toBeFalsy(); }); - it('should initialize the app with the build config when runtime configuration fails', async () => { - config.MFE_CONFIG_API_URL = 'http://localhost:18000/api/mfe/v1/config'; - // eslint-disable-next-line no-console - console.error = jest.fn(); - configureCache.mockReturnValueOnce(Promise.reject(new Error('Api fails'))); - - const messages = { i_am: 'a message' }; - await initialize({ - messages, + describe('with mocked console.error', () => { + beforeEach(() => { + console.error = jest.fn(); }); - expect(configureCache).toHaveBeenCalled(); - // eslint-disable-next-line no-console - expect(console.error).toHaveBeenCalledWith('Error with config API', 'Api fails'); - expect(configureLogging).toHaveBeenCalledWith(NewRelicLoggingService, { config }); - expect(configureAuth).toHaveBeenCalledWith(AxiosJwtAuthService, { - loggingService: getLoggingService(), - config, - middleware: [], + afterAll(() => { + console.error.mockRestore(); }); - expect(configureAnalytics).toHaveBeenCalledWith(SegmentAnalyticsService, { - config, - loggingService: getLoggingService(), - httpClient: getAuthenticatedHttpClient(), - }); - expect(configureI18n).toHaveBeenCalledWith({ - messages, - config, - loggingService: getLoggingService(), + + it('should initialize the app with the build config when runtime configuration fails', async () => { + configureCache.mockRejectedValueOnce(new Error('Api fails')); + + const messages = { i_am: 'a message' }; + await initialize({ + messages, + handlers: { + config: () => { + mergeConfig({ + MFE_CONFIG_API_URL: 'http://localhost:18000/api/mfe/v1/config', + APP_ID: 'auth', + }); + } + } + }); + + expect(configureCache).toHaveBeenCalled(); + expect(console.error).toHaveBeenCalledWith('Error with config API', 'Api fails'); + expect(configureLogging).toHaveBeenCalledWith(NewRelicLoggingService, { config }); + expect(configureAuth).toHaveBeenCalledWith(AxiosJwtAuthService, { + loggingService: getLoggingService(), + config, + middleware: [], + }); + expect(configureAnalytics).toHaveBeenCalledWith(SegmentAnalyticsService, { + config, + loggingService: getLoggingService(), + httpClient: getAuthenticatedHttpClient(), + }); + expect(configureI18n).toHaveBeenCalledWith({ + messages, + config, + loggingService: getLoggingService(), + }); + expect(fetchAuthenticatedUser).toHaveBeenCalled(); + expect(ensureAuthenticatedUser).not.toHaveBeenCalled(); + expect(hydrateAuthenticatedUser).not.toHaveBeenCalled(); + expect(logError).not.toHaveBeenCalled(); }); - expect(fetchAuthenticatedUser).toHaveBeenCalled(); - expect(ensureAuthenticatedUser).not.toHaveBeenCalled(); - expect(hydrateAuthenticatedUser).not.toHaveBeenCalled(); - expect(logError).not.toHaveBeenCalled(); }); }); diff --git a/runtime/jest.config.js b/runtime/jest.config.js index 3add51d5..562d2f20 100644 --- a/runtime/jest.config.js +++ b/runtime/jest.config.js @@ -6,7 +6,7 @@ module.exports = { '\\.svg$': '/runtime/__mocks__/svg.js', '\\.(jpg|jpeg|png|gif|eot|otf|webp|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$': '/runtime/__mocks__/file.js', '\\.(css|scss)$': require.resolve('identity-obj-proxy'), - 'env.config': '/runtime/__mocks__/env.config.js', + 'env.config': '/runtime/env.test.config.tsx', }, testEnvironment: 'jsdom', testEnvironmentOptions: { diff --git a/runtime/testing/initializeMockApp.js b/runtime/testing/initializeMockApp.js index 8e2bead1..0cd42da4 100644 --- a/runtime/testing/initializeMockApp.js +++ b/runtime/testing/initializeMockApp.js @@ -1,6 +1,8 @@ +import envConfig from 'env.config'; + import { configure as configureAnalytics, MockAnalyticsService } from '../analytics'; import { configure as configureAuth, MockAuthService } from '../auth'; -import { getConfig } from '../config'; +import { getConfig, mergeConfig } from '../config'; import { configure as configureI18n } from '../i18n'; import { configure as configureLogging, MockLoggingService } from '../logging'; import mockMessages from './mockMessages'; @@ -46,6 +48,9 @@ export default function initializeMockApp({ messages = mockMessages, authenticatedUser = null, } = {}) { + const config = envConfig; + mergeConfig(config); + const loggingService = configureLogging(MockLoggingService, { config: getConfig(), }); From c84d9651d97bded7e81f934a701118510f5c0795 Mon Sep 17 00:00:00 2001 From: David Joy Date: Fri, 9 Aug 2024 17:33:25 -0400 Subject: [PATCH 22/90] feat: improving interface for config file This adds all our own environment variables to the interface for OpenedXConfig, which is used by env.config files. It should match the shape of the config object in runtime/config.js as well as env.config files being created. --- index.ts | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/index.ts b/index.ts index 59702a32..edae2e84 100644 --- a/index.ts +++ b/index.ts @@ -111,5 +111,41 @@ export interface OpenedXConfig { * convert micro-frontends to plugins. It must be a React functional component that takes no * arguments and returns JSX. */ - app?: () => JSX.Element + app?: () => JSX.Element, + + ACCESS_TOKEN_COOKIE_NAME?: string, + ACCOUNT_PROFILE_URL: string, + ACCOUNT_SETTINGS_URL: string, + APP_ID: string, + BASE_URL: string, + CREDENTIALS_BASE_URL: string, + CSRF_TOKEN_API_PATH?: string, + DISCOVERY_API_BASE_URL: string, + ECOMMERCE_BASE_URL: string, + ENVIRONMENT: string, + FAVICON_URL: string, + IGNORED_ERROR_REGEX: RegExp | null, + LANGUAGE_PREFERENCE_COOKIE_NAME?: string, + LEARNING_BASE_URL: string, + LMS_BASE_URL: string, + LOGIN_URL: string, + LOGO_TRADEMARK_URL: string, + LOGO_URL: string, + LOGO_WHITE_URL: string, + LOGOUT_URL: string, + MARKETING_SITE_BASE_URL: string, + MFE_CONFIG_API_URL?: string, + ORDER_HISTORY_URL: string, + PUBLIC_PATH: string, + PUBLISHER_BASE_URL: string, + REFRESH_ACCESS_TOKEN_ENDPOINT: string, + SEGMENT_KEY: string, + SITE_NAME: string, + STUDIO_BASE_URL: string, + SUPPORT_URL?: string, + USER_INFO_COOKIE_NAME?: string, + + custom?: { + [key:string]: any, + } } From 27fdbd5e903c1a67b70d56eed2082a7b7ea2a675 Mon Sep 17 00:00:00 2001 From: David Joy Date: Fri, 9 Aug 2024 17:34:44 -0400 Subject: [PATCH 23/90] =?UTF-8?q?fix:=20adding=20some=20packages=20to=20pa?= =?UTF-8?q?ckage.json=20we=E2=80=99re=20going=20to=20need?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Subsequent commits will use these. Checking this in so that I can commit other changes more incrementally, since they’d otherwise be tied together through this file. --- package-lock.json | 65 ++++++++++++++++++++++++++++++++++++++++++++--- package.json | 4 +++ 2 files changed, 66 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index cd2f352b..3a017fa6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -97,7 +97,11 @@ "@testing-library/jest-dom": "^6.4.6", "@testing-library/react": "^12.1.5", "@testing-library/react-hooks": "^8.0.1", + "@tsconfig/node18": "^18.2.4", "@types/jest": "^29.5.12", + "@types/lodash.camelcase": "^4.3.9", + "@types/lodash.merge": "^4.6.9", + "@types/node": "^18.19.43", "@types/react": "^17.0.0", "@types/react-dom": "^17.0.11", "axios-mock-adapter": "^1.22.0", @@ -2400,6 +2404,11 @@ } } }, + "node_modules/@formatjs/ts-transformer/node_modules/@types/node": { + "version": "17.0.45", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", + "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==" + }, "node_modules/@fortawesome/fontawesome-common-types": { "version": "6.6.0", "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.6.0.tgz", @@ -3300,6 +3309,12 @@ "node": ">=10.13.0" } }, + "node_modules/@tsconfig/node18": { + "version": "18.2.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node18/-/node18-18.2.4.tgz", + "integrity": "sha512-5xxU8vVs9/FNcvm3gE07fPbn9tl6tqGGWA9tSlwsUEkBxtRnTsNmwrV8gasZ9F/EobaSv9+nu8AxUKccw77JpQ==", + "dev": true + }, "node_modules/@types/aria-query": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", @@ -3579,6 +3594,30 @@ "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", "dev": true }, + "node_modules/@types/lodash": { + "version": "4.17.7", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.7.tgz", + "integrity": "sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA==", + "dev": true + }, + "node_modules/@types/lodash.camelcase": { + "version": "4.3.9", + "resolved": "https://registry.npmjs.org/@types/lodash.camelcase/-/lodash.camelcase-4.3.9.tgz", + "integrity": "sha512-ys9/hGBfsKxzmFI8hckII40V0ASQ83UM2pxfQRghHAwekhH4/jWtjz/3/9YDy7ZpUd/H0k2STSqmPR28dnj7Zg==", + "dev": true, + "dependencies": { + "@types/lodash": "*" + } + }, + "node_modules/@types/lodash.merge": { + "version": "4.6.9", + "resolved": "https://registry.npmjs.org/@types/lodash.merge/-/lodash.merge-4.6.9.tgz", + "integrity": "sha512-23sHDPmzd59kUgWyKGiOMO2Qb9YtqRO/x4IhkgNUiPQ1+5MUVqi6bCZeq9nBJ17msjIMbEIO5u+XW4Kz6aGUhQ==", + "dev": true, + "dependencies": { + "@types/lodash": "*" + } + }, "node_modules/@types/markdown-it": { "version": "14.1.1", "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.1.tgz", @@ -3606,9 +3645,12 @@ "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==" }, "node_modules/@types/node": { - "version": "17.0.45", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", - "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==" + "version": "18.19.43", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.43.tgz", + "integrity": "sha512-Mw/YlgXnyJdEwLoFv2dpuJaDFriX+Pc+0qOBJ57jC1H6cDxIj2xc5yUrdtArDVG0m+KV6622a4p2tenEqB3C/g==", + "dependencies": { + "undici-types": "~5.26.4" + } }, "node_modules/@types/node-forge": { "version": "1.3.11", @@ -3743,6 +3785,18 @@ "integrity": "sha512-D1XC7WK8K+zZEveUPY+cf4+kgauk8N4eHr/XIHXGlGYkHLud6hK9lYfZk1ry1TNh798cZUCgb6MqGEG8DkJt6Q==", "peer": true }, + "node_modules/@types/webpack": { + "version": "5.28.5", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-5.28.5.tgz", + "integrity": "sha512-wR87cgvxj3p6D0Crt1r5avwqffqPXUkNlnQ1mjU93G7gCuFjufZR4I6j8cz5g1F1tTYpfOOFvly+cmIQwL9wvw==", + "optional": true, + "peer": true, + "dependencies": { + "@types/node": "*", + "tapable": "^2.2.0", + "webpack": "^5" + } + }, "node_modules/@types/ws": { "version": "8.5.11", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.11.tgz", @@ -15603,6 +15657,11 @@ "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==", "dev": true }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", diff --git a/package.json b/package.json index da26f25f..01dfe1d9 100644 --- a/package.json +++ b/package.json @@ -127,7 +127,11 @@ "@testing-library/jest-dom": "^6.4.6", "@testing-library/react": "^12.1.5", "@testing-library/react-hooks": "^8.0.1", + "@tsconfig/node18": "^18.2.4", "@types/jest": "^29.5.12", + "@types/lodash.camelcase": "^4.3.9", + "@types/lodash.merge": "^4.6.9", + "@types/node": "^18.19.43", "@types/react": "^17.0.0", "@types/react-dom": "^17.0.11", "axios-mock-adapter": "^1.22.0", From ca68813643e4387fe8ce66f3f86509977ad2c53c Mon Sep 17 00:00:00 2001 From: David Joy Date: Fri, 9 Aug 2024 17:35:26 -0400 Subject: [PATCH 24/90] fix(style): organizing some imports Nothing much to see here. --- runtime/index.js | 8 ++++---- runtime/plugins/PluginContainer.jsx | 5 ++--- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/runtime/index.js b/runtime/index.js index 48a088cd..58a4423f 100644 --- a/runtime/index.js +++ b/runtime/index.js @@ -98,11 +98,11 @@ export { } from './logging'; export { - Plugin, - PluginSlot, - PLUGIN_OPERATIONS, - IFRAME_PLUGIN, DIRECT_PLUGIN, + IFRAME_PLUGIN, + PLUGIN_OPERATIONS, + Plugin, + PluginSlot } from './plugins'; export { diff --git a/runtime/plugins/PluginContainer.jsx b/runtime/plugins/PluginContainer.jsx index 8bd158a7..0ed6629e 100644 --- a/runtime/plugins/PluginContainer.jsx +++ b/runtime/plugins/PluginContainer.jsx @@ -1,15 +1,14 @@ 'use client'; -import React from 'react'; import PropTypes from 'prop-types'; // eslint-disable-next-line import/no-extraneous-dependencies -import PluginContainerIframe from './PluginContainerIframe'; import PluginContainerDirect from './PluginContainerDirect'; +import PluginContainerIframe from './PluginContainerIframe'; import { - IFRAME_PLUGIN, DIRECT_PLUGIN, + IFRAME_PLUGIN, } from './data/constants'; import { pluginConfigShape } from './data/shapes'; From 7ba8bb4fa57a29772714ecce247be3ae0da54aed Mon Sep 17 00:00:00 2001 From: David Joy Date: Fri, 9 Aug 2024 17:36:44 -0400 Subject: [PATCH 25/90] test: updating test app to use new config methods MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The test-app now uses env.config.tsx properly. This ‘custom’ thing is maybe temporary, but I needed a way to add the test app’s custom variables. It will likely morph into sub-configs specific to frontends. --- test-app/{env.config.js => env.config.tsx} | 26 ++++++++++++++-------- test-app/package-lock.json | 8 +++++-- test-app/src/ExamplePage.jsx | 18 ++++----------- test-app/src/index.jsx | 8 +++++++ test-app/tsconfig.json | 2 +- 5 files changed, 36 insertions(+), 26 deletions(-) rename test-app/{env.config.js => env.config.tsx} (74%) diff --git a/test-app/env.config.js b/test-app/env.config.tsx similarity index 74% rename from test-app/env.config.js rename to test-app/env.config.tsx index b26b804a..e58e9521 100644 --- a/test-app/env.config.js +++ b/test-app/env.config.tsx @@ -1,9 +1,8 @@ -module.exports = { - FALSE_VALUE: false, - CORRECT_BOOL_VALUE: 'Good, false meant false. We did not cast a boolean to a string.', - INCORRECT_BOOL_VALUE: 'Why was a false boolean true?', - INTEGER_VALUE: 123, - EXAMPLE_VAR: 'Example Value', +import { OpenedXConfig } from "@openedx/frontend-base"; + +const config: OpenedXConfig = { + ENVIRONMENT: 'dev', + PUBLIC_PATH: '/', ACCESS_TOKEN_COOKIE_NAME: 'edx-jwt-cookie-header-payload', ACCOUNT_PROFILE_URL: 'http://localhost:1995', ACCOUNT_SETTINGS_URL: 'http://localhost:1997', @@ -22,7 +21,7 @@ module.exports = { MARKETING_SITE_BASE_URL: 'http://localhost:18000', ORDER_HISTORY_URL: 'http://localhost:1996/orders', REFRESH_ACCESS_TOKEN_ENDPOINT: 'http://localhost:18000/login_refresh', - SEGMENT_KEY: null, + SEGMENT_KEY: 'segment_whoa', SITE_NAME: 'localhost', USER_INFO_COOKIE_NAME: 'edx-user-info', LOGO_URL: 'https://edx-cdn.org/v3/default/logo.svg', @@ -30,7 +29,16 @@ module.exports = { LOGO_WHITE_URL: 'https://edx-cdn.org/v3/default/logo-white.svg', FAVICON_URL: 'https://edx-cdn.org/v3/default/favicon.ico', IGNORED_ERROR_REGEX: null, - MFE_CONFIG_API_URL: null, - APP_ID: null, + APP_ID: 'shell', SUPPORT_URL: 'https://support.edx.org', + + custom: { + FALSE_VALUE: false, + CORRECT_BOOL_VALUE: 'Good, false meant false. We did not cast a boolean to a string.', + INCORRECT_BOOL_VALUE: 'Why was a false boolean true?', + INTEGER_VALUE: 123, + EXAMPLE_VAR: 'Example Value', + } }; + +export default config; diff --git a/test-app/package-lock.json b/test-app/package-lock.json index a2b7761e..3f9804f0 100644 --- a/test-app/package-lock.json +++ b/test-app/package-lock.json @@ -79,7 +79,7 @@ "lodash.snakecase": "^4.1.1", "mini-css-extract-plugin": "1.6.2", "postcss": "8.4.40", - "postcss-custom-media": "10.0.6", + "postcss-custom-media": "^11.0.0", "postcss-loader": "7.3.4", "postcss-rtlcss": "5.1.2", "prop-types": "^15.8.1", @@ -106,7 +106,7 @@ }, "bin": { "intl-imports.js": "dist/cli/scripts/intl-imports.js", - "openedx": "dist/cli/scripts/openedx.js", + "openedx": "dist/tools/cli/openedx.js", "transifex-utils.js": "dist/cli/scripts/transifex-utils.js" }, "devDependencies": { @@ -114,7 +114,11 @@ "@testing-library/jest-dom": "^6.4.6", "@testing-library/react": "^12.1.5", "@testing-library/react-hooks": "^8.0.1", + "@tsconfig/node18": "^18.2.4", "@types/jest": "^29.5.12", + "@types/lodash.camelcase": "^4.3.9", + "@types/lodash.merge": "^4.6.9", + "@types/node": "^18.19.43", "@types/react": "^17.0.0", "@types/react-dom": "^17.0.11", "axios-mock-adapter": "^1.22.0", diff --git a/test-app/src/ExamplePage.jsx b/test-app/src/ExamplePage.jsx index 976605e4..beeaa1a4 100644 --- a/test-app/src/ExamplePage.jsx +++ b/test-app/src/ExamplePage.jsx @@ -1,10 +1,8 @@ import { AppContext, - ensureConfig, getAuthenticatedUser, getConfig, logInfo, - mergeConfig, useIntl } from '@openedx/frontend-base'; import { Container } from '@openedx/paragon'; @@ -16,14 +14,6 @@ import appleUrl from './apple.svg'; import Image from './Image'; import messages from './messages'; -mergeConfig({ - MERGED_VAR: 'I was merged in.', -}); - -ensureConfig([ - 'MERGED_VAR', -], 'ExamplePage'); - function printTestResult(value) { return value ? '✅' : '❌'; } @@ -80,12 +70,12 @@ export default function ExamplePage() { )}

Config tests

-

Non-existent config variable: {printTestResult(getConfig().I_AM_NOT_HERE === undefined)}

-

Merged var: {printTestResult(getConfig().MERGED_VAR === 'I was merged in.')}

+

Non-existent config variable: {printTestResult(getConfig().custom.I_AM_NOT_HERE === undefined)}

+

Merged var: {printTestResult(getConfig().custom.MERGED_VAR === 'I was merged in.')}

env.config.js boolean test: - {printTestResult(getConfig().FALSE_VALUE === false)} + {printTestResult(getConfig().custom.FALSE_VALUE === false)}

-

env.config.js integer test: {printTestResult(Number.isInteger(getConfig().INTEGER_VALUE))}

+

env.config.js integer test: {printTestResult(Number.isInteger(getConfig().custom.INTEGER_VALUE))}

Right-to-left language handling tests

I'm aligned right, but left in RTL.

diff --git a/test-app/src/index.jsx b/test-app/src/index.jsx index d5da7b35..7a08985d 100644 --- a/test-app/src/index.jsx +++ b/test-app/src/index.jsx @@ -5,6 +5,7 @@ import { AuthenticatedPageRoute, ErrorPage, initialize, + mergeConfig, PageWrap, subscribe } from '@openedx/frontend-base'; @@ -45,5 +46,12 @@ initialize({ hydrateAuthenticatedUser: true, handlers: { auth: () => { }, + config: () => { + mergeConfig({ + custom : { + MERGED_VAR: 'I was merged in.', + } + }); + }, } }); diff --git a/test-app/tsconfig.json b/test-app/tsconfig.json index da4a7d91..b36bdb15 100644 --- a/test-app/tsconfig.json +++ b/test-app/tsconfig.json @@ -7,7 +7,7 @@ "include": [ ".eslintrc.js", "jest.config.js", - "env.config.js", + "env.config.tsx", "src/**/*", "app.d.ts", ], From 1e2c68853e9f95fac1b0b460aeebdd34c4325596 Mon Sep 17 00:00:00 2001 From: David Joy Date: Fri, 9 Aug 2024 17:55:50 -0400 Subject: [PATCH 26/90] =?UTF-8?q?refactor:=20organizing=20=E2=80=9Ccli?= =?UTF-8?q?=E2=80=9D=20and=20=E2=80=9Cconfig=E2=80=9D=20into=20a=20?= =?UTF-8?q?=E2=80=9Ctools=E2=80=9D=20folder?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is a fairly big upheaval of the library. This library is trying to serve two consumers, the apps which will use the code in ‘runtime’ and ‘shell’, and the build/dev tools that will use the code in ‘cli’ and ‘config’. When we build the app to be distributed via npm, we only get one entry point. This means that unless we want to mix dev/build-time code and dependencies with runtime code and dependencies, we need to work around the limitations of npm and ES modules to find a way to provide two separate bundles of code inside one package. (To be clear, we _can't_ mix the two, that would be madness) The solution: - We do this with sub-module exports. We export all of our dev/cli/build tools under the path ‘config’, i.e., "@openedx/frontend-base/config". The way npm and module loading works, this folder is OUTSIDE the “dist” folder of the package. The code used at runtime, imported by @openedx/frontend-base, is inside the “dist” folder. - They are both transpiled, but to different targets. The dist folder is transpiled for the web and our webpack build process, meaning it has ES modules in it still. The ‘config’ folder we create is transpiled for node using a different tsconfig. It retains ‘require’ imports so that it can run natively in node without requiring anyone to use ts-node, which would be onerous for consumers. - Since we wanted to use the ‘config’ folder as compiled code in the distribution, we needed to move our source code out of the way. - The ‘cli’ and ‘config’ code was already acting kind of like a single module, in that the CLI imports from config, and vice versa. We consolidate it under ‘tools’, and also give it some more organization, creating sub-folders for each tool. - Webpack’s sub-folder is the most interesting, as it has a good number of files in it. - The others (babel, eslint, typescript, jest) are all simpler and just have the config file for our consumers, for the most part. - Our config-related helpers are in config-helpers. - The CLI files go under tools/cli. - The 'tools' folder gets its own tsconfig.json, which our Makefile builds separately from the top-level one. - The code that goes into 'config' is just that which we want to expose to users to use in their config files. This means the config-helpers and eslint, jest, webpack, and typescript config files. - Because tsconfig.json is a JSON file, we need to put our base tsconfig.json file in a nice location, so it sits at config/tsconfig.json for convenience. - We expect consumers to use createConfig for all the other config types - therefore they’re all in sub-folders still, not convenient locations. createConfig needs them to be in the same relative path as they were in tools. - Interestingly, the CLI also needs all this code. So it’s duplicated in dist/tools in its transpiled form. The CLI acts more like it’s part of the ‘dist’ because we can point package.json’s “bin” config at the compiled dist version. So in our package, there’s some code duplicated between config and dist/tools. This is by design. - Oh, and I also turned all the ‘tools’ code into TypeScript, which makes it more pleasant to do development on (and less error prone as I moved it around). So there may still be some configuration (eslint, babel, jest, tsconfig) massaging that needs to be done after this PR. There’s a lot to think about, but I want to get this in so I can interate on it. It was quite difficult to line everything up right, since we basically have a few sub-projects in this repo. --- .eslintrc.js | 7 ++- .gitignore | 2 + Makefile | 21 ++++---- README.md | 2 +- babel.config.js | 4 +- cli/ConfigPreset.js | 28 ---------- .../html-webpack-new-relic-plugin/index.js | 3 -- cli/resolveFilepaths.js | 14 ----- config/createConfig.js | 7 --- config/getBaseConfig.js | 9 ---- config/index.js | 7 --- jest.config.js | 2 +- package-lock.json | 2 +- package.json | 3 +- test-app/.eslintrc.js | 2 +- .../babel/babel.base.config.js | 3 ++ {cli/scripts => tools/cli}/README.md | 0 cli/formatter.js => tools/cli/formatter.ts | 2 +- .../cli/intl-imports.test.ts | 18 ++++--- .../cli/intl-imports.ts | 39 +++++++++----- {cli/scripts => tools/cli}/openedx.ts | 22 ++++---- cli/scripts/serve.js => tools/cli/serve.ts | 12 ++--- .../cli/transifex-utils.ts | 20 +++---- tools/config-helpers/createConfig.ts | 8 +++ tools/config-helpers/createConfigPreset.ts | 38 +++++++++++++ tools/config-helpers/getBaseConfig.ts | 10 ++++ .../config-helpers/presets.ts | 39 ++++++++------ {config => tools/eslint}/.eslintrc.js | 4 +- tools/index.ts | 2 + {cli => tools}/jest.config.js | 0 {config => tools/jest}/jest.config.js | 0 tools/tsconfig.json | 21 ++++++++ tools/types.ts | 20 +++++++ {config => tools/typescript}/tsconfig.json | 8 +-- .../webpack/getLocalAliases.ts | 17 +++--- tools/webpack/modules.d.ts | 6 +++ .../HtmlWebpackNewRelicPlugin.ts | 30 ++++++++--- .../html-webpack-new-relic-plugin/LICENSE | 0 .../html-webpack-new-relic-plugin/README.md | 0 .../html-webpack-new-relic-plugin/index.js | 3 ++ .../test/HtmlWebpackNewRelicPlugin.test.js | 0 .../test/fixtures/entry.js | 0 .../webpack/webpack.common.config.ts | 8 ++- .../webpack/webpack.dev-stage.config.ts | 28 +++++----- .../webpack/webpack.dev.config.ts | 29 +++++----- .../webpack/webpack.prod.config.ts | 40 ++++++++------ .../webpack/webpack.shell.dev.config.ts | 53 ++++++++----------- tsconfig.build.json | 22 ++++++++ tsconfig.json | 14 +++-- 49 files changed, 373 insertions(+), 256 deletions(-) delete mode 100644 cli/ConfigPreset.js delete mode 100644 cli/plugins/html-webpack-new-relic-plugin/index.js delete mode 100644 cli/resolveFilepaths.js delete mode 100644 config/createConfig.js delete mode 100644 config/getBaseConfig.js delete mode 100644 config/index.js rename config/babel.config.js => tools/babel/babel.base.config.js (81%) rename {cli/scripts => tools/cli}/README.md (100%) rename cli/formatter.js => tools/cli/formatter.ts (65%) rename cli/scripts/intl-imports.test.js => tools/cli/intl-imports.test.ts (90%) rename cli/scripts/intl-imports.js => tools/cli/intl-imports.ts (89%) rename {cli/scripts => tools/cli}/openedx.ts (78%) rename cli/scripts/serve.js => tools/cli/serve.ts (91%) rename cli/scripts/transifex-utils.js => tools/cli/transifex-utils.ts (79%) create mode 100644 tools/config-helpers/createConfig.ts create mode 100644 tools/config-helpers/createConfigPreset.ts create mode 100644 tools/config-helpers/getBaseConfig.ts rename cli/presets.js => tools/config-helpers/presets.ts (51%) rename {config => tools/eslint}/.eslintrc.js (92%) create mode 100644 tools/index.ts rename {cli => tools}/jest.config.js (100%) rename {config => tools/jest}/jest.config.js (100%) create mode 100644 tools/tsconfig.json create mode 100644 tools/types.ts rename {config => tools/typescript}/tsconfig.json (89%) rename config/getLocalAliases.js => tools/webpack/getLocalAliases.ts (87%) create mode 100644 tools/webpack/modules.d.ts rename cli/plugins/html-webpack-new-relic-plugin/HtmlWebpackNewRelicPlugin.js => tools/webpack/plugins/html-webpack-new-relic-plugin/HtmlWebpackNewRelicPlugin.ts (97%) rename {cli => tools/webpack}/plugins/html-webpack-new-relic-plugin/LICENSE (100%) rename {cli => tools/webpack}/plugins/html-webpack-new-relic-plugin/README.md (100%) create mode 100644 tools/webpack/plugins/html-webpack-new-relic-plugin/index.js rename {cli => tools/webpack}/plugins/html-webpack-new-relic-plugin/test/HtmlWebpackNewRelicPlugin.test.js (100%) rename {cli => tools/webpack}/plugins/html-webpack-new-relic-plugin/test/fixtures/entry.js (100%) rename config/webpack.common.config.js => tools/webpack/webpack.common.config.ts (86%) rename config/webpack.dev-stage.config.js => tools/webpack/webpack.dev-stage.config.ts (88%) rename config/webpack.dev.config.js => tools/webpack/webpack.dev.config.ts (88%) rename config/webpack.prod.config.js => tools/webpack/webpack.prod.config.ts (84%) rename config/webpack.shell.dev.config.js => tools/webpack/webpack.shell.dev.config.ts (81%) create mode 100644 tsconfig.build.json diff --git a/.eslintrc.js b/.eslintrc.js index eb94268c..67904ec5 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,8 +1,9 @@ const path = require('path'); +const { merge } = require('webpack-merge'); -const { createConfig } = require('./config'); +const config = require('./tools/eslint/.eslintrc.js'); -module.exports = createConfig('eslint', { +module.exports = merge(config, { ignorePatterns: [ 'test-app', 'docs', @@ -11,6 +12,8 @@ module.exports = createConfig('eslint', { 'coverage', 'example', 'example-plugin-app', + 'tools', + 'config', ], parserOptions: { project: path.resolve(__dirname, './tsconfig.json'), diff --git a/.gitignore b/.gitignore index 4a85a606..44c2a7b3 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,8 @@ .vscode coverage dist +config +scss node_modules npm-debug.log docs/api diff --git a/Makefile b/Makefile index b614547a..b55924a2 100644 --- a/Makefile +++ b/Makefile @@ -11,14 +11,18 @@ doc_command = ./node_modules/.bin/documentation build src -g -c ./docs/documenta cat_docs_command = cat ./docs/_API-header.md ./docs/_API-body.md > ./docs/API.md build: - rm -rf ./dist - tsc - mkdir -p ./scss/header/studio-header - - cp shell/index.scss dist/shell/index.scss - cp shell/header/index.scss dist/shell/header/index.scss - cp shell/header/Menu/menu.scss dist/shell/header/Menu/menu.scss - cp shell/header/studio-header/StudioHeader.scss dist/shell/header/studio-header/StudioHeader.scss + rm -rf ./config ./dist + tsc --project tsconfig.build.json + mkdir -p ./config + cp tools/typescript/tsconfig.json config/tsconfig.json + tsc --project ./tools/tsconfig.json + cp -prf ./tools/dist ./dist + mv ./dist/dist ./dist/tools + cp -prf ./tools/dist/config-helpers ./config/config-helpers + cp -prf ./tools/dist/eslint ./config/eslint + cp -prf ./tools/dist/jest ./config/jest + cp -prf ./tools/dist/webpack ./config/webpack + cp -prf ./tools/dist/index.js ./config/index.js docs-build: ${doc_command} @@ -32,7 +36,6 @@ docs-watch: docs-lint: ./node_modules/.bin/documentation lint src - .PHONY: requirements requirements: ## install ci requirements npm ci diff --git a/README.md b/README.md index 17da00c5..71025b9c 100644 --- a/README.md +++ b/README.md @@ -210,7 +210,7 @@ module.exports = 'FileMock'; You can change the values of "SvgURL", and "FileMock" if you want to reduce changes necessary to your snapshot tests; the old values from frontend-build assume svg is only being used for icons, so the values referenced an "icon" which felt unnecessarily narrow. -This is necessary because we cannot write a tsconfig.json in MFEs that includes transpilation of the "config/jest" folder in frontend-base, it can't meaningfully find those files and transpile them, and we wouldn't want all MFEs to have to include such idiosyncratic configuration anyway. The SVG mock, however, requires ESModules syntax to export its default and ReactComponent exports at the same time. This means without moving the mocks into the MFE code, the SVG one breaks transpilation and doesn't understand the `export` syntax used. By moving them into the MFE, they can be easily transpiled along with all the other code when jest tries to run. +This is necessary because we cannot write a tsconfig.json in MFEs that includes transpilation of the "tools/jest" folder in frontend-base, it can't meaningfully find those files and transpile them, and we wouldn't want all MFEs to have to include such idiosyncratic configuration anyway. The SVG mock, however, requires ESModules syntax to export its default and ReactComponent exports at the same time. This means without moving the mocks into the MFE code, the SVG one breaks transpilation and doesn't understand the `export` syntax used. By moving them into the MFE, they can be easily transpiled along with all the other code when jest tries to run. ### 9. SVGR "ReactComponent" imports have been removed. diff --git a/babel.config.js b/babel.config.js index c66966af..96cfc8b6 100644 --- a/babel.config.js +++ b/babel.config.js @@ -1,3 +1,3 @@ -const { createConfig } = require('./config'); +const config = require('./tools/babel/babel.base.config'); -module.exports = createConfig('babel'); +module.exports = config; diff --git a/cli/ConfigPreset.js b/cli/ConfigPreset.js deleted file mode 100644 index e71ab2ba..00000000 --- a/cli/ConfigPreset.js +++ /dev/null @@ -1,28 +0,0 @@ -const path = require('path'); -const resolveFilepaths = require('./resolveFilepaths'); - -const defaultConfigDir = path.resolve(__dirname, '../config'); - -function ConfigPreset({ - defaultDir = defaultConfigDir, - defaultFilename, - searchFilenames, - searchFilepaths, -}) { - return { - defaultFilename, - getDefault: () => require(require.resolve(`./${defaultFilename}`, { paths: [defaultDir] })), - get defaultFilepath() { - console.log('getting default filepath', defaultFilename, defaultDir); - return require.resolve(`./${defaultFilename}`, { paths: [defaultDir] }); - }, - get resolvedFilepath() { - return resolveFilepaths( - searchFilenames.map(filename => `./${filename}`), - [...searchFilepaths, defaultDir], - ); - }, - }; -} - -module.exports = ConfigPreset; diff --git a/cli/plugins/html-webpack-new-relic-plugin/index.js b/cli/plugins/html-webpack-new-relic-plugin/index.js deleted file mode 100644 index d296648c..00000000 --- a/cli/plugins/html-webpack-new-relic-plugin/index.js +++ /dev/null @@ -1,3 +0,0 @@ -const HtmlWebpackNewRelicPlugin = require('./HtmlWebpackNewRelicPlugin'); - -module.exports = HtmlWebpackNewRelicPlugin; diff --git a/cli/resolveFilepaths.js b/cli/resolveFilepaths.js deleted file mode 100644 index c7980e35..00000000 --- a/cli/resolveFilepaths.js +++ /dev/null @@ -1,14 +0,0 @@ -// Resolves a filepath given an array of filepaths and an array of resolvePaths -// (directories to check). Useful for finding files and resolving to defaults -// if they don't exist. -module.exports = (filepaths, resolvePaths = [process.cwd()]) => { - // eslint-disable-next-line no-plusplus - for (let i = 0; i < filepaths.length; i++) { - try { - return require.resolve(filepaths[i], { paths: resolvePaths }); - } catch (e) { - // Do nothing, maybe we'll find it in the next loop - } - } - throw new Error(`Could not resolve files:\n ${filepaths.join('\n')}\n\n in directories:\n ${resolvePaths.join(', ')}\n`); -}; diff --git a/config/createConfig.js b/config/createConfig.js deleted file mode 100644 index 09cefbe4..00000000 --- a/config/createConfig.js +++ /dev/null @@ -1,7 +0,0 @@ -const { merge } = require('webpack-merge'); -const getBaseConfig = require('./getBaseConfig'); - -module.exports = (commandName, configFragment = {}) => { - const baseConfig = getBaseConfig(commandName); - return merge(baseConfig, configFragment); -}; diff --git a/config/getBaseConfig.js b/config/getBaseConfig.js deleted file mode 100644 index 5c6983df..00000000 --- a/config/getBaseConfig.js +++ /dev/null @@ -1,9 +0,0 @@ -const presets = require('../cli/presets'); - -module.exports = (commandName) => { - if (presets[commandName] === undefined) { - throw new Error(`openedx: ${commandName} is unsupported in this version`); - } - - return presets[commandName].getDefault(); -}; diff --git a/config/index.js b/config/index.js deleted file mode 100644 index 8224d7b7..00000000 --- a/config/index.js +++ /dev/null @@ -1,7 +0,0 @@ -const createConfig = require('./createConfig'); -const getBaseConfig = require('./getBaseConfig'); - -module.exports = { - createConfig, - getBaseConfig, -}; diff --git a/jest.config.js b/jest.config.js index 841f2785..a58c881b 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,3 +1,3 @@ -const { createConfig } = require('./config'); +const { createConfig } = require('./tools'); module.exports = createConfig('jest'); diff --git a/package-lock.json b/package-lock.json index 3a017fa6..7037ca90 100644 --- a/package-lock.json +++ b/package-lock.json @@ -89,7 +89,7 @@ }, "bin": { "intl-imports.js": "dist/cli/scripts/intl-imports.js", - "openedx": "dist/cli/scripts/openedx.js", + "openedx": "dist/tools/cli/openedx.js", "transifex-utils.js": "dist/cli/scripts/transifex-utils.js" }, "devDependencies": { diff --git a/package.json b/package.json index 01dfe1d9..e37e043d 100644 --- a/package.json +++ b/package.json @@ -11,12 +11,11 @@ "files": [ "/dist", "/config", - "/cli", "/shell/**/*.scss" ], "bin": { "intl-imports.js": "dist/cli/scripts/intl-imports.js", - "openedx": "dist/cli/scripts/openedx.js", + "openedx": "dist/tools/cli/openedx.js", "transifex-utils.js": "dist/cli/scripts/transifex-utils.js" }, "scripts": { diff --git a/test-app/.eslintrc.js b/test-app/.eslintrc.js index 74dd6439..30135a0b 100644 --- a/test-app/.eslintrc.js +++ b/test-app/.eslintrc.js @@ -1,4 +1,4 @@ -const { createConfig } = require('@openedx/frontend-base/config'); +const { createConfig } = require('@openedx/frontend-base/tools'); module.exports = createConfig('eslint', { parserOptions: { diff --git a/config/babel.config.js b/tools/babel/babel.base.config.js similarity index 81% rename from config/babel.config.js rename to tools/babel/babel.base.config.js index 676f50aa..6e061386 100644 --- a/config/babel.config.js +++ b/tools/babel/babel.base.config.js @@ -1,3 +1,6 @@ +/** + * This Babel configuration file is for Jest. The Webpack build does not use Babel. + */ module.exports = { presets: [ [ diff --git a/cli/scripts/README.md b/tools/cli/README.md similarity index 100% rename from cli/scripts/README.md rename to tools/cli/README.md diff --git a/cli/formatter.js b/tools/cli/formatter.ts similarity index 65% rename from cli/formatter.js rename to tools/cli/formatter.ts index 3c48a07c..0865d45a 100644 --- a/cli/formatter.js +++ b/tools/cli/formatter.ts @@ -1,4 +1,4 @@ -exports.format = (messages) => { +exports.format = (messages: { [messageId: string]: { defaultMessage: string, description: string}}) => { const results = Object.entries(messages).map(([id, message]) => ( { id, diff --git a/cli/scripts/intl-imports.test.js b/tools/cli/intl-imports.test.ts similarity index 90% rename from cli/scripts/intl-imports.test.js rename to tools/cli/intl-imports.test.ts index df23dc96..0b349de4 100644 --- a/cli/scripts/intl-imports.test.js +++ b/tools/cli/intl-imports.test.ts @@ -6,32 +6,32 @@ import { main as realMain } from './intl-imports'; const sampleAppDirectory = path.join(__dirname, '../../test-app'); // History for `process.stdout.write` mock calls. -const logHistory = { +const logHistory: { log: string[], latest: string | null } = { log: [], latest: '', }; // History for `fs.writeFileSync` mock calls. -const writeFileHistory = { +const writeFileHistory: { log: Array<{ filename: string, content: string }>, latest: { filename: string, content: string } | null} = { log: [], latest: null, }; // Mock for process.stdout.write -const log = (text) => { +const log = (text: string) => { logHistory.latest = text; logHistory.log.push(text); }; // Mock for fs.writeFileSync -const writeFileSync = (filename, content) => { +const writeFileSync = (filename: string, content: string) => { const entry = { filename, content }; writeFileHistory.latest = entry; writeFileHistory.log.push(entry); }; // Main with mocked output -const main = (...directories) => realMain({ +const main = (...directories: string[]) => realMain({ directories, log, writeFileSync, @@ -81,7 +81,9 @@ describe('error validation', () => { describe('generated files', () => { it('writes a correct src/i18n/index.js file', () => { main('frontend-component-singlelang', 'frontend-component-nolangs', 'frontend-component-emptylangs', 'frontend-app-sample'); - const mainFileActualContent = writeFileHistory.log.find(file => file.filename.endsWith('src/i18n/index.js')).content; + const mainFileActualContent = writeFileHistory.log.find((file) => { + return file.filename.endsWith('src/i18n/index.js'); + })?.content; const mainFileExpectedContent = `// This file is generated by the openedx/frontend-base's "intl-import.js" script. // @@ -105,7 +107,7 @@ export default [ it('writes a correct frontend-component-singlelang/index.js file', () => { main('frontend-component-singlelang', 'frontend-component-nolangs', 'frontend-component-emptylangs', 'frontend-app-sample'); - const mainFileActualContent = writeFileHistory.log.find(file => file.filename.endsWith('frontend-component-singlelang/index.js')).content; + const mainFileActualContent = writeFileHistory.log.find(file => file.filename.endsWith('frontend-component-singlelang/index.js'))?.content; const singleLangExpectedContent = `// This file is generated by the openedx/frontend-base's "intl-import.js" script. // @@ -125,7 +127,7 @@ export default { it('writes a correct frontend-app-sample/index.js file', () => { main('frontend-component-singlelang', 'frontend-component-nolangs', 'frontend-component-emptylangs', 'frontend-app-sample'); - const mainFileActualContent = writeFileHistory.log.find(file => file.filename.endsWith('frontend-app-sample/index.js')).content; + const mainFileActualContent = writeFileHistory.log.find(file => file.filename.endsWith('frontend-app-sample/index.js'))?.content; const singleLangExpectedContent = `// This file is generated by the openedx/frontend-base's "intl-import.js" script. // diff --git a/cli/scripts/intl-imports.js b/tools/cli/intl-imports.ts similarity index 89% rename from cli/scripts/intl-imports.js rename to tools/cli/intl-imports.ts index b965b0ed..ff54edc5 100755 --- a/cli/scripts/intl-imports.js +++ b/tools/cli/intl-imports.ts @@ -63,9 +63,9 @@ DESCRIPTION """ `; -const fs = require('fs'); -const path = require('path'); -const camelCase = require('lodash.camelcase'); +import fs from 'fs'; +import camelCase from 'lodash.camelcase'; +import path from 'path'; const loggingPrefix = path.basename(`${__filename}`); // the name of this JS file @@ -92,9 +92,15 @@ function generateSubdirectoryMessageFile({ log, writeFileSync, i18nDir, +}: { + directory: string, + log: (message: string) => void, + writeFileSync: (filename: string, content: string) => void, + i18nDir: string, + }) { - const importLines = []; - const messagesLines = []; + const importLines: string[] = []; + const messagesLines: string[] = []; const counter = { nonEmptyLanguages: 0 }; const messagesDir = `${i18nDir}/messages`; // The directory of Micro-frontend i18n messages @@ -182,9 +188,14 @@ function generateMainMessagesFile({ log, writeFileSync, i18nDir, +}: { + processedDirectories: Array<{ directory: string, isWritten: boolean }>, + log: (message: string) => void, + writeFileSync: (filename: string, content: string) => void, + i18nDir: string, }) { - const importLines = []; - const exportLines = []; + const importLines: string[] = []; + const exportLines: string[] = []; processedDirectories.forEach(processedDirectory => { const { directory, isWritten } = processedDirectory; @@ -214,11 +225,16 @@ function generateMainMessagesFile({ /* * Main function of the file. */ -function main({ +export function main({ directories, log, writeFileSync, pwd, +}: { + directories: string | string[], + log: (message: string) => void, + writeFileSync: (filename: string, content: string) => void, + pwd: string }) { const i18nDir = `${pwd}/src/i18n`; // The Micro-frontend i18n root directory @@ -231,7 +247,8 @@ function main({ log(scriptHelpDocument); log(`${loggingPrefix}: Error: src/i18n directory was not found.\n`); } else { - const processedDirectories = directories.map(directory => generateSubdirectoryMessageFile({ + // If we're here, we know that directories is an array, so cast it as one. + const processedDirectories = (directories).map((directory: string) => generateSubdirectoryMessageFile({ directory, log, writeFileSync, @@ -252,8 +269,6 @@ if (require.main === module) { directories: process.argv.slice(2), log: text => process.stdout.write(text), writeFileSync: fs.writeFileSync, - pwd: process.env.PWD, + pwd: process.env.PWD || '.', }); } - -module.exports.main = main; // Allow tests to use the main function. diff --git a/cli/scripts/openedx.ts b/tools/cli/openedx.ts similarity index 78% rename from cli/scripts/openedx.ts rename to tools/cli/openedx.ts index f42b0e58..6de21f39 100755 --- a/cli/scripts/openedx.ts +++ b/tools/cli/openedx.ts @@ -1,9 +1,8 @@ #!/usr/bin/env node import chalk from 'chalk'; -// const chalk = require('chalk'); - -const presets = require('../presets'); +import presets from '../config-helpers/presets'; +import { ConfigPreset, ConfigPresetTypes } from '../types'; /** * TLDR: @@ -20,7 +19,7 @@ const presets = require('../presets'); * them should behave the same as if run from the command line as usual. */ -function optionExists(keys) { +function optionExists(keys: string[]) { return process.argv.some((arg) => { // eslint-disable-next-line no-plusplus for (let i = 0; i < keys.length; i++) { @@ -33,7 +32,7 @@ function optionExists(keys) { } // Ensures that a config option already exists and if it does not adds a default -function ensureConfigOption(preset, keys = ['--config', '-c']) { +function ensureConfigOption(preset: ConfigPreset, keys = ['--config', '-c']) { if (!optionExists(keys)) { console.log(`Running with resolved config:\n${preset.resolvedFilepath}\n`); process.argv.push(keys[0]); @@ -49,29 +48,28 @@ process.argv.splice(1, 1); switch (commandName) { case 'eslint': - ensureConfigOption(presets.eslint); - // eslint-disable-next-line import/extensions, import/no-extraneous-dependencies + ensureConfigOption(presets[ConfigPresetTypes.ESLINT]); require('.bin/eslint'); break; case 'jest': - ensureConfigOption(presets.jest); + ensureConfigOption(presets[ConfigPresetTypes.JEST]); require('jest/bin/jest'); break; case 'webpack': - ensureConfigOption(presets.webpack); + ensureConfigOption(presets[ConfigPresetTypes.WEBPACK]); require('webpack/bin/webpack'); break; case 'webpack-dev-server': - ensureConfigOption(presets.webpackDevServer); + ensureConfigOption(presets[ConfigPresetTypes.WEBPACK_DEV_SERVER]); require('webpack-dev-server/bin/webpack-dev-server'); break; case 'shell-dev-server': - ensureConfigOption(presets.shellDevServer); + ensureConfigOption(presets[ConfigPresetTypes.SHELL_DEV_SERVER]); require('webpack-dev-server/bin/webpack-dev-server'); break; case 'formatjs': { const commonArgs = [ - '--format', 'node_modules/@openedx/frontend-base/cli/formatter.js', + '--format', 'node_modules/@openedx/frontend-base/dist/tools/cli/formatter.js', '--ignore', 'src/**/*.json', '--out-file', './temp/formatjs/Default.messages.json', '--', 'src/**/*.js*', diff --git a/cli/scripts/serve.js b/tools/cli/serve.ts similarity index 91% rename from cli/scripts/serve.js rename to tools/cli/serve.ts index 14ded3fb..9e075c8a 100644 --- a/cli/scripts/serve.js +++ b/tools/cli/serve.ts @@ -1,13 +1,13 @@ -const express = require('express'); -const path = require('path'); -const fs = require('fs'); -const chalk = require('chalk'); +import express from 'express'; +import path from 'path'; +import fs from 'fs'; +import chalk from 'chalk'; -function isDirectoryEmpty(directoryPath) { +function isDirectoryEmpty(directoryPath: string) { try { const files = fs.readdirSync(directoryPath); return files.length === 0; - } catch (error) { + } catch (error: any) { if (error.code === 'ENOENT') { // Directory does not exist, so treat it as empty. return true; diff --git a/cli/scripts/transifex-utils.js b/tools/cli/transifex-utils.ts similarity index 79% rename from cli/scripts/transifex-utils.js rename to tools/cli/transifex-utils.ts index 730decc7..96ce1f07 100755 --- a/cli/scripts/transifex-utils.js +++ b/tools/cli/transifex-utils.ts @@ -1,8 +1,8 @@ #!/usr/bin/env node -const fs = require('fs'); -const glob = require('glob'); -const path = require('path'); +import fs from 'fs'; +import glob from 'glob'; +import path from 'path'; /* * See the Makefile for how the required hash file is downloaded from Transifex. @@ -14,12 +14,12 @@ const path = require('path'); * * */ -function gatherJson(dir) { - const ret = []; +function gatherJson(dir: string) { + const ret: Array<{ id: string, description: string, defaultMessage: string }> = []; const files = glob.sync(`${dir}/**/*.json`); files.forEach((filename) => { - const messages = JSON.parse(fs.readFileSync(filename)); + const messages = JSON.parse(fs.readFileSync(filename, { encoding: 'utf8'})); ret.push(...messages); }); return ret; @@ -28,7 +28,7 @@ function gatherJson(dir) { // the hash file returns ids whose periods are "escaped" (sort of), like this: // "key": "profile\\.sociallinks\\.social\\.links" // so our regular messageIds won't match them out of the box -function escapeDots(messageId) { +function escapeDots(messageId: string) { return messageId.replace(/\./g, '\\.'); } @@ -49,7 +49,7 @@ if (process.argv[3] === '--comments') { // prepare to handle the translator note const hashFile = `${bashScriptsPath}/hashmap.json`; process.stdout.write(`${loggingPrefix}: reading hash file ${hashFile}\n`); - const messageInfo = JSON.parse(fs.readFileSync(hashFile)); + const messageInfo = JSON.parse(fs.readFileSync(hashFile, { encoding: 'utf8'})); const outputFile = `${bashScriptsPath}/hashed_data.txt`; process.stdout.write(`${loggingPrefix}: writing to output file ${outputFile}\n`); @@ -58,7 +58,7 @@ if (process.argv[3] === '--comments') { // prepare to handle the translator note messageObjects.forEach((message) => { const transifexFormatId = escapeDots(message.id); - const info = messageInfo.find(mi => mi.key === transifexFormatId); + const info = messageInfo.find((mi: { key: string }) => mi.key === transifexFormatId); if (info) { fs.appendFileSync(outputFile, `${info.string_hash}|${message.description}\n`); } else { @@ -66,7 +66,7 @@ if (process.argv[3] === '--comments') { // prepare to handle the translator note } }); } else { - const output = {}; + const output: {[id: string]: string } = {}; messageObjects.forEach((message) => { output[message.id] = message.defaultMessage; diff --git a/tools/config-helpers/createConfig.ts b/tools/config-helpers/createConfig.ts new file mode 100644 index 00000000..7ad455d5 --- /dev/null +++ b/tools/config-helpers/createConfig.ts @@ -0,0 +1,8 @@ +import { merge } from 'webpack-merge'; +import { ConfigPresetTypes } from '../types'; +import getBaseConfig from './getBaseConfig'; + +export default function createConfig(commandName: ConfigPresetTypes, configFragment: any = {}) { + const baseConfig = getBaseConfig(commandName); + return merge(baseConfig, configFragment); +}; diff --git a/tools/config-helpers/createConfigPreset.ts b/tools/config-helpers/createConfigPreset.ts new file mode 100644 index 00000000..b3eb7f50 --- /dev/null +++ b/tools/config-helpers/createConfigPreset.ts @@ -0,0 +1,38 @@ +export default function createConfigPreset({ + defaultDir, + defaultFilename, + searchFilenames, + searchFilepaths, +}: { + defaultDir: string, defaultFilename: string, searchFilenames: string[], searchFilepaths: string[] +}) { + return { + defaultFilename, + getDefault: () => require(require.resolve(`./${defaultFilename}`, { paths: [defaultDir] })), + get defaultFilepath() { + console.log('getting default filepath', defaultFilename, defaultDir); + return require.resolve(`./${defaultFilename}`, { paths: [defaultDir] }); + }, + get resolvedFilepath() { + return resolveFilepaths( + searchFilenames.map((filename: string) => `./${filename}`), + [...searchFilepaths, defaultDir] + ); + } + }; +} + +// Resolves a filepath given an array of filepaths and an array of resolvePaths +// (directories to check). Useful for finding files and resolving to defaults +// if they don't exist. +function resolveFilepaths(filepaths: string[], resolvePaths = [process.cwd()]) { + // eslint-disable-next-line no-plusplus + for (let i = 0; i < filepaths.length; i++) { + try { + return require.resolve(filepaths[i], { paths: resolvePaths }); + } catch (e) { + // Do nothing, maybe we'll find it in the next loop + } + } + throw new Error(`Could not resolve files:\n ${filepaths.join('\n')}\n\n in directories:\n ${resolvePaths.join(', ')}\n`); +}; diff --git a/tools/config-helpers/getBaseConfig.ts b/tools/config-helpers/getBaseConfig.ts new file mode 100644 index 00000000..35d3c544 --- /dev/null +++ b/tools/config-helpers/getBaseConfig.ts @@ -0,0 +1,10 @@ +import { ConfigPresetTypes } from '../types'; +import presets from './presets'; + +export default function getBaseConfig(commandName: ConfigPresetTypes) { + if (presets[commandName] === undefined) { + throw new Error(`openedx: ${commandName} is not a supported command.`); + } + + return presets[commandName].getDefault(); +}; diff --git a/cli/presets.js b/tools/config-helpers/presets.ts similarity index 51% rename from cli/presets.js rename to tools/config-helpers/presets.ts index e53d41cd..bbf828e8 100644 --- a/cli/presets.js +++ b/tools/config-helpers/presets.ts @@ -1,60 +1,69 @@ -const ConfigPreset = require('./ConfigPreset'); +import path from 'path'; + +import { ConfigPresets } from '../types'; +import createConfigPreset from './createConfigPreset'; const searchFilepaths = [process.cwd()]; -const babel = new ConfigPreset({ +const babel = createConfigPreset({ + defaultDir: path.resolve(__dirname, '../babel'), defaultFilename: 'babel.config.js', searchFilenames: ['babel.config.js'], searchFilepaths, }); -const eslint = new ConfigPreset({ +console.log('booyah', path.resolve(__dirname, '../eslint')); + +const eslint = createConfigPreset({ + defaultDir: path.resolve(__dirname, '../eslint'), defaultFilename: '.eslintrc.js', searchFilenames: ['.eslintrc.js'], searchFilepaths, }); -const jest = new ConfigPreset({ +const jest = createConfigPreset({ + defaultDir: path.resolve(__dirname, '../jest'), defaultFilename: 'jest.config.js', searchFilenames: ['jest.config.js'], searchFilepaths, }); -const webpackDevServer = new ConfigPreset({ +const webpackDevServer = createConfigPreset({ + defaultDir: path.resolve(__dirname, '../webpack'), defaultFilename: 'webpack.dev.config.js', searchFilenames: ['webpack.dev.config.js'], searchFilepaths, }); -const shellDevServer = new ConfigPreset({ +const shellDevServer = createConfigPreset({ + defaultDir: path.resolve(__dirname, '../webpack'), defaultFilename: 'webpack.shell.dev.config.js', searchFilenames: ['webpack.shell.dev.config.js'], searchFilepaths, }); -const webpackDevServerStage = new ConfigPreset({ +const webpackDevServerStage = createConfigPreset({ + defaultDir: path.resolve(__dirname, '../webpack'), defaultFilename: 'webpack.dev-stage.config.js', searchFilenames: ['webpack.dev-stage.config.js'], searchFilepaths, }); -const webpack = new ConfigPreset({ +const webpack = createConfigPreset({ + defaultDir: path.resolve(__dirname, '../webpack'), defaultFilename: 'webpack.prod.config.js', searchFilenames: ['webpack.prod.config.js'], searchFilepaths, }); -module.exports = { +const presets: ConfigPresets = { babel, eslint, jest, webpack, - webpackDevServer, - 'webpack-dev': webpackDevServer, 'webpack-dev-server': webpackDevServer, - shellDevServer, - webpackDevServerStage, + 'shell-dev-server': shellDevServer, 'webpack-dev-server-stage': webpackDevServerStage, - 'webpack-dev-stage': webpackDevServerStage, 'webpack-prod': webpack, -}; +} +export default presets; diff --git a/config/.eslintrc.js b/tools/eslint/.eslintrc.js similarity index 92% rename from config/.eslintrc.js rename to tools/eslint/.eslintrc.js index 150bdf49..52d4c012 100644 --- a/config/.eslintrc.js +++ b/tools/eslint/.eslintrc.js @@ -6,7 +6,7 @@ module.exports = { es2020: true, }, extends: [ - // The airbnb config includes configuraton for import, react, and jsx-a11y. + // The airbnb config includes configuration for import, react, and jsx-a11y. // That means it's the only thing we need here. We still need to // have those eslint-config plugins installed, though - it defines them // as peer dependencies. @@ -82,7 +82,7 @@ module.exports = { }], 'formatjs/enforce-description': ['error', 'literal'], 'import/no-import-module-export': 'off', - 'react/function-component-definition': [2, { namedComponents: 'arrow-function' }], + 'react/function-component-definition': 'off', 'react/jsx-filename-extension': [1, { extensions: ['.tsx', '.jsx'] }], }, }; diff --git a/tools/index.ts b/tools/index.ts new file mode 100644 index 00000000..268f1ca5 --- /dev/null +++ b/tools/index.ts @@ -0,0 +1,2 @@ +export { default as createConfig } from './config-helpers/createConfig'; +export { default as getBaseConfig } from './config-helpers/getBaseConfig'; diff --git a/cli/jest.config.js b/tools/jest.config.js similarity index 100% rename from cli/jest.config.js rename to tools/jest.config.js diff --git a/config/jest.config.js b/tools/jest/jest.config.js similarity index 100% rename from config/jest.config.js rename to tools/jest/jest.config.js diff --git a/tools/tsconfig.json b/tools/tsconfig.json new file mode 100644 index 00000000..04b177a9 --- /dev/null +++ b/tools/tsconfig.json @@ -0,0 +1,21 @@ +{ + "extends": "@tsconfig/node18/tsconfig.json", + "compilerOptions": { + "rootDir": ".", + "outDir": "dist", + "noEmit": false, + "composite": true, + "allowJs": true, + }, + "include": [ + "babel/**/*", + "cli/**/*", + "config-helpers/**/*", + "eslint/.eslintrc.js", + "jest/jest.config.js", + "typescript/tsconfig.json", + "webpack/**/*", + "types.ts", + "index.ts", + ], +} diff --git a/tools/types.ts b/tools/types.ts new file mode 100644 index 00000000..768517d8 --- /dev/null +++ b/tools/types.ts @@ -0,0 +1,20 @@ +export interface ConfigPreset { + defaultFilename: string, + getDefault: any, + resolvedFilepath: string, +} + +export enum ConfigPresetTypes { + BABEL = 'babel', + ESLINT = 'eslint', + JEST = 'jest', + WEBPACK = 'webpack', + WEBPACK_DEV_SERVER = 'webpack-dev-server', + SHELL_DEV_SERVER = 'shell-dev-server', + WEBPACK_DEV_SERVER_STAGE = 'webpack-dev-server-stage', + WEBPACK_PROD = 'webpack-prod', +} + +export type ConfigPresets = { + [key in ConfigPresetTypes]: ConfigPreset +} diff --git a/config/tsconfig.json b/tools/typescript/tsconfig.json similarity index 89% rename from config/tsconfig.json rename to tools/typescript/tsconfig.json index 4eb655b0..26bbcdb8 100644 --- a/config/tsconfig.json +++ b/tools/typescript/tsconfig.json @@ -7,12 +7,12 @@ "forceConsistentCasingInFileNames": true, "jsx": "react-jsx", "lib": [ - "dom", - "dom.iterable", - "esnext" + "DOM", + "DOM.Iterable", + "ESNext" ], "isolatedModules": true, - "module": "esnext", + "module": "ESNext", "moduleResolution": "node", "noEmit": true, "noFallthroughCasesInSwitch": true, diff --git a/config/getLocalAliases.js b/tools/webpack/getLocalAliases.ts similarity index 87% rename from config/getLocalAliases.js rename to tools/webpack/getLocalAliases.ts index e76a0034..efba043d 100644 --- a/config/getLocalAliases.js +++ b/tools/webpack/getLocalAliases.ts @@ -1,7 +1,6 @@ /* eslint-disable no-console */ - -const path = require('path'); -const fs = require('fs'); +import fs from 'fs'; +import path from 'path'; /* This function reads in a 'module.config.js' file if it exists and uses its contents to define @@ -27,8 +26,8 @@ Some working examples, as of the time of this writing: { moduleName: '@openedx/frontend-base', dir: '../frontend-base', dist: 'dist' } */ -function getLocalAliases() { - const aliases = {}; +export default function getLocalAliases() { + const aliases: { [moduleName: string]: string} = {}; try { const moduleConfigPath = path.resolve(process.cwd(), 'module.config.js'); @@ -39,12 +38,12 @@ function getLocalAliases() { // eslint-disable-next-line import/no-dynamic-require, global-require const { localModules } = require(moduleConfigPath); - let allPeerDependencies = []; - const excludedPeerPackages = []; + let allPeerDependencies: string[] = []; + const excludedPeerPackages: string[] = []; if (localModules.length > 0) { console.info('Resolving modules from local directories via module.config.js.'); } - localModules.forEach(({ moduleName, dir, dist = '' }) => { + localModules.forEach(({ moduleName, dir, dist = '' }: { moduleName: string, dir: string, dist?: string }) => { console.info(`Using local version of ${moduleName} from ${dir}/${dist}.`); // eslint-disable-next-line import/no-dynamic-require, global-require const { peerDependencies = {}, name } = require(path.resolve(process.cwd(), dir, 'package.json')); @@ -65,5 +64,3 @@ function getLocalAliases() { } return aliases; } - -module.exports = getLocalAliases; diff --git a/tools/webpack/modules.d.ts b/tools/webpack/modules.d.ts new file mode 100644 index 00000000..b7f0a382 --- /dev/null +++ b/tools/webpack/modules.d.ts @@ -0,0 +1,6 @@ +// This file needs to exist to declare modules for dependencies that don't publish their types. + +declare module 'postcss-custom-media'; +declare module '@edx/new-relic-source-map-webpack-plugin'; +declare module 'mini-css-extract-plugin'; +declare module 'webpack-bundle-analyzer'; diff --git a/cli/plugins/html-webpack-new-relic-plugin/HtmlWebpackNewRelicPlugin.js b/tools/webpack/plugins/html-webpack-new-relic-plugin/HtmlWebpackNewRelicPlugin.ts similarity index 97% rename from cli/plugins/html-webpack-new-relic-plugin/HtmlWebpackNewRelicPlugin.js rename to tools/webpack/plugins/html-webpack-new-relic-plugin/HtmlWebpackNewRelicPlugin.ts index d17f2102..311e08bf 100644 --- a/cli/plugins/html-webpack-new-relic-plugin/HtmlWebpackNewRelicPlugin.js +++ b/tools/webpack/plugins/html-webpack-new-relic-plugin/HtmlWebpackNewRelicPlugin.ts @@ -3,10 +3,26 @@ // much value in having it in a separate package. /* eslint no-useless-escape: [0] */ -const HtmlWebpackPlugin = require('html-webpack-plugin'); +import HtmlWebpackPlugin from 'html-webpack-plugin'; +import { Compiler } from 'webpack'; -class HtmlWebpackNewRelicPlugin { - constructor(options) { +enum OptionTypes { + ACCOUNT_ID = 'accountID', + AGENT_ID = 'agentID', + APPLICATION_ID = 'applicationID', + LICENSE_KEY = 'licenseKey', + TRUST_KEY = 'trustKey', +} + +type HtmlWebpackNewRelicPluginOptions = { + [key in OptionTypes]: string | undefined; +} + +export default class HtmlWebpackNewRelicPlugin { + options: HtmlWebpackNewRelicPluginOptions; + newRelicString: string; + + constructor(options: Partial) { this.options = { accountID: undefined, agentID: undefined, @@ -59,17 +75,19 @@ class HtmlWebpackNewRelicPlugin { ;NREUM.info={beacon:"bam-cell.nr-data.net",errorBeacon:"bam-cell.nr-data.net",licenseKey:"${this.options.licenseKey}",applicationID:"${this.options.applicationID}",sa:1} `; - Object.keys(this.options).forEach((key) => { + const optionKeys = >Object.keys(this.options) + optionKeys.forEach((key: OptionTypes) => { if (!this.options[key]) { throw new Error(`${key} argument is required`); } }); } - apply(compiler) { + apply(compiler: Compiler) { compiler.hooks.compilation.tap('HtmlWebpackNewRelicPlugin', (compilation) => { HtmlWebpackPlugin.getHooks(compilation).alterAssetTagGroups.tap( 'HtmlWebpackNewRelicPlugin', + // @ts-ignore (data) => { const newRelicScriptTag = HtmlWebpackPlugin.createHtmlTagObject( 'script', @@ -82,5 +100,3 @@ class HtmlWebpackNewRelicPlugin { }); } } - -module.exports = HtmlWebpackNewRelicPlugin; diff --git a/cli/plugins/html-webpack-new-relic-plugin/LICENSE b/tools/webpack/plugins/html-webpack-new-relic-plugin/LICENSE similarity index 100% rename from cli/plugins/html-webpack-new-relic-plugin/LICENSE rename to tools/webpack/plugins/html-webpack-new-relic-plugin/LICENSE diff --git a/cli/plugins/html-webpack-new-relic-plugin/README.md b/tools/webpack/plugins/html-webpack-new-relic-plugin/README.md similarity index 100% rename from cli/plugins/html-webpack-new-relic-plugin/README.md rename to tools/webpack/plugins/html-webpack-new-relic-plugin/README.md diff --git a/tools/webpack/plugins/html-webpack-new-relic-plugin/index.js b/tools/webpack/plugins/html-webpack-new-relic-plugin/index.js new file mode 100644 index 00000000..166dbbef --- /dev/null +++ b/tools/webpack/plugins/html-webpack-new-relic-plugin/index.js @@ -0,0 +1,3 @@ +import HtmlWebpackNewRelicPlugin from './HtmlWebpackNewRelicPlugin'; + +export default HtmlWebpackNewRelicPlugin; diff --git a/cli/plugins/html-webpack-new-relic-plugin/test/HtmlWebpackNewRelicPlugin.test.js b/tools/webpack/plugins/html-webpack-new-relic-plugin/test/HtmlWebpackNewRelicPlugin.test.js similarity index 100% rename from cli/plugins/html-webpack-new-relic-plugin/test/HtmlWebpackNewRelicPlugin.test.js rename to tools/webpack/plugins/html-webpack-new-relic-plugin/test/HtmlWebpackNewRelicPlugin.test.js diff --git a/cli/plugins/html-webpack-new-relic-plugin/test/fixtures/entry.js b/tools/webpack/plugins/html-webpack-new-relic-plugin/test/fixtures/entry.js similarity index 100% rename from cli/plugins/html-webpack-new-relic-plugin/test/fixtures/entry.js rename to tools/webpack/plugins/html-webpack-new-relic-plugin/test/fixtures/entry.js diff --git a/config/webpack.common.config.js b/tools/webpack/webpack.common.config.ts similarity index 86% rename from config/webpack.common.config.js rename to tools/webpack/webpack.common.config.ts index 11d12cdc..4619766b 100644 --- a/config/webpack.common.config.js +++ b/tools/webpack/webpack.common.config.ts @@ -1,6 +1,7 @@ -const path = require('path'); +import path from 'path'; +import { Configuration } from 'webpack'; -module.exports = { +const config: Configuration = { entry: { app: path.resolve(process.cwd(), './src/index'), }, @@ -26,6 +27,7 @@ module.exports = { function ignoreSourcemapsloaderWarnings(warning) { return ( warning.module + // @ts-ignore && warning.module.resource.includes('node_modules') && warning.details && warning.details.includes('source-map-loader') @@ -33,3 +35,5 @@ module.exports = { }, ], }; + +export default config; diff --git a/config/webpack.dev-stage.config.js b/tools/webpack/webpack.dev-stage.config.ts similarity index 88% rename from config/webpack.dev-stage.config.js rename to tools/webpack/webpack.dev-stage.config.ts index 41b838e0..37e5d9a9 100644 --- a/config/webpack.dev-stage.config.js +++ b/tools/webpack/webpack.dev-stage.config.ts @@ -1,23 +1,22 @@ // This is the dev Webpack config. All settings here should prefer a fast build // time at the expense of creating larger, unoptimized bundles. -const ImageMinimizerPlugin = require('image-minimizer-webpack-plugin'); +import { transform } from '@formatjs/ts-transformer'; +import ReactRefreshWebpackPlugin from '@pmmmwh/react-refresh-webpack-plugin'; +import PostCssAutoprefixerPlugin from 'autoprefixer'; +import HtmlWebpackPlugin from 'html-webpack-plugin'; +import ImageMinimizerPlugin from 'image-minimizer-webpack-plugin'; +import path from 'path'; +import PostCssCustomMediaCSS from 'postcss-custom-media'; +import PostCssRTLCSS from 'postcss-rtlcss'; +import { merge } from 'webpack-merge'; -const { merge } = require('webpack-merge'); -const HtmlWebpackPlugin = require('html-webpack-plugin'); -const path = require('path'); -const PostCssAutoprefixerPlugin = require('autoprefixer'); -const PostCssRTLCSS = require('postcss-rtlcss'); -const PostCssCustomMediaCSS = require('postcss-custom-media'); -const ReactRefreshWebpackPlugin = require('@pmmmwh/react-refresh-webpack-plugin'); -const { transform } = require('@formatjs/ts-transformer'); - -const commonConfig = require('./webpack.common.config'); -const getLocalAliases = require('./getLocalAliases'); +import getLocalAliases from './getLocalAliases'; +import commonConfig from './webpack.common.config'; const aliases = getLocalAliases(); const PUBLIC_PATH = process.env.PUBLIC_PATH || '/'; -module.exports = merge(commonConfig, { +const config = merge(commonConfig, { mode: 'development', devtool: 'eval-source-map', output: { @@ -34,6 +33,7 @@ module.exports = merge(commonConfig, { test: /\.(js|jsx|ts|tsx)$/, include: [ /src/, + path.resolve(process.cwd(), './env.config.tsx'), ], use: { loader: require.resolve('ts-loader'), @@ -174,3 +174,5 @@ module.exports = merge(commonConfig, { }, }, }); + +export default config; diff --git a/config/webpack.dev.config.js b/tools/webpack/webpack.dev.config.ts similarity index 88% rename from config/webpack.dev.config.js rename to tools/webpack/webpack.dev.config.ts index 5ac9cb09..8c948c25 100644 --- a/config/webpack.dev.config.js +++ b/tools/webpack/webpack.dev.config.ts @@ -1,23 +1,23 @@ // This is the dev Webpack config. All settings here should prefer a fast build // time at the expense of creating larger, unoptimized bundles. -const ImageMinimizerPlugin = require('image-minimizer-webpack-plugin'); +import { transform } from '@formatjs/ts-transformer'; +import ReactRefreshWebpackPlugin from '@pmmmwh/react-refresh-webpack-plugin'; +import PostCssAutoprefixerPlugin from 'autoprefixer'; +import HtmlWebpackPlugin from 'html-webpack-plugin'; +import ImageMinimizerPlugin from 'image-minimizer-webpack-plugin'; +import path from 'path'; +import PostCssCustomMediaCSS from 'postcss-custom-media'; +import PostCssRTLCSS from 'postcss-rtlcss'; +import { merge } from 'webpack-merge'; -const { merge } = require('webpack-merge'); -const HtmlWebpackPlugin = require('html-webpack-plugin'); -const path = require('path'); -const PostCssAutoprefixerPlugin = require('autoprefixer'); -const PostCssRTLCSS = require('postcss-rtlcss'); -const PostCssCustomMediaCSS = require('postcss-custom-media'); -const ReactRefreshWebpackPlugin = require('@pmmmwh/react-refresh-webpack-plugin'); -const { transform } = require('@formatjs/ts-transformer'); - -const commonConfig = require('./webpack.common.config'); -const getLocalAliases = require('./getLocalAliases'); +import getLocalAliases from './getLocalAliases'; +import commonConfig from './webpack.common.config'; const aliases = getLocalAliases(); const PUBLIC_PATH = process.env.PUBLIC_PATH || '/'; -module.exports = merge(commonConfig, { + +const config = merge(commonConfig, { mode: 'development', devtool: 'eval-source-map', output: { @@ -34,6 +34,7 @@ module.exports = merge(commonConfig, { test: /\.(js|jsx|ts|tsx)$/, include: [ /src/, + path.resolve(process.cwd(), './env.config.tsx'), ], use: { loader: require.resolve('ts-loader'), @@ -173,3 +174,5 @@ module.exports = merge(commonConfig, { }, }, }); + +export default config; diff --git a/config/webpack.prod.config.js b/tools/webpack/webpack.prod.config.ts similarity index 84% rename from config/webpack.prod.config.js rename to tools/webpack/webpack.prod.config.ts index 1bab859d..b0ca9d42 100644 --- a/config/webpack.prod.config.js +++ b/tools/webpack/webpack.prod.config.ts @@ -1,22 +1,24 @@ // This is the prod Webpack config. All settings here should prefer smaller, // optimized bundles at the expense of a longer build time. -const ImageMinimizerPlugin = require('image-minimizer-webpack-plugin'); -const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer'); -const { merge } = require('webpack-merge'); -const CssNano = require('cssnano'); -const NewRelicSourceMapPlugin = require('@edx/new-relic-source-map-webpack-plugin'); -const HtmlWebpackPlugin = require('html-webpack-plugin'); -const MiniCssExtractPlugin = require('mini-css-extract-plugin'); -const path = require('path'); -const PostCssAutoprefixerPlugin = require('autoprefixer'); -const PostCssRTLCSS = require('postcss-rtlcss'); -const PostCssCustomMediaCSS = require('postcss-custom-media'); -const { transform } = require('@formatjs/ts-transformer'); +import NewRelicSourceMapPlugin from '@edx/new-relic-source-map-webpack-plugin'; +import { transform } from '@formatjs/ts-transformer'; +import PostCssAutoprefixerPlugin from 'autoprefixer'; +import CssNano from 'cssnano'; +import HtmlWebpackPlugin from 'html-webpack-plugin'; +import ImageMinimizerPlugin from 'image-minimizer-webpack-plugin'; +import MiniCssExtractPlugin from 'mini-css-extract-plugin'; +import path from 'path'; +import PostCssCustomMediaCSS from 'postcss-custom-media'; +import PostCssRTLCSS from 'postcss-rtlcss'; +import { Configuration } from 'webpack'; +import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer'; +import 'webpack-dev-server'; // Required to get devServer types added to Configuration +import { merge } from 'webpack-merge'; -const getLocalAliases = require('./getLocalAliases'); -const HtmlWebpackNewRelicPlugin = require('../cli/plugins/html-webpack-new-relic-plugin'); -const commonConfig = require('./webpack.common.config'); +import getLocalAliases from './getLocalAliases'; +import HtmlWebpackNewRelicPlugin from './plugins/html-webpack-new-relic-plugin'; +import commonConfig from './webpack.common.config'; const extraPlugins = []; if (process.env.ENABLE_NEW_RELIC !== 'false') { @@ -42,7 +44,7 @@ if (process.env.ENABLE_NEW_RELIC !== 'false') { const aliases = getLocalAliases(); -module.exports = merge(commonConfig, { +const config: Configuration = merge(commonConfig, { mode: 'production', devtool: 'source-map', output: { @@ -61,6 +63,7 @@ module.exports = merge(commonConfig, { test: /\.(js|jsx|ts|tsx)$/, include: [ /src/, + path.resolve(process.cwd(), './env.config.tsx'), ], use: { loader: require.resolve('ts-loader'), @@ -90,7 +93,7 @@ module.exports = merge(commonConfig, { }, // Webpack, by default, includes all CSS in the javascript bundles. Unfortunately, that means: // a) The CSS won't be cached by browsers separately (a javascript change will force CSS - // re-download). b) Since CSS is applied asyncronously, it causes an ugly + // re-download). b) Since CSS is applied asynchronously, it causes an ugly // flash-of-unstyled-content. // // To avoid these problems, we extract the CSS from the bundles into separate CSS files that @@ -201,6 +204,7 @@ module.exports = merge(commonConfig, { FAVICON_URL: process.env.FAVICON_URL || null, OPTIMIZELY_PROJECT_ID: process.env.OPTIMIZELY_PROJECT_ID || null, NODE_ENV: process.env.NODE_ENV || null, + SITE_NAME: process.env.SITE_NAME || '', }), new BundleAnalyzerPlugin({ analyzerMode: 'static', @@ -209,3 +213,5 @@ module.exports = merge(commonConfig, { ...extraPlugins, ], }); + +export default config; diff --git a/config/webpack.shell.dev.config.js b/tools/webpack/webpack.shell.dev.config.ts similarity index 81% rename from config/webpack.shell.dev.config.js rename to tools/webpack/webpack.shell.dev.config.ts index f2eafd41..0e984ff9 100644 --- a/config/webpack.shell.dev.config.js +++ b/tools/webpack/webpack.shell.dev.config.ts @@ -1,20 +1,19 @@ -// This is the dev Webpack config. All settings here should prefer a fast build -// time at the expense of creating larger, unoptimized bundles. -const ImageMinimizerPlugin = require('image-minimizer-webpack-plugin'); - -const HtmlWebpackPlugin = require('html-webpack-plugin'); -const path = require('path'); -const PostCssAutoprefixerPlugin = require('autoprefixer'); -const PostCssRTLCSS = require('postcss-rtlcss'); -const PostCssCustomMediaCSS = require('postcss-custom-media'); -const ReactRefreshWebpackPlugin = require('@pmmmwh/react-refresh-webpack-plugin'); -const { transform } = require('@formatjs/ts-transformer'); -const getLocalAliases = require('./getLocalAliases'); +import { transform } from '@formatjs/ts-transformer'; +import ReactRefreshWebpackPlugin from '@pmmmwh/react-refresh-webpack-plugin'; +import PostCssAutoprefixerPlugin from 'autoprefixer'; +import HtmlWebpackPlugin from 'html-webpack-plugin'; +import ImageMinimizerPlugin from 'image-minimizer-webpack-plugin'; +import path from 'path'; +import PostCssCustomMediaCSS from 'postcss-custom-media'; +import PostCssRTLCSS from 'postcss-rtlcss'; +import { Configuration, WebpackError } from 'webpack'; +import 'webpack-dev-server'; // Required to get devServer types added to Configuration +import getLocalAliases from './getLocalAliases'; const aliases = getLocalAliases(); const PUBLIC_PATH = process.env.PUBLIC_PATH || '/'; -module.exports = { +const config: Configuration = { entry: { app: path.resolve(__dirname, '../shell/index'), }, @@ -27,30 +26,18 @@ module.exports = { ...aliases, 'env.config': path.resolve(process.cwd(), './env.config'), }, - fallback: { - // This causes the system to return an empty object if it can't find an env.config.js file in - // the application being built. - 'env.config': false, - }, extensions: ['.js', '.jsx', '.ts', '.tsx'], }, ignoreWarnings: [ // Ignore warnings raised by source-map-loader. // some third party packages may ship miss-configured sourcemaps, that interrupts the build // See: https://github.com/facebook/create-react-app/discussions/11278#discussioncomment-1780169 - /** - * - * @param {import('webpack').WebpackError} warning - * @returns {boolean} - */ - function ignoreSourcemapsloaderWarnings(warning) { - return ( - warning.module - && warning.module.resource.includes('node_modules') - && warning.details - && warning.details.includes('source-map-loader') - ); - }, + (warning: WebpackError) => !!( + warning.module + // @ts-ignore + && warning.module.resource.includes('node_modules') + && warning.details + && warning.details.includes('source-map-loader')), ], mode: 'development', devtool: 'eval-source-map', @@ -63,7 +50,6 @@ module.exports = { [ /src/, path.resolve(process.cwd(), './env.config.tsx'), - // /env.config/ // \.(js|jsx|ts|tsx)/, ] ], use: { @@ -185,6 +171,7 @@ module.exports = { ], // This configures webpack-dev-server which serves bundles from memory and provides live // reloading. + devServer: { host: '0.0.0.0', port: process.env.PORT || 8080, @@ -204,3 +191,5 @@ module.exports = { }, }, }; + +export default config; diff --git a/tsconfig.build.json b/tsconfig.build.json new file mode 100644 index 00000000..25cad5ce --- /dev/null +++ b/tsconfig.build.json @@ -0,0 +1,22 @@ +{ + "extends": "./tools/typescript/tsconfig.json", + "compilerOptions": { + "rootDir": ".", + "outDir": "dist", + "noEmit": false, + }, + "include": [ + "runtime/**/*", + "shell/**/*", + "index.ts", + ], + "exclude": [ + "**/*.test.*", + "**/jest.config.js", + "**/.eslintrc.js", + "**/__mocks__", + ], + "references": [ + { "path": "./tools" }, + ] +} diff --git a/tsconfig.json b/tsconfig.json index a98ef0cd..bf701d04 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,24 +1,28 @@ { - "extends": "./config/tsconfig.json", + "extends": "./tools/typescript/tsconfig.json", "compilerOptions": { "rootDir": ".", "outDir": "dist", "noEmit": false, - "declaration": true, }, "include": [ - "cli/**/*", - "config/**/*", "runtime/**/*", "shell/**/*", "index.ts", + "jest.config.js", + "babel.config.js", + ".eslintrc.js", ], "exclude": [ "test-app/**/*", "dist/**/*", "coverage/**/*", - "cli/coverage", + "tools/**/*", + "config/**/*", "example/**/*", "example-plugin-app/**/*", + ], + "references": [ + { "path": "./tools" }, ] } From 1d09deef773baff7fca8dcddc669bb94b7f2e481 Mon Sep 17 00:00:00 2001 From: David Joy Date: Wed, 14 Aug 2024 13:04:05 -0400 Subject: [PATCH 27/90] =?UTF-8?q?refactor:=20Using=20=E2=80=98site.config?= =?UTF-8?q?=E2=80=99=20for=20runtime=20configuration=20instead=20of=20?= =?UTF-8?q?=E2=80=98env.config=E2=80=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This feels like it more accurately describes what the file is; it’s a holistic config file for your entire site. ‘env’ is duplicative of the actual environment that operators will put in the filename, i.e., env.config.dev.tsx already days it’s for dev, we know it’s for an environment. But what is it? Is it build config? No, it’s the whole site. It’s not even for an MFE or a module, again, it’s the whole thing and should be thought of as such. This is admittedly a little fiddly, but makes more sense in the mental model I’m working off of. --- README.md | 16 ++-- docs/decisions/0002-js-environment-config.md | 10 +-- docs/decisions/0003-fedx-scripts-serve.md | 6 +- .../0007-javascript-file-configuration.rst | 2 +- ... 0008-stylesheet-import-in-site-config.md} | 12 +-- .../{env.config.js => site.config.tsx} | 0 example/{env.config.jsx => site.config.tsx} | 0 frontend-base.d.ts | 2 +- runtime/config.js | 77 +++++++------------ .../initialize.async.function.config.test.js | 2 +- runtime/initialize.const.config.test.js | 2 +- runtime/initialize.function.config.test.js | 2 +- runtime/initialize.js | 18 ++--- runtime/jest.config.js | 2 +- ...v.test.config.tsx => site.config.test.tsx} | 0 runtime/testing/initializeMockApp.js | 4 +- shell/header/Header.jsx | 2 +- shell/jest.config.js | 2 +- ...v.test.config.tsx => site.config.test.tsx} | 2 +- test-app/{env.config.tsx => site.config.tsx} | 0 test-app/src/ExamplePage.jsx | 4 +- test-app/tsconfig.json | 2 +- tools/cli/serve.ts | 8 +- tools/eslint/.eslintrc.js | 2 +- tools/jest/jest.config.js | 2 +- tools/webpack/webpack.common.config.ts | 2 +- tools/webpack/webpack.dev-stage.config.ts | 2 +- tools/webpack/webpack.dev.config.ts | 2 +- tools/webpack/webpack.prod.config.ts | 2 +- tools/webpack/webpack.shell.dev.config.ts | 4 +- 30 files changed, 83 insertions(+), 108 deletions(-) rename docs/decisions/{0008-stylesheet-import-in-env-config.md => 0008-stylesheet-import-in-site-config.md} (68%) rename example-plugin-app/{env.config.js => site.config.tsx} (100%) rename example/{env.config.jsx => site.config.tsx} (100%) rename runtime/{env.test.config.tsx => site.config.test.tsx} (100%) rename shell/{env.test.config.tsx => site.config.test.tsx} (97%) rename test-app/{env.config.tsx => site.config.tsx} (100%) diff --git a/README.md b/README.md index 71025b9c..93469214 100644 --- a/README.md +++ b/README.md @@ -148,7 +148,7 @@ Create a tsconfig.json file and add the following contents to it: "include": [ ".eslintrc.js", "jest.config.js", - "env.config.js", + "site.config.tsx", "src/**/*", "app.d.ts", ] @@ -256,15 +256,15 @@ Remember to make the following substitution for these functions: + import { configureLogging } from '@openedx/frontend-base'; ``` -### 12. Replace the .env.test file with configuration in env.test.config.tsx file +### 12. Replace the .env.test file with configuration in site.config.test.tsx file -We're moving away from .env files because they're not expressive enough (only string types!) to configure an Open edX frontend. Instead, the test suite has been configured to expect an env.test.config.tsx file. If you're initializing an application in your tests, frontend-base will pick up this configuration and make it available to getConfig(), etc. If you need to manually access the variables, you an import `env.config` in your test files: +We're moving away from .env files because they're not expressive enough (only string types!) to configure an Open edX frontend. Instead, the test suite has been configured to expect an site.config.test.tsx file. If you're initializing an application in your tests, frontend-base will pick up this configuration and make it available to getConfig(), etc. If you need to manually access the variables, you an import `site.config` in your test files: ```diff -+ import config from 'env.config'; ++ import config from 'site.config'; ``` -The Jest configuration has been set up to find `env.config` at an `env.test.config.tsx` file. +The Jest configuration has been set up to find `site.config` at an `site.config.test.tsx` file. ## Migrating to the frontend-base shell (:rotating_light: Work In Progress) @@ -278,11 +278,11 @@ In spirit, in this migration we remove the initialization and header/footer code ### 1. Remove initialization -In your index.(jsx|tsx) file, you need to remove the subscribe and initialization code. If you have customizations here, they will need to migrate to your env.config.tsx file instead and take advantage of the shell's provided customization mechanisms. +In your index.(jsx|tsx) file, you need to remove the subscribe and initialization code. If you have customizations here, they will need to migrate to your site.config.tsx file instead and take advantage of the shell's provided customization mechanisms. ### 2. Migrate header/footer dependencies -If your application uses a custom header or footer, you can use the shell's header and footer plugin slots to provide your custom header/footer components. This is done through the env.config.tsx file. +If your application uses a custom header or footer, you can use the shell's header and footer plugin slots to provide your custom header/footer components. This is done through the site.config.tsx file. ### 3. Export the modules of your app as a component. @@ -296,7 +296,7 @@ Create a new project.scss file at the top of your application. It's responsible 2. Importing your brand stylesheet. 3. Importing the stylesheets from your application. -You must then import this new stylesheet into your env.config.tsx file: +You must then import this new stylesheet into your site.config.tsx file: ```diff + import './project.scss'; diff --git a/docs/decisions/0002-js-environment-config.md b/docs/decisions/0002-js-environment-config.md index 1d0245db..d84754b6 100644 --- a/docs/decisions/0002-js-environment-config.md +++ b/docs/decisions/0002-js-environment-config.md @@ -28,20 +28,20 @@ We will still support `process.env`-based configuration for the time being. Tod # Implementation -This new mechanism is done via webpack's `resolve` rules, specifically `alias` and `fallback`. We use the first rule to set up an alias for `"env.config"` and point it at a `env.config.js` file we expect to be in the root of the application being built with frontend-build. If that file is not present, `fallback` is responsible for resolving it with an empty `env.config.js` file here in frontend-build, which provides an empty object of configuration values. +This new mechanism is done via webpack's `resolve` rules, specifically `alias` and `fallback`. We use the first rule to set up an alias for `"site.config"` and point it at a `site.config.tsx` file we expect to be in the root of the application being built with frontend-build. If that file is not present, `fallback` is responsible for resolving it with an empty `site.config.tsx` file here in frontend-build, which provides an empty object of configuration values. -In this way, if an application doesn't know about or doesn't use `env.config.js`, it will seamlessly fallback to be a no-op. +In this way, if an application doesn't know about or doesn't use `site.config.tsx`, it will seamlessly fallback to be a no-op. Once in place, an application can do: ``` -import config from 'env.config'; +import config from 'site.config'; ``` -And it'll import the code from `env.config.js` if it's present, or the frontend-build version (which is an empty object `{}`) if it is not. +And it'll import the code from `site.config.tsx` if it's present, or the frontend-build version (which is an empty object `{}`) if it is not. # Follow-on work -After getting this code committed to frontend-build, we'll want to consume it in frontend-platform. This will probably take the form of a new "configuration service" interface with two implementations: the existing `process.env`-based implementation packaged into a class, and a new `env.config`-based implementation. Cutting over from one to the other over time will have to be done in a backwards compatible way so that we can continue to support existing MFE builds. +After getting this code committed to frontend-build, we'll want to consume it in frontend-platform. This will probably take the form of a new "configuration service" interface with two implementations: the existing `process.env`-based implementation packaged into a class, and a new `site.config`-based implementation. Cutting over from one to the other over time will have to be done in a backwards compatible way so that we can continue to support existing MFE builds. We expect that we'll also want to update https://github.com/openedx/tubular to support this new mechanism. Operators who want to take advantage of it may need to update any repositories that contain their environment-specific configurations as well. diff --git a/docs/decisions/0003-fedx-scripts-serve.md b/docs/decisions/0003-fedx-scripts-serve.md index e0990f10..4783c7ea 100644 --- a/docs/decisions/0003-fedx-scripts-serve.md +++ b/docs/decisions/0003-fedx-scripts-serve.md @@ -16,9 +16,9 @@ To mitigate this, this ADR describes a new mechanism to provide a standard, docu # Decision -We will create a new `serve` command for `openedx` that creates an Express.js server to run the generated `dist` file assets (e.g., `index.html`) on the `PORT` specified in the MFE's `env.config.js` and/or `.env.development|private` file(s) on `localhost`. +We will create a new `serve` command for `openedx` that creates an Express.js server to run the generated `dist` file assets (e.g., `index.html`) on the `PORT` specified in the MFE's `site.config.tsx` and/or `.env.development|private` file(s) on `localhost`. -If no `env.config.js` and/or `.env.development|private` file(s) exist and/or no `PORT` setting is specified those files, the `serve` command will fallback to a default port 8080, which is similar to the default ports our typical example MFE applications use. +If no `site.config.tsx` and/or `.env.development|private` file(s) exist and/or no `PORT` setting is specified those files, the `serve` command will fallback to a default port 8080, which is similar to the default ports our typical example MFE applications use. # Implementation @@ -34,7 +34,7 @@ Once in place, a MFE application may add a `serve` script to its NPM scripts in } ``` -Then, running `npm run serve` in the root of that MFE application will run the new `serve` command in `@edx/frontend-build`, serving the assets in the MFE's `dist` directory on the `PORT` specified in the `env.config.js` file or `.env.development|private` file(s). +Then, running `npm run serve` in the root of that MFE application will run the new `serve` command in `@edx/frontend-build`, serving the assets in the MFE's `dist` directory on the `PORT` specified in the `site.config.tsx` file or `.env.development|private` file(s). # Change Log diff --git a/docs/decisions/0007-javascript-file-configuration.rst b/docs/decisions/0007-javascript-file-configuration.rst index 9de22593..328eea0a 100644 --- a/docs/decisions/0007-javascript-file-configuration.rst +++ b/docs/decisions/0007-javascript-file-configuration.rst @@ -72,7 +72,7 @@ Decision For the above reasons, we will deprecate environment variable configuration in favor of JavaScript file configuration. -This method makes use of an ``env.config.js`` file to supply configuration +This method makes use of an ``site.config.tsx`` file to supply configuration variables to an application:: const config = { diff --git a/docs/decisions/0008-stylesheet-import-in-env-config.md b/docs/decisions/0008-stylesheet-import-in-site-config.md similarity index 68% rename from docs/decisions/0008-stylesheet-import-in-env-config.md rename to docs/decisions/0008-stylesheet-import-in-site-config.md index 42299b54..eba07011 100644 --- a/docs/decisions/0008-stylesheet-import-in-env-config.md +++ b/docs/decisions/0008-stylesheet-import-in-site-config.md @@ -1,20 +1,20 @@ -# Shell stylesheet must be imported in env.config file. +# Shell stylesheet must be imported in site.config file. ## Summary -A project must import the stylesheet for the application shell in its env.config file. +A project must import the stylesheet for the application shell in its site.config file. ## Context There is a particular quirk of the stylesheet loaders for webpack (style-loader and/or css-loader) where the import of stylesheets into JavaScript files must take place in a JS file in the project, not in library dependency like frontend-base. Further, the stylesheet imported into JS must _itself_ be a part of the project. -If, for instance, we try to import a stylesheet from frontend-base (shell, header, footer, etc.) inside a React component inside the shell, webpack silently ignores the import and refuses to load the stylesheet. If we try to import a stylesheet from frontend-base directly into the env.config file in the project, that will also fail with webpack silently ignoring the stylesheet. If, however, frontend-base exports the stylesheet and it's loaded into a SCSS file in the project and _that_ is imported into env.config, everything works correctly. +If, for instance, we try to import a stylesheet from frontend-base (shell, header, footer, etc.) inside a React component inside the shell, webpack silently ignores the import and refuses to load the stylesheet. If we try to import a stylesheet from frontend-base directly into the site.config file in the project, that will also fail with webpack silently ignoring the stylesheet. If, however, frontend-base exports the stylesheet and it's loaded into a SCSS file in the project and _that_ is imported into site.config, everything works correctly. -This slight indirection through a SCSS file in the project is necessary, and arguably desirable. It ensure as common, unified entry point for SCSS from dependencies of the project. SCSS from the project or micro-frontend itself can be imported into its own components, or can be imported into this top-level SCSS file as desired. Further, this ensures that every aspect of the style of a project or MFE can easily be customized since the stylesheet is supplied through the env.config file. +This slight indirection through a SCSS file in the project is necessary, and arguably desirable. It ensure as common, unified entry point for SCSS from dependencies of the project. SCSS from the project or micro-frontend itself can be imported into its own components, or can be imported into this top-level SCSS file as desired. Further, this ensures that every aspect of the style of a project or MFE can easily be customized since the stylesheet is supplied through the site.config file. ## Decision -As a best practice, a project should have a top-level SCSS file as a peer to the env.config file. This SCSS file should import the stylesheet from the frontend-base shell application. It should, in turn, be imported into the env.config file. +As a best practice, a project should have a top-level SCSS file as a peer to the site.config file. This SCSS file should import the stylesheet from the frontend-base shell application. It should, in turn, be imported into the site.config file. ## Implementation @@ -26,7 +26,7 @@ The `project.scss` file should import the stylesheet from the shell: // other styles ``` -The env.config file should then import the top-level SCSS file: +The site.config file should then import the top-level SCSS file: ```diff + import './project.scss'; diff --git a/example-plugin-app/env.config.js b/example-plugin-app/site.config.tsx similarity index 100% rename from example-plugin-app/env.config.js rename to example-plugin-app/site.config.tsx diff --git a/example/env.config.jsx b/example/site.config.tsx similarity index 100% rename from example/env.config.jsx rename to example/site.config.tsx diff --git a/frontend-base.d.ts b/frontend-base.d.ts index d43cfcfc..9cacfe80 100644 --- a/frontend-base.d.ts +++ b/frontend-base.d.ts @@ -1,6 +1,6 @@ import { OpenedXConfig } from "./"; -declare module 'env.config' { +declare module 'site.config' { export default OpenedXConfig; } diff --git a/runtime/config.js b/runtime/config.js index 896cb705..bf5f7858 100644 --- a/runtime/config.js +++ b/runtime/config.js @@ -3,44 +3,20 @@ * * The configuration module provides utilities for working with an application's configuration * document (ConfigDocument). Configuration variables can be supplied to the - * application in four different ways. They are applied in the following order: + * application in three different ways. They are applied in the following order: * - * - Build-time Configuration - * - Environment Variables - * - JavaScript File + * - Site Configuration File (site.config.tsx) + * - Initialization Config Handler * - Runtime Configuration * - * Last one in wins. Variables with the same name defined via the later methods will override any - * defined using an earlier method. i.e., if a variable is defined in Runtime Configuration, that - * will override the same variable defined in either Build-time Configuration method (environment - * variables or JS file). Configuration defined in a JS file will override environment variables. + * Last one in wins, and are deep merged together. Variables with the same name defined via the + * later methods will override any defined using an earlier method. i.e., if a variable is defined + * in Runtime Configuration, that will override the same variable defined in either of the earlier + * methods. Configuration defined in a JS file will override any default values below. * - * ##### Build-time Configuration + * ##### Site Configuration File * - * Build-time configuration methods add config variables into the app when it is built by webpack. - * This saves the app an API call and means it has all the information it needs to initialize right - * away. There are two methods of supplying build-time configuration: environment variables and a - * JavaScript file. - * - * ###### Environment Variables - * - * A set list of required config variables can be supplied as - * command-line environment variables during the build process. - * - * As a simple example, these are supplied on the command-line before invoking `npm run build`: - * - * ``` - * LMS_BASE_URL=http://localhost:18000 npm run build - * ``` - * - * Note that additional variables _cannot_ be supplied via this method without using the `config` - * initialization handler. The app won't pick them up and they'll appear `undefined`. - * - * This configuration method is being deprecated in favor of JavaScript File Configuration. - * - * ###### JavaScript File Configuration - * - * Configuration variables can be supplied in an optional file named env.config.tsx. This file must + * Configuration variables can be supplied in a file named site.config.tsx. This file must * export either an Object containing configuration variables or a function. The function must * return an Object containing configuration variables or, alternately, a promise which resolves to * an Object. @@ -49,7 +25,7 @@ * the function will be executed at runtime). This is not common, and the capability is included * for the sake of flexibility. * - * JavaScript File Configuration is well-suited to extensibility use cases or component overrides, + * The Site Configuration File is well-suited to extensibility use cases or component overrides, * in that the configuration file can depend on any installed JavaScript module. It is also the * preferred way of doing build-time configuration if runtime configuration isn't used by your * deployment of the platform. @@ -85,22 +61,6 @@ * export default getAsyncConfig; * ``` * - * ##### Runtime Configuration - * - * Configuration variables can also be supplied using the "runtime configuration" method, taking - * advantage of the Micro-frontend Config API in edx-platform. More information on this API can be - * found in the ADR which introduced it: - * - * https://github.com/openedx/edx-platform/blob/master/lms/djangoapps/mfe_config_api/docs/decisions/0001-mfe-config-api.rst - * - * The runtime configuration method can be enabled by supplying a MFE_CONFIG_API_URL via one of the other - * two configuration methods above. - * - * Runtime configuration is particularly useful if you need to supply different configurations to - * a single deployment of a micro-frontend, for instance. It is also a perfectly valid alternative - * to build-time configuration, though it introduces an additional API call to edx-platform on MFE - * initialization. - * * ##### Initialization Config Handler * * The configuration document can be extended by @@ -120,6 +80,23 @@ * }); * ``` * + * ##### Runtime Configuration + * + * Configuration variables can also be supplied using the "runtime configuration" method, taking + * advantage of the Micro-frontend Config API in edx-platform. More information on this API can be + * found in the ADR which introduced it: + * + * https://github.com/openedx/edx-platform/blob/master/lms/djangoapps/mfe_config_api/docs/decisions/0001-mfe-config-api.rst + * + * The runtime configuration method can be enabled by supplying a MFE_CONFIG_API_URL via one of the other + * two configuration methods above. + * + * Runtime configuration is particularly useful if you need to supply different configurations to + * a single deployment of a micro-frontend, for instance. It is also a perfectly valid alternative + * to build-time configuration, though it introduces an additional API call to edx-platform on MFE + * initialization. + * + * * @module Config */ diff --git a/runtime/initialize.async.function.config.test.js b/runtime/initialize.async.function.config.test.js index 63a997b3..323bf1cc 100644 --- a/runtime/initialize.async.function.config.test.js +++ b/runtime/initialize.async.function.config.test.js @@ -16,7 +16,7 @@ jest.mock('./auth'); jest.mock('./analytics'); jest.mock('./i18n'); jest.mock('./auth/LocalForageCache'); -jest.mock('env.config', () => async () => new Promise((resolve) => { +jest.mock('site.config', () => async () => new Promise((resolve) => { resolve({ JS_FILE_VAR: 'JS_FILE_VAR_VALUE_ASYNC_FUNCTION', }); diff --git a/runtime/initialize.const.config.test.js b/runtime/initialize.const.config.test.js index cf8ee6fa..3f30c90c 100644 --- a/runtime/initialize.const.config.test.js +++ b/runtime/initialize.const.config.test.js @@ -16,7 +16,7 @@ jest.mock('./auth'); jest.mock('./analytics'); jest.mock('./i18n'); jest.mock('./auth/LocalForageCache'); -jest.mock('env.config', () => ({ +jest.mock('site.config', () => ({ JS_FILE_VAR: 'JS_FILE_VAR_VALUE_CONSTANT', })); diff --git a/runtime/initialize.function.config.test.js b/runtime/initialize.function.config.test.js index 2a7ecd66..4683754e 100644 --- a/runtime/initialize.function.config.test.js +++ b/runtime/initialize.function.config.test.js @@ -16,7 +16,7 @@ jest.mock('./auth'); jest.mock('./analytics'); jest.mock('./i18n'); jest.mock('./auth/LocalForageCache'); -jest.mock('env.config', () => () => ({ +jest.mock('site.config', () => () => ({ JS_FILE_VAR: 'JS_FILE_VAR_VALUE_FUNCTION', })); diff --git a/runtime/initialize.js b/runtime/initialize.js index 60683bc2..68a828d9 100644 --- a/runtime/initialize.js +++ b/runtime/initialize.js @@ -52,12 +52,10 @@ import { createMemoryHistory } from 'history'; /* -This 'env.config' package is a special 'magic' alias in our webpack configuration in the `config` -folder. It points at an `env.config.js` file in the root of an MFE's repository if it exists and -falls back to an empty object `{}` if the file doesn't exist. This acts like an 'optional' import, -in a sense. +This 'site.config' package is a special 'magic' alias in our webpack configuration in the `config` +folder. It points at an `site.config.tsx` file in the root of an project's repository. */ -import envConfig from 'env.config'; +import siteConfig from 'site.config'; import { getPath } from './utils'; // eslint-disable-next-line import/no-cycle import { @@ -162,8 +160,8 @@ export async function auth(requireUser, hydrateUser) { } /** - * Set or overrides configuration via an env.config.js file in the consuming application. - * This env.config.js is loaded at runtime and must export one of two things: + * Set or overrides configuration via an site.config.tsx file in the consuming application. + * This site.config.tsx is loaded at runtime and must export one of two things: * * - An object which will be merged into the application config via `mergeConfig`. * - A function which returns an object which will be merged into the application config via @@ -171,10 +169,10 @@ export async function auth(requireUser, hydrateUser) { */ async function jsFileConfig() { let config = {}; - if (typeof envConfig === 'function') { - config = await envConfig(); + if (typeof siteConfig === 'function') { + config = await siteConfig(); } else { - config = envConfig; + config = siteConfig; } mergeConfig(config); diff --git a/runtime/jest.config.js b/runtime/jest.config.js index 562d2f20..e694c824 100644 --- a/runtime/jest.config.js +++ b/runtime/jest.config.js @@ -6,7 +6,7 @@ module.exports = { '\\.svg$': '/runtime/__mocks__/svg.js', '\\.(jpg|jpeg|png|gif|eot|otf|webp|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$': '/runtime/__mocks__/file.js', '\\.(css|scss)$': require.resolve('identity-obj-proxy'), - 'env.config': '/runtime/env.test.config.tsx', + 'site.config': '/runtime/site.config.test.tsx', }, testEnvironment: 'jsdom', testEnvironmentOptions: { diff --git a/runtime/env.test.config.tsx b/runtime/site.config.test.tsx similarity index 100% rename from runtime/env.test.config.tsx rename to runtime/site.config.test.tsx diff --git a/runtime/testing/initializeMockApp.js b/runtime/testing/initializeMockApp.js index 0cd42da4..1968d965 100644 --- a/runtime/testing/initializeMockApp.js +++ b/runtime/testing/initializeMockApp.js @@ -1,4 +1,4 @@ -import envConfig from 'env.config'; +import siteConfig from 'site.config'; import { configure as configureAnalytics, MockAnalyticsService } from '../analytics'; import { configure as configureAuth, MockAuthService } from '../auth'; @@ -48,7 +48,7 @@ export default function initializeMockApp({ messages = mockMessages, authenticatedUser = null, } = {}) { - const config = envConfig; + const config = siteConfig; mergeConfig(config); const loggingService = configureLogging(MockLoggingService, { diff --git a/shell/header/Header.jsx b/shell/header/Header.jsx index 5f0749c8..467c35db 100644 --- a/shell/header/Header.jsx +++ b/shell/header/Header.jsx @@ -76,7 +76,7 @@ const Header = ({ href: config.ACCOUNT_SETTINGS_URL, content: intl.formatMessage(messages['header.user.menu.account.settings']), }, - // Users should only see Order History if have a ORDER_HISTORY_URL define in the environment. + // Users should only see Order History if have a ORDER_HISTORY_URL define in the site config. ...(config.ORDER_HISTORY_URL ? [{ type: 'item', href: config.ORDER_HISTORY_URL, diff --git a/shell/jest.config.js b/shell/jest.config.js index c785a39a..9ac46355 100644 --- a/shell/jest.config.js +++ b/shell/jest.config.js @@ -6,7 +6,7 @@ module.exports = { '\\.svg$': '/shell/__mocks__/svg.js', '\\.(jpg|jpeg|png|gif|eot|otf|webp|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$': '/shell/__mocks__/file.js', '\\.(css|scss)$': require.resolve('identity-obj-proxy'), - 'env.config': '/shell/env.test.config.tsx', + 'site.config': '/shell/site.config.test.tsx', }, testEnvironment: 'jsdom', testEnvironmentOptions: { diff --git a/shell/env.test.config.tsx b/shell/site.config.test.tsx similarity index 97% rename from shell/env.test.config.tsx rename to shell/site.config.test.tsx index 925c404f..35c230d5 100644 --- a/shell/env.test.config.tsx +++ b/shell/site.config.test.tsx @@ -1,4 +1,4 @@ -import { OpenedXConfig } from '..'; +import { OpenedXConfig } from '../dist'; const config: OpenedXConfig = { ACCESS_TOKEN_COOKIE_NAME: 'edx-jwt-cookie-header-payload', diff --git a/test-app/env.config.tsx b/test-app/site.config.tsx similarity index 100% rename from test-app/env.config.tsx rename to test-app/site.config.tsx diff --git a/test-app/src/ExamplePage.jsx b/test-app/src/ExamplePage.jsx index beeaa1a4..6c316156 100644 --- a/test-app/src/ExamplePage.jsx +++ b/test-app/src/ExamplePage.jsx @@ -72,10 +72,10 @@ export default function ExamplePage() {

Config tests

Non-existent config variable: {printTestResult(getConfig().custom.I_AM_NOT_HERE === undefined)}

Merged var: {printTestResult(getConfig().custom.MERGED_VAR === 'I was merged in.')}

-

env.config.js boolean test: +

site.config boolean test: {printTestResult(getConfig().custom.FALSE_VALUE === false)}

-

env.config.js integer test: {printTestResult(Number.isInteger(getConfig().custom.INTEGER_VALUE))}

+

site.config integer test: {printTestResult(Number.isInteger(getConfig().custom.INTEGER_VALUE))}

Right-to-left language handling tests

I'm aligned right, but left in RTL.

diff --git a/test-app/tsconfig.json b/test-app/tsconfig.json index b36bdb15..640a91b2 100644 --- a/test-app/tsconfig.json +++ b/test-app/tsconfig.json @@ -7,7 +7,7 @@ "include": [ ".eslintrc.js", "jest.config.js", - "env.config.tsx", + "site.config.tsx", "src/**/*", "app.d.ts", ], diff --git a/tools/cli/serve.ts b/tools/cli/serve.ts index 9e075c8a..5f9227a3 100644 --- a/tools/cli/serve.ts +++ b/tools/cli/serve.ts @@ -28,19 +28,19 @@ if (isDirectoryEmpty(buildPath)) { let configuredPort; try { - configuredPort = require(path.join(process.cwd(), 'env.config.js'))?.PORT; + configuredPort = require(path.join(process.cwd(), 'site.config.tsx'))?.PORT; } catch (error) { - // Pass. Consuming applications may not have an `env.config.js` file. This is OK. + // Pass. Consuming applications may not have an `site.config.tsx` file. This is OK. } if (!configuredPort) { configuredPort = process.env.PORT; } - // No `PORT` found in `env.config.js` and/or `.env.development|private`, so output a warning. + // No `PORT` found in `site.config.tsx` and/or `.env.development|private`, so output a warning. if (!configuredPort) { const formattedEnvDev = chalk.bold.yellowBright('.env.development'); - const formattedEnvConfig = chalk.bold.yellowBright('env.config.js'); + const formattedEnvConfig = chalk.bold.yellowBright('site.config.tsx'); const formattedPort = chalk.bold.yellowBright(fallbackPort); console.log(chalk.yellow(`No port found in ${formattedEnvDev} and/or ${formattedEnvConfig} file(s). Falling back to port ${formattedPort}.\n`)); } diff --git a/tools/eslint/.eslintrc.js b/tools/eslint/.eslintrc.js index 52d4c012..408641f8 100644 --- a/tools/eslint/.eslintrc.js +++ b/tools/eslint/.eslintrc.js @@ -71,7 +71,7 @@ module.exports = { 'error', { ignore: [ - 'env.config', + 'site.config', ], }, ], diff --git a/tools/jest/jest.config.js b/tools/jest/jest.config.js index 34aebc85..08f2a7ae 100644 --- a/tools/jest/jest.config.js +++ b/tools/jest/jest.config.js @@ -8,7 +8,7 @@ module.exports = { rootDir: process.cwd(), moduleNameMapper: { '\\.(css|scss)$': require.resolve('identity-obj-proxy'), - 'env.config': path.resolve(process.cwd(), './env.test.config.tsx'), + 'site.config': path.resolve(process.cwd(), './site.config.test.tsx'), }, collectCoverageFrom: [ 'src/**/*.{js,jsx,ts,tsx}', diff --git a/tools/webpack/webpack.common.config.ts b/tools/webpack/webpack.common.config.ts index 4619766b..8646c94d 100644 --- a/tools/webpack/webpack.common.config.ts +++ b/tools/webpack/webpack.common.config.ts @@ -11,7 +11,7 @@ const config: Configuration = { }, resolve: { alias: { - 'env.config': path.resolve(process.cwd(), './env.config'), + 'site.config': path.resolve(process.cwd(), './site.config'), }, extensions: ['.js', '.jsx', '.ts', '.tsx'], }, diff --git a/tools/webpack/webpack.dev-stage.config.ts b/tools/webpack/webpack.dev-stage.config.ts index 37e5d9a9..accdcc77 100644 --- a/tools/webpack/webpack.dev-stage.config.ts +++ b/tools/webpack/webpack.dev-stage.config.ts @@ -33,7 +33,7 @@ const config = merge(commonConfig, { test: /\.(js|jsx|ts|tsx)$/, include: [ /src/, - path.resolve(process.cwd(), './env.config.tsx'), + path.resolve(process.cwd(), './site.config.tsx'), ], use: { loader: require.resolve('ts-loader'), diff --git a/tools/webpack/webpack.dev.config.ts b/tools/webpack/webpack.dev.config.ts index 8c948c25..a1339263 100644 --- a/tools/webpack/webpack.dev.config.ts +++ b/tools/webpack/webpack.dev.config.ts @@ -34,7 +34,7 @@ const config = merge(commonConfig, { test: /\.(js|jsx|ts|tsx)$/, include: [ /src/, - path.resolve(process.cwd(), './env.config.tsx'), + path.resolve(process.cwd(), './site.config.tsx'), ], use: { loader: require.resolve('ts-loader'), diff --git a/tools/webpack/webpack.prod.config.ts b/tools/webpack/webpack.prod.config.ts index b0ca9d42..512f15b5 100644 --- a/tools/webpack/webpack.prod.config.ts +++ b/tools/webpack/webpack.prod.config.ts @@ -63,7 +63,7 @@ const config: Configuration = merge(commonConfig, { test: /\.(js|jsx|ts|tsx)$/, include: [ /src/, - path.resolve(process.cwd(), './env.config.tsx'), + path.resolve(process.cwd(), './site.config.tsx'), ], use: { loader: require.resolve('ts-loader'), diff --git a/tools/webpack/webpack.shell.dev.config.ts b/tools/webpack/webpack.shell.dev.config.ts index 0e984ff9..b79bd801 100644 --- a/tools/webpack/webpack.shell.dev.config.ts +++ b/tools/webpack/webpack.shell.dev.config.ts @@ -24,7 +24,7 @@ const config: Configuration = { resolve: { alias: { ...aliases, - 'env.config': path.resolve(process.cwd(), './env.config'), + 'site.config': path.resolve(process.cwd(), './site.config'), }, extensions: ['.js', '.jsx', '.ts', '.tsx'], }, @@ -49,7 +49,7 @@ const config: Configuration = { include: [ [ /src/, - path.resolve(process.cwd(), './env.config.tsx'), + path.resolve(process.cwd(), './site.config.tsx'), ] ], use: { From 3d2a1672285e7086de7e44cb96d97dde44f3ae7b Mon Sep 17 00:00:00 2001 From: David Joy Date: Wed, 14 Aug 2024 13:10:16 -0400 Subject: [PATCH 28/90] =?UTF-8?q?build:=20main=20tsconfig=20should=20not?= =?UTF-8?q?=20emit=20-=20it=E2=80=99s=20there=20for=20IDEs,=20not=20the=20?= =?UTF-8?q?build?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tsconfig.json | 1 - 1 file changed, 1 deletion(-) diff --git a/tsconfig.json b/tsconfig.json index bf701d04..99cf5769 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -3,7 +3,6 @@ "compilerOptions": { "rootDir": ".", "outDir": "dist", - "noEmit": false, }, "include": [ "runtime/**/*", From 9f7ea39b3b2dbd2c51ef710c81a7a38153de42f3 Mon Sep 17 00:00:00 2001 From: David Joy Date: Wed, 14 Aug 2024 13:12:05 -0400 Subject: [PATCH 29/90] refactor: Renaming site config interface to SiteConfig Consistency is good. --- frontend-base.d.ts | 4 ++-- index.ts | 2 +- runtime/site.config.test.tsx | 4 ++-- shell/site.config.test.tsx | 4 ++-- test-app/site.config.tsx | 4 ++-- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/frontend-base.d.ts b/frontend-base.d.ts index 9cacfe80..f80647da 100644 --- a/frontend-base.d.ts +++ b/frontend-base.d.ts @@ -1,7 +1,7 @@ -import { OpenedXConfig } from "./"; +import { SiteConfig } from "./"; declare module 'site.config' { - export default OpenedXConfig; + export default SiteConfig; } declare module '*.svg' { diff --git a/index.ts b/index.ts index edae2e84..d2fb8488 100644 --- a/index.ts +++ b/index.ts @@ -105,7 +105,7 @@ export { useIntl } from './runtime'; -export interface OpenedXConfig { +export interface SiteConfig { /** * The application content for the shell. This is a temporary configuration option while we * convert micro-frontends to plugins. It must be a React functional component that takes no diff --git a/runtime/site.config.test.tsx b/runtime/site.config.test.tsx index 87e606f0..2712f61c 100644 --- a/runtime/site.config.test.tsx +++ b/runtime/site.config.test.tsx @@ -1,6 +1,6 @@ -import { OpenedXConfig } from '..'; +import { SiteConfig } from '..'; -const config: OpenedXConfig = { +const config: SiteConfig = { ACCESS_TOKEN_COOKIE_NAME: 'edx-jwt-cookie-header-payload', ACCOUNT_PROFILE_URL: 'http://localhost:1995', ACCOUNT_SETTINGS_URL: 'http://localhost:1997', diff --git a/shell/site.config.test.tsx b/shell/site.config.test.tsx index 35c230d5..be7ed9f1 100644 --- a/shell/site.config.test.tsx +++ b/shell/site.config.test.tsx @@ -1,6 +1,6 @@ -import { OpenedXConfig } from '../dist'; +import { SiteConfig } from '..'; -const config: OpenedXConfig = { +const config: SiteConfig = { ACCESS_TOKEN_COOKIE_NAME: 'edx-jwt-cookie-header-payload', ACCOUNT_PROFILE_URL: 'http://localhost:1995', ACCOUNT_SETTINGS_URL: 'http://localhost:1997', diff --git a/test-app/site.config.tsx b/test-app/site.config.tsx index e58e9521..aff631db 100644 --- a/test-app/site.config.tsx +++ b/test-app/site.config.tsx @@ -1,6 +1,6 @@ -import { OpenedXConfig } from "@openedx/frontend-base"; +import { SiteConfig } from "@openedx/frontend-base"; -const config: OpenedXConfig = { +const config: SiteConfig = { ENVIRONMENT: 'dev', PUBLIC_PATH: '/', ACCESS_TOKEN_COOKIE_NAME: 'edx-jwt-cookie-header-payload', From 99c628d7e0c30f7786761510c7c4e5ae24981aca Mon Sep 17 00:00:00 2001 From: David Joy Date: Wed, 14 Aug 2024 13:12:41 -0400 Subject: [PATCH 30/90] fix: removing MFE_CONFIG_API_URL from runtime/shell site configs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It’s optional, which means you leave it out if you don’t want to set it. --- runtime/site.config.test.tsx | 1 - shell/site.config.test.tsx | 1 - 2 files changed, 2 deletions(-) diff --git a/runtime/site.config.test.tsx b/runtime/site.config.test.tsx index 2712f61c..56ab66ba 100644 --- a/runtime/site.config.test.tsx +++ b/runtime/site.config.test.tsx @@ -26,7 +26,6 @@ const config: SiteConfig = { LOGO_TRADEMARK_URL: 'https://edx-cdn.org/v3/default/logo-trademark.svg', LOGO_WHITE_URL: 'https://edx-cdn.org/v3/default/logo-white.svg', FAVICON_URL: 'https://edx-cdn.org/v3/default/favicon.ico', - MFE_CONFIG_API_URL: null, APP_ID: 'runtime', SUPPORT_URL: 'https://support.edx.org', ENVIRONMENT: 'test', diff --git a/shell/site.config.test.tsx b/shell/site.config.test.tsx index be7ed9f1..7d7d6e77 100644 --- a/shell/site.config.test.tsx +++ b/shell/site.config.test.tsx @@ -26,7 +26,6 @@ const config: SiteConfig = { LOGO_TRADEMARK_URL: 'https://edx-cdn.org/v3/default/logo-trademark.svg', LOGO_WHITE_URL: 'https://edx-cdn.org/v3/default/logo-white.svg', FAVICON_URL: 'https://edx-cdn.org/v3/default/favicon.ico', - MFE_CONFIG_API_URL: null, APP_ID: 'runtime', SUPPORT_URL: 'https://support.edx.org', ENVIRONMENT: 'test', From a2af4018d258046daf69773a2e8f72a7325c0ed3 Mon Sep 17 00:00:00 2001 From: David Joy Date: Wed, 14 Aug 2024 13:49:19 -0400 Subject: [PATCH 31/90] test: fixing test site config name to not conflict with test suffix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit If you make a file that ends in test.tsx… jest will think it’s a test. Oops. This rearranges the name to be “test.site.config.tsx” instead. --- README.md | 6 +++--- runtime/jest.config.js | 2 +- runtime/{site.config.test.tsx => test.site.config.tsx} | 2 +- shell/jest.config.js | 2 +- shell/{site.config.test.tsx => test.site.config.tsx} | 0 tools/jest/jest.config.js | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) rename runtime/{site.config.test.tsx => test.site.config.tsx} (97%) rename shell/{site.config.test.tsx => test.site.config.tsx} (100%) diff --git a/README.md b/README.md index 93469214..77c7e0d5 100644 --- a/README.md +++ b/README.md @@ -256,15 +256,15 @@ Remember to make the following substitution for these functions: + import { configureLogging } from '@openedx/frontend-base'; ``` -### 12. Replace the .env.test file with configuration in site.config.test.tsx file +### 12. Replace the .env.test file with configuration in test.site.config.tsx file -We're moving away from .env files because they're not expressive enough (only string types!) to configure an Open edX frontend. Instead, the test suite has been configured to expect an site.config.test.tsx file. If you're initializing an application in your tests, frontend-base will pick up this configuration and make it available to getConfig(), etc. If you need to manually access the variables, you an import `site.config` in your test files: +We're moving away from .env files because they're not expressive enough (only string types!) to configure an Open edX frontend. Instead, the test suite has been configured to expect an test.site.config.tsx file. If you're initializing an application in your tests, frontend-base will pick up this configuration and make it available to getConfig(), etc. If you need to manually access the variables, you an import `site.config` in your test files: ```diff + import config from 'site.config'; ``` -The Jest configuration has been set up to find `site.config` at an `site.config.test.tsx` file. +The Jest configuration has been set up to find `site.config` at an `test.site.config.tsx` file. ## Migrating to the frontend-base shell (:rotating_light: Work In Progress) diff --git a/runtime/jest.config.js b/runtime/jest.config.js index e694c824..d25a7fc9 100644 --- a/runtime/jest.config.js +++ b/runtime/jest.config.js @@ -6,7 +6,7 @@ module.exports = { '\\.svg$': '/runtime/__mocks__/svg.js', '\\.(jpg|jpeg|png|gif|eot|otf|webp|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$': '/runtime/__mocks__/file.js', '\\.(css|scss)$': require.resolve('identity-obj-proxy'), - 'site.config': '/runtime/site.config.test.tsx', + 'site.config': '/runtime/test.site.config.tsx', }, testEnvironment: 'jsdom', testEnvironmentOptions: { diff --git a/runtime/site.config.test.tsx b/runtime/test.site.config.tsx similarity index 97% rename from runtime/site.config.test.tsx rename to runtime/test.site.config.tsx index 56ab66ba..3ec9921b 100644 --- a/runtime/site.config.test.tsx +++ b/runtime/test.site.config.tsx @@ -1,4 +1,4 @@ -import { SiteConfig } from '..'; +import { SiteConfig } from '../dist'; const config: SiteConfig = { ACCESS_TOKEN_COOKIE_NAME: 'edx-jwt-cookie-header-payload', diff --git a/shell/jest.config.js b/shell/jest.config.js index 9ac46355..f1af6042 100644 --- a/shell/jest.config.js +++ b/shell/jest.config.js @@ -6,7 +6,7 @@ module.exports = { '\\.svg$': '/shell/__mocks__/svg.js', '\\.(jpg|jpeg|png|gif|eot|otf|webp|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$': '/shell/__mocks__/file.js', '\\.(css|scss)$': require.resolve('identity-obj-proxy'), - 'site.config': '/shell/site.config.test.tsx', + 'site.config': '/shell/test.site.config.tsx', }, testEnvironment: 'jsdom', testEnvironmentOptions: { diff --git a/shell/site.config.test.tsx b/shell/test.site.config.tsx similarity index 100% rename from shell/site.config.test.tsx rename to shell/test.site.config.tsx diff --git a/tools/jest/jest.config.js b/tools/jest/jest.config.js index 08f2a7ae..8abb663e 100644 --- a/tools/jest/jest.config.js +++ b/tools/jest/jest.config.js @@ -8,7 +8,7 @@ module.exports = { rootDir: process.cwd(), moduleNameMapper: { '\\.(css|scss)$': require.resolve('identity-obj-proxy'), - 'site.config': path.resolve(process.cwd(), './site.config.test.tsx'), + 'site.config': path.resolve(process.cwd(), './test.site.config.tsx'), }, collectCoverageFrom: [ 'src/**/*.{js,jsx,ts,tsx}', From 09112019931cf78830c7d2770a3a63d7af72de72 Mon Sep 17 00:00:00 2001 From: David Joy Date: Wed, 14 Aug 2024 14:58:59 -0400 Subject: [PATCH 32/90] test: fixing Component errors resuling in test warnings/console errors MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Using correct PropTypes for buttonTitle in NavDropdownMenu - Adding a ‘key’ attribute to the list items in MobileMenu - Adding alt text to the IconButton in HeaderBody - Adding ‘id’ attribute to Dropdown.Toggle in AuthenticatedUserDropdown Also fixing a few errors in test files. Accidentally checked in some removal of process.env which belongs in the next commit. Don’t use this one on its own! --- runtime/auth/AxiosJwtAuthService.test.jsx | 38 +++++++++---------- shell/footer/components/Footer.test.jsx | 8 +--- .../__snapshots__/Footer.test.jsx.snap | 30 --------------- .../AuthenticatedUserDropdown.jsx | 2 +- shell/header/studio-header/HeaderBody.jsx | 1 + shell/header/studio-header/MobileMenu.jsx | 5 +-- .../header/studio-header/NavDropdownMenu.jsx | 5 +-- 7 files changed, 25 insertions(+), 64 deletions(-) diff --git a/runtime/auth/AxiosJwtAuthService.test.jsx b/runtime/auth/AxiosJwtAuthService.test.jsx index 9dd65c6f..d5bcf79c 100644 --- a/runtime/auth/AxiosJwtAuthService.test.jsx +++ b/runtime/auth/AxiosJwtAuthService.test.jsx @@ -1,7 +1,7 @@ /* eslint-disable arrow-body-style, no-console */ import axios from 'axios'; -import Cookies from 'universal-cookie'; import MockAdapter from 'axios-mock-adapter'; +import Cookies from 'universal-cookie'; import AxiosJwtAuthService from './AxiosJwtAuthService'; const mockLoggingService = { @@ -12,13 +12,13 @@ const mockLoggingService = { const authOptions = { config: { - BASE_URL: process.env.BASE_URL, - ACCESS_TOKEN_COOKIE_NAME: process.env.ACCESS_TOKEN_COOKIE_NAME, + BASE_URL: 'http://localhost:8080', + ACCESS_TOKEN_COOKIE_NAME: 'edx-jwt-cookie-header-payload', CSRF_TOKEN_API_PATH: '/get-csrf-token', - LMS_BASE_URL: process.env.LMS_BASE_URL, - LOGIN_URL: process.env.LOGIN_URL, - LOGOUT_URL: process.env.LOGOUT_URL, - REFRESH_ACCESS_TOKEN_ENDPOINT: process.env.REFRESH_ACCESS_TOKEN_ENDPOINT, + LMS_BASE_URL: 'http://localhost:18000', + LOGIN_URL: 'http://localhost:18000/login', + LOGOUT_URL: 'http://localhost:18000/logout', + REFRESH_ACCESS_TOKEN_ENDPOINT: 'http://localhost:18000/login_refresh', }, loggingService: mockLoggingService, }; @@ -77,7 +77,7 @@ Object.keys(jwtTokens).forEach((jwtTokenName) => { }); const mockCsrfToken = 'thetokenvalue'; -const mockApiEndpointPath = `${process.env.BASE_URL}/api/v1/test`; +const mockApiEndpointPath = `${authOptions.config.BASE_URL}/api/v1/test`; global.location ??= { ...global.location, assign: jest.fn() }; @@ -112,16 +112,16 @@ const setJwtTokenRefreshResponseTo = (status, jwtCookieValue, responseEpochSecon }); }; -function expectLogout(redirectUrl = process.env.BASE_URL) { +function expectLogout(redirectUrl = authOptions.config.BASE_URL) { const encodedRedirectUrl = encodeURIComponent(redirectUrl); expect(global.location.assign) - .toHaveBeenCalledWith(`${process.env.LOGOUT_URL}?redirect_url=${encodedRedirectUrl}`); + .toHaveBeenCalledWith(`${authOptions.config.LOGOUT_URL}?redirect_url=${encodedRedirectUrl}`); } -function expectLogin(redirectUrl = process.env.BASE_URL) { +function expectLogin(redirectUrl = authOptions.config.BASE_URL) { const encodedRedirectUrl = encodeURIComponent(redirectUrl); expect(global.location.assign) - .toHaveBeenCalledWith(`${process.env.LOGIN_URL}?next=${encodedRedirectUrl}`); + .toHaveBeenCalledWith(`${authOptions.config.LOGIN_URL}?next=${encodedRedirectUrl}`); } // customAttributes is sent into expect.objectContaining @@ -210,9 +210,7 @@ beforeEach(() => { axiosMock.onGet('/unauthorized').reply(401); axiosMock.onGet('/forbidden').reply(403); axiosMock.onAny().reply(200); - csrfTokensAxiosMock - .onGet(process.env.CSRF_TOKEN_REFRESH) - .reply(200, { csrfToken: mockCsrfToken }); + csrfTokensAxiosMock.onGet().reply(200, { csrfToken: mockCsrfToken }); axios.defaults.maxRetries = 0; csrfTokensAxios.defaults.maxRetries = 0; accessTokenAxios.defaults.maxRetries = 0; @@ -739,7 +737,7 @@ describe('redirectToLogin', () => { service.redirectToLogin('http://edx.org/dashboard'); expectLogin('http://edx.org/dashboard'); service.redirectToLogin(); - expectLogin(process.env.BASE_URL); + expectLogin(authOptions.config.BASE_URL); }); }); @@ -748,7 +746,7 @@ describe('redirectToLogout', () => { service.redirectToLogout('http://edx.org/'); expectLogout('http://edx.org/'); service.redirectToLogout(); - expectLogout(process.env.BASE_URL); + expectLogout(authOptions.config.BASE_URL); }); }); @@ -834,15 +832,15 @@ describe('ensureAuthenticatedUser', () => { it('attempts to refresh a missing jwt token and redirects user to login', () => { setJwtCookieTo(null); expect.hasAssertions(); - return service.ensureAuthenticatedUser(`${process.env.BASE_URL}/route`).catch((unauthorizedError) => { + return service.ensureAuthenticatedUser(`${authOptions.config.BASE_URL}/route`).catch((unauthorizedError) => { expect(unauthorizedError.isRedirecting).toBe(true); expectSingleCallToJwtTokenRefresh(); - expectLogin(`${process.env.BASE_URL}/route`); + expectLogin(`${authOptions.config.BASE_URL}/route`); }); }); it('throws an error and does not redirect if the referrer is the login page', () => { - jest.spyOn(global.document, 'referrer', 'get').mockReturnValue(process.env.LOGIN_URL); + jest.spyOn(global.document, 'referrer', 'get').mockReturnValue(authOptions.config.LOGIN_URL); setJwtCookieTo(null); expect.hasAssertions(); return service.ensureAuthenticatedUser().catch(() => { diff --git a/shell/footer/components/Footer.test.jsx b/shell/footer/components/Footer.test.jsx index 4cf0ace0..f8057e74 100644 --- a/shell/footer/components/Footer.test.jsx +++ b/shell/footer/components/Footer.test.jsx @@ -7,7 +7,7 @@ import { AppContext, IntlProvider } from '../../../runtime'; import Footer from './Footer'; -const FooterWithContext = ({ locale = 'es' }) => { +const FooterWithContext = ({ locale = 'en' }) => { const contextValue = useMemo(() => ({ authenticatedUser: null, config: { @@ -61,12 +61,6 @@ describe('